{"version":3,"sources":["../src/types/index.ts","../src/config/default-config.ts","../src/core/trie.ts","../src/core/symspell.ts","../src/utils/text-normalizer.ts","../src/core/profanity-matcher.ts","../src/core/filter.ts","../src/core/detection-result.ts","../src/utils/language-detection.ts","../src/utils/text-processing.ts","../src/core/language-detector.ts","../src/core/detector.ts","../src/config/config-validator.ts","../src/config/config-manager.ts","../src/languages/language-loader.ts","../src/languages/multi-language-detector.ts","../src/languages/factory.ts","../src/utils/fuzzy-matcher.ts","../src/utils/config.ts","../src/core/quick-start.ts","../src/index.ts"],"names":["SeverityLevel","FilterMode","DetectionErrorType","__name","__publicField","currentRow","performance","normalizeText","LANGUAGE_DATA","builder","fs","path","fileURLToPath","LanguageDetectionStrategy","filter"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Supported language codes for profanity detection\n */\nexport type LanguageCode =\n  | 'en' // English\n  | 'es' // Spanish\n  | 'fr' // French\n  | 'de' // German\n  | 'it' // Italian\n  | 'pt' // Portuguese\n  | 'ru' // Russian\n  | 'zh' // Chinese\n  | 'ja' // Japanese\n  | 'ar' // Arabic\n  | 'hi' // Hindi\n  | 'ko' // Korean\n  | 'nl' // Dutch\n  | 'sv' // Swedish\n  | 'pl' // Polish\n  | 'he' // Hebrew\n  | 'tr' // Turkish\n  | 'auto' // Auto-detect\n\n/**\n * Severity levels for profanity classification\n */\nexport enum SeverityLevel {\n  LOW = 1,\n  MEDIUM = 2,\n  MODERATE = 2,\n  HIGH = 3,\n  SEVERE = 4,\n}\n\n/**\n * Categories of profanity content\n * String union type to support diverse categorizations across languages\n */\nexport type ProfanityCategory =\n  // Core categories\n  | 'general'\n  | 'profanity'\n  | 'sexual'\n  | 'violence'\n  | 'hate_speech'\n  | 'discrimination'\n  | 'substance_abuse'\n  | 'religious'\n  | 'political'\n  | 'body_parts'\n  | 'scatological'\n  | 'slurs'\n  | 'disability'\n  | 'ethnic'\n  | 'lgbtq'\n  | 'racial'\n  // Extended categories for language-specific expressions\n  | 'abbreviation'\n  | 'ableist'\n  | 'adjective'\n  | 'age'\n  | 'ageist'\n  | 'anatomical'\n  | 'anatomy'\n  | 'animal'\n  | 'animal_comparisons'\n  | 'animal_insult'\n  | 'appearance'\n  | 'arabic_loanword'\n  | 'archaic'\n  | 'avoidance'\n  | 'behavior'\n  | 'biblical'\n  | 'blasphemy'\n  | 'bodily_function'\n  | 'body_shaming'\n  | 'borrowed'\n  | 'caste'\n  | 'chaos'\n  | 'character'\n  | 'childish'\n  | 'class'\n  | 'classist'\n  | 'cleanliness'\n  | 'command'\n  | 'commands'\n  | 'complaining'\n  | 'compound'\n  | 'condition'\n  | 'container'\n  | 'context_dependent'\n  | 'creative'\n  | 'creepy'\n  | 'criminal'\n  | 'curse'\n  | 'damnation'\n  | 'death_threat'\n  | 'death_wish'\n  | 'derogatory'\n  | 'diminutive'\n  | 'direct_address'\n  | 'direct_insult'\n  | 'directness'\n  | 'discriminatory'\n  | 'disease'\n  | 'disgust'\n  | 'dismissal'\n  | 'dismissive'\n  | 'disrespect'\n  | 'drug_reference'\n  | 'drugs'\n  | 'duty'\n  | 'egyptian_specific'\n  | 'emotion'\n  | 'emphatic'\n  | 'endearment'\n  | 'english_loan'\n  | 'euphemism'\n  | 'exclamation'\n  | 'extreme'\n  | 'extreme_threat'\n  | 'extremely_derogatory'\n  | 'extremely_offensive'\n  | 'extremely_vulgar'\n  | 'family'\n  | 'family_honor'\n  | 'family_insult'\n  | 'female_specific'\n  | 'finality'\n  | 'flemish'\n  | 'food'\n  | 'formal'\n  | 'gender'\n  | 'gender_slur'\n  | 'gendered'\n  | 'generational'\n  | 'gesture'\n  | 'gulf_specific'\n  | 'homeless'\n  | 'homophobic'\n  | 'honor'\n  | 'humorous'\n  | 'illegitimate_birth'\n  | 'impatience'\n  | 'imperative'\n  | 'insult'\n  | 'intelligence'\n  | 'intensifier'\n  | 'internet_euphemism'\n  | 'internet_gaming'\n  | 'internet_memes'\n  | 'laziness'\n  | 'levantine_specific'\n  | 'lgbtq_slur'\n  | 'maghrebi_specific'\n  | 'male_specific'\n  | 'masturbation'\n  | 'mat_system'\n  | 'memory_erasure'\n  | 'mental'\n  | 'mental_health'\n  | 'mess'\n  | 'metaphorical'\n  | 'mild'\n  | 'mild_profanity'\n  | 'mild_vulgar'\n  | 'military'\n  | 'misogynistic'\n  | 'modern'\n  | 'moral'\n  | 'mythological'\n  | 'nationality'\n  | 'nonsense'\n  | 'noun'\n  | 'object'\n  | 'objectification'\n  | 'offensive'\n  | 'passive_insult'\n  | 'phrase'\n  | 'physical_appearance'\n  | 'physical_threat'\n  | 'pimp'\n  | 'pity'\n  | 'positive'\n  | 'prefixed'\n  | 'prison'\n  | 'profession'\n  | 'pronouns'\n  | 'quantity'\n  | 'racial_slur'\n  | 'racist'\n  | 'regional'\n  | 'relationship'\n  | 'rude_command'\n  | 'sarcasm'\n  | 'seniority'\n  | 'sexual_undertone'\n  | 'situation'\n  | 'slang'\n  | 'slur'\n  | 'social'\n  | 'social_class'\n  | 'socially_acceptable'\n  | 'socioeconomic'\n  | 'suffix'\n  | 'supernatural'\n  | 'surprise'\n  | 'threat'\n  | 'threats'\n  | 'traditional'\n  | 'transphobic'\n  | 'verb'\n  | 'violent'\n  | 'vulgar'\n  | 'vulgar_command'\n  | 'vulgar_verb'\n  | 'weakness'\n  | 'weather'\n  | 'worthlessness'\n\n/**\n * Detection result for a single word or phrase\n */\nexport interface DetectionMatch {\n  /** The original word/phrase that was detected */\n  word: string\n  /** The matched profane word from the database */\n  match: string\n  /** Position in the text where the match starts */\n  start: number\n  /** Position in the text where the match ends */\n  end: number\n  /** Severity level of the detected profanity */\n  severity: SeverityLevel\n  /** Categories this profanity belongs to */\n  categories: ProfanityCategory[]\n  /** Detected language of the word */\n  language: LanguageCode\n  /** Confidence score (0-1) for the detection */\n  confidence: number\n}\n\n/**\n * Complete detection result for analyzed text\n */\nexport interface DetectionResult {\n  /** Original input text */\n  originalText: string\n  /** Text with profanity filtered/censored */\n  filteredText: string\n  /** Whether any profanity was detected */\n  hasProfanity: boolean\n  /** Total number of profane words detected */\n  totalMatches: number\n  /** Highest severity level found in the text */\n  maxSeverity: SeverityLevel\n  /** All detection matches found */\n  matches: DetectionMatch[]\n  /** Languages detected in the text */\n  detectedLanguages: LanguageCode[]\n  /** Overall confidence score for the analysis */\n  confidence: number\n  /** Processing time in milliseconds */\n  processingTime: number\n}\n\n/**\n * Language metadata information\n */\nexport interface LanguageMetadata {\n  readonly name: string\n  readonly code: LanguageCode\n  readonly version: string\n  readonly wordCount: number\n  readonly lastUpdated: string\n  readonly contributors?: readonly string[]\n}\n\n/**\n * Word entry in language data\n */\nexport interface WordEntry {\n  readonly word: string\n  readonly severity: SeverityLevel\n  readonly categories: readonly ProfanityCategory[]\n  readonly variations?: readonly string[]\n  readonly case_sensitive?: boolean\n  readonly context_notes?: string\n  readonly target_type?: string\n}\n\n/**\n * Simplified static language data structure for tree-shaking optimization\n * This is a simplified version that only contains essential word data\n */\nexport interface StaticLanguageData {\n  readonly metadata: LanguageMetadata\n  readonly words: readonly WordEntry[]\n}\n\n/**\n * Configuration options for the profanity detector\n */\nexport interface DetectorConfig {\n  /** Languages to check for profanity */\n  languages: LanguageCode[]\n  /** Minimum severity level to detect */\n  minSeverity: SeverityLevel\n  /** Categories of profanity to detect */\n  categories: ProfanityCategory[]\n  /** Whether to use fuzzy matching for variations */\n  fuzzyMatching: boolean\n  /** Fuzzy matching threshold (0-1) */\n  fuzzyThreshold: number\n  /** Custom words to add to the filter */\n  customWords: CustomWord[]\n  /** Words to whitelist (never flag as profanity) */\n  whitelist: string[]\n  /** Whether to detect profanity in different scripts/alphabets */\n  detectAlternateScripts: boolean\n  /** Whether to normalize text before detection */\n  normalizeText: boolean\n  /** Replacement character/string for censoring */\n  replacementChar: string\n  /** Whether to preserve word structure when censoring */\n  preserveStructure: boolean\n  /** Static language data for tree-shaking (bypasses dynamic loading) */\n  languageData?: Partial<Record<LanguageCode, StaticLanguageData>>\n}\n\n/**\n * Custom word definition for extending the profanity database\n */\nexport interface CustomWord {\n  /** The word or phrase to detect */\n  word: string\n  /** Language this word belongs to */\n  language: LanguageCode\n  /** Severity level of this word */\n  severity: SeverityLevel\n  /** Categories this word belongs to */\n  categories: ProfanityCategory[]\n  /** Alternative spellings or variations */\n  variations?: string[]\n  /** Regular expression pattern (if word contains regex) */\n  pattern?: string\n  /** Whether this word should be case-sensitive */\n  caseSensitive?: boolean\n}\n\n/**\n * Language detection result\n */\nexport interface LanguageDetection {\n  /** Detected language code */\n  language: LanguageCode\n  /** Confidence score for this language (0-1) */\n  confidence: number\n  /** Portion of text that contributed to this detection */\n  sample: string | undefined\n}\n\n/**\n * Statistics about the profanity database\n */\nexport interface DatabaseStats {\n  /** Total number of words in the database */\n  totalWords: number\n  /** Words count by language */\n  wordsByLanguage: Record<LanguageCode, number>\n  /** Words count by severity */\n  wordsBySeverity: Record<SeverityLevel, number>\n  /** Words count by category */\n  wordsByCategory: Record<ProfanityCategory, number>\n  /** Last updated timestamp */\n  lastUpdated: Date\n  /** Database version */\n  version: string\n}\n\n/**\n * Filter operation modes\n */\nexport enum FilterMode {\n  /** Replace with asterisks or replacement characters */\n  CENSOR = 'censor',\n  /** Remove profane words entirely */\n  REMOVE = 'remove',\n  /** Replace with alternative words */\n  REPLACE = 'replace',\n  /** Mark but don't modify the text */\n  DETECT_ONLY = 'detect_only',\n}\n\n/**\n * Text analysis options\n */\nexport interface AnalysisOptions {\n  /** Filter mode to apply */\n  filterMode: FilterMode\n  /** Whether to return detailed match information */\n  includeMatches: boolean\n  /** Whether to include confidence scores */\n  includeConfidence: boolean\n  /** Whether to measure processing time */\n  measurePerformance: boolean\n  /** Maximum text length to process */\n  maxLength?: number\n}\n\n/**\n * Error types that can occur during detection\n */\nexport enum DetectionErrorType {\n  INVALID_INPUT = 'invalid_input',\n  LANGUAGE_NOT_SUPPORTED = 'language_not_supported',\n  TEXT_TOO_LONG = 'text_too_long',\n  CONFIGURATION_ERROR = 'configuration_error',\n  DATABASE_ERROR = 'database_error',\n}\n\n/**\n * Detection error with context information\n */\nexport interface DetectionError extends Error {\n  type: DetectionErrorType\n  code: string\n  context?: Record<string, unknown>\n}\n\n/**\n * Enhanced detection match with additional metadata (re-export from core)\n */\nexport interface EnhancedDetectionMatch extends DetectionMatch {\n  /** Detailed position information */\n  position: {\n    absoluteStart: number\n    absoluteEnd: number\n    lineNumber: number\n    columnStart: number\n    columnEnd: number\n    wordIndex: number\n    sentenceIndex: number\n  }\n  /** Context around the match */\n  context: {\n    before: string\n    after: string\n    sentence: string\n  }\n  /** Alternative suggestions for replacement */\n  suggestions: string[]\n  /** Reason for detection */\n  detectionReason: string\n  /** Whether this is a fuzzy match */\n  isFuzzyMatch: boolean\n  /** Edit distance for fuzzy matches */\n  editDistance?: number\n  /** Original match score before confidence adjustments */\n  rawScore: number\n}\n","/**\n * Default configuration settings for NaughtyWords\n * Provides sensible defaults for all configuration options\n */\n\nimport type { DetectorConfig, AnalysisOptions, ProfanityCategory } from '../types/index.js'\nimport { SeverityLevel, FilterMode } from '../types/index.js'\n\n/**\n * All available profanity categories\n */\nexport const ALL_CATEGORIES: ProfanityCategory[] = [\n  // Core categories\n  'general',\n  'profanity',\n  'sexual',\n  'violence',\n  'hate_speech',\n  'discrimination',\n  'substance_abuse',\n  'religious',\n  'political',\n  'body_parts',\n  'scatological',\n  'slurs',\n  'disability',\n  'ethnic',\n  'lgbtq',\n  'racial',\n]\n\n/**\n * Default detector configuration\n */\nexport const DEFAULT_DETECTOR_CONFIG: DetectorConfig = {\n  // Language settings\n  languages: ['en'], // English as default language for better out-of-box experience\n\n  // Detection sensitivity\n  minSeverity: SeverityLevel.LOW, // Detect all severity levels\n  categories: ALL_CATEGORIES, // All categories enabled\n\n  // Matching settings\n  fuzzyMatching: true, // Enable fuzzy matching for variations\n  fuzzyThreshold: 0.8, // High threshold for accuracy\n\n  // Custom settings\n  customWords: [], // No custom words by default\n  whitelist: [], // No whitelisted words by default\n\n  // Text processing\n  detectAlternateScripts: true, // Detect alternate scripts\n  normalizeText: true, // Normalize text before analysis\n\n  // Output formatting\n  replacementChar: '*', // Standard asterisk replacement\n  preserveStructure: true, // Maintain original text structure\n}\n\n/**\n * Default analysis options\n */\nexport const DEFAULT_ANALYSIS_OPTIONS: AnalysisOptions = {\n  filterMode: FilterMode.DETECT_ONLY,\n  includeMatches: true,\n  includeConfidence: true,\n  measurePerformance: false,\n  maxLength: 100000, // 100KB default limit\n}\n\n/**\n * Performance-oriented configuration\n * Optimized for speed over comprehensive detection\n */\nexport const PERFORMANCE_CONFIG: Partial<DetectorConfig> = {\n  languages: ['en'], // Single language for speed\n  minSeverity: SeverityLevel.MODERATE, // Skip low severity\n  fuzzyMatching: false, // Disable fuzzy matching\n  normalizeText: false, // Skip normalization\n  detectAlternateScripts: false, // Skip script detection\n}\n\n/**\n * Comprehensive configuration\n * Optimized for maximum detection accuracy\n */\nexport const COMPREHENSIVE_CONFIG: Partial<DetectorConfig> = {\n  languages: ['auto'], // Auto-detect all languages\n  minSeverity: SeverityLevel.LOW, // Detect everything\n  fuzzyMatching: true, // Enable fuzzy matching\n  fuzzyThreshold: 0.7, // Lower threshold for more matches\n  normalizeText: true, // Full text normalization\n  detectAlternateScripts: true, // Detect all script variations\n}\n\n/**\n * Strict configuration\n * High precision, low false positives\n */\nexport const STRICT_CONFIG: Partial<DetectorConfig> = {\n  minSeverity: SeverityLevel.HIGH, // Only high severity\n  fuzzyMatching: true,\n  fuzzyThreshold: 0.9, // Very high threshold\n  categories: [\n    'general',\n    'sexual',\n    'hate_speech',\n  ], // Core categories only\n}\n\n/**\n * Lenient configuration\n * Lower precision, fewer false negatives\n */\nexport const LENIENT_CONFIG: Partial<DetectorConfig> = {\n  minSeverity: SeverityLevel.LOW,\n  fuzzyMatching: true,\n  fuzzyThreshold: 0.6, // Lower threshold for more matches\n  categories: ALL_CATEGORIES, // All categories\n}\n\n/**\n * Environment-specific configurations\n */\nexport const ENVIRONMENT_CONFIGS = {\n  development: {\n    ...DEFAULT_DETECTOR_CONFIG,\n    measurePerformance: true,\n  } as DetectorConfig,\n\n  production: {\n    ...DEFAULT_DETECTOR_CONFIG,\n    measurePerformance: false,\n  } as DetectorConfig,\n\n  testing: {\n    ...DEFAULT_DETECTOR_CONFIG,\n    languages: ['en'], // Single language for consistent tests\n    fuzzyMatching: false, // Deterministic results\n  } as DetectorConfig,\n}\n\n/**\n * Get configuration for current environment\n */\nexport function getEnvironmentConfig(): DetectorConfig {\n  const env = process.env.NODE_ENV || 'development'\n  return ENVIRONMENT_CONFIGS[env as keyof typeof ENVIRONMENT_CONFIGS] || ENVIRONMENT_CONFIGS.development\n}\n\n/**\n * Configuration presets for common use cases\n */\nexport const CONFIG_PRESETS = {\n  default: DEFAULT_DETECTOR_CONFIG,\n  performance: { ...DEFAULT_DETECTOR_CONFIG, ...PERFORMANCE_CONFIG },\n  comprehensive: { ...DEFAULT_DETECTOR_CONFIG, ...COMPREHENSIVE_CONFIG },\n  strict: { ...DEFAULT_DETECTOR_CONFIG, ...STRICT_CONFIG },\n  lenient: { ...DEFAULT_DETECTOR_CONFIG, ...LENIENT_CONFIG },\n} as const\n\n/**\n * Get a configuration preset by name\n */\nexport function getConfigPreset(preset: keyof typeof CONFIG_PRESETS): DetectorConfig {\n  return CONFIG_PRESETS[preset]\n}\n\n/**\n * Language-specific optimization configs\n */\nexport const LANGUAGE_OPTIMIZED_CONFIGS = {\n  en: {\n    fuzzyThreshold: 0.8,\n    normalizeText: true,\n    detectAlternateScripts: false,\n  },\n  es: {\n    fuzzyThreshold: 0.7, // Spanish has more variations\n    normalizeText: true,\n    detectAlternateScripts: true,\n  },\n  fr: {\n    fuzzyThreshold: 0.7,\n    normalizeText: true,\n    detectAlternateScripts: false,\n  },\n  de: {\n    fuzzyThreshold: 0.8, // German compound words\n    normalizeText: true,\n    detectAlternateScripts: false,\n  },\n  ru: {\n    fuzzyThreshold: 0.7,\n    normalizeText: true,\n    detectAlternateScripts: true, // Cyrillic variations\n  },\n  zh: {\n    fuzzyThreshold: 0.9, // Chinese characters need precision\n    normalizeText: false, // Don't normalize Chinese\n    detectAlternateScripts: true,\n  },\n  ja: {\n    fuzzyThreshold: 0.9,\n    normalizeText: false,\n    detectAlternateScripts: true,\n  },\n  ar: {\n    fuzzyThreshold: 0.7,\n    normalizeText: true,\n    detectAlternateScripts: true, // Arabic script variations\n  },\n}","/**\n * Serialized trie node structure for import/export\n */\ninterface SerializedTrieNode {\n  isEndOfWord: boolean\n  children: Record<string, SerializedTrieNode>\n  data?: TrieNodeData\n}\n\n/**\n * Serialized trie structure for import/export\n */\ninterface SerializedTrie {\n  root: SerializedTrieNode\n  totalWords: number\n  version: string\n}\n\n/**\n * Trie (Prefix Tree) implementation optimized for profanity detection\n * Supports fuzzy matching, variations, and efficient word storage\n *\n * Performance optimizations:\n * - Memory-efficient lazy node creation\n * - Intelligent caching for frequently accessed paths\n * - Optimized traversal algorithms with early termination\n * - Batch processing support for multiple texts\n */\n\nimport type { SeverityLevel, ProfanityCategory } from '../types/index.js'\n\n/**\n * Data stored at each terminal node (word end)\n */\nexport interface TrieNodeData {\n  /** Original word as stored */\n  word: string\n  /** Severity level of the word */\n  severity: SeverityLevel\n  /** Categories this word belongs to */\n  categories: ProfanityCategory[]\n  /** Language this word is from */\n  language: string\n  /** Whether this word is case-sensitive */\n  caseSensitive?: boolean\n  /** Confidence score for this match */\n  confidence?: number\n}\n\n/**\n * Single node in the Trie structure with performance optimizations\n */\nexport class TrieNode {\n  public children: Map<string, TrieNode> = new Map()\n  public isEndOfWord = false\n  public data: TrieNodeData | null = null\n  public failureLink: TrieNode | null = null // For Aho-Corasick algorithm\n  public outputLink: TrieNode | null = null\n\n  // Performance optimization: cache frequently accessed paths\n  public accessCount = 0\n  public lastAccessTime = 0\n\n  constructor() {}\n\n  /**\n   * Check if this node has any children\n   */\n  hasChildren(): boolean {\n    return this.children.size > 0\n  }\n\n  /**\n   * Get child node for a character\n   */\n  getChild(char: string): TrieNode | undefined {\n    return this.children.get(char)\n  }\n\n  /**\n   * Add or get child node for a character\n   */\n  addChild(char: string): TrieNode {\n    if (!this.children.has(char)) {\n      this.children.set(char, new TrieNode())\n    }\n    const node = this.children.get(char)\n    return node || new TrieNode()\n  }\n}\n\n/**\n * Match result from Trie search\n */\nexport interface TrieMatch {\n  /** The matched word */\n  word: string\n  /** Start position in the search text */\n  start: number\n  /** End position in the search text */\n  end: number\n  /** Data associated with this match */\n  data: TrieNodeData\n  /** Edit distance (for fuzzy matches) */\n  editDistance?: number\n}\n\n/**\n * Efficient Trie implementation for fast profanity detection\n * Features:\n * - O(m) insertion and search where m is word length\n * - Fuzzy matching with configurable edit distance\n * - Memory-optimized storage\n * - Support for word variations and patterns\n * - Aho-Corasick algorithm for multi-pattern matching\n */\nexport class ProfanityTrie {\n  public root: TrieNode = new TrieNode()\n  private totalWords = 0\n  private compiled = false\n\n  constructor() {}\n\n  /**\n   * Insert a word into the Trie with associated data\n   */\n  insert(word: string, data: TrieNodeData): void {\n    if (!word || word.length === 0) {\n      return\n    }\n\n    const normalizedWord = data.caseSensitive === false\n      ? word.toLowerCase()\n      : word\n\n    let currentNode = this.root\n\n    for (const char of normalizedWord) {\n      currentNode = currentNode.addChild(char)\n    }\n\n    currentNode.isEndOfWord = true\n    currentNode.data = { ...data }\n    this.totalWords++\n    this.compiled = false // Mark as needing recompilation\n  }\n\n  /**\n   * Insert multiple words with their variations\n   */\n  insertWithVariations(\n    baseWord: string,\n    variations: readonly string[],\n    data: TrieNodeData\n  ): void {\n    // Insert the base word\n    this.insert(baseWord, data)\n\n    // Insert all variations with the same data\n    for (const variation of variations) {\n      this.insert(variation, { ...data, word: baseWord })\n    }\n  }\n\n  /**\n   * Search for exact matches in text\n   */\n  search(text: string, caseSensitive = false): TrieMatch[] {\n    if (!text || text.length === 0) {\n      return []\n    }\n\n    const searchText = caseSensitive ? text : text.toLowerCase()\n    const matches: TrieMatch[] = []\n\n    // Search at each starting position\n    for (let i = 0; i < searchText.length; i++) {\n      const match = this.searchFromPosition(searchText, i, text)\n      if (match) {\n        matches.push(match)\n      }\n    }\n\n    return matches\n  }\n\n  /**\n   * Search for matches starting from a specific position\n   */\n  private searchFromPosition(searchText: string, startPos: number, originalText?: string): TrieMatch | null {\n    let currentNode = this.root\n    let currentPos = startPos\n    const textToReturn = originalText || searchText\n\n    while (currentPos < searchText.length) {\n      const char = searchText[currentPos]\n      if (!char) break\n      const childNode = currentNode.getChild(char)\n\n      if (!childNode) {\n        break\n      }\n\n      currentNode = childNode\n      currentPos++\n\n      // Check if we found a complete word\n      if (currentNode.isEndOfWord && currentNode.data) {\n        // Ensure we're at word boundaries to avoid partial matches\n        if (this.isWordBoundary(searchText, startPos, currentPos)) {\n          return {\n            word: textToReturn.substring(startPos, currentPos),\n            start: startPos,\n            end: currentPos,\n            data: currentNode.data\n          }\n        }\n      }\n    }\n\n    return null\n  }\n\n  /**\n   * Fuzzy search with edit distance tolerance - OPTIMIZED\n   * Uses iterative approach with early termination and pruning\n   */\n  fuzzySearch(text: string, maxEditDistance = 1, caseSensitive = false): TrieMatch[] {\n    if (!text || text.length === 0 || maxEditDistance < 0) {\n      return []\n    }\n\n    const searchText = caseSensitive ? text : text.toLowerCase()\n    const matches: TrieMatch[] = []\n    const maxWordLength = 30 // Reasonable max word length to search\n\n    // Search at each starting position with early termination\n    // Only search from word boundaries to avoid substring matches\n    for (let i = 0; i < searchText.length; i++) {\n      // Skip if not at a word boundary (avoids finding \"rofanity\" in \"profanity\")\n      if (i > 0 && /[a-zA-Z0-9]/.test(searchText[i - 1] || '')) {\n        continue\n      }\n\n      // Limit search to reasonable word length\n      const maxSearchLength = Math.min(maxWordLength, searchText.length - i)\n\n      const fuzzyMatches = this.fuzzySearchFromPositionOptimized(\n        searchText.substring(i, i + maxSearchLength),\n        i,\n        maxEditDistance\n      )\n      matches.push(...fuzzyMatches)\n    }\n\n    return this.deduplicateMatches(matches)\n  }\n\n  /**\n   * Optimized fuzzy search using iterative approach with pruning\n   */\n  private fuzzySearchFromPositionOptimized(\n    text: string,\n    originalStart: number,\n    maxEditDistance: number\n  ): TrieMatch[] {\n    const matches: TrieMatch[] = []\n    const textLen = text.length\n\n    if (textLen === 0) return matches\n\n    // For very short texts, use a more direct approach\n    if (textLen <= 20) {\n      return this.fuzzySearchShortText(text, originalStart, maxEditDistance)\n    }\n\n    // Use a queue-based BFS approach instead of recursive DFS\n    const queue: Array<{\n      node: TrieNode\n      pattern: string\n      patternPos: number\n      editDistance: number\n    }> = [{\n      node: this.root,\n      pattern: '',\n      patternPos: 0,\n      editDistance: 0\n    }]\n\n    while (queue.length > 0) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Queue length checked in while condition, shift() guaranteed to return value\n      const current = queue.shift()!\n      const { node, pattern, patternPos, editDistance } = current\n\n      // Prune if edit distance exceeds limit\n      if (editDistance > maxEditDistance) continue\n\n      // Check if current node represents a complete word\n      if (node.isEndOfWord && node.data && patternPos > 0) {\n        // Calculate final edit distance\n        const finalEditDistance = editDistance + Math.abs(textLen - patternPos)\n\n        if (finalEditDistance <= maxEditDistance) {\n          // Check word boundaries\n          if (this.isWordBoundary(text, 0, Math.min(patternPos, textLen))) {\n            matches.push({\n              word: text.substring(0, Math.min(patternPos, textLen)),\n              start: originalStart,\n              end: originalStart + Math.min(patternPos, textLen),\n              data: node.data,\n              editDistance: finalEditDistance\n            })\n          }\n        }\n      }\n\n      // Explore children if we haven't exceeded limits\n      if (patternPos < textLen && editDistance < maxEditDistance) {\n        for (const [char, childNode] of Array.from(node.children.entries())) {\n          // Try match (no edit cost)\n          if (patternPos < textLen && char === text[patternPos]) {\n            queue.push({\n              node: childNode,\n              pattern: pattern + char,\n              patternPos: patternPos + 1,\n              editDistance\n            })\n          }\n\n          // Try substitution (edit cost +1)\n          if (editDistance + 1 <= maxEditDistance) {\n            queue.push({\n              node: childNode,\n              pattern: pattern + char,\n              patternPos: patternPos + 1,\n              editDistance: editDistance + 1\n            })\n          }\n        }\n\n        // Try insertion (skip text character)\n        if (editDistance + 1 <= maxEditDistance) {\n          queue.push({\n            node,\n            pattern,\n            patternPos: patternPos + 1,\n            editDistance: editDistance + 1\n          })\n        }\n      }\n    }\n\n    return matches\n  }\n\n  /**\n   * Specialized fuzzy search for short texts (more accurate)\n   */\n  private fuzzySearchShortText(\n    text: string,\n    originalStart: number,\n    maxEditDistance: number\n  ): TrieMatch[] {\n    const matches: TrieMatch[] = []\n    const textLen = text.length\n\n    // For short texts, we can be more thorough\n    const queue: Array<{\n      node: TrieNode\n      pattern: string\n      patternPos: number\n      editDistance: number\n    }> = [{\n      node: this.root,\n      pattern: '',\n      patternPos: 0,\n      editDistance: 0\n    }]\n\n    while (queue.length > 0) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Queue length checked in while condition, shift() guaranteed to return value\n      const current = queue.shift()!\n      const { node, pattern, patternPos, editDistance } = current\n\n      if (editDistance > maxEditDistance) continue\n\n      // Check for matches at this position\n      if (node.isEndOfWord && node.data && patternPos > 0) {\n        // Calculate edit distance for the remaining text\n        const remainingDistance = Math.abs(textLen - patternPos)\n        const finalEditDistance = editDistance + remainingDistance\n\n        if (finalEditDistance <= maxEditDistance) {\n          // Check word boundaries\n          if (this.isWordBoundary(text, 0, Math.min(patternPos, textLen))) {\n            matches.push({\n              word: text.substring(0, Math.min(patternPos, textLen)),\n              start: originalStart,\n              end: originalStart + Math.min(patternPos, textLen),\n              data: node.data,\n              editDistance: finalEditDistance\n            })\n          }\n        }\n      }\n\n      // Explore all possible paths\n      if (patternPos < textLen) {\n        for (const [char, childNode] of Array.from(node.children.entries())) {\n          // Try exact match\n          if (patternPos < textLen && char === text[patternPos]) {\n            queue.push({\n              node: childNode,\n              pattern: pattern + char,\n              patternPos: patternPos + 1,\n              editDistance\n            })\n          }\n\n          // Try substitution\n          if (editDistance + 1 <= maxEditDistance) {\n            queue.push({\n              node: childNode,\n              pattern: pattern + char,\n              patternPos: patternPos + 1,\n              editDistance: editDistance + 1\n            })\n          }\n        }\n\n        // Try insertion (skip text character)\n        if (editDistance + 1 <= maxEditDistance) {\n          queue.push({\n            node,\n            pattern,\n            patternPos: patternPos + 1,\n            editDistance: editDistance + 1\n          })\n        }\n\n        // Try deletion (skip pattern character)\n        if (editDistance + 1 <= maxEditDistance) {\n          for (const [char, childNode] of Array.from(node.children.entries())) {\n            queue.push({\n              node: childNode,\n              pattern: pattern + char,\n              patternPos,\n              editDistance: editDistance + 1\n            })\n          }\n        }\n      }\n    }\n\n    return matches\n  }\n\n  /**\n   * Legacy fuzzy search DFS - kept for compatibility but deprecated\n   * Use fuzzySearchFromPositionOptimized instead\n   */\n  // @ts-ignore: Deprecated method kept for compatibility\n  private _fuzzySearchDFS(\n    node: TrieNode,\n    text: string,\n    originalStart: number,\n    currentPattern: string,\n    dp: number[][],\n    patternPos: number,\n    maxEditDistance: number,\n    matches: TrieMatch[]\n  ): void {\n    const textLen = text.length\n\n    // Initialize current row of DP table\n    if (patternPos === 0) {\n      for (let i = 0; i <= patternPos; i++) {\n        const row = dp[i]\n        if (row) {\n          row[0] = i\n        }\n      }\n    }\n\n    // Fill DP table for current pattern position\n    for (let j = 1; j <= textLen; j++) {\n      let minCost = Infinity\n\n      if (patternPos > 0) {\n        // Deletion: skip character in pattern\n        const prevPatternRow = dp[patternPos - 1]\n        if (prevPatternRow) {\n          const prevValue = prevPatternRow[j]\n          if (prevValue !== undefined) {\n            minCost = Math.min(minCost, prevValue + 1)\n          }\n        }\n\n        // Insertion: skip character in text\n        const currentRow = dp[patternPos]\n        if (currentRow && j > 0) {\n          const currentValue = currentRow[j - 1]\n          if (currentValue !== undefined) {\n            minCost = Math.min(minCost, currentValue + 1)\n          }\n        }\n\n        // Substitution or match\n        const cost = currentPattern[patternPos - 1] === text[j - 1] ? 0 : 1\n        if (prevPatternRow && j > 0) {\n          const prevValue = prevPatternRow[j - 1]\n          if (prevValue !== undefined) {\n            minCost = Math.min(minCost, prevValue + cost)\n          }\n        }\n      }\n\n      const currentRow = dp[patternPos]\n      if (currentRow) {\n        currentRow[j] = minCost\n      }\n    }\n\n    // Check if current node represents a complete word\n    if (node.isEndOfWord && node.data && patternPos > 0) {\n      // Find minimum edit distance for any ending position\n      const currentRow = dp[patternPos]\n      if (currentRow) {\n        for (let j = 1; j <= textLen; j++) {\n          const editDistance = currentRow[j]\n          if (editDistance !== undefined && editDistance <= maxEditDistance) {\n            if (this.isWordBoundary(text, 0, j)) {\n              matches.push({\n                word: text.substring(0, j),\n                start: originalStart,\n                end: originalStart + j,\n                data: node.data,\n                editDistance\n              })\n            }\n          }\n        }\n      }\n    }\n\n    // Continue DFS to children if we haven't exceeded max edit distance\n    // Note: Legacy DFS method removed for now\n    //\n    // PERFORMANCE OPTIMIZATION (DEFERRED):\n    // The current implementation uses BFS (breadth-first search) in the main fuzzySearch method.\n    // A potential optimization would be to add DFS (depth-first search) continuation here for child\n    // nodes when the current node's minimum edit distance is still within maxEditDistance.\n    //\n    // This would allow early pruning of entire subtrees and potentially improve performance for\n    // large tries. However, the current BFS implementation is already quite efficient and the\n    // added complexity may not justify the marginal gains.\n    //\n    // Deferring this optimization until profiling shows it as a significant bottleneck.\n  }\n\n  /**\n   * Check if position represents a word boundary\n   */\n  private isWordBoundary(text: string, start: number, end: number): boolean {\n    const beforeChar = start > 0 ? text[start - 1] : ' '\n    const afterChar = end < text.length ? text[end] : ' '\n\n    const isWordChar = (char: string | undefined): boolean => {\n      return char ? /[a-zA-Z0-9]/.test(char) : false\n    }\n\n    return !isWordChar(beforeChar) && !isWordChar(afterChar)\n  }\n\n  /**\n   * Remove duplicate matches and sort by quality\n   */\n  private deduplicateMatches(matches: TrieMatch[]): TrieMatch[] {\n    const seen = new Set<string>()\n    const unique: TrieMatch[] = []\n\n    // Sort by position first, then by edit distance (lower is better)\n    const sorted = matches.sort((a, b) => {\n      if (a.start !== b.start) return a.start - b.start\n      const distA = a.editDistance || 0\n      const distB = b.editDistance || 0\n      return distA - distB\n    })\n\n    for (const match of sorted) {\n      const key = `${match.start}-${match.end}-${match.data.word}`\n      if (!seen.has(key)) {\n        seen.add(key)\n        unique.push(match)\n      }\n    }\n\n    return unique\n  }\n\n  /**\n   * Compile the Trie for optimized searching (Aho-Corasick)\n   * This creates failure links for efficient multi-pattern matching\n   */\n  compile(): void {\n    if (this.compiled) return\n\n    this.buildFailureLinks()\n    this.compiled = true\n  }\n\n  /**\n   * Build failure links for Aho-Corasick algorithm\n   */\n  private buildFailureLinks(): void {\n    const queue: TrieNode[] = []\n\n    // Initialize failure links for depth 1\n    for (const child of Array.from(this.root.children.values())) {\n      child.failureLink = this.root\n      queue.push(child)\n    }\n\n    // Build failure links using BFS\n    while (queue.length > 0) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Queue length checked in while condition, shift() guaranteed to return value\n      const current = queue.shift()!\n\n      for (const [char, child] of Array.from(current.children.entries())) {\n        queue.push(child)\n\n        // Find failure link with cycle detection\n        let failure = current.failureLink\n        const visitedFailureNodes = new Set<TrieNode>()\n\n        while (failure !== null && !failure.children.has(char)) {\n          if (visitedFailureNodes.has(failure)) {\n            // Cycle detected in failure links, break to root\n            failure = null\n            break\n          }\n          visitedFailureNodes.add(failure)\n          failure = failure.failureLink\n        }\n\n        if (failure === null) {\n          child.failureLink = this.root\n        } else {\n          const failureChild = failure.children.get(char)\n          child.failureLink = failureChild || this.root\n        }\n\n        // Set output link\n        if (child.failureLink?.isEndOfWord) {\n          child.outputLink = child.failureLink\n        } else {\n          child.outputLink = child.failureLink?.outputLink || null\n        }\n      }\n    }\n  }\n\n  /**\n   * Multi-pattern search using Aho-Corasick algorithm\n   * More efficient than multiple single searches\n   */\n  multiPatternSearch(text: string, caseSensitive = false, maxMatches = Infinity): TrieMatch[] {\n    this.compile()\n\n    if (!text || text.length === 0) {\n      return []\n    }\n\n    const searchText = caseSensitive ? text : text.toLowerCase()\n    const matches: TrieMatch[] = []\n    let currentNode = this.root\n\n    for (let i = 0; i < searchText.length; i++) {\n      // Early termination if we've found enough matches\n      if (matches.length >= maxMatches) {\n        break\n      }\n\n      const char = searchText[i]\n      if (!char) continue\n\n      // Follow failure links until we find a match or reach root\n      const traversedNodes = new Set<TrieNode>()\n\n      while (currentNode !== this.root && !currentNode.children.has(char)) {\n        if (traversedNodes.has(currentNode)) {\n          // Cycle detected, reset to root\n          currentNode = this.root\n          break\n        }\n        traversedNodes.add(currentNode)\n\n        if (currentNode.failureLink) {\n          currentNode = currentNode.failureLink\n        } else {\n          currentNode = this.root\n          break\n        }\n      }\n\n      if (currentNode.children.has(char)) {\n        const childNode = currentNode.children.get(char)\n        if (childNode) {\n          currentNode = childNode\n        }\n      }\n\n      // Check for matches at current position\n      let outputNode: TrieNode | null = currentNode\n      const visitedNodes = new Set<TrieNode>()\n\n      while (outputNode !== null) {\n        // Prevent infinite loops from circular outputLink references\n        if (visitedNodes.has(outputNode)) {\n          break\n        }\n        visitedNodes.add(outputNode)\n\n        if (outputNode.isEndOfWord && outputNode.data) {\n          const wordLength = outputNode.data.word.length\n          const start = i - wordLength + 1\n          const end = i + 1\n\n          if (this.isWordBoundary(searchText, start, end)) {\n            matches.push({\n              word: searchText.substring(start, end),\n              start,\n              end,\n              data: outputNode.data\n            })\n            // Check if we've reached the limit after adding\n            if (matches.length >= maxMatches) {\n              return matches\n            }\n          }\n        }\n        outputNode = outputNode.outputLink\n      }\n    }\n\n    return matches\n  }\n\n  /**\n   * Get statistics about the Trie\n   */\n  getStats(): {\n    totalWords: number\n    totalNodes: number\n    averageDepth: number\n    maxDepth: number\n    memoryUsage: number\n  } {\n    let totalNodes = 0\n    let totalDepth = 0\n    let maxDepth = 0\n    let wordCount = 0\n\n    const traverse = (node: TrieNode, depth: number) => {\n      totalNodes++\n      if (node.isEndOfWord) {\n        totalDepth += depth\n        wordCount++\n        maxDepth = Math.max(maxDepth, depth)\n      }\n\n      for (const child of Array.from(node.children.values())) {\n        traverse(child, depth + 1)\n      }\n    }\n\n    traverse(this.root, 0)\n\n    const averageDepth = wordCount > 0 ? totalDepth / wordCount : 0\n\n    // Rough memory estimation\n    const memoryUsage = totalNodes * (\n      32 + // Base node overhead\n      (16 * 2) + // Map overhead\n      (8 * 4) // Average character storage per node\n    )\n\n    return {\n      totalWords: this.totalWords,\n      totalNodes,\n      averageDepth,\n      maxDepth,\n      memoryUsage\n    }\n  }\n\n  /**\n   * Clear the entire Trie\n   */\n  clear(): void {\n    this.root = new TrieNode()\n    this.totalWords = 0\n    this.compiled = false\n  }\n\n  /**\n   * Export Trie to a serializable format\n   */\n  export(): SerializedTrie {\n    const exportNode = (node: TrieNode): SerializedTrieNode => {\n      const exported: SerializedTrieNode = {\n        isEndOfWord: node.isEndOfWord,\n        children: {}\n      }\n\n      if (node.data) {\n        exported.data = node.data\n      }\n\n      for (const [char, child] of Array.from(node.children.entries())) {\n        exported.children[char] = exportNode(child)\n      }\n\n      return exported\n    }\n\n    return {\n      root: exportNode(this.root),\n      totalWords: this.totalWords,\n      version: '1.0.0'\n    }\n  }\n\n  /**\n   * Import Trie from serialized format\n   */\n  import(data: SerializedTrie): void {\n    this.clear()\n\n    const importNode = (nodeData: SerializedTrieNode): TrieNode => {\n      const node = new TrieNode()\n      node.isEndOfWord = nodeData.isEndOfWord || false\n\n      if (nodeData.data) {\n        node.data = nodeData.data\n      }\n\n      if (nodeData.children) {\n        for (const [char, childData] of Object.entries(nodeData.children)) {\n          node.children.set(char, importNode(childData))\n        }\n      }\n\n      return node\n    }\n\n    if (data.root) {\n      this.root = importNode(data.root)\n      this.totalWords = data.totalWords || 0\n      this.compiled = false\n    }\n  }\n\n  /**\n   * PERFORMANCE OPTIMIZATIONS\n   */\n\n  // Cache for frequently accessed search paths\n  private searchCache = new Map<string, TrieMatch[]>()\n  private readonly MAX_CACHE_SIZE = 1000\n  private cacheHits = 0\n  private cacheMisses = 0\n\n  /**\n   * Cached search with intelligent cache management\n   */\n  cachedSearch(text: string, caseSensitive = false): TrieMatch[] {\n    const cacheKey = `${caseSensitive ? 'cs' : 'ci'}:${text}`\n\n    // Check cache first\n    if (this.searchCache.has(cacheKey)) {\n      this.cacheHits++\n      const cached = this.searchCache.get(cacheKey)\n      return cached || []\n    }\n\n    this.cacheMisses++\n    const results = this.search(text, caseSensitive)\n\n    // Add to cache if under limit\n    if (this.searchCache.size < this.MAX_CACHE_SIZE) {\n      this.searchCache.set(cacheKey, results)\n    } else {\n      // Remove least recently used entries\n      this.evictOldCacheEntries()\n      this.searchCache.set(cacheKey, results)\n    }\n\n    return results\n  }\n\n  /**\n   * Batch processing for multiple texts - significantly more efficient\n   */\n  batchSearch(texts: string[], caseSensitive = false): TrieMatch[][] {\n    return texts.map(text => this.cachedSearch(text, caseSensitive))\n  }\n\n  /**\n   * Memory-efficient batch processing with streaming\n   */\n  *batchSearchStream(texts: Iterable<string>, caseSensitive = false): Generator<TrieMatch[], void, unknown> {\n    for (const text of Array.from(texts)) {\n      yield this.cachedSearch(text, caseSensitive)\n    }\n  }\n\n  /**\n   * Optimized traversal with early termination\n   */\n  searchWithEarlyTermination(text: string, maxMatches: number, caseSensitive = false): TrieMatch[] {\n    if (!text || text.length === 0 || maxMatches <= 0) {\n      return []\n    }\n\n    const searchText = caseSensitive ? text : text.toLowerCase()\n    const matches: TrieMatch[] = []\n\n    // Early termination when max matches reached\n    for (let i = 0; i < searchText.length && matches.length < maxMatches; i++) {\n      const match = this.searchFromPosition(searchText, i)\n      if (match) {\n        matches.push(match)\n      }\n    }\n\n    return matches\n  }\n\n  enableLazyLoading(callback: (word: string) => TrieNodeData | null): void {\n    // Lazy loading functionality can be implemented when needed\n    // For now, just store the callback for future use\n    if (typeof callback === 'function') {\n      // Implementation would use the callback to load data on demand\n    }\n  }\n\n  /**\n   * Smart cache eviction using LRU strategy\n   */\n  private evictOldCacheEntries(): void {\n    // Remove 25% of cache entries\n    const entriesToRemove = Math.floor(this.searchCache.size * 0.25)\n    const entries = Array.from(this.searchCache.keys()).slice(0, entriesToRemove)\n\n    for (const key of entries) {\n      this.searchCache.delete(key)\n    }\n  }\n\n  /**\n   * Get cache performance statistics\n   */\n  getCacheStats(): { hits: number; misses: number; hitRate: number; size: number } {\n    const total = this.cacheHits + this.cacheMisses\n    return {\n      hits: this.cacheHits,\n      misses: this.cacheMisses,\n      hitRate: total > 0 ? this.cacheHits / total : 0,\n      size: this.searchCache.size\n    }\n  }\n\n  /**\n   * Clear search cache\n   */\n  clearCache(): void {\n    this.searchCache.clear()\n    this.cacheHits = 0\n    this.cacheMisses = 0\n  }\n\n  /**\n   * Warm up cache with common patterns\n   */\n  warmUpCache(commonTexts: string[]): void {\n    for (const text of commonTexts) {\n      this.cachedSearch(text)\n      this.cachedSearch(text, true) // Also warm up case-sensitive\n    }\n  }\n\n  /**\n   * Memory usage optimization - compact internal structures\n   */\n  compact(): void {\n    this.searchCache.clear()\n    this.cacheHits = 0\n    this.cacheMisses = 0\n\n    // Force garbage collection hint\n    if (global.gc) {\n      global.gc()\n    }\n  }\n}","/**\n * SymSpell (Symmetric Delete) algorithm for ultra-fast fuzzy string matching\n *\n * Performance: 1,000-100,000x faster than traditional edit distance approaches\n * Memory trade-off: Preprocesses all delete variants for O(1) lookup speed\n *\n * Algorithm:\n * 1. Preprocessing: Generate all possible character deletions up to max edit distance\n * 2. Query: Generate deletions of query string and lookup in hash map\n * 3. Result: All dictionary words within edit distance in constant time\n *\n * Example:\n * - Dictionary word \"shit\" with max_edit=1 generates: [\"shit\", \"hit\", \"sit\", \"sht\", \"shi\"]\n * - Query \"sht\" (from normalized \"sh!t\") → instant hash lookup → matches \"shit\"\n */\n\nexport interface SymSpellMatch {\n  /** The original dictionary word */\n  word: string\n  /** Edit distance from query to dictionary word */\n  editDistance: number\n}\n\nexport interface SymSpellOptions {\n  /** Maximum edit distance to consider (1-2 recommended, 3+ expensive) */\n  maxEditDistance: number\n  /** Prefix length for memory optimization (0 = disabled, 7 = recommended) */\n  prefixLength?: number\n  /** Case sensitive matching */\n  caseSensitive?: boolean\n}\n\n/**\n * SymSpell index for ultra-fast fuzzy string matching\n */\nexport class SymSpellIndex {\n  /** Map from delete variant → set of original words that generate it */\n  private deletes: Map<string, Set<string>> = new Map()\n\n  /** Original dictionary words */\n  private dictionary: Set<string> = new Set()\n\n  /** Configuration options */\n  private options: Required<SymSpellOptions>\n\n  constructor(options: SymSpellOptions) {\n    this.options = {\n      maxEditDistance: options.maxEditDistance,\n      prefixLength: options.prefixLength ?? 0,\n      caseSensitive: options.caseSensitive ?? false\n    }\n  }\n\n  /**\n   * Build the SymSpell index from a dictionary of words\n   */\n  buildIndex(words: string[]): void {\n    this.deletes.clear()\n    this.dictionary.clear()\n\n    for (const word of words) {\n      if (!word || word.trim().length === 0) continue\n\n      const normalizedWord = this.options.caseSensitive ? word : word.toLowerCase()\n      this.dictionary.add(normalizedWord)\n\n      // Generate all delete variants for this word\n      const deleteVariants = this.generateDeletes(normalizedWord, this.options.maxEditDistance)\n\n      for (const variant of deleteVariants) {\n        let bucket = this.deletes.get(variant)\n        if (!bucket) {\n          bucket = new Set()\n          this.deletes.set(variant, bucket)\n        }\n        bucket.add(normalizedWord)\n      }\n    }\n  }\n\n  /**\n   * Lookup fuzzy matches for a query string\n   * Returns all dictionary words within maxEditDistance\n   */\n  lookup(query: string, maxEditDistance?: number): SymSpellMatch[] {\n    const searchDistance = maxEditDistance ?? this.options.maxEditDistance\n    const normalizedQuery = this.options.caseSensitive ? query : query.toLowerCase()\n\n    if (normalizedQuery.length === 0) return []\n\n    // Track candidates and their edit distances\n    const candidates = new Map<string, number>()\n\n    // Exact match check (edit distance 0)\n    if (this.dictionary.has(normalizedQuery)) {\n      candidates.set(normalizedQuery, 0)\n    }\n\n    // Generate delete variants of query and look them up\n    const queryDeletes = this.generateDeletes(normalizedQuery, searchDistance)\n\n    for (const deleteVariant of queryDeletes) {\n      const matchingWords = this.deletes.get(deleteVariant)\n      if (!matchingWords) continue\n\n      // Calculate actual edit distance for each candidate\n      for (const word of matchingWords) {\n        if (candidates.has(word)) continue // Already found with lower distance\n\n        const distance = this.calculateEditDistance(normalizedQuery, word)\n        if (distance <= searchDistance) {\n          candidates.set(word, distance)\n        }\n      }\n    }\n\n    // Convert to result format and sort by edit distance\n    return Array.from(candidates.entries())\n      .map(([word, editDistance]) => ({ word, editDistance }))\n      .sort((a, b) => a.editDistance - b.editDistance)\n  }\n\n  /**\n   * Generate all delete variants of a word up to maxDistance\n   * Uses prefix optimization if enabled\n   */\n  private generateDeletes(word: string, maxDistance: number): Set<string> {\n    const deletes = new Set<string>()\n\n    // Note: Don't add original word to deletes, only its delete variants\n    // The original word is stored in dictionary\n\n    // Use prefix optimization to reduce memory during index building\n    // But for lookups, we need to handle the full word\n    const effectiveWord = this.options.prefixLength > 0 && word.length > this.options.prefixLength\n      ? word.substring(0, this.options.prefixLength)\n      : word\n\n    // BFS to generate all possible deletions\n    const queue: Array<{ str: string; distance: number }> = [{ str: effectiveWord, distance: 0 }]\n    const visited = new Set<string>([effectiveWord])\n\n    while (queue.length > 0) {\n      const current = queue.shift()\n      if (!current) break\n\n      // Add current state to deletes (including the starting word)\n      deletes.add(current.str)\n\n      if (current.distance >= maxDistance) continue\n\n      // Generate all single-character deletions\n      for (let i = 0; i < current.str.length; i++) {\n        const deleted = current.str.substring(0, i) + current.str.substring(i + 1)\n\n        if (!visited.has(deleted)) {\n          visited.add(deleted)\n          queue.push({ str: deleted, distance: current.distance + 1 })\n        }\n      }\n    }\n\n    return deletes\n  }\n\n  /**\n   * Calculate Levenshtein edit distance between two strings\n   * Optimized for short strings (profanity words typically 3-15 chars)\n   */\n  private calculateEditDistance(str1: string, str2: string): number {\n    const len1 = str1.length\n    const len2 = str2.length\n\n    // Quick checks\n    if (len1 === 0) return len2\n    if (len2 === 0) return len1\n    if (str1 === str2) return 0\n\n    // Use single array for space optimization (only need previous row)\n    const prev = new Array(len2 + 1)\n    const curr = new Array(len2 + 1)\n\n    // Initialize first row\n    for (let j = 0; j <= len2; j++) {\n      prev[j] = j\n    }\n\n    // Dynamic programming\n    for (let i = 1; i <= len1; i++) {\n      curr[0] = i\n\n      for (let j = 1; j <= len2; j++) {\n        const cost = str1[i - 1] === str2[j - 1] ? 0 : 1\n\n        curr[j] = Math.min(\n          prev[j] + 1,      // deletion\n          curr[j - 1] + 1,  // insertion\n          prev[j - 1] + cost // substitution\n        )\n      }\n\n      // Swap arrays\n      for (let j = 0; j <= len2; j++) {\n        prev[j] = curr[j]\n      }\n    }\n\n    return prev[len2]\n  }\n\n  /**\n   * Get statistics about the index\n   */\n  getStats(): {\n    dictionarySize: number\n    deleteVariants: number\n    avgVariantsPerWord: number\n    memoryEstimateMB: number\n  } {\n    const dictionarySize = this.dictionary.size\n    const deleteVariants = this.deletes.size\n\n    // Estimate memory usage (very rough)\n    // Each string ~50 bytes, each Set entry ~20 bytes\n    const memoryEstimateBytes = (dictionarySize * 50) + (deleteVariants * 70)\n    const memoryEstimateMB = memoryEstimateBytes / (1024 * 1024)\n\n    return {\n      dictionarySize,\n      deleteVariants,\n      avgVariantsPerWord: dictionarySize > 0 ? deleteVariants / dictionarySize : 0,\n      memoryEstimateMB: memoryEstimateMB > 0 ? Math.max(0.01, Math.round(memoryEstimateMB * 100) / 100) : 0\n    }\n  }\n\n  /**\n   * Clear the index to free memory\n   */\n  clear(): void {\n    this.deletes.clear()\n    this.dictionary.clear()\n  }\n}\n","/**\n * Text normalization utilities for consistent profanity detection\n */\n\n/**\n * Normalize text for profanity detection - OPTIMIZED\n */\nexport function normalizeText(text: string): string {\n  if (!text || text.length === 0) return text\n\n  // Fast path for short texts\n  if (text.length <= 50) {\n    return normalizeShortText(text)\n  }\n\n  // Long text optimization\n  return normalizeLongText(text)\n}\n\n/**\n * Optimized normalization for short texts\n */\nfunction normalizeShortText(text: string): string {\n  return text\n    .toLowerCase()\n    .trim()\n    .replace(/\\s+/g, ' ')\n    .replace(/[_\\-.!@#$%^&()+=[\\]{}|\\\\:;\"'<>,?~`*]/g, '')\n    .replace(/[0]/g, 'o')\n    .replace(/[1]/g, 'i')\n    .replace(/[3]/g, 'e')\n    .replace(/[4]/g, 'a')\n    .replace(/[5]/g, 's')\n    .replace(/[7]/g, 't')\n    .replace(/[8]/g, 'b')\n    .replace(/(.)\\1{2,}/g, '$1$1')\n}\n\n/**\n * Optimized normalization for long texts with chunking\n */\nfunction normalizeLongText(text: string): string {\n  // For very long texts, we can use a simpler normalization\n  return text\n    .toLowerCase()\n    .trim()\n    .replace(/\\s+/g, ' ')\n    // Remove only the most common obfuscation characters for performance\n    .replace(/[_\\-.!@#$%^&*]/g, '')\n    // Apply character substitutions only at word boundaries\n    .replace(/\\b[0]\\b/g, 'o')\n    .replace(/\\b[1]\\b/g, 'i')\n    .replace(/\\b[3]\\b/g, 'e')\n    .replace(/\\b[4]\\b/g, 'a')\n    .replace(/\\b[5]\\b/g, 's')\n    .replace(/\\b[7]\\b/g, 't')\n    .replace(/\\b[8]\\b/g, 'b')\n    .replace(/(.)\\1{3,}/g, '$1$1') // Only reduce very long repetitions\n}\n\n/**\n * Extract words from text for individual analysis\n */\nexport function extractWords(text: string): string[] {\n  return text\n    .split(/\\s+/)\n    .filter(word => word.length > 0)\n    .map(word => word.replace(/[^\\w]/g, ''))\n    .filter(word => word.length > 1)\n}\n\n/**\n * Create variations of a word for detection\n */\nexport function createWordVariations(word: string): string[] {\n  const variations = new Set<string>()\n  variations.add(word)\n\n  // Add common letter substitutions\n  const substitutions: Record<string, string[]> = {\n    a: ['@', '4'],\n    e: ['3'],\n    i: ['1', '!'],\n    o: ['0'],\n    s: ['5', '$'],\n    t: ['7'],\n    b: ['8'],\n  }\n\n  // Generate variations with substitutions\n  let current = [word]\n  for (const [letter, replacements] of Object.entries(substitutions)) {\n    const next: string[] = []\n    for (const variant of current) {\n      next.push(variant)\n      for (const replacement of replacements) {\n        next.push(variant.replace(new RegExp(letter, 'g'), replacement))\n      }\n    }\n    current = next\n  }\n\n  current.forEach(v => variations.add(v))\n  return Array.from(variations)\n}\n\n/**\n * Calculate Levenshtein distance for fuzzy matching\n */\nexport function levenshteinDistance(a: string, b: string): number {\n  // Simple implementation without complex matrix access\n  if (a === b) return 0\n  if (a.length === 0) return b.length\n  if (b.length === 0) return a.length\n\n  // Type assertion to help TypeScript understand the matrix is properly initialized\n  const matrix = Array(b.length + 1).fill(null).map(() =>\n    Array(a.length + 1).fill(0)\n  ) as number[][]\n\n  // Initialize first row and column\n  for (let i = 0; i <= a.length; i++) {\n    // Matrix row 0 is guaranteed to exist by Array.from above\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    matrix[0]![i] = i\n  }\n  for (let j = 0; j <= b.length; j++) {\n    // All matrix rows are guaranteed to exist by Array.from above\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    matrix[j]![0] = j\n  }\n\n  // Fill matrix - all matrix indices within bounds are guaranteed by loop conditions\n  for (let j = 1; j <= b.length; j++) {\n    for (let i = 1; i <= a.length; i++) {\n      const cost = a[i - 1] === b[j - 1] ? 0 : 1\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      matrix[j]![i] = Math.min(\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        matrix[j - 1]![i]! + 1,     // deletion\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        matrix[j]![i - 1]! + 1,     // insertion\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        matrix[j - 1]![i - 1]! + cost // substitution\n      )\n    }\n  }\n\n  // Final indices guaranteed by matrix initialization\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  return matrix[b.length]![a.length]!\n}\n\n/**\n * Text normalizer configuration options\n */\nexport interface TextNormalizerOptions {\n  removeAccents?: boolean\n  expandContractions?: boolean\n  normalizeWhitespace?: boolean\n  preserveCase?: boolean\n}\n\n/**\n * Advanced text normalizer with configurable options\n */\nexport const textNormalizer = {\n  normalize: (text: string, options: TextNormalizerOptions = {}): string => {\n    let normalized = text\n\n    if (!options.preserveCase) {\n      normalized = normalized.toLowerCase()\n    }\n\n    if (options.normalizeWhitespace !== false) {\n      normalized = normalized.replace(/\\s+/g, ' ').trim()\n    }\n\n    if (options.removeAccents) {\n      normalized = normalized.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '')\n    }\n\n    if (options.expandContractions) {\n      const contractions: Record<string, string> = {\n        \"don't\": \"do not\",\n        \"doesn't\": \"does not\",\n        \"didn't\": \"did not\",\n        \"won't\": \"will not\",\n        \"can't\": \"cannot\",\n        \"isn't\": \"is not\",\n        \"aren't\": \"are not\",\n        \"wasn't\": \"was not\",\n        \"weren't\": \"were not\",\n        \"haven't\": \"have not\",\n        \"hasn't\": \"has not\",\n        \"hadn't\": \"had not\",\n        \"wouldn't\": \"would not\",\n        \"shouldn't\": \"should not\",\n        \"couldn't\": \"could not\"\n      }\n\n      for (const [contraction, expansion] of Object.entries(contractions)) {\n        normalized = normalized.replace(new RegExp(contraction, 'gi'), expansion)\n      }\n    }\n\n    return normalized\n  }\n}\n","/**\n * Advanced profanity matcher with context-aware detection\n * Handles severity scoring, word boundaries, and false positive reduction\n */\n\nimport type {\n  DetectionMatch,\n  SeverityLevel,\n  ProfanityCategory,\n  LanguageCode,\n  CustomWord\n} from '../types/index.js'\nimport { ProfanityTrie, type TrieMatch, type TrieNodeData } from './trie.js'\nimport { SymSpellIndex } from './symspell.js'\nimport { textNormalizer } from '../utils/text-normalizer.js'\n\n/**\n * Context information for a potential match\n */\ninterface MatchContext {\n  /** Text before the match */\n  before: string\n  /** Text after the match */\n  after: string\n  /** Full sentence containing the match */\n  sentence: string\n  /** Position within the sentence */\n  sentencePosition: number\n}\n\n/**\n * Configuration for the profanity matcher\n */\nexport interface MatcherConfig {\n  /** Languages to detect */\n  languages: LanguageCode[]\n  /** Minimum severity level to report */\n  minSeverity: SeverityLevel\n  /** Categories to detect */\n  categories: ProfanityCategory[]\n  /** Enable fuzzy matching */\n  fuzzyMatching: boolean\n  /** Fuzzy matching threshold (0-1) */\n  fuzzyThreshold: number\n  /** Words to whitelist */\n  whitelist: string[]\n  /** Enable context-aware filtering */\n  contextAware: boolean\n  /** Minimum word length to consider */\n  minWordLength: number\n  /** Maximum edit distance for fuzzy matches */\n  maxEditDistance: number\n}\n\n/**\n * High-performance profanity matcher with advanced features\n */\nexport class ProfanityMatcher {\n  private tries: Map<LanguageCode, ProfanityTrie> = new Map()\n  private symSpellIndices: Map<LanguageCode, SymSpellIndex> = new Map()\n  private whitelist: Set<string> = new Set()\n  private config: MatcherConfig\n  private commonWords: Set<string> = new Set()\n  private contextPatterns: Map<string, RegExp> = new Map()\n\n  // Performance optimizations\n  private matchCache = new Map<string, DetectionMatch[]>()\n  private readonly MAX_CACHE_SIZE = 500\n  private cacheHits = 0\n  private cacheMisses = 0\n  private normalizationCache = new Map<string, string>()\n  private readonly MAX_NORMALIZATION_CACHE = 1000\n\n  constructor(config: MatcherConfig) {\n    this.config = config\n    this.initializeWhitelist()\n    this.initializeCommonWords()\n    this.initializeContextPatterns()\n  }\n\n  /**\n   * Load profanity words for a specific language\n   */\n  async loadLanguage(\n    language: LanguageCode,\n    words: ReadonlyArray<{\n      readonly word: string\n      readonly severity: SeverityLevel\n      readonly categories: readonly ProfanityCategory[]\n      readonly variations?: readonly string[]\n      readonly caseSensitive?: boolean\n    }>\n  ): Promise<void> {\n    const trie = new ProfanityTrie()\n\n    for (const wordData of words) {\n      // Skip null, undefined, or malformed entries\n      if (!wordData || typeof wordData !== 'object') {\n        continue\n      }\n\n      // Skip entries with empty or invalid word\n      if (!wordData.word || typeof wordData.word !== 'string' || wordData.word.trim().length === 0) {\n        continue\n      }\n\n      // Skip entries that don't meet config criteria\n      if (!this.shouldIncludeWord(wordData)) {\n        continue\n      }\n\n      const trieData: TrieNodeData = {\n        word: wordData.word,\n        severity: wordData.severity,\n        categories: [...wordData.categories],\n        language,\n        caseSensitive: wordData.caseSensitive ?? false,\n        confidence: 1.0\n      }\n\n      // Insert base word\n      trie.insert(wordData.word, trieData)\n\n      // Insert variations if provided\n      if (wordData.variations && wordData.variations.length > 0) {\n        trie.insertWithVariations(wordData.word, wordData.variations, trieData)\n      }\n    }\n\n    // Compile for optimal performance\n    trie.compile()\n    this.tries.set(language, trie)\n\n    // Build SymSpell index for fast fuzzy matching\n    if (this.config.fuzzyMatching) {\n      const symSpell = new SymSpellIndex({\n        maxEditDistance: this.config.maxEditDistance,\n        caseSensitive: false\n      })\n\n      // Extract all words for SymSpell index\n      const allWords = words\n        .filter(w => w && w.word && this.shouldIncludeWord(w))\n        .map(w => w.word)\n\n      symSpell.buildIndex(allWords)\n      this.symSpellIndices.set(language, symSpell)\n    }\n  }\n\n  /**\n   * Add custom words to the matcher\n   */\n  addCustomWords(customWords: CustomWord[]): void {\n    for (const customWord of customWords) {\n      const trie = this.tries.get(customWord.language)\n      if (!trie) continue\n\n      const trieData: TrieNodeData = {\n        word: customWord.word,\n        severity: customWord.severity,\n        categories: customWord.categories,\n        language: customWord.language,\n        caseSensitive: customWord.caseSensitive ?? false,\n        confidence: 0.9 // Slightly lower confidence for custom words\n      }\n\n      trie.insert(customWord.word, trieData)\n\n      // Insert variations if provided\n      if (customWord.variations && customWord.variations.length > 0) {\n        trie.insertWithVariations(customWord.word, customWord.variations, trieData)\n      }\n    }\n  }\n\n  /**\n   * Find all profanity matches in text - OPTIMIZED WITH CACHING\n   */\n  findMatches(\n    text: string,\n    detectedLanguages: LanguageCode[] = ['en'],\n    caseSensitive = false\n  ): DetectionMatch[] {\n    if (!text || text.length === 0) {\n      return []\n    }\n\n    // Quick check for very short texts\n    if (text.length < 3) {\n      return []\n    }\n\n    // Check cache first\n    const cachedMatches = this.getCachedMatches(text, detectedLanguages, caseSensitive)\n    if (cachedMatches) {\n      return cachedMatches\n    }\n\n    // Cache normalization results for repeated texts\n    const cacheKey = `${caseSensitive ? 'cs' : 'ci'}:${text.substring(0, 100)}`\n\n    let normalizedText: string\n    if (this.normalizationCache.has(cacheKey)) {\n      const cached = this.normalizationCache.get(cacheKey)\n      normalizedText = cached || textNormalizer.normalize(text, {\n        removeAccents: true,\n        expandContractions: true,\n        normalizeWhitespace: true,\n        preserveCase: caseSensitive\n      })\n    } else {\n      normalizedText = textNormalizer.normalize(text, {\n        removeAccents: true,\n        expandContractions: true,\n        normalizeWhitespace: true,\n        preserveCase: caseSensitive\n      })\n      if (this.normalizationCache.size < this.MAX_NORMALIZATION_CACHE) {\n        this.normalizationCache.set(cacheKey, normalizedText)\n      }\n    }\n\n    const allMatches: DetectionMatch[] = []\n\n    // Search in each detected language with early termination\n    for (const language of detectedLanguages) {\n      if (language === 'auto') continue\n\n      const trie = this.tries.get(language)\n      if (!trie) continue\n\n      // Early termination if we already have enough matches\n      if (allMatches.length >= 100) {\n        break\n      }\n\n      // Find exact matches first (fastest)\n      // Limit matches to prevent performance issues with very large texts\n      const remainingCapacity = 100 - allMatches.length\n      const exactMatches = trie.multiPatternSearch(normalizedText, caseSensitive, remainingCapacity)\n\n      // PERFORMANCE OPTIMIZATION: SymSpell fuzzy search (40-80x faster than BFS)\n      // SymSpell is so fast we can use it on all text sizes without restrictions\n      let fuzzyMatches: TrieMatch[] = []\n      if (this.config.fuzzyMatching && allMatches.length < 50) {\n        fuzzyMatches = this.symSpellFuzzySearch(language, normalizedText, text, caseSensitive)\n      }\n\n      // Convert to detection matches and add them to allMatches\n      // Use for loop instead of spread operator to prevent stack overflow with large arrays\n      for (const match of exactMatches) {\n        allMatches.push(this.convertToDetectionMatch(match, text, language))\n        if (allMatches.length >= 100) break\n      }\n\n      // Only process fuzzy matches if we still have room\n      if (allMatches.length < 100) {\n        for (const match of fuzzyMatches) {\n          allMatches.push(this.convertToDetectionMatch(match, text, language))\n          if (allMatches.length >= 100) break\n        }\n      }\n    }\n\n    // Filter and process matches\n    const filteredMatches = this.filterMatches(allMatches, text)\n    const contextFilteredMatches = this.config.contextAware\n      ? this.applyContextFiltering(filteredMatches, text)\n      : filteredMatches\n\n    // Remove overlapping matches (keep highest severity)\n    const deduplicatedMatches = this.deduplicateMatches(contextFilteredMatches)\n\n    // Sort by position and apply final confidence adjustments\n    const finalMatches = deduplicatedMatches\n      .map(match => this.adjustConfidence(match, text))\n      .sort((a, b) => a.start - b.start)\n\n    // Cache the results\n    this.cacheMatches(text, detectedLanguages, caseSensitive, finalMatches)\n\n    return finalMatches\n  }\n\n  /**\n   * Perform ultra-fast fuzzy search using SymSpell algorithm\n   * 40-80x faster than traditional BFS approach\n   */\n  private symSpellFuzzySearch(\n    language: LanguageCode,\n    normalizedText: string,\n    originalText: string,\n    caseSensitive: boolean\n  ): TrieMatch[] {\n    const symSpell = this.symSpellIndices.get(language)\n    const trie = this.tries.get(language)\n\n    if (!symSpell || !trie) return []\n\n    // Extract unique words from text with their positions\n    const wordPattern = /\\b\\w+\\b/g\n    const words = new Set<string>()\n    const wordPositions = new Map<string, number[]>()\n\n    let match\n    while ((match = wordPattern.exec(normalizedText)) !== null) {\n      const word = match[0]\n      if (word.length >= this.config.minWordLength) {\n        words.add(word)\n        let positions = wordPositions.get(word)\n        if (!positions) {\n          positions = []\n          wordPositions.set(word, positions)\n        }\n        positions.push(match.index)\n      }\n    }\n\n    // Use SymSpell to find fuzzy matches for each unique word\n    const matches: TrieMatch[] = []\n    for (const word of words) {\n      const symSpellMatches = symSpell.lookup(word, this.config.maxEditDistance)\n\n      // For each SymSpell match, get metadata from Trie and create TrieMatch\n      for (const symMatch of symSpellMatches) {\n        // Get word data from Trie\n        const trieData = this.getTrieData(trie, symMatch.word, caseSensitive)\n        if (!trieData) continue\n\n        // Map to all positions where this word appears\n        const positions = wordPositions.get(word)\n        if (positions) {\n          for (const position of positions) {\n            matches.push({\n              word: originalText.substring(position, position + word.length),\n              start: position,\n              end: position + word.length,\n              data: trieData,\n              editDistance: symMatch.editDistance\n            })\n          }\n        }\n      }\n    }\n\n    return matches\n  }\n\n  /**\n   * Get Trie data for a word (helper for SymSpell integration)\n   */\n  private getTrieData(trie: ProfanityTrie, word: string, caseSensitive: boolean): TrieNodeData | null {\n    const searchWord = caseSensitive ? word : word.toLowerCase()\n\n    // Navigate through the trie to find the word\n    let node = trie.root\n    for (const char of searchWord) {\n      const child = node.getChild(char)\n      if (!child) return null\n      node = child\n    }\n\n    return node.isEndOfWord ? node.data : null\n  }\n\n  /**\n   * Convert Trie match to Detection match - OPTIMIZED\n   */\n  private convertToDetectionMatch(\n    trieMatch: TrieMatch,\n    originalText: string,\n    language: LanguageCode\n  ): DetectionMatch {\n    let confidence = trieMatch.data.confidence || 1.0\n\n    // Reduce confidence for fuzzy matches (less aggressive reduction)\n    if (trieMatch.editDistance && trieMatch.editDistance > 0) {\n      confidence *= Math.max(0.5, 1.0 - (trieMatch.editDistance * 0.2))\n    }\n\n    // Use direct indexing for substring - much faster\n    let actualWord: string\n    try {\n      actualWord = originalText.substring(trieMatch.start, trieMatch.end)\n    } catch {\n      // Fallback if indices are out of bounds\n      actualWord = trieMatch.word\n    }\n\n    return {\n      word: actualWord,\n      match: trieMatch.data.word,\n      start: trieMatch.start,\n      end: trieMatch.end,\n      severity: trieMatch.data.severity,\n      categories: trieMatch.data.categories,\n      language,\n      confidence\n    }\n  }\n\n  /**\n   * Filter matches based on configuration and common patterns\n   */\n  private filterMatches(matches: DetectionMatch[], text: string): DetectionMatch[] {\n    return matches.filter(match => {\n      // Check minimum severity\n      if (match.severity < this.config.minSeverity) {\n        return false\n      }\n\n      // Check categories\n      if (this.config.categories.length > 0) {\n        const hasRequiredCategory = match.categories.some(cat =>\n          this.config.categories.includes(cat)\n        )\n        if (!hasRequiredCategory) {\n          return false\n        }\n      }\n\n      // Check whitelist\n      if (this.isWhitelisted(match.word)) {\n        return false\n      }\n\n      // Check minimum word length\n      if (match.word.length < this.config.minWordLength) {\n        return false\n      }\n\n      // Check if it's a common word (potential false positive)\n      // Only filter out common words if they're very low severity (1) AND have low confidence\n      // Check both the actual word and the dictionary match (for fuzzy matches)\n      if ((this.isCommonWord(match.word) || this.isCommonWord(match.match)) && match.severity <= 1 && match.confidence < 0.8) {\n        return false\n      }\n\n      // Check word boundaries\n      if (!this.hasProperWordBoundaries(match, text)) {\n        return false\n      }\n\n      return true\n    })\n  }\n\n  /**\n   * Apply context-aware filtering to reduce false positives\n   */\n  private applyContextFiltering(matches: DetectionMatch[], text: string): DetectionMatch[] {\n    return matches.filter(match => {\n      const context = this.getMatchContext(match, text)\n\n      // Check for negating context (e.g., \"not bad\")\n      if (this.hasNegatingContext(context)) {\n        return false\n      }\n\n      // Check for technical/medical context\n      if (this.hasTechnicalContext(context)) {\n        return false\n      }\n\n      // Check for quoted context (might be discussing the word)\n      if (this.hasQuotedContext(context)) {\n        match.confidence *= 0.7 // Reduce confidence but don't eliminate\n      }\n\n      // Adjust confidence based on context\n      const contextConfidence = this.calculateContextConfidence(context)\n      match.confidence *= contextConfidence\n\n      return match.confidence >= 0.3 // Minimum confidence threshold\n    })\n  }\n\n  /**\n   * Get context information for a match - OPTIMIZED\n   */\n  private getMatchContext(match: DetectionMatch, text: string): MatchContext {\n    // Use smaller context window for better performance\n    const contextSize = 25\n    const beforeStart = Math.max(0, match.start - contextSize)\n    const afterEnd = Math.min(text.length, match.end + contextSize)\n\n    // Optimized substring extraction\n    const before = text.slice(beforeStart, match.start).trim()\n    const after = text.slice(match.end, afterEnd).trim()\n\n    // Simplified sentence detection\n    const sentenceStart = text.lastIndexOf('.', match.start - 1) + 1\n    const sentenceEnd = text.indexOf('.', match.end + 1)\n\n    const sentence = text.slice(\n      Math.max(0, sentenceStart),\n      sentenceEnd > 0 ? sentenceEnd : text.length\n    ).trim()\n\n    const sentencePosition = match.start - Math.max(0, sentenceStart)\n\n    return {\n      before,\n      after,\n      sentence,\n      sentencePosition\n    }\n  }\n\n  /**\n   * Check for negating context\n   */\n  private hasNegatingContext(context: MatchContext): boolean {\n    const negatingWords = ['not', \"don't\", \"doesn't\", 'never', 'hardly', 'barely']\n    const beforeWords = context.before.toLowerCase().split(/\\s+/)\n\n    // Check if negating word appears within 3 words before\n    for (let i = Math.max(0, beforeWords.length - 3); i < beforeWords.length; i++) {\n      const word = beforeWords[i]\n      if (word && negatingWords.includes(word)) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  /**\n   * Check for technical/medical context\n   */\n  private hasTechnicalContext(context: MatchContext): boolean {\n    const technicalIndicators = [\n      'medical', 'technical', 'definition', 'terminology', 'glossary',\n      'dictionary', 'research', 'study', 'analysis', 'academic'\n    ]\n\n    const fullContext = (context.before + ' ' + context.after).toLowerCase()\n\n    return technicalIndicators.some(indicator => fullContext.includes(indicator))\n  }\n\n  /**\n   * Check for quoted context\n   */\n  private hasQuotedContext(context: MatchContext): boolean {\n    const quoteBefore = context.before.includes('\"') || context.before.includes(\"'\")\n    const quoteAfter = context.after.includes('\"') || context.after.includes(\"'\")\n\n    return quoteBefore && quoteAfter\n  }\n\n  /**\n   * Calculate confidence based on context\n   */\n  private calculateContextConfidence(context: MatchContext): number {\n    let confidence = 1.0\n\n    // Reduce confidence for very short sentences (fragments)\n    // Only penalize very short fragments (< 10 chars) as they lack context\n    if (context.sentence.length < 10) {\n      confidence *= 0.8\n    }\n\n    // Reduce confidence if word is at the very beginning or end of text\n    if (context.sentencePosition < 5 || context.sentencePosition > context.sentence.length - 10) {\n      confidence *= 0.9\n    }\n\n    // Check for surrounding profanity (increases confidence)\n    const surroundingText = context.before + ' ' + context.after\n    if (this.hasSurroundingProfanity(surroundingText)) {\n      confidence *= 1.2\n    }\n\n    return Math.min(1.0, Math.max(0.1, confidence))\n  }\n\n  /**\n   * Check if there's surrounding profanity (quick check)\n   */\n  private hasSurroundingProfanity(text: string): boolean {\n    // Quick regex-based check for common profanity patterns\n    const patterns = [\n      /\\b(damn|hell|crap|shit|fuck|ass|bitch)\\b/i,\n      /[!@#$%^&*]{2,}/, // Multiple special characters\n      /[A-Z]{3,}/ // All caps words\n    ]\n\n    return patterns.some(pattern => pattern.test(text))\n  }\n\n  /**\n   * Remove overlapping matches, keeping the highest severity\n   */\n  private deduplicateMatches(matches: DetectionMatch[]): DetectionMatch[] {\n    if (matches.length === 0) return matches\n\n    // Sort by start position, then by severity (descending)\n    const sorted = matches.sort((a, b) => {\n      if (a.start !== b.start) return a.start - b.start\n      return b.severity - a.severity\n    })\n\n    const result: DetectionMatch[] = []\n    let lastEnd = -1\n\n    for (const match of sorted) {\n      // Skip if this match overlaps with the previous one\n      if (match.start < lastEnd) {\n        // Check if this match is significantly better\n        const lastMatch = result[result.length - 1]\n        if (lastMatch && (match.severity > lastMatch.severity ||\n            (match.severity === lastMatch.severity && match.confidence > lastMatch.confidence))) {\n          // Replace the last match with this better one\n          result[result.length - 1] = match\n          lastEnd = match.end\n        }\n        continue\n      }\n\n      result.push(match)\n      lastEnd = match.end\n    }\n\n    return result\n  }\n\n  /**\n   * Adjust confidence based on various factors\n   */\n  private adjustConfidence(match: DetectionMatch, _text: string): DetectionMatch {\n    let confidence = match.confidence\n\n    // Boost confidence for exact matches\n    if (match.word.toLowerCase() === match.match.toLowerCase()) {\n      confidence *= 1.1\n    }\n\n    // Reduce confidence for very short matched text (not the dictionary word)\n    // Use the actual matched text length, not the dictionary word length\n    if (match.match.length <= 3) {\n      confidence *= 0.8\n    }\n\n    // Boost confidence for high-severity words\n    if (match.severity >= 3) {\n      confidence *= 1.1\n    }\n\n    // Reduce confidence if word contains numbers (often false positives)\n    if (/\\d/.test(match.word)) {\n      confidence *= 0.7\n    }\n\n    // Cap confidence at 1.0\n    confidence = Math.min(1.0, Math.max(0.1, confidence))\n\n    return {\n      ...match,\n      confidence: Math.round(confidence * 100) / 100 // Round to 2 decimal places\n    }\n  }\n\n  /**\n   * Check if word should be included based on config\n   */\n  private shouldIncludeWord(wordData: {\n    readonly word: string\n    readonly severity: SeverityLevel\n    readonly categories: readonly ProfanityCategory[]\n  }): boolean {\n    // Check minimum severity\n    if (wordData.severity < this.config.minSeverity) {\n      return false\n    }\n\n    // Check categories\n    if (this.config.categories.length > 0) {\n      const hasRequiredCategory = wordData.categories.some(cat =>\n        this.config.categories.includes(cat)\n      )\n      if (!hasRequiredCategory) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  /**\n   * Check if word is whitelisted\n   */\n  private isWhitelisted(word: string): boolean {\n    return this.whitelist.has(word.toLowerCase())\n  }\n\n  /**\n   * Check if word is a common word (potential false positive)\n   */\n  private isCommonWord(word: string): boolean {\n    return this.commonWords.has(word.toLowerCase())\n  }\n\n  /**\n   * Check if match has proper word boundaries\n   */\n  private hasProperWordBoundaries(match: DetectionMatch, text: string): boolean {\n    const beforeChar = match.start > 0 ? text[match.start - 1] : ' '\n    const afterChar = match.end < text.length ? text[match.end] : ' '\n\n    const isWordChar = (char: string | undefined) => char ? /[a-zA-Z0-9]/.test(char) : false\n\n    return !isWordChar(beforeChar) && !isWordChar(afterChar)\n  }\n\n  /**\n   * Initialize whitelist with common false positives\n   */\n  private initializeWhitelist(): void {\n    const defaultWhitelist = [\n      'assess', 'assessment', 'classic', 'glass', 'class', 'pass',\n      'bass', 'mass', 'grass', 'brass', 'assistance', 'associate',\n      'assumption', 'expression', 'impression', 'depression',\n      'aggression', 'regression', 'progression', 'succession',\n      'text', 'context', 'pretext', 'subtext', 'texture', // Words that fuzzy match 'sex'\n      'this', 'that', 'these', 'those', 'with', 'from', // Common words that fuzzy match profanity\n      'and', 'the', 'for', 'are', 'but', 'not', 'you', 'all', 'can', 'her', 'was', 'one', 'our' // Very common English words\n    ]\n\n    for (const word of [...defaultWhitelist, ...this.config.whitelist]) {\n      this.whitelist.add(word.toLowerCase())\n    }\n  }\n\n  /**\n   * Initialize common words that might cause false positives\n   * Note: Words that are explicitly in profanity databases should not be filtered here\n   */\n  private initializeCommonWords(): void {\n    const commonWords = [\n      'god', 'gay', 'sex', 'sexy', // Words that can be legitimate in non-profane contexts\n      'kill', 'die', 'dead', 'hate', // Violent words that can be used legitimately\n      'stupid', 'idiot', 'moron', 'bad' // General insults that might be mild\n    ]\n\n    for (const word of commonWords) {\n      this.commonWords.add(word.toLowerCase())\n    }\n  }\n\n  /**\n   * Initialize context patterns for better detection\n   */\n  private initializeContextPatterns(): void {\n    this.contextPatterns.set('technical', /\\b(definition|meaning|term|word|etymology|origin)\\b/i)\n    this.contextPatterns.set('quoted', /[\"'].*?[\"']/g)\n    this.contextPatterns.set('medical', /\\b(medical|clinical|diagnosis|symptom|condition)\\b/i)\n    this.contextPatterns.set('academic', /\\b(research|study|paper|thesis|academic|scholarly)\\b/i)\n  }\n\n  /**\n   * Get matcher statistics with performance metrics\n   */\n  getStats(): {\n    totalLanguages: number\n    totalWords: number\n    trieStats: Record<string, {\n      totalWords: number\n      totalNodes: number\n      averageDepth: number\n      maxDepth: number\n      memoryUsage: number\n    }>\n    cacheStats: {\n      hits: number\n      misses: number\n      hitRate: number\n      size: number\n    }\n    normalizationCacheSize: number\n  } {\n    const trieStats: Record<string, {\n      totalWords: number\n      totalNodes: number\n      averageDepth: number\n      maxDepth: number\n      memoryUsage: number\n    }> = {}\n    let totalWords = 0\n\n    for (const [language, trie] of this.tries) {\n      const stats = trie.getStats()\n      trieStats[language] = stats\n      totalWords += stats.totalWords\n    }\n\n    const totalCacheRequests = this.cacheHits + this.cacheMisses\n\n    return {\n      totalLanguages: this.tries.size,\n      totalWords,\n      trieStats,\n      cacheStats: {\n        hits: this.cacheHits,\n        misses: this.cacheMisses,\n        hitRate: totalCacheRequests > 0 ? this.cacheHits / totalCacheRequests : 0,\n        size: this.matchCache.size\n      },\n      normalizationCacheSize: this.normalizationCache.size\n    }\n  }\n\n  /**\n   * Update matcher configuration\n   */\n  updateConfig(newConfig: Partial<MatcherConfig>): void {\n    this.config = { ...this.config, ...newConfig }\n\n    // Clear caches when config changes\n    this.clearCaches()\n\n    // Reinitialize whitelist if it changed\n    if (newConfig.whitelist) {\n      this.whitelist.clear()\n      this.initializeWhitelist()\n    }\n  }\n\n  /**\n   * Clear all caches for memory management\n   */\n  clearCaches(): void {\n    this.matchCache.clear()\n    this.normalizationCache.clear()\n    this.cacheHits = 0\n    this.cacheMisses = 0\n  }\n\n  /**\n   * Get cached matches for a text\n   */\n  private getCachedMatches(text: string, languages: LanguageCode[], caseSensitive: boolean): DetectionMatch[] | null {\n    const cacheKey = this.getCacheKey(text, languages, caseSensitive)\n    if (this.matchCache.has(cacheKey)) {\n      this.cacheHits++\n      const cached = this.matchCache.get(cacheKey)\n      return cached || null\n    }\n    this.cacheMisses++\n    return null\n  }\n\n  /**\n   * Cache matches for a text\n   */\n  private cacheMatches(text: string, languages: LanguageCode[], caseSensitive: boolean, matches: DetectionMatch[]): void {\n    const cacheKey = this.getCacheKey(text, languages, caseSensitive)\n\n    if (this.matchCache.size >= this.MAX_CACHE_SIZE) {\n      // Remove oldest entries (LRU)\n      const keysToDelete = Array.from(this.matchCache.keys()).slice(0, Math.floor(this.MAX_CACHE_SIZE * 0.2))\n      for (const key of keysToDelete) {\n        this.matchCache.delete(key)\n      }\n    }\n\n    this.matchCache.set(cacheKey, matches)\n  }\n\n  /**\n   * Generate cache key for text and configuration\n   */\n  private getCacheKey(text: string, languages: LanguageCode[], caseSensitive: boolean): string {\n    // Use a shorter version of text for cache key to save memory\n    const textKey = text.length > 100 ? text.substring(0, 100) : text\n    const langKey = languages.sort().join(',')\n    return `${caseSensitive ? 'cs' : 'ci'}:${langKey}:${textKey}`\n  }\n}","/**\n * Advanced filtering engine with multiple modes and structure preservation\n * Supports censoring, removal, replacement, and custom filtering strategies\n */\n\nimport type {\n  DetectionMatch,\n  FilterMode,\n  EnhancedDetectionMatch,\n} from '../types/index.js'\nimport { FilterMode as FilterModeEnum } from '../types/index.js'\n\n/**\n * Configuration for filtering operations\n */\nexport interface FilterConfig {\n  /** Filtering mode to apply */\n  mode: FilterMode\n  /** Character to use for censoring */\n  replacementChar: string\n  /** Whether to preserve word structure when censoring */\n  preserveStructure: boolean\n  /** Custom replacement words/phrases */\n  customReplacements: Map<string, string>\n  /** Whether to preserve sentence structure */\n  preserveSentenceStructure: boolean\n  /** Whether to maintain original text length */\n  maintainLength: boolean\n  /** Minimum confidence threshold for filtering */\n  confidenceThreshold: number\n  /** Whether to apply gradual filtering based on severity */\n  gradualFiltering: boolean\n  /** Replacement patterns for different categories */\n  categoryReplacements: Map<string, string[]>\n}\n\n/**\n * Result of a filtering operation\n */\nexport interface FilterResult {\n  /** The filtered text */\n  filteredText: string\n  /** Number of words that were filtered */\n  filteredCount: number\n  /** Details about what was filtered */\n  filterDetails: FilterDetail[]\n  /** Whether the text structure was preserved */\n  structurePreserved: boolean\n  /** Original text length vs filtered text length */\n  lengthComparison: {\n    original: number\n    filtered: number\n    difference: number\n  }\n}\n\n/**\n * Details about a specific filter operation\n */\nexport interface FilterDetail {\n  /** Original word that was filtered */\n  originalWord: string\n  /** What it was replaced with */\n  replacement: string\n  /** Position in the text */\n  position: { start: number; end: number }\n  /** Why it was filtered */\n  reason: string\n  /** Confidence of the match */\n  confidence: number\n  /** Filter method used */\n  method: 'censor' | 'remove' | 'replace' | 'custom'\n}\n\n/**\n * Advanced text filtering engine\n */\nexport class ProfanityFilter {\n  private config: FilterConfig\n\n  constructor(config: Partial<FilterConfig> = {}) {\n    this.config = this.mergeWithDefaults(config)\n  }\n\n  /**\n   * Legacy method for backward compatibility\n   */\n  applyFilter(\n    text: string,\n    matches: DetectionMatch[],\n    mode: FilterMode,\n    replacementChar: string = '*',\n    preserveStructure: boolean = true\n  ): string {\n    const result = this.filter(text, matches, {\n      mode,\n      replacementChar,\n      preserveStructure\n    })\n    return result.filteredText\n  }\n\n  /**\n   * Filter text based on detected matches\n   */\n  filter(\n    text: string,\n    matches: DetectionMatch[] | EnhancedDetectionMatch[],\n    customConfig?: Partial<FilterConfig>\n  ): FilterResult {\n    const effectiveConfig = customConfig\n      ? { ...this.config, ...customConfig }\n      : this.config\n\n    // Handle empty text\n    if (!text || text.length === 0) {\n      return this.createEmptyResult(text)\n    }\n\n    // Normalize and validate matches - fix positions if they're wrong\n    const normalizedMatches = matches.map(match => this.normalizeMatch(match, text))\n\n    // Filter matches by confidence threshold and validate positions\n    const qualifyingMatches = normalizedMatches.filter(match => {\n      // Check confidence threshold\n      if (match.confidence < effectiveConfig.confidenceThreshold) {\n        return false\n      }\n\n      // Validate match positions are within text bounds\n      if (match.start < 0 || match.end > text.length || match.start >= match.end) {\n        return false\n      }\n\n      return true\n    })\n\n    if (qualifyingMatches.length === 0) {\n      return this.createEmptyResult(text)\n    }\n\n    // Sort matches by position (reverse order for easier replacement)\n    const sortedMatches = [...qualifyingMatches].sort((a, b) => b.start - a.start)\n\n    let filteredText = text\n    const filterDetails: FilterDetail[] = []\n\n    for (const match of sortedMatches) {\n      const filterResult = this.filterSingleMatch(\n        filteredText,\n        match,\n        effectiveConfig\n      )\n\n      filteredText = filterResult.text\n      filterDetails.push(filterResult.detail)\n    }\n\n    // Post-processing\n    if (effectiveConfig.preserveSentenceStructure) {\n      // Check if any match was at the beginning of the text\n      const hadMatchAtStart = qualifyingMatches.some(m => m.start === 0)\n      filteredText = this.preserveSentenceStructure(filteredText, hadMatchAtStart)\n    }\n\n    return {\n      filteredText,\n      filteredCount: filterDetails.length,\n      filterDetails: filterDetails.reverse(), // Reverse to match original order\n      structurePreserved: effectiveConfig.preserveStructure,\n      lengthComparison: {\n        original: text.length,\n        filtered: filteredText.length,\n        difference: filteredText.length - text.length\n      }\n    }\n  }\n\n  /**\n   * Normalize match positions - find actual word position in text if positions are wrong\n   */\n  private normalizeMatch(match: DetectionMatch, text: string): DetectionMatch {\n    // If positions are valid and match the word, keep them\n    const substring = text.substring(match.start, match.end)\n    const matchWord = match.match.toLowerCase()\n\n    if (substring.toLowerCase() === matchWord) {\n      return match\n    }\n\n    // Positions are wrong - try to find the actual position\n    // Use case-insensitive search\n    const textLower = text.toLowerCase()\n    const index = textLower.indexOf(matchWord)\n\n    if (index !== -1) {\n      return {\n        ...match,\n        start: index,\n        end: index + matchWord.length\n      }\n    }\n\n    // If we still can't find it, return original (will be filtered out later)\n    return match\n  }\n\n  /**\n   * Filter a single match from text\n   */\n  private filterSingleMatch(\n    text: string,\n    match: DetectionMatch,\n    config: FilterConfig\n  ): { text: string; detail: FilterDetail } {\n    const originalWord = text.substring(match.start, match.end)\n    let replacement = ''\n    let method: FilterDetail['method'] = 'censor'\n    let reason = `${config.mode} applied`\n\n    switch (config.mode) {\n      case FilterModeEnum.CENSOR:\n        replacement = this.generateCensorReplacement(originalWord, config)\n        method = 'censor'\n        // Apply gradual filtering only for CENSOR mode\n        if (config.gradualFiltering) {\n          replacement = this.applyGradualFiltering(originalWord, match, replacement, config)\n          reason += ' (gradual filtering applied)'\n        }\n        break\n\n      case FilterModeEnum.REMOVE:\n        replacement = this.generateRemovalReplacement(originalWord, text, match.start, match.end)\n        method = 'remove'\n        break\n\n      case FilterModeEnum.REPLACE:\n        replacement = this.generateReplaceReplacement(match, config)\n        method = 'replace'\n        break\n\n      case FilterModeEnum.DETECT_ONLY:\n        return {\n          text,\n          detail: {\n            originalWord,\n            replacement: originalWord,\n            position: { start: match.start, end: match.end },\n            reason: 'detect only mode - no filtering applied',\n            confidence: match.confidence,\n            method: 'custom'\n          }\n        }\n    }\n\n    // Apply custom replacements if available\n    const customReplacement = this.getCustomReplacement(originalWord, match, config)\n    if (customReplacement) {\n      replacement = customReplacement\n      method = 'custom'\n      reason = 'custom replacement applied'\n    }\n\n    // Replace in text\n    let newText = text.substring(0, match.start) + replacement + text.substring(match.end)\n\n    const detail: FilterDetail = {\n      originalWord,\n      replacement,\n      position: { start: match.start, end: match.start + replacement.length },\n      reason,\n      confidence: match.confidence,\n      method\n    }\n\n    return { text: newText, detail }\n  }\n\n\n  /**\n   * Generate censoring replacement\n   */\n  private generateCensorReplacement(word: string, config: FilterConfig): string {\n    if (!config.preserveStructure) {\n      return config.replacementChar.repeat(word.length)\n    }\n\n    let replacement = ''\n\n    for (let i = 0; i < word.length; i++) {\n      const char = word[i]\n\n      if (!char) continue\n\n      if (/[a-zA-Z]/.test(char)) {\n        // Replace ALL letters with replacement character (full censoring)\n        replacement += config.replacementChar\n      } else if (/\\d/.test(char)) {\n        // Replace numbers with '#'\n        replacement += '#'\n      } else {\n        // Keep punctuation and special characters\n        replacement += char\n      }\n    }\n\n    return replacement\n  }\n\n  /**\n   * Generate removal replacement\n   */\n  private generateRemovalReplacement(\n    _word: string,\n    _text: string,\n    _start: number,\n    _end: number\n  ): string {\n    // In REMOVE mode, just remove the word completely\n    // The spaces around it will remain from the original text\n    return ''\n  }\n\n  /**\n   * Generate replacement word/phrase\n   */\n  private generateReplaceReplacement(\n    match: DetectionMatch,\n    config: FilterConfig\n  ): string {\n    // Try category-specific replacements first\n    for (const category of match.categories) {\n      const categoryReplacements = config.categoryReplacements.get(category)\n      if (categoryReplacements && categoryReplacements.length > 0) {\n        // Pick replacement based on severity for deterministic results\n        const replacement = this.selectReplacementBySeverity(\n          match.severity,\n          categoryReplacements\n        )\n        if (replacement) return replacement\n      }\n    }\n\n    // Fallback replacements based on severity - deterministic choices for each severity\n    switch (match.severity) {\n      case 1:\n        return 'inappropriate'\n      case 2:\n        return 'offensive'\n      case 3:\n        return '[removed]'\n      case 4:\n        return '[content removed]'\n      default:\n        return '[censored]'\n    }\n  }\n\n  /**\n   * Apply gradual filtering based on severity and confidence\n   */\n  private applyGradualFiltering(\n    originalWord: string,\n    match: DetectionMatch,\n    defaultReplacement: string,\n    config: FilterConfig\n  ): string {\n    // If gradual filtering is disabled, use the default replacement\n    if (!config.gradualFiltering) {\n      return defaultReplacement\n    }\n\n    const intensity = match.severity * match.confidence\n\n    if (intensity < 1.5) {\n      // Low intensity: partial censoring\n      return this.partialCensor(originalWord, 0.3, config.replacementChar)\n    } else if (intensity < 2.5) {\n      // Medium intensity: more censoring\n      return this.partialCensor(originalWord, 0.6, config.replacementChar)\n    } else if (intensity < 3.5) {\n      // High intensity: nearly full censoring\n      return this.partialCensor(originalWord, 0.8, config.replacementChar)\n    } else {\n      // Very high intensity: full replacement\n      return defaultReplacement\n    }\n  }\n\n  /**\n   * Partially censor a word\n   */\n  private partialCensor(word: string, intensity: number, replacementChar: string): string {\n    if (word.length <= 2) return replacementChar.repeat(word.length)\n\n    const charsToReplace = Math.max(1, Math.floor(word.length * intensity))\n    const startIndex = Math.floor((word.length - charsToReplace) / 2)\n\n    return (\n      word.substring(0, startIndex) +\n      replacementChar.repeat(charsToReplace) +\n      word.substring(startIndex + charsToReplace)\n    )\n  }\n\n  /**\n   * Get custom replacement for a word\n   */\n  private getCustomReplacement(\n    word: string,\n    match: DetectionMatch,\n    config: FilterConfig\n  ): string | null {\n    // Check exact word match\n    const exactMatch = config.customReplacements.get(word.toLowerCase())\n    if (exactMatch) return exactMatch\n\n    // Check base word match\n    const baseMatch = config.customReplacements.get(match.match.toLowerCase())\n    if (baseMatch) return baseMatch\n\n    // Check pattern matches (simple wildcards)\n    for (const [pattern, replacement] of config.customReplacements) {\n      if (pattern.includes('*')) {\n        const regex = new RegExp(pattern.replace(/\\*/g, '.*'), 'i')\n        if (regex.test(word)) {\n          return replacement\n        }\n      }\n    }\n\n    return null\n  }\n\n  /**\n   * Select replacement based on severity level for deterministic results\n   */\n  private selectReplacementBySeverity(severity: number, replacements: string[]): string {\n    if (replacements.length === 0) return '[censored]'\n    if (replacements.length === 1) return replacements[0] || '[censored]'\n\n    // Map severity (1-4) to array index\n    // Lower severity gets earlier items, higher severity gets later items\n    const index = Math.min(\n      Math.floor((severity - 1) * replacements.length / 4),\n      replacements.length - 1\n    )\n\n    return replacements[index] || '[censored]'\n  }\n\n\n  /**\n   * Preserve sentence structure after filtering\n   */\n  private preserveSentenceStructure(text: string, capitalizeFirst: boolean = false): string {\n    // Fix multiple spaces\n    let processed = text.replace(/\\s{2,}/g, ' ')\n\n    // Fix spacing around punctuation - remove spaces before punctuation\n    // BUT don't remove space if previous character is also punctuation\n    processed = processed.replace(/([^\\s,.;:!?])\\s+([,.;:!?])/g, '$1$2')\n\n    // Add spaces after punctuation if missing (but only if followed by letters)\n    processed = processed.replace(/([,.;:!?])([a-zA-Z])/g, '$1 $2')\n\n    // Fix capitalization after sentence endings\n    processed = processed.replace(/([.!?])\\s*([a-z])/g, (_match, punct, letter) => {\n      return punct + ' ' + letter.toUpperCase()\n    })\n\n    // Remove leading/trailing spaces\n    processed = processed.trim()\n\n    // Capitalize first letter only if we removed something from the beginning\n    if (capitalizeFirst && processed.length > 0) {\n      const firstChar = processed.charAt(0)\n      if (/[a-z]/.test(firstChar)) {\n        processed = firstChar.toUpperCase() + processed.substring(1)\n      }\n    }\n\n    return processed\n  }\n\n  /**\n   * Create empty result for no matches\n   */\n  private createEmptyResult(text: string): FilterResult {\n    return {\n      filteredText: text,\n      filteredCount: 0,\n      filterDetails: [],\n      structurePreserved: true,\n      lengthComparison: {\n        original: text.length,\n        filtered: text.length,\n        difference: 0\n      }\n    }\n  }\n\n  /**\n   * Batch filter multiple texts\n   */\n  batchFilter(\n    texts: string[],\n    matchesArray: DetectionMatch[][],\n    config?: Partial<FilterConfig>\n  ): FilterResult[] {\n    if (texts.length !== matchesArray.length) {\n      throw new Error('Texts and matches arrays must have the same length')\n    }\n\n    return texts.map((text, index) =>\n      this.filter(text, matchesArray[index] || [], config)\n    )\n  }\n\n  /**\n   * Create a safe version of text with intelligent filtering\n   */\n  makeSafe(\n    text: string,\n    matches: DetectionMatch[],\n    safetyLevel: 'strict' | 'moderate' | 'lenient' = 'moderate'\n  ): FilterResult {\n    const safetyConfigs: Record<string, Partial<FilterConfig>> = {\n      strict: {\n        mode: FilterModeEnum.REMOVE,\n        confidenceThreshold: 0.3,\n        gradualFiltering: false,\n        preserveStructure: false\n      },\n      moderate: {\n        mode: FilterModeEnum.CENSOR,\n        confidenceThreshold: 0.5,\n        gradualFiltering: true,\n        preserveStructure: true\n      },\n      lenient: {\n        mode: FilterModeEnum.REPLACE,\n        confidenceThreshold: 0.7,\n        gradualFiltering: true,\n        preserveStructure: true\n      }\n    }\n\n    return this.filter(text, matches, safetyConfigs[safetyLevel])\n  }\n\n  /**\n   * Update filter configuration\n   */\n  updateConfig(config: Partial<FilterConfig>): void {\n    this.config = { ...this.config, ...config }\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): FilterConfig {\n    return { ...this.config }\n  }\n\n  /**\n   * Add custom replacement rule\n   */\n  addCustomReplacement(word: string, replacement: string): void {\n    this.config.customReplacements.set(word.toLowerCase(), replacement)\n  }\n\n  /**\n   * Remove custom replacement rule\n   */\n  removeCustomReplacement(word: string): boolean {\n    return this.config.customReplacements.delete(word.toLowerCase())\n  }\n\n  /**\n   * Add category replacement options\n   */\n  addCategoryReplacements(category: string, replacements: string[]): void {\n    this.config.categoryReplacements.set(category, replacements)\n  }\n\n  /**\n   * Get filter statistics\n   */\n  getStats(): {\n    customReplacements: number\n    categoryReplacements: number\n    currentMode: FilterMode\n    preserveStructure: boolean\n  } {\n    return {\n      customReplacements: this.config.customReplacements.size,\n      categoryReplacements: this.config.categoryReplacements.size,\n      currentMode: this.config.mode,\n      preserveStructure: this.config.preserveStructure\n    }\n  }\n\n  /**\n   * Merge configuration with defaults\n   */\n  private mergeWithDefaults(config: Partial<FilterConfig>): FilterConfig {\n    const defaults: FilterConfig = {\n      mode: FilterModeEnum.CENSOR,\n      replacementChar: '*',\n      preserveStructure: true,\n      customReplacements: new Map(),\n      preserveSentenceStructure: false,\n      maintainLength: false,\n      confidenceThreshold: 0.0,\n      gradualFiltering: false,\n      categoryReplacements: new Map([\n        ['general', ['inappropriate', 'unsuitable']],\n        ['sexual', ['[inappropriate content]', '[explicit content]']],\n        ['violence', ['[violent content]', '[aggressive language]']],\n        ['hate_speech', ['[offensive content]', '[inappropriate language]']],\n        ['discrimination', ['[discriminatory content]', '[offensive language]']],\n        ['substance_abuse', ['[substance reference]', '[inappropriate content]']],\n        ['religious', ['[religious content]', '[potentially offensive]']],\n        ['political', ['[political content]', '[controversial content]']]\n      ])\n    }\n\n    return {\n      ...defaults,\n      ...config,\n      customReplacements: config.customReplacements || defaults.customReplacements,\n      categoryReplacements: config.categoryReplacements || defaults.categoryReplacements\n    }\n  }\n}\n","/**\n * Comprehensive detection result system with detailed analysis and metadata\n */\n\nimport type {\n  DetectionResult,\n  DetectionMatch,\n  SeverityLevel,\n  ProfanityCategory,\n  LanguageCode\n} from '../types/index.js'\nimport { SeverityLevel as SeverityEnum } from '../types/index.js'\nimport { ALL_CATEGORIES } from '../config/default-config.js'\n\n/**\n * Comprehensive emoji regex (same as in text-processing)\n */\nconst EMOJI_REGEX = /(?:[\\u{1F600}-\\u{1F64F}]|[\\u{1F300}-\\u{1F5FF}]|[\\u{1F680}-\\u{1F6FF}]|[\\u{1F700}-\\u{1F77F}]|[\\u{1F780}-\\u{1F7FF}]|[\\u{1F800}-\\u{1F8FF}]|[\\u{1F900}-\\u{1F9FF}]|[\\u{1FA00}-\\u{1FA6F}]|[\\u{1FA70}-\\u{1FAFF}]|[\\u{2600}-\\u{26FF}]|[\\u{2700}-\\u{27BF}]|[\\u{1F1E6}-\\u{1F1FF}]|[\\u{1F3FB}-\\u{1F3FF}])/gu\n\n/**\n * Performance metrics for detection operation\n */\nexport interface PerformanceMetrics {\n  /** Total processing time in milliseconds */\n  totalTime: number\n  /** Time spent on language detection */\n  languageDetectionTime: number\n  /** Time spent on text normalization */\n  normalizationTime: number\n  /** Time spent on pattern matching */\n  matchingTime: number\n  /** Time spent on context analysis */\n  contextAnalysisTime: number\n  /** Time spent on filtering */\n  filteringTime: number\n  /** Number of characters processed */\n  charactersProcessed: number\n  /** Processing rate in characters per millisecond */\n  processingRate: number\n}\n\n/**\n * Statistical analysis of detection results\n */\nexport interface DetectionStatistics {\n  /** Total words in the text */\n  totalWords: number\n  /** Total unique words detected */\n  uniqueProfaneWords: number\n  /** Percentage of text that is profane */\n  profanityDensity: number\n  /** Distribution by severity level */\n  severityDistribution: Record<SeverityLevel, number>\n  /** Distribution by category */\n  categoryDistribution: Record<ProfanityCategory, number>\n  /** Distribution by language */\n  languageDistribution: Record<LanguageCode, number>\n  /** Average confidence score */\n  averageConfidence: number\n  /** Confidence score distribution */\n  confidenceDistribution: {\n    high: number // >= 0.8\n    medium: number // 0.5-0.8\n    low: number // < 0.5\n  }\n}\n\n/**\n * Context information about the analyzed text\n */\nexport interface TextContext {\n  /** Detected text type (social media, formal, email, etc.) */\n  textType: 'unknown' | 'social_media' | 'formal' | 'email' | 'chat' | 'article' | 'comment'\n  /** Estimated reading level */\n  readingLevel: 'elementary' | 'middle' | 'high_school' | 'college' | 'graduate'\n  /** Emotional tone indicators */\n  emotionalTone: {\n    aggressive: number\n    neutral: number\n    positive: number\n    negative: number\n  }\n  /** Presence of special patterns */\n  patterns: {\n    hasUrls: boolean\n    hasEmails: boolean\n    hasMentions: boolean\n    hasHashtags: boolean\n    hasEmojis: boolean\n    hasRepeatedChars: boolean\n    hasAllCaps: boolean\n  }\n}\n\n/**\n * Detailed position information for matches\n */\nexport interface MatchPosition {\n  /** Absolute character position in text */\n  absoluteStart: number\n  absoluteEnd: number\n  /** Line number (1-based) */\n  lineNumber: number\n  /** Column position in line (1-based) */\n  columnStart: number\n  columnEnd: number\n  /** Word index in text */\n  wordIndex: number\n  /** Sentence index */\n  sentenceIndex: number\n}\n\n/**\n * Enhanced detection match with additional metadata\n */\nexport interface EnhancedDetectionMatch extends DetectionMatch {\n  /** Detailed position information */\n  position: MatchPosition\n  /** Context around the match */\n  context: {\n    before: string\n    after: string\n    sentence: string\n  }\n  /** Alternative suggestions for replacement */\n  suggestions: string[]\n  /** Reason for detection */\n  detectionReason: string\n  /** Whether this is a fuzzy match */\n  isFuzzyMatch: boolean\n  /** Edit distance for fuzzy matches */\n  editDistance?: number\n  /** Original match score before confidence adjustments */\n  rawScore: number\n}\n\n/**\n * Enhanced detection result with comprehensive analysis\n */\nexport interface EnhancedDetectionResult extends DetectionResult {\n  /** Enhanced matches with additional metadata */\n  enhancedMatches: EnhancedDetectionMatch[]\n  /** Performance metrics */\n  performance: PerformanceMetrics\n  /** Statistical analysis */\n  statistics: DetectionStatistics\n  /** Text context information */\n  textContext: TextContext\n  /** Warnings about potential issues */\n  warnings: string[]\n  /** Recommendations for improvement */\n  recommendations: string[]\n  /** Detection metadata */\n  metadata: {\n    version: string\n    algorithm: string\n    configHash: string\n    timestamp: Date\n  }\n}\n\n/**\n * Builder for creating detection results with comprehensive analysis\n */\nexport class DetectionResultBuilder {\n  private result: Partial<EnhancedDetectionResult> = {}\n  private startTime: number = Date.now()\n  private performanceMarkers: Map<string, number> = new Map()\n\n  constructor(originalText: string = '') {\n    const safeText = originalText || ''\n    this.result = {\n      originalText: safeText,\n      filteredText: safeText,\n      hasProfanity: false,\n      totalMatches: 0,\n      maxSeverity: SeverityEnum.LOW,\n      matches: [],\n      enhancedMatches: [],\n      detectedLanguages: [],\n      confidence: 1.0,\n      processingTime: 0,\n      performance: {\n        totalTime: 0,\n        languageDetectionTime: 0,\n        normalizationTime: 0,\n        matchingTime: 0,\n        contextAnalysisTime: 0,\n        filteringTime: 0,\n        charactersProcessed: originalText.length,\n        processingRate: 0\n      },\n      statistics: {\n        totalWords: this.countWords(originalText),\n        uniqueProfaneWords: 0,\n        profanityDensity: 0,\n        severityDistribution: {\n          [SeverityEnum.LOW]: 0,\n          [SeverityEnum.MODERATE]: 0,\n          [SeverityEnum.HIGH]: 0,\n          [SeverityEnum.SEVERE]: 0\n        },\n        categoryDistribution: ALL_CATEGORIES.reduce((acc, cat) => {\n          acc[cat] = 0\n          return acc\n        }, {} as Record<ProfanityCategory, number>),\n        languageDistribution: {} as Record<LanguageCode, number>,\n        averageConfidence: 0,\n        confidenceDistribution: {\n          high: 0,\n          medium: 0,\n          low: 0\n        }\n      },\n      textContext: {\n        textType: 'unknown',\n        readingLevel: 'middle',\n        emotionalTone: {\n          aggressive: 0,\n          neutral: 1,\n          positive: 0,\n          negative: 0\n        },\n        patterns: {\n          hasUrls: false,\n          hasEmails: false,\n          hasMentions: false,\n          hasHashtags: false,\n          hasEmojis: false,\n          hasRepeatedChars: false,\n          hasAllCaps: false\n        }\n      },\n      warnings: [],\n      recommendations: [],\n      metadata: {\n        version: '1.0.0',\n        algorithm: 'trie-based-fuzzy-matching',\n        configHash: '',\n        timestamp: new Date()\n      }\n    }\n\n    this.markPerformance('start')\n  }\n\n  /**\n   * Mark a performance checkpoint\n   */\n  markPerformance(label: string): void {\n    this.performanceMarkers.set(label, Date.now())\n  }\n\n  /**\n   * Set detected languages\n   */\n  setLanguages(languages: LanguageCode[]): this {\n    this.result.detectedLanguages = languages\n    return this\n  }\n\n  /**\n   * Add detection matches\n   */\n  addMatches(matches: DetectionMatch[]): this {\n    this.result.matches = matches\n    this.result.totalMatches = matches.length\n    this.result.hasProfanity = matches.length > 0\n\n    // Calculate max severity\n    this.result.maxSeverity = matches.reduce(\n      (max, match) => Math.max(max, match.severity),\n      SeverityEnum.LOW\n    )\n\n    // Create enhanced matches\n    this.result.enhancedMatches = matches.map(match => this.enhanceMatch(match))\n\n    // Update statistics\n    this.updateStatistics()\n\n    return this\n  }\n\n  /**\n   * Set filtered text\n   */\n  setFilteredText(filteredText: string): this {\n    this.result.filteredText = filteredText\n    return this\n  }\n\n  /**\n   * Set overall confidence\n   */\n  setConfidence(confidence: number): this {\n    this.result.confidence = Math.max(0, Math.min(1, confidence))\n    return this\n  }\n\n  /**\n   * Add a warning\n   */\n  addWarning(warning: string): this {\n    if (this.result.warnings) {\n      this.result.warnings.push(warning)\n    } else {\n      this.result.warnings = [warning]\n    }\n    return this\n  }\n\n  /**\n   * Add a recommendation\n   */\n  addRecommendation(recommendation: string): this {\n    if (this.result.recommendations) {\n      this.result.recommendations.push(recommendation)\n    } else {\n      this.result.recommendations = [recommendation]\n    }\n    return this\n  }\n\n  /**\n   * Set configuration hash for caching\n   */\n  setConfigHash(hash: string): this {\n    if (this.result.metadata) {\n      this.result.metadata.configHash = hash\n    }\n    return this\n  }\n\n  /**\n   * Build the final result\n   */\n  build(): EnhancedDetectionResult {\n    this.markPerformance('end')\n\n    // Calculate final performance metrics\n    this.calculatePerformanceMetrics()\n\n    // Analyze text context\n    this.analyzeTextContext()\n\n    // Generate recommendations\n    this.generateRecommendations()\n\n    // Set final processing time\n    this.result.processingTime = Date.now() - this.startTime\n\n    return this.result as EnhancedDetectionResult\n  }\n\n  /**\n   * Enhance a basic match with additional metadata\n   */\n  private enhanceMatch(match: DetectionMatch): EnhancedDetectionMatch {\n    const position = this.calculatePosition(match, this.result.originalText || '')\n    const context = this.extractContext(match, this.result.originalText || '')\n    const suggestions = this.generateSuggestions(match)\n\n    return {\n      ...match,\n      position,\n      context,\n      suggestions,\n      detectionReason: this.getDetectionReason(match),\n      isFuzzyMatch: match.word.toLowerCase() !== match.match.toLowerCase(),\n      editDistance: this.calculateEditDistance(match.word, match.match),\n      rawScore: match.confidence\n    }\n  }\n\n  /**\n   * Calculate detailed position information\n   */\n  private calculatePosition(match: DetectionMatch, text: string): MatchPosition {\n    // Calculate line and column numbers\n    let lineNumber = 1\n    let columnStart = 1\n    let wordIndex = 0\n    let sentenceIndex = 0\n\n    for (let i = 0; i < match.start; i++) {\n      if (text[i] === '\\n') {\n        lineNumber++\n        columnStart = 1\n      } else {\n        columnStart++\n      }\n\n      const currentChar = text[i]\n      const prevChar = text[i - 1]\n\n      if (i > 0 && currentChar && prevChar && /\\s/.test(currentChar) && !/\\s/.test(prevChar)) {\n        wordIndex++\n      }\n\n      if (currentChar && /[.!?]/.test(currentChar)) {\n        sentenceIndex++\n      }\n    }\n\n    const columnEnd = columnStart + (match.end - match.start)\n\n    return {\n      absoluteStart: match.start,\n      absoluteEnd: match.end,\n      lineNumber,\n      columnStart,\n      columnEnd,\n      wordIndex,\n      sentenceIndex\n    }\n  }\n\n  /**\n   * Extract context around a match\n   */\n  private extractContext(match: DetectionMatch, text: string): {\n    before: string\n    after: string\n    sentence: string\n  } {\n    const contextLength = 50\n    const beforeStart = Math.max(0, match.start - contextLength)\n    const afterEnd = Math.min(text.length, match.end + contextLength)\n\n    const before = text.substring(beforeStart, match.start).trim()\n    const after = text.substring(match.end, afterEnd).trim()\n\n    // Find the sentence containing this match\n    const sentences = text.split(/[.!?]+/)\n    let sentence = ''\n\n    for (const sent of sentences) {\n      const sentStart = text.indexOf(sent)\n      const sentEnd = sentStart + sent.length\n\n      if (match.start >= sentStart && match.end <= sentEnd) {\n        sentence = sent.trim()\n        break\n      }\n    }\n\n    return { before, after, sentence }\n  }\n\n  /**\n   * Generate replacement suggestions\n   */\n  private generateSuggestions(match: DetectionMatch): string[] {\n    const suggestions: string[] = []\n\n    // Generate based on category\n    if (match.categories.includes('general')) {\n      suggestions.push('[censored]', '[removed]', '***')\n    }\n\n    if (match.categories.includes('sexual')) {\n      suggestions.push('[inappropriate content]', '[explicit content removed]')\n    }\n\n    if (match.categories.includes('violence')) {\n      suggestions.push('[violent content]', '[aggressive language]')\n    }\n\n    if (match.categories.includes('hate_speech')) {\n      suggestions.push('[hate speech removed]', '[offensive content]')\n    }\n\n    // Generate asterisk replacement\n    const asteriskReplacement = '*'.repeat(match.word.length)\n    suggestions.unshift(asteriskReplacement)\n\n    // Generate partial replacement (keep first and last letter)\n    if (match.word.length > 3) {\n      const partial = match.word[0] + '*'.repeat(match.word.length - 2) + match.word[match.word.length - 1]\n      suggestions.unshift(partial)\n    }\n\n    return Array.from(new Set(suggestions)) // Remove duplicates\n  }\n\n  /**\n   * Get reason for detection\n   */\n  private getDetectionReason(match: DetectionMatch): string {\n    const reasons: string[] = []\n\n    if (match.confidence < 0.7) {\n      reasons.push('fuzzy match')\n    }\n\n    if (match.severity >= SeverityEnum.HIGH) {\n      reasons.push('high severity')\n    }\n\n    if (match.categories.includes('hate_speech')) {\n      reasons.push('hate speech')\n    }\n\n    if (match.categories.includes('sexual')) {\n      reasons.push('sexual content')\n    }\n\n    if (match.categories.includes('violence')) {\n      reasons.push('violent content')\n    }\n\n    return reasons.length > 0 ? reasons.join(', ') : 'profanity detected'\n  }\n\n  /**\n   * Calculate edit distance between two strings\n   */\n  private calculateEditDistance(str1: string, str2: string): number {\n    // Simple implementation without complex matrix\n    if (str1 === str2) return 0\n    if (str1.length === 0) return str2.length\n    if (str2.length === 0) return str1.length\n\n    // Type assertion to help TypeScript understand the matrix is properly initialized\n    const matrix = Array(str2.length + 1).fill(null).map(() =>\n      Array(str1.length + 1).fill(0)\n    ) as number[][]\n\n    // Initialize first row and column\n    for (let i = 0; i <= str1.length; i++) {\n      // Matrix row 0 is guaranteed to exist by Array.from above\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      matrix[0]![i] = i\n    }\n    for (let j = 0; j <= str2.length; j++) {\n      // All matrix rows are guaranteed to exist by Array.from above\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      matrix[j]![0] = j\n    }\n\n    // Fill matrix - all matrix indices within bounds are guaranteed by loop conditions\n    for (let j = 1; j <= str2.length; j++) {\n      for (let i = 1; i <= str1.length; i++) {\n        const cost = str1[i - 1] === str2[j - 1] ? 0 : 1\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        matrix[j]![i] = Math.min(\n          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n          matrix[j - 1]![i]! + 1,     // deletion\n          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n          matrix[j]![i - 1]! + 1,     // insertion\n          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n          matrix[j - 1]![i - 1]! + cost // substitution\n        )\n      }\n    }\n\n    // Final indices guaranteed by matrix initialization\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return matrix[str2.length]![str1.length]!\n  }\n\n  /**\n   * Update statistics based on matches\n   */\n  private updateStatistics(): void {\n    const matches = this.result.matches || []\n    const stats = this.result.statistics\n\n    // Count unique profane words\n    const uniqueWords = new Set(matches.map(m => m.match.toLowerCase()))\n    if (stats) {\n      stats.uniqueProfaneWords = uniqueWords.size\n    }\n\n    // Calculate profanity density\n    if (stats) {\n      stats.profanityDensity = stats.totalWords > 0 ? (matches.length / stats.totalWords) : 0\n    }\n\n    // Update severity distribution\n    for (const match of matches) {\n      if (stats && stats.severityDistribution) {\n        stats.severityDistribution[match.severity]++\n      }\n    }\n\n    // Update category distribution\n    for (const match of matches) {\n      for (const category of match.categories) {\n        if (stats && stats.categoryDistribution) {\n          stats.categoryDistribution[category]++\n        }\n      }\n    }\n\n    // Update language distribution\n    for (const match of matches) {\n      if (stats && stats.languageDistribution) {\n        stats.languageDistribution[match.language] =\n          (stats.languageDistribution[match.language] || 0) + 1\n      }\n    }\n\n    // Calculate confidence statistics\n    if (matches.length > 0 && stats) {\n      stats.averageConfidence = matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length\n\n      const confidenceCounts = matches.reduce(\n        (acc, m) => {\n          if (m.confidence >= 0.8) acc.high++\n          else if (m.confidence >= 0.5) acc.medium++\n          else acc.low++\n          return acc\n        },\n        { high: 0, medium: 0, low: 0 }\n      )\n\n      stats.confidenceDistribution = confidenceCounts\n    }\n  }\n\n  /**\n   * Calculate performance metrics\n   */\n  private calculatePerformanceMetrics(): void {\n    const performance = this.result.performance\n    if (!performance) return\n\n    const start = this.performanceMarkers.get('start') || this.startTime\n    const end = this.performanceMarkers.get('end') || Date.now()\n\n    performance.totalTime = end - start\n\n    // Calculate component times if markers exist\n    const langStart = this.performanceMarkers.get('language_detection_start')\n    const langEnd = this.performanceMarkers.get('language_detection_end')\n    if (langStart && langEnd) {\n      performance.languageDetectionTime = langEnd - langStart\n    }\n\n    const normStart = this.performanceMarkers.get('normalization_start')\n    const normEnd = this.performanceMarkers.get('normalization_end')\n    if (normStart && normEnd) {\n      performance.normalizationTime = normEnd - normStart\n    }\n\n    const matchStart = this.performanceMarkers.get('matching_start')\n    const matchEnd = this.performanceMarkers.get('matching_end')\n    if (matchStart && matchEnd) {\n      performance.matchingTime = matchEnd - matchStart\n    }\n\n    const contextStart = this.performanceMarkers.get('context_start')\n    const contextEnd = this.performanceMarkers.get('context_end')\n    if (contextStart && contextEnd) {\n      performance.contextAnalysisTime = contextEnd - contextStart\n    }\n\n    const filterStart = this.performanceMarkers.get('filtering_start')\n    const filterEnd = this.performanceMarkers.get('filtering_end')\n    if (filterStart && filterEnd) {\n      performance.filteringTime = filterEnd - filterStart\n    }\n\n    // Calculate processing rate\n    if (performance.totalTime > 0) {\n      performance.processingRate = performance.charactersProcessed / performance.totalTime\n    }\n  }\n\n  /**\n   * Analyze text context\n   */\n  private analyzeTextContext(): void {\n    const text = this.result.originalText || ''\n    const context = this.result.textContext\n    if (!context) return\n\n    // Detect patterns\n    context.patterns.hasUrls = /(https?:\\/\\/[^\\s]+)|(www\\.[^\\s]+\\.[^\\s]+)/i.test(text)\n    context.patterns.hasEmails = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/i.test(text)\n    context.patterns.hasMentions = /@\\w+/.test(text)\n    context.patterns.hasHashtags = /#\\w+/.test(text)\n    // Comprehensive emoji detection\n    context.patterns.hasEmojis = EMOJI_REGEX.test(text)\n    context.patterns.hasRepeatedChars = /(.)\\1{2,}/.test(text)\n    context.patterns.hasAllCaps = /\\b[A-Z]{3,}\\b/.test(text)\n\n    // Estimate text type\n    if (context.patterns.hasMentions || context.patterns.hasHashtags) {\n      context.textType = 'social_media'\n    } else if (context.patterns.hasEmails) {\n      context.textType = 'email'\n    } else if (text.length < 200 && context.patterns.hasEmojis) {\n      context.textType = 'chat'\n    } else if (text.length > 300) {\n      context.textType = 'article'\n    }\n\n    // Estimate emotional tone\n    const aggressiveWords = (text.match(/\\b(hate|angry|furious|rage|kill|destroy|fight)\\b/gi) || []).length\n    const positiveWords = (text.match(/\\b(love|happy|great|awesome|wonderful|amazing)\\b/gi) || []).length\n    const negativeWords = (text.match(/\\b(sad|terrible|awful|horrible|disgusting|hate)\\b/gi) || []).length\n\n    const totalEmotionalWords = aggressiveWords + positiveWords + negativeWords\n\n    if (totalEmotionalWords > 0) {\n      context.emotionalTone.aggressive = aggressiveWords / totalEmotionalWords\n      context.emotionalTone.positive = positiveWords / totalEmotionalWords\n      context.emotionalTone.negative = negativeWords / totalEmotionalWords\n      context.emotionalTone.neutral = Math.max(0, 1 - (aggressiveWords + positiveWords + negativeWords) / totalEmotionalWords)\n    }\n  }\n\n  /**\n   * Generate recommendations based on analysis\n   */\n  private generateRecommendations(): void {\n    const recommendations = this.result.recommendations || []\n    const matches = this.result.matches || []\n    const context = this.result.textContext\n\n    if (matches.length === 0) {\n      return\n    }\n\n    // High severity recommendations\n    if (this.result.maxSeverity && this.result.maxSeverity >= SeverityEnum.HIGH) {\n      recommendations.push('Consider complete content review due to high severity language')\n    }\n\n    // High density recommendations\n    if (this.result.statistics && this.result.statistics.profanityDensity > 0.1) {\n      recommendations.push('High profanity density detected - consider content moderation')\n    }\n\n    // Context-based recommendations\n    if (context && context.textType === 'social_media' && matches.length > 0) {\n      recommendations.push('Social media content may need community guidelines review')\n    }\n\n    if (context && context.emotionalTone.aggressive > 0.3) {\n      recommendations.push('Aggressive tone detected - consider tone moderation')\n    }\n\n    // Low confidence recommendations\n    const lowConfidenceMatches = matches.filter(m => m.confidence < 0.6)\n    if (lowConfidenceMatches.length > 0) {\n      recommendations.push(`${lowConfidenceMatches.length} matches have low confidence - manual review recommended`)\n    }\n  }\n\n  /**\n   * Count words in text\n   */\n  private countWords(text: string): number {\n    return text.trim().split(/\\s+/).filter(word => word.length > 0).length\n  }\n}\n\n/**\n * Utility functions for working with detection results\n */\nexport class DetectionResultUtils {\n  /**\n   * Merge multiple detection results\n   */\n  static merge(results: DetectionResult[]): DetectionResult {\n    if (results.length === 0) {\n      throw new Error('Cannot merge empty results array')\n    }\n\n    if (results.length === 1) {\n      // results.length === 1 check guarantees first element exists\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      return results[0]!\n    }\n\n    const merged = new DetectionResultBuilder(\n      results.map(r => r.originalText).join(' ')\n    )\n\n    const allMatches: DetectionMatch[] = []\n    const allLanguages: LanguageCode[] = []\n    let maxSeverity = SeverityEnum.LOW\n    let totalConfidence = 0\n    let totalProcessingTime = 0\n\n    for (const result of results) {\n      allMatches.push(...result.matches)\n      allLanguages.push(...result.detectedLanguages)\n      maxSeverity = Math.max(maxSeverity, result.maxSeverity)\n      totalConfidence += result.confidence\n      totalProcessingTime += result.processingTime\n    }\n\n    // Remove duplicate languages\n    const uniqueLanguages = Array.from(new Set(allLanguages))\n\n    merged\n      .setLanguages(uniqueLanguages)\n      .addMatches(allMatches)\n      .setConfidence(totalConfidence / results.length)\n\n    const result = merged.build()\n    result.processingTime = totalProcessingTime\n\n    return result\n  }\n\n  /**\n   * Compare two detection results\n   */\n  static compare(result1: DetectionResult, result2: DetectionResult): {\n    matchesDiff: number\n    severityDiff: number\n    confidenceDiff: number\n    summary: string\n  } {\n    const matchesDiff = result2.totalMatches - result1.totalMatches\n    const severityDiff = result2.maxSeverity - result1.maxSeverity\n    const confidenceDiff = result2.confidence - result1.confidence\n\n    let summary = ''\n    if (matchesDiff > 0) {\n      summary += `${matchesDiff} more matches found. `\n    } else if (matchesDiff < 0) {\n      summary += `${Math.abs(matchesDiff)} fewer matches found. `\n    }\n\n    if (severityDiff > 0) {\n      summary += 'Higher severity detected. '\n    } else if (severityDiff < 0) {\n      summary += 'Lower severity detected. '\n    }\n\n    if (Math.abs(confidenceDiff) > 0.1) {\n      summary += `Confidence ${confidenceDiff > 0 ? 'increased' : 'decreased'} by ${Math.abs(confidenceDiff).toFixed(2)}. `\n    }\n\n    if (!summary) {\n      summary = 'Results are similar.'\n    }\n\n    return {\n      matchesDiff,\n      severityDiff,\n      confidenceDiff,\n      summary: summary.trim()\n    }\n  }\n\n  /**\n   * Export result to JSON with custom formatting\n   */\n  static toJSON(result: DetectionResult, includeText = false): string {\n    const exportData: Record<string, unknown> = {\n      hasProfanity: result.hasProfanity,\n      totalMatches: result.totalMatches,\n      maxSeverity: result.maxSeverity,\n      detectedLanguages: result.detectedLanguages,\n      confidence: result.confidence,\n      processingTime: result.processingTime,\n      matches: result.matches.map(match => ({\n        word: match.word,\n        severity: match.severity,\n        categories: match.categories,\n        confidence: match.confidence,\n        position: { start: match.start, end: match.end }\n      }))\n    }\n\n    if (includeText) {\n      exportData.originalText = result.originalText\n      exportData.filteredText = result.filteredText\n    }\n\n    return JSON.stringify(exportData, null, 2)\n  }\n}","/**\n * Advanced language detection system for NaughtyWords\n * Uses character frequency analysis and pattern matching for efficient detection\n */\n\nimport type { LanguageCode, LanguageDetection } from '../types/index.js'\n\n/**\n * Character frequency data for different languages\n * Based on statistical analysis of common text in each language\n */\nconst LANGUAGE_FREQUENCIES: Record<string, Record<string, number>> = {\n  en: {\n    e: 12.7, t: 9.1, a: 8.2, o: 7.5, i: 7.0, n: 6.7, s: 6.3, h: 6.1, r: 6.0,\n    d: 4.3, l: 4.0, c: 2.8, u: 2.8, m: 2.4, w: 2.4, f: 2.2, g: 2.0, y: 2.0,\n    p: 1.9, b: 1.3, v: 1.0, k: 0.8, j: 0.15, x: 0.15, q: 0.10, z: 0.07\n  },\n  es: {\n    e: 13.7, a: 12.5, o: 8.7, s: 8.0, r: 6.9, n: 6.7, i: 6.2, l: 4.97, d: 5.9,\n    t: 4.6, c: 4.7, u: 3.9, m: 3.2, p: 2.5, b: 1.4, g: 1.0, v: 0.9, y: 0.9,\n    q: 0.9, h: 0.7, f: 0.7, z: 0.5, j: 0.4, ñ: 0.3, x: 0.2, k: 0.1, w: 0.0\n  },\n  fr: {\n    e: 17.3, s: 7.9, a: 7.6, i: 7.5, t: 7.2, n: 7.1, r: 6.6, u: 6.3, l: 5.5,\n    o: 5.3, d: 3.7, c: 3.3, p: 3.0, m: 3.0, é: 1.9, f: 1.1, b: 0.9, v: 1.6,\n    h: 0.7, g: 0.9, y: 0.3, q: 1.4, j: 0.5, x: 0.4, à: 0.5, è: 0.3, z: 0.1\n  },\n  de: {\n    e: 17.4, n: 9.8, i: 7.6, s: 7.3, r: 7.0, a: 6.5, t: 6.2, d: 5.1, h: 4.8,\n    u: 4.4, l: 3.4, c: 3.1, g: 3.0, m: 2.5, o: 2.5, b: 1.9, w: 1.9, f: 1.7,\n    k: 1.2, z: 1.1, p: 0.8, v: 0.7, ü: 0.7, ä: 0.5, ö: 0.3, j: 0.3, y: 0.04\n  },\n  it: {\n    e: 11.8, a: 11.7, i: 11.3, o: 9.8, n: 6.9, r: 6.4, t: 5.6, l: 6.5, c: 4.5,\n    s: 5.0, d: 3.7, u: 3.0, p: 3.1, m: 2.5, g: 1.6, v: 2.1, f: 1.2, b: 0.9,\n    z: 0.5, h: 1.5, q: 0.5, è: 0.4, à: 0.6, ò: 0.2, ù: 0.1, ì: 0.1, í: 0.06\n  },\n  pt: {\n    a: 14.6, e: 12.6, o: 10.7, s: 7.8, r: 6.5, i: 6.2, n: 5.2, d: 5.0, m: 4.7,\n    u: 4.6, t: 4.3, c: 3.9, l: 2.8, p: 2.5, v: 1.7, g: 1.3, h: 1.3, q: 1.2,\n    b: 1.0, f: 1.0, z: 0.5, j: 0.4, x: 0.3, ç: 0.4, ã: 0.7, õ: 0.4, á: 0.5\n  },\n  ru: {\n    о: 10.97, е: 8.45, а: 8.01, и: 7.35, н: 6.7, т: 6.26, с: 5.47, р: 4.73,\n    в: 4.54, л: 4.40, к: 3.49, м: 3.21, д: 2.98, п: 2.81, у: 2.62, я: 2.01,\n    ы: 1.90, ь: 1.74, г: 1.70, з: 1.65, б: 1.59, ч: 1.44, й: 1.21, х: 0.97\n  },\n  zh: {\n    的: 7.9, 一: 4.1, 是: 3.3, 在: 2.9, 不: 2.3, 了: 2.2, 有: 2.1, 和: 1.6,\n    人: 1.4, 这: 1.3, 中: 1.2, 大: 1.1, 为: 1.0, 上: 0.9, 个: 0.9, 国: 0.8,\n    我: 0.8, 以: 0.7, 要: 0.7, 他: 0.7, 时: 0.6, 来: 0.6, 用: 0.6, 们: 0.6\n  },\n  ja: {\n    の: 4.8, に: 3.6, は: 3.4, を: 3.2, た: 2.8, が: 2.7, で: 2.4, て: 2.3,\n    と: 2.1, し: 2.0, れ: 1.8, さ: 1.7, る: 1.6, あ: 1.5, い: 1.4, ら: 1.3,\n    す: 1.2, っ: 1.1, な: 1.1, り: 1.0, ん: 1.0, だ: 0.9, ま: 0.9, こ: 0.8\n  },\n  ar: {\n    ا: 12.8, ل: 9.7, ي: 8.6, م: 7.5, و: 7.2, ن: 6.9, ر: 5.9, ت: 5.4, ب: 4.9,\n    ع: 4.6, د: 4.3, س: 3.8, ف: 3.5, ق: 3.2, ك: 3.0, ه: 2.8, ح: 2.5, ج: 2.2,\n    ط: 2.0, ص: 1.8, خ: 1.6, ز: 1.4, ش: 1.3, ض: 1.2, غ: 1.0, ذ: 0.9, ث: 0.8\n  },\n  he: {\n    א: 8.9, ל: 8.8, ר: 7.8, ה: 7.6, י: 7.2, ו: 6.9, ת: 6.1, נ: 5.8, מ: 5.5,\n    ב: 4.9, ש: 4.7, ד: 4.4, ע: 4.1, כ: 3.8, ח: 3.5, ק: 3.2, פ: 2.9, ז: 2.6,\n    ג: 2.3, ט: 2.0, צ: 1.7, ס: 1.4, ך: 1.1, ם: 0.8, ן: 0.5, ף: 0.2, ץ: 0.1\n  },\n  hi: {\n    क: 8.6, र: 8.1, त: 7.8, न: 7.2, स: 6.5, म: 5.9, ह: 5.4, द: 5.0, व: 4.7,\n    ल: 4.3, प: 4.0, य: 3.8, ज: 3.5, ब: 3.2, च: 2.9, ग: 2.6, श: 2.4, अ: 2.1,\n    आ: 1.9, इ: 1.7, उ: 1.5, ए: 1.3, ओ: 1.1, औ: 0.9, ऋ: 0.1, ऌ: 0.05\n  },\n  ko: {\n    이: 4.5, 다: 3.8, 에: 3.4, 는: 3.1, 하: 2.9, 고: 2.6, 을: 2.4, 아: 2.2,\n    으: 2.0, 의: 1.9, 가: 1.8, 로: 1.7, 한: 1.6, 지: 1.5, 도: 1.4, 서: 1.3,\n    기: 1.2, 과: 1.1, 자: 1.0, 어: 0.9, 나: 0.8, 오: 0.7, 인: 0.7, 사: 0.6\n  },\n  nl: {\n    e: 18.9, n: 10.0, a: 7.5, t: 6.8, i: 6.5, r: 6.4, o: 6.1, d: 5.9, s: 3.7,\n    l: 3.6, g: 3.4, v: 2.9, h: 2.4, k: 2.3, m: 2.2, u: 2.0, b: 1.6, p: 1.6,\n    w: 1.5, j: 1.5, z: 1.4, c: 1.2, f: 0.8, y: 0.04, q: 0.009, x: 0.04\n  },\n  sv: {\n    a: 9.4, e: 9.9, n: 8.8, r: 8.4, t: 7.7, s: 6.6, l: 5.3, o: 4.5, i: 5.8,\n    d: 4.5, ä: 2.0, k: 3.1, g: 2.9, m: 3.5, v: 2.4, f: 2.0, u: 1.9, p: 1.5,\n    h: 2.1, c: 1.4, b: 1.3, ö: 1.3, j: 0.6, y: 0.7, w: 0.1, x: 0.1, z: 0.07\n  },\n  pl: {\n    a: 10.5, i: 8.2, o: 7.8, e: 7.7, z: 6.4, n: 5.5, r: 4.7, w: 4.6, s: 4.3,\n    t: 3.9, c: 3.96, k: 3.5, d: 3.3, y: 3.8, m: 2.8, u: 2.5, l: 2.1, b: 1.5,\n    g: 1.4, p: 3.1, j: 2.3, ł: 1.8, ę: 1.1, ą: 0.9, ć: 0.4, ń: 0.4, ś: 0.7\n  }\n}\n\n/**\n * Language detection result with confidence scoring\n */\nexport interface LanguageDetectionResult {\n  language: LanguageCode\n  confidence: number\n  sample?: string\n}\n\n/**\n * Cached detection results for performance optimization\n */\nconst detectionCache = new Map<string, LanguageDetectionResult[]>()\n\n/**\n * Maximum cache size to prevent memory issues\n */\nconst MAX_CACHE_SIZE = 1000\n\n/**\n * Advanced language detection engine\n */\nexport class LanguageDetectionEngine {\n  private cacheEnabled: boolean\n  private minTextLength: number\n  private maxSampleLength: number\n\n  constructor(options: {\n    cacheEnabled?: boolean\n    minTextLength?: number\n    maxSampleLength?: number\n  } = {}) {\n    this.cacheEnabled = options.cacheEnabled ?? true\n    this.minTextLength = options.minTextLength ?? 10\n    this.maxSampleLength = options.maxSampleLength ?? 200\n  }\n\n  /**\n   * Detect languages in the given text\n   */\n  detect(text: string): LanguageDetectionResult[] {\n    if (!text || text.trim().length === 0) {\n      return [{ language: 'en', confidence: 0.11 }]\n    }\n\n    // For script-based languages, check early to avoid short text filtering\n    const earlyScriptResults = this.detectByScript(text)\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- earlyScriptResults.length > 0 check guarantees first element exists\n    if (earlyScriptResults.length > 0 && earlyScriptResults[0]!.confidence > 0.6) {\n      // Script detected with high confidence, proceed with full detection\n      // Do not return early - continue to full detection logic\n    } else if (text.length < this.minTextLength) {\n      // Only apply length check if no strong script detected\n      return [{ language: 'en', confidence: 0.11 }]\n    }\n\n    // Check cache first\n    const cacheKey = this.createCacheKey(text)\n    if (this.cacheEnabled && detectionCache.has(cacheKey)) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- detectionCache.has() check guarantees value exists\n      return detectionCache.get(cacheKey)!\n    }\n\n    // Normalize and prepare text for analysis\n    const normalizedText = this.normalizeForDetection(text)\n    const sample = normalizedText.substring(0, this.maxSampleLength)\n\n    // Perform multi-method detection\n    const scriptResults = this.detectByScript(text)\n    const frequencyResults = this.detectByCharacterFrequency(sample)\n    const patternResults = this.detectByPatterns(sample)\n\n    // Check if we have strong script-based detection (dominant script with very high confidence)\n    // Only use single-language mode if confidence is very high (>95%) to allow mixed language detection\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- scriptResults.length > 0 check guarantees first element exists\n    const hasStrongScriptDetection = scriptResults.length > 0 && scriptResults[0]!.confidence > 0.95\n\n    // Combine all detection methods\n    const combinedResults = this.combineDetectionResults(\n      frequencyResults,\n      patternResults,\n      scriptResults\n    )\n\n    // For strong single-script detection, return just that language (no mixed detection)\n    if (hasStrongScriptDetection) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- checked above\n      const scriptResult = scriptResults[0]!\n      const finalResults: LanguageDetectionResult[] = [{\n        ...scriptResult,\n        sample: sample.substring(0, 50)\n      }]\n\n      if (this.cacheEnabled) {\n        this.addToCache(cacheKey, finalResults)\n      }\n\n      return finalResults\n    }\n\n    // Filter and sort by confidence\n    const filteredResults = combinedResults\n      .filter(result => result.confidence > 0.08)\n      .sort((a, b) => b.confidence - a.confidence)\n      .slice(0, 3) // Return top 3 candidates\n      .map(result => ({\n        ...result,\n        sample: sample.substring(0, 50)\n      }))\n\n    // Cache results\n    if (this.cacheEnabled) {\n      this.addToCache(cacheKey, filteredResults)\n    }\n\n    return filteredResults.length > 0 ? filteredResults : [{ language: 'en', confidence: 0.11 }]\n  }\n\n  /**\n   * Get the most likely language from text\n   */\n  detectPrimary(text: string): LanguageCode {\n    const results = this.detect(text)\n    return results.length > 0 && results[0] ? results[0].language : 'en'\n  }\n\n  /**\n   * Clear the detection cache\n   */\n  clearCache(): void {\n    detectionCache.clear()\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getCacheStats(): { size: number; maxSize: number } {\n    return {\n      size: detectionCache.size,\n      maxSize: MAX_CACHE_SIZE\n    }\n  }\n\n  private createCacheKey(text: string): string {\n    const normalized = text.toLowerCase().replace(/\\s+/g, ' ').trim()\n    return normalized.length > 100 ?\n      normalized.substring(0, 100) + `_${normalized.length}` :\n      normalized\n  }\n\n  private normalizeForDetection(text: string): string {\n    return text\n      .toLowerCase()\n      // Use Unicode categories instead of ranges to avoid misleading character class issues\n      .replace(/[^\\p{L}\\p{N}\\s]/gu, ' ')\n      .replace(/\\s+/g, ' ')\n      .trim()\n  }\n\n  private detectByCharacterFrequency(text: string): LanguageDetectionResult[] {\n    const results: LanguageDetectionResult[] = []\n    const textFreq = this.calculateCharacterFrequency(text)\n\n    for (const [langCode, langFreq] of Object.entries(LANGUAGE_FREQUENCIES)) {\n      const similarity = this.calculateFrequencySimilarity(textFreq, langFreq)\n      if (similarity > 0.15) { // Increased threshold\n        results.push({\n          language: langCode as LanguageCode,\n          confidence: similarity * 0.4 // Reduced weight to 40%\n        })\n      }\n    }\n\n    return results\n  }\n\n  private detectByPatterns(text: string): LanguageDetectionResult[] {\n    const results: LanguageDetectionResult[] = []\n    const words = text.split(/\\s+/).filter(word => word.length > 0)\n\n    // Enhanced high-confidence word markers with more distinctive words\n    const strongMarkers: Record<string, string[]> = {\n      en: ['the', 'and', 'that', 'have', 'for', 'not', 'with', 'you', 'this', 'but', 'his', 'from', 'they', 'are', 'be', 'an', 'will', 'would', 'could', 'should', 'am', 'is', 'writing', 'some', 'english', 'language'],\n      es: ['que', 'de', 'el', 'la', 'en', 'y', 'un', 'es', 'se', 'no', 'te', 'lo', 'le', 'da', 'su', 'por', 'con', 'para', 'como', 'muy', 'mundo', 'hola', 'gato', 'está', 'sobre', 'mesa', 'gusta', 'mucho', 'comida', 'española', 'buenos', 'días', 'cómo', 'está', 'usted', 'hoy'],\n      fr: ['le', 'de', 'et', 'être', 'un', 'il', 'avoir', 'ne', 'je', 'son', 'que', 'se', 'qui', 'ce', 'dans', 'vous', 'mon', 'ma', 'mes', 'tout', 'bonjour', 'monde', 'suis', 'très', 'content', 'voir', 'france', 'beau', 'pays', 'comment', 'allez-vous', 'aujourd\\'hui'],\n      de: ['der', 'die', 'und', 'in', 'den', 'von', 'zu', 'das', 'mit', 'sich', 'des', 'auf', 'für', 'ist', 'dem', 'nicht', 'ein', 'eine', 'einer', 'einen', 'hallo', 'welt', 'bin', 'sehr', 'glücklich', 'heute', 'deutschland', 'schönes', 'land', 'wie', 'geht', 'ihnen'],\n      it: ['che', 'di', 'il', 'un', 'a', 'è', 'per', 'una', 'in', 'del', 'la', 'non', 'le', 'si', 'da', 'questo', 'quello', 'quella', 'quelli', 'quelle'],\n      pt: ['que', 'de', 'o', 'a', 'e', 'do', 'da', 'em', 'um', 'para', 'é', 'com', 'não', 'uma', 'os', 'como', 'por', 'mas', 'muito', 'qual'],\n      nl: ['de', 'het', 'een', 'van', 'in', 'is', 'op', 'dat', 'met', 'voor', 'als', 'zijn', 'er', 'maar', 'om', 'niet', 'wat', 'hoe', 'waar', 'wie']\n    }\n\n    // Highly distinctive patterns for each language\n    const uniquePatterns: Record<string, RegExp[]> = {\n      en: [/\\b(the|and|that|have|for|not|with|you|this|but|his|from|they|are|be|am|is)\\b/gi, /\\b\\w+ing\\b/gi, /\\b\\w+ed\\b/gi, /\\b\\w+ly\\b/gi],\n      es: [/\\b(que|de|el|la|en|y|un|es|se|no|te|lo|le|da|su|por|con|para|como|muy)\\b/gi, /\\b\\w+ción\\b/gi, /\\b\\w+mente\\b/gi, /\\b(está|gato|mesa|gusta|comida|buenos|días|cómo|está|usted|hoy)\\b/gi, /[áéíóúüñ¿¡]/gi],\n      fr: [/\\b(le|de|et|être|un|il|avoir|ne|je|son|que|se|qui|ce|dans|vous|mon|ma|mes|tout)\\b/gi, /\\b\\w+ment\\b/gi, /\\b\\w+tion\\b/gi, /\\b(suis|très|content|voir|france|beau|pays|comment|allez-vous|aujourd'hui)\\b/gi, /[àâäéèêëïîôöùûüÿç]/gi],\n      de: [/\\b(der|die|und|in|den|von|zu|das|mit|sich|des|auf|für|ist|dem|nicht|ein|eine)\\b/gi, /\\b\\w+ung\\b/gi, /\\b\\w+lich\\b/gi, /\\b(bin|sehr|glücklich|heute|deutschland|schönes|land|wie|geht|ihnen)\\b/gi, /[äöüß]/gi],\n      it: [/\\b(che|di|il|un|a|è|per|una|in|del|la|non|le|si|da)\\b/gi, /\\b\\w+zione\\b/gi, /\\b\\w+mente\\b/gi, /[àáèéìíîòóùúü]/gi],\n      pt: [/\\b(que|de|o|a|e|do|da|em|um|para|é|com|não|uma|os)\\b/gi, /\\b\\w+ção\\b/gi, /\\b\\w+mente\\b/gi, /[áàâãéêíóôõúç]/gi],\n      nl: [/\\b(de|het|een|van|in|is|op|dat|met|voor|als|zijn|er|maar|om)\\b/gi, /\\b\\w+lijk\\b/gi, /\\b\\w+heid\\b/gi]\n    }\n\n    for (const [langCode, markers] of Object.entries(strongMarkers)) {\n      let score = 0\n\n      // Enhanced marker scoring with higher weight for very distinctive words\n      const markerMatches = words.filter(word => markers.includes(word.toLowerCase()))\n      const markerScore = markerMatches.length / Math.max(words.length, 1)\n      score += markerScore * 0.7\n\n      // Pattern matching\n      const patterns = uniquePatterns[langCode]\n      if (patterns) {\n        let patternScore = 0\n        for (const pattern of patterns) {\n          const matches = text.match(pattern)\n          if (matches) {\n            patternScore += matches.length\n          }\n        }\n        score += (patternScore / Math.max(words.length, 1)) * 0.3\n      }\n\n      // Boost confidence for strong matches and lower threshold\n      if (score > 0.02) {\n        results.push({\n          language: langCode as LanguageCode,\n          confidence: Math.min(score * 2.8, 1) // Further increased boost\n        })\n      }\n    }\n\n    return results\n  }\n\n  private detectByScript(text: string): LanguageDetectionResult[] {\n    const results: LanguageDetectionResult[] = []\n\n    // Enhanced script detection with better handling of overlapping scripts\n    const scriptChecks = [\n      { pattern: /[\\u4e00-\\u9fff]/, language: 'zh', name: 'Chinese' },\n      { pattern: /[\\u3040-\\u309f\\u30a0-\\u30ff]/, language: 'ja', name: 'Japanese' },\n      { pattern: /[\\u0600-\\u06ff]/, language: 'ar', name: 'Arabic' },\n      { pattern: /[\\u0400-\\u04ff]/, language: 'ru', name: 'Cyrillic' },\n      { pattern: /[\\u0900-\\u097f]/, language: 'hi', name: 'Devanagari' },\n      { pattern: /[\\uac00-\\ud7af]/, language: 'ko', name: 'Korean' }\n    ]\n\n    const cleanText = text.replace(/\\s/g, '')\n    if (cleanText.length === 0) return results\n\n    // Special handling for Chinese vs Japanese overlap\n    const chineseMatches = text.match(/[\\u4e00-\\u9fff]/g)\n    const japaneseMatches = text.match(/[\\u3040-\\u309f\\u30a0-\\u30ff]/g)\n\n    // If both Chinese and Japanese characters are found, determine dominant script\n    if (chineseMatches && japaneseMatches) {\n      const chineseRatio = chineseMatches.length / cleanText.length\n      const japaneseRatio = japaneseMatches.length / cleanText.length\n\n      // Japanese has kana, Chinese has mostly kanji - prefer Japanese if kana present\n      const hasKana = text.match(/[\\u3040-\\u309f\\u30a0-\\u30ff]/g)\n      if (hasKana && hasKana.length > 0) {\n        results.push({\n          language: 'ja',\n          confidence: Math.min(japaneseRatio * 4, 1) * 0.9\n        })\n        results.push({\n          language: 'zh',\n          confidence: Math.min(chineseRatio * 2, 1) * 0.5\n        })\n      } else {\n        results.push({\n          language: 'zh',\n          confidence: Math.min(chineseRatio * 4, 1) * 0.9\n        })\n        results.push({\n          language: 'ja',\n          confidence: Math.min(japaneseRatio * 2, 1) * 0.5\n        })\n      }\n    } else {\n      // Handle single script cases\n      for (const check of scriptChecks) {\n        const matches = text.match(new RegExp(check.pattern, 'g'))\n        if (matches && matches.length > 0) {\n          const scriptRatio = matches.length / cleanText.length\n          const confidence = Math.min(scriptRatio * 4, 1) // Increased multiplier\n\n          if (confidence > 0.05) { // Lowered threshold\n            results.push({\n              language: check.language as LanguageCode,\n              confidence: confidence * 0.9 // Weight script detection very highly\n            })\n          }\n        }\n      }\n    }\n\n    return results\n  }\n\n  private combineDetectionResults(\n    ...resultSets: LanguageDetectionResult[][]\n  ): LanguageDetectionResult[] {\n    const combined = new Map<string, number>()\n    const frequencyResults = resultSets[0] || []\n    const patternResults = resultSets[1] || []\n    const scriptResults = resultSets[2] || []\n\n    // Apply weights: patterns (65%) > frequency (10%) > script (25%)\n    for (const result of patternResults) {\n      const current = combined.get(result.language) || 0\n      combined.set(result.language, current + (result.confidence * 0.65))\n    }\n\n    for (const result of frequencyResults) {\n      const current = combined.get(result.language) || 0\n      combined.set(result.language, current + (result.confidence * 0.10))\n    }\n\n    for (const result of scriptResults) {\n      const current = combined.get(result.language) || 0\n      combined.set(result.language, current + (result.confidence * 0.25))\n    }\n\n    // Apply bonus for script-based detections (very strong signal)\n    const scriptLanguages = new Set(scriptResults.map(r => r.language))\n\n    return Array.from(combined.entries()).map(([language, confidence]) => {\n      let finalConfidence = Math.min(confidence, 1)\n\n      // Strong boost for script-based detections\n      if (scriptLanguages.has(language as LanguageCode)) {\n        finalConfidence = Math.min(finalConfidence * 8, 1)\n      }\n\n      // Additional boost for high-confidence pattern matches\n      if (finalConfidence > 0.5 && finalConfidence < 0.8) {\n        finalConfidence = Math.min(finalConfidence * 1.1, 1)\n      }\n\n      return {\n        language: language as LanguageCode,\n        confidence: finalConfidence\n      }\n    })\n  }\n\n  private calculateCharacterFrequency(text: string): Record<string, number> {\n    const freq: Record<string, number> = {}\n    const cleanText = text.replace(/\\s/g, '').toLowerCase()\n\n    if (cleanText.length === 0) return freq\n\n    for (const char of cleanText) {\n      freq[char] = (freq[char] || 0) + 1\n    }\n\n    // Convert to percentages\n    for (const char in freq) {\n      const count = freq[char]\n      if (count !== undefined) {\n        freq[char] = (count / cleanText.length) * 100\n      }\n    }\n\n    return freq\n  }\n\n  private calculateFrequencySimilarity(\n    textFreq: Record<string, number>,\n    langFreq: Record<string, number>\n  ): number {\n    let similarity = 0\n    let totalChars = 0\n\n    for (const char in langFreq) {\n      const textRate = textFreq[char] || 0\n      const langRate = langFreq[char] || 0\n      const diff = Math.abs(textRate - langRate)\n      similarity += Math.max(0, (langRate - diff) / langRate) * langRate\n      totalChars += langRate\n    }\n\n    return totalChars > 0 ? similarity / totalChars : 0\n  }\n\n  private addToCache(key: string, results: LanguageDetectionResult[]): void {\n    if (detectionCache.size >= MAX_CACHE_SIZE) {\n      // Remove oldest entries (simple FIFO approach)\n      const keysToDelete = Array.from(detectionCache.keys()).slice(0, 100)\n      for (const keyToDelete of keysToDelete) {\n        detectionCache.delete(keyToDelete)\n      }\n    }\n    detectionCache.set(key, results)\n  }\n}\n\n/**\n * Default language detection engine instance\n */\nexport const defaultLanguageDetector = new LanguageDetectionEngine()\n\n/**\n * Quick language detection function\n */\nexport function detectLanguage(text: string): LanguageCode {\n  return defaultLanguageDetector.detectPrimary(text)\n}\n\n/**\n * Detailed language detection function\n */\nexport function detectLanguages(text: string): LanguageDetection[] {\n  return defaultLanguageDetector.detect(text).map(result => ({\n    language: result.language,\n    confidence: result.confidence,\n    sample: result.sample\n  }))\n}\n\n/**\n * Check if text contains mixed languages\n */\nexport function hasMixedLanguages(text: string, threshold = 0.3): boolean {\n  const detections = defaultLanguageDetector.detect(text)\n  return detections.length > 1 && detections[1] !== undefined && detections[1].confidence > threshold\n}\n\n/**\n * Get language confidence for a specific language\n */\nexport function getLanguageConfidence(text: string, language: LanguageCode): number {\n  const detections = defaultLanguageDetector.detect(text)\n  const result = detections.find(d => d.language === language)\n  return result?.confidence || 0\n}","/**\n * Advanced text processing utilities for NaughtyWords\n * Handles Unicode normalization, RTL languages, and text cleanup\n */\n\nimport type { LanguageCode } from '../types/index.js'\n\n/**\n * RTL (Right-to-Left) language codes\n */\nexport const RTL_LANGUAGES: Set<LanguageCode> = new Set(['ar', 'he'])\n\n/**\n * Language-specific character normalization rules\n */\nconst LANGUAGE_NORMALIZATION: Record<string, Record<string, string>> = {\n  // English normalization\n  en: {\n    'ç': 'c', 'ñ': 'n', 'á': 'a', 'à': 'a', 'â': 'a', 'ä': 'a', 'ã': 'a', 'å': 'a',\n    'é': 'e', 'è': 'e', 'ê': 'e', 'ë': 'e', 'í': 'i', 'ì': 'i', 'î': 'i', 'ï': 'i',\n    'ó': 'o', 'ò': 'o', 'ô': 'o', 'ö': 'o', 'õ': 'o', 'ú': 'u', 'ù': 'u', 'û': 'u',\n    'ü': 'u', 'ý': 'y', 'ÿ': 'y'\n  },\n  // French specific\n  fr: {\n    'œ': 'oe', 'æ': 'ae', 'ß': 'ss'\n  },\n  // German specific\n  de: {\n    'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'ß': 'ss'\n  },\n  // Spanish specific\n  es: {\n    'ñ': 'n', 'ç': 'c'\n  },\n  // Portuguese specific\n  pt: {\n    'ã': 'a', 'õ': 'o', 'ç': 'c'\n  },\n  // Italian specific\n  it: {\n    'ç': 'c'\n  }\n}\n\n/**\n * Unicode category mappings for normalization\n */\nexport const UNICODE_CATEGORIES = {\n  // Diacritical marks to remove\n  DIACRITICS: /[\\u0300-\\u036f]/g,\n  // Combining marks - use Unicode property escapes\n  COMBINING_MARKS: /\\p{M}/gu,\n  // Control characters to remove - use Unicode property escape\n  CONTROL_CHARS: /\\p{C}/gu,\n  // Zero-width characters\n  ZERO_WIDTH: /[\\u200b-\\u200f\\u202a-\\u202e\\u2060-\\u206f\\ufeff]/g,\n  // Punctuation and symbols (extended)\n  PUNCTUATION: /[\\u0021-\\u002f\\u003a-\\u0040\\u005b-\\u0060\\u007b-\\u007e\\u00a1-\\u00bf\\u2000-\\u206f\\u2e00-\\u2e7f]/g,\n  // Mathematical operators\n  MATH_OPERATORS: /[\\u2200-\\u22ff\\u27c0-\\u27ef\\u2980-\\u29ff\\u2a00-\\u2aff]/g,\n  // Emoji ranges (updated to include modern emoji)\n  // eslint-disable-next-line no-misleading-character-class\n  EMOJI: /[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F700}-\\u{1F77F}\\u{1F780}-\\u{1F7FF}\\u{1F800}-\\u{1F8FF}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F1E6}-\\u{1F1FF}\\u{1F3FB}-\\u{1F3FF}]/gu\n}\n\n/**\n * Text processing configuration\n */\nexport interface TextProcessingConfig {\n  /** Target language for processing */\n  language?: LanguageCode\n  /** Enable Unicode normalization */\n  unicodeNormalization?: boolean\n  /** Normalization form (NFC, NFD, NFKC, NFKD) */\n  normalizationForm?: 'NFC' | 'NFD' | 'NFKC' | 'NFKD'\n  /** Remove diacritical marks */\n  removeDiacritics?: boolean\n  /** Handle RTL text processing */\n  handleRTL?: boolean\n  /** Preserve whitespace structure */\n  preserveWhitespace?: boolean\n  /** Remove control characters */\n  removeControlChars?: boolean\n  /** Remove zero-width characters */\n  removeZeroWidth?: boolean\n  /** Convert to lowercase */\n  lowercase?: boolean\n  /** Remove punctuation */\n  removePunctuation?: boolean\n  /** Remove emoji */\n  removeEmoji?: boolean\n  /** Maximum text length for processing */\n  maxLength?: number\n}\n\n/**\n * Default configuration for text processing\n */\nexport const DEFAULT_TEXT_PROCESSING_CONFIG: Required<TextProcessingConfig> = {\n  language: 'en',\n  unicodeNormalization: true,\n  normalizationForm: 'NFKC',\n  removeDiacritics: true,\n  handleRTL: true,\n  preserveWhitespace: false,\n  removeControlChars: true,\n  removeZeroWidth: true,\n  lowercase: true,\n  removePunctuation: true,\n  removeEmoji: false,\n  maxLength: 10000\n}\n\n/**\n * Advanced text processor class\n */\nexport class TextProcessor {\n  private config: Required<TextProcessingConfig>\n\n  constructor(config: Partial<TextProcessingConfig> = {}) {\n    this.config = { ...DEFAULT_TEXT_PROCESSING_CONFIG, ...config }\n  }\n\n  /**\n   * Process text with all configured normalizations\n   */\n  process(text: string, overrideConfig?: Partial<TextProcessingConfig>): string {\n    if (!text) return ''\n\n    const config = overrideConfig\n      ? { ...this.config, ...overrideConfig }\n      : this.config\n\n    let processed = text\n\n    // Length check\n    if (config.maxLength && processed.length > config.maxLength) {\n      processed = processed.substring(0, config.maxLength)\n    }\n\n    // Unicode normalization\n    if (config.unicodeNormalization) {\n      processed = this.normalizeUnicode(processed, config.normalizationForm)\n    }\n\n    // Remove control characters\n    if (config.removeControlChars) {\n      processed = processed.replace(UNICODE_CATEGORIES.CONTROL_CHARS, '')\n    }\n\n    // Remove zero-width characters\n    if (config.removeZeroWidth) {\n      processed = processed.replace(UNICODE_CATEGORIES.ZERO_WIDTH, '')\n    }\n\n    // Handle RTL text\n    if (config.handleRTL && RTL_LANGUAGES.has(config.language)) {\n      processed = this.processRTL(processed)\n    }\n\n    // Language-specific normalization (before case conversion)\n    processed = this.applyLanguageNormalization(processed, config.language)\n\n    // Case normalization (before diacritic removal for Turkish)\n    if (config.lowercase) {\n      processed = this.normalizeCase(processed, config.language)\n    }\n\n    // Remove diacritics\n    if (config.removeDiacritics) {\n      processed = this.removeDiacritics(processed)\n    }\n\n    // Remove punctuation\n    if (config.removePunctuation) {\n      processed = this.removePunctuation(processed, config.preserveWhitespace)\n    }\n\n    // Remove emoji\n    if (config.removeEmoji) {\n      processed = this.removeEmoji(processed)\n    }\n\n    // Normalize whitespace\n    if (!config.preserveWhitespace) {\n      processed = this.normalizeWhitespace(processed)\n    }\n\n    return processed.trim()\n  }\n\n  /**\n   * Normalize Unicode characters\n   */\n  normalizeUnicode(text: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' = 'NFKC'): string {\n    try {\n      return text.normalize(form)\n    } catch (error) {\n      // Fallback if normalization fails\n      console.warn('Unicode normalization failed:', error)\n      return text\n    }\n  }\n\n  /**\n   * Remove diacritical marks from text\n   */\n  removeDiacritics(text: string): string {\n    return text\n      .normalize('NFD')\n      .replace(UNICODE_CATEGORIES.DIACRITICS, '')\n      .normalize('NFC')\n  }\n\n  /**\n   * Apply language-specific character normalizations\n   */\n  applyLanguageNormalization(text: string, language: LanguageCode): string {\n    const rules = LANGUAGE_NORMALIZATION[language]\n    if (!rules) return text\n\n    let normalized = text\n    for (const [from, to] of Object.entries(rules)) {\n      normalized = normalized.replace(new RegExp(from, 'g'), to)\n    }\n    return normalized\n  }\n\n  /**\n   * Process RTL (Right-to-Left) text\n   */\n  processRTL(text: string): string {\n    // Remove RTL/LTR marks and isolates\n    return text\n      .replace(/[\\u200e\\u200f\\u202a-\\u202e\\u2066-\\u2069]/g, '')\n      .replace(/\\u061c/g, '') // Arabic letter mark\n      .trim()\n  }\n\n  /**\n   * Normalize case with language-specific rules\n   */\n  normalizeCase(text: string, language: LanguageCode): string {\n    switch (language) {\n      case 'tr': // Turkish has special case rules for i/I\n        {\n          // Handle Turkish dotted/undotted i correctly\n          // Process character by character to preserve Turkish case rules\n          let result = ''\n          for (let i = 0; i < text.length; i++) {\n            const char = text[i]\n            switch (char) {\n              case 'İ':\n                result += 'i'  // Capital dotted I -> lowercase dotted i\n                break\n              case 'I':\n                result += 'ı'  // Capital undotted I -> lowercase undotted ı\n                break\n              case 'i':\n                result += 'i'  // lowercase dotted i stays the same\n                break\n              case 'ı':\n                result += 'ı'  // lowercase undotted ı stays the same\n                break\n              default:\n                result += char ? char.toLowerCase() : ''\n                break\n            }\n          }\n          return result\n        }\n\n      case 'de': // German ß handling\n        return text.toLowerCase().replace(/ß/g, 'ss')\n\n      default:\n        return text.toLowerCase()\n    }\n  }\n\n  /**\n   * Remove emoji from text\n   */\n  removeEmoji(text: string): string {\n    // Use the updated emoji regex\n    return text.replace(UNICODE_CATEGORIES.EMOJI, '')\n  }\n\n  /**\n   * Remove punctuation while optionally preserving whitespace structure\n   */\n  removePunctuation(text: string, preserveWhitespace = false): string {\n    if (preserveWhitespace) {\n      // Replace punctuation with single space\n      return text.replace(UNICODE_CATEGORIES.PUNCTUATION, ' ')\n    } else {\n      // Remove punctuation entirely\n      return text.replace(UNICODE_CATEGORIES.PUNCTUATION, '')\n    }\n  }\n\n  /**\n   * Normalize whitespace characters\n   */\n  normalizeWhitespace(text: string): string {\n    return text\n      // Replace various whitespace characters with regular space\n      .replace(/[\\u00a0\\u1680\\u2000-\\u200a\\u202f\\u205f\\u3000]/g, ' ')\n      // Collapse multiple whitespace into single space\n      .replace(/\\s+/g, ' ')\n      .trim()\n  }\n\n  /**\n   * Check if text contains RTL characters\n   */\n  hasRTLCharacters(text: string): boolean {\n    // Arabic, Hebrew, and other RTL scripts\n    const rtlRanges = [\n      /[\\u0590-\\u05ff]/,  // Hebrew\n      /[\\u0600-\\u06ff]/,  // Arabic\n      /[\\u0750-\\u077f]/,  // Arabic Supplement\n      /[\\u08a0-\\u08ff]/,  // Arabic Extended-A\n      /[\\ufb1d-\\ufb4f]/,  // Hebrew Presentation Forms\n      /[\\ufb50-\\ufdff]/,  // Arabic Presentation Forms-A\n      /[\\ufe70-\\ufeff]/   // Arabic Presentation Forms-B\n    ]\n\n    return rtlRanges.some(pattern => pattern.test(text))\n  }\n\n  /**\n   * Detect and extract different character encodings\n   */\n  detectEncoding(text: string): {\n    hasAscii: boolean\n    hasLatin: boolean\n    hasExtendedLatin: boolean\n    hasCyrillic: boolean\n    hasArabic: boolean\n    hasHebrew: boolean\n    hasCJK: boolean\n    hasEmoji: boolean\n  } {\n    return {\n      hasAscii: /[\\x20-\\x7e]/.test(text), // ASCII printable characters\n      hasLatin: /[\\u0080-\\u00ff]/.test(text),\n      hasExtendedLatin: /[\\u0100-\\u017f\\u0180-\\u024f]/.test(text),\n      hasCyrillic: /[\\u0400-\\u04ff]/.test(text),\n      hasArabic: /[\\u0600-\\u06ff]/.test(text),\n      hasHebrew: /[\\u0590-\\u05ff]/.test(text),\n      hasCJK: /[\\u4e00-\\u9fff\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af]/.test(text),\n      hasEmoji: UNICODE_CATEGORIES.EMOJI.test(text)\n    }\n  }\n\n  /**\n   * Clean text for comparison operations\n   */\n  cleanForComparison(text: string): string {\n    return this.process(text, {\n      removeDiacritics: true,\n      removePunctuation: true,\n      removeEmoji: true,\n      lowercase: true,\n      preserveWhitespace: false\n    })\n  }\n\n  /**\n   * Prepare text for search operations\n   */\n  prepareForSearch(text: string): string {\n    return this.process(text, {\n      removeDiacritics: true,\n      removePunctuation: false,\n      removeEmoji: false,\n      lowercase: true,\n      preserveWhitespace: true\n    })\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(newConfig: Partial<TextProcessingConfig>): void {\n    this.config = { ...this.config, ...newConfig }\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): Required<TextProcessingConfig> {\n    return { ...this.config }\n  }\n}\n\n/**\n * Default text processor instance\n */\nexport const defaultTextProcessor = new TextProcessor()\n\n/**\n * Quick text normalization function\n */\nexport function normalizeText(\n  text: string,\n  config?: Partial<TextProcessingConfig>\n): string {\n  return defaultTextProcessor.process(text, config)\n}\n\n/**\n * Clean text for profanity detection\n */\nexport function cleanTextForDetection(\n  text: string,\n  language: LanguageCode = 'en'\n): string {\n  return defaultTextProcessor.process(text, {\n    language,\n    removeDiacritics: true,\n    removePunctuation: true,\n    removeEmoji: false,\n    lowercase: true,\n    preserveWhitespace: false\n  })\n}\n\n/**\n * Extract meaningful words from text\n */\nexport function extractWords(\n  text: string,\n  minLength = 2,\n  maxLength = 50\n): string[] {\n  const normalized = normalizeText(text, { preserveWhitespace: true })\n\n  return normalized\n    .split(/\\s+/)\n    .map(word => word.replace(/[^a-zA-Z]/g, ''))\n    .filter(word => word.length >= minLength && word.length <= maxLength)\n    .filter(word => /[a-zA-Z]/.test(word)) // Must contain at least one letter\n}\n\n/**\n * Check if text is primarily RTL\n */\nexport function isRTLText(text: string): boolean {\n  const processor = new TextProcessor()\n  return processor.hasRTLCharacters(text)\n}\n\n/**\n * Get text statistics\n */\nexport function getTextStats(text: string): {\n  length: number\n  wordCount: number\n  charCount: number\n  encoding: ReturnType<TextProcessor['detectEncoding']>\n  isRTL: boolean\n  hasMultipleScripts: boolean\n} {\n  const processor = new TextProcessor()\n  const words = extractWords(text)\n  const encoding = processor.detectEncoding(text)\n\n  // Check if multiple scripts are present\n  const scriptCount = Object.values(encoding).filter(Boolean).length\n\n  return {\n    length: text.length,\n    wordCount: words.length,\n    charCount: text.replace(/\\s/g, '').length,\n    encoding,\n    isRTL: processor.hasRTLCharacters(text),\n    hasMultipleScripts: scriptCount > 1\n  }\n}","import type { LanguageDetection } from '../types/index.js'\nimport type { LanguageCode } from '../types/index.js'\nimport { LanguageDetectionEngine } from '../utils/language-detection.js'\nimport { normalizeText } from '../utils/text-processing.js'\n\n/**\n * Language detection for profanity filtering\n * Enhanced with advanced language detection capabilities\n */\nexport class LanguageDetector {\n  private engine: LanguageDetectionEngine\n\n  constructor(options: {\n    cacheEnabled?: boolean\n    minTextLength?: number\n    maxSampleLength?: number\n  } = {}) {\n    this.engine = new LanguageDetectionEngine(options)\n  }\n\n  /**\n   * Detect the language of the given text\n   */\n  async detect(text: string): Promise<LanguageDetection[]> {\n    if (!text || text.trim().length === 0) {\n      return []\n    }\n\n    // Normalize text for better detection accuracy\n    const normalizedText = normalizeText(text, {\n      removePunctuation: false,\n      removeEmoji: false,\n      preserveWhitespace: true\n    })\n\n    const results = this.engine.detect(normalizedText)\n\n    return results.map(result => ({\n      language: result.language,\n      confidence: result.confidence,\n      sample: result.sample || text.substring(0, 50),\n    }))\n  }\n\n  /**\n   * Get the most likely language from detection results\n   */\n  getPrimaryLanguage(detections: LanguageDetection[]): LanguageCode {\n    if (detections.length === 0) return 'en'\n    return detections.reduce((prev, current) =>\n      current.confidence > prev.confidence ? current : prev\n    ).language\n  }\n\n  /**\n   * Detect language synchronously for performance-critical operations\n   */\n  detectSync(text: string): LanguageDetection[] {\n    if (!text || text.trim().length === 0) {\n      return [\n        {\n          language: 'en' as LanguageCode,\n          confidence: 0.1,\n          sample: '',\n        },\n      ]\n    }\n\n    const normalizedText = normalizeText(text, {\n      removePunctuation: false,\n      removeEmoji: false,\n      preserveWhitespace: true\n    })\n\n    const results = this.engine.detect(normalizedText)\n\n    return results.map(result => ({\n      language: result.language,\n      confidence: result.confidence,\n      sample: result.sample || text.substring(0, 50),\n    }))\n  }\n\n  /**\n   * Get the primary language synchronously\n   */\n  getPrimaryLanguageSync(text: string): LanguageCode {\n    const detections = this.detectSync(text)\n    return this.getPrimaryLanguage(detections)\n  }\n\n  /**\n   * Check if text contains mixed languages\n   */\n  hasMixedLanguages(text: string, threshold = 0.3): boolean {\n    const detections = this.detectSync(text)\n    if (detections.length <= 1 || !detections[1]) {\n      return false\n    }\n    return detections[1].confidence > threshold\n  }\n\n  /**\n   * Get confidence for a specific language\n   */\n  getLanguageConfidence(text: string, language: LanguageCode): number {\n    const detections = this.detectSync(text)\n    const result = detections.find(d => d.language === language)\n    return result?.confidence || 0\n  }\n\n  /**\n   * Clear the detection cache\n   */\n  clearCache(): void {\n    this.engine.clearCache()\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getCacheStats(): { size: number; maxSize: number } {\n    return this.engine.getCacheStats()\n  }\n}\n","import type {\n  DetectorConfig,\n  DetectionResult,\n  DetectionMatch,\n  AnalysisOptions,\n  LanguageCode,\n  CustomWord,\n} from '../types/index.js'\nimport { SeverityLevel, FilterMode } from '../types/index.js'\nimport { DEFAULT_DETECTOR_CONFIG } from '../config/default-config.js'\nimport { ProfanityMatcher, type MatcherConfig } from './profanity-matcher.js'\nimport { ProfanityFilter, type FilterConfig } from './filter.js'\nimport {\n  DetectionResultBuilder,\n  type EnhancedDetectionResult,\n} from './detection-result.js'\nimport { LanguageDetector } from './language-detector.js'\nimport { textNormalizer } from '../utils/text-normalizer.js'\nimport { LANGUAGE_DATA } from '../languages/data/index.js'\n\n/**\n * Main profanity detection class with comprehensive analysis capabilities\n */\nexport class ContentShieldDetector {\n  private config: DetectorConfig\n  private matcher: ProfanityMatcher\n  private filterEngine: ProfanityFilter\n  private languageDetector: LanguageDetector\n  private isInitialized = false\n  private configHash = ''\n\n  constructor(config: Partial<DetectorConfig> = {}) {\n    this.config = this.mergeWithDefaults(config)\n    this.configHash = this.generateConfigHash(this.config)\n\n    // Initialize components\n    this.languageDetector = new LanguageDetector()\n    this.matcher = new ProfanityMatcher(this.createMatcherConfig())\n    this.filterEngine = new ProfanityFilter(this.createFilterConfig())\n  }\n\n  /**\n   * Initialize the detector with language data\n   */\n  async initialize(_dataPath?: string): Promise<void> {\n    if (this.isInitialized) return\n\n    // Load language data for each configured language\n    const loadPromises = this.config.languages\n      .filter(lang => lang !== 'auto')\n      .map(async lang => {\n        const langCode = lang as LanguageCode\n\n        // Priority 1: Use languageData from config if provided\n        if (this.config.languageData?.[langCode]) {\n          const words = this.config.languageData[langCode].words || []\n          await this.matcher.loadLanguage(langCode, words)\n        } else {\n          // Priority 2: Use static LANGUAGE_DATA imports\n          const langData = LANGUAGE_DATA[langCode]\n          if (langData?.words) {\n            await this.matcher.loadLanguage(langCode, langData.words)\n          } else {\n            console.warn(`Language data for ${langCode} not found`)\n          }\n        }\n      })\n\n    await Promise.all(loadPromises)\n\n    // Add custom words if any\n    if (this.config.customWords.length > 0) {\n      this.matcher.addCustomWords(this.config.customWords)\n    }\n\n    this.isInitialized = true\n  }\n\n  /**\n   * Analyze text for profanity with comprehensive results\n   */\n  async analyze(\n    text: string,\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<DetectionResult> {\n    // Enhanced analysis returns EnhancedDetectionResult but we return base type for compatibility\n    const enhanced = await this.analyzeEnhanced(text, options)\n    return enhanced as DetectionResult\n  }\n\n  /**\n   * Enhanced analysis with detailed metrics and context\n   */\n  async analyzeEnhanced(\n    text: string,\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<EnhancedDetectionResult> {\n    await this.ensureInitialized()\n\n    // Handle null/undefined/empty inputs\n    if (!text || text.length === 0) {\n      const builder = new DetectionResultBuilder(text || '')\n      return builder.build() as EnhancedDetectionResult\n    }\n\n    const effectiveOptions = this.mergeAnalysisOptions(options)\n    const builder = new DetectionResultBuilder(text)\n\n    builder.setConfigHash(this.configHash)\n\n    if (effectiveOptions.measurePerformance) {\n      builder.markPerformance('language_detection_start')\n    }\n\n    // Step 1: Detect languages\n    let detectedLanguages: LanguageCode[]\n    if (this.config.languages.includes('auto')) {\n      const languageResults = await this.languageDetector.detect(text)\n\n      // For mixed text with multiple scripts, be more permissive\n      const hasMultipleScripts = this.hasMultipleScripts(text)\n      const threshold = hasMultipleScripts ? 0.1 : 0.5\n\n      detectedLanguages = languageResults\n        .filter(result => result.confidence > threshold)\n        .map(result => result.language)\n\n      // Fallback to English if no languages detected\n      if (detectedLanguages.length === 0) {\n        detectedLanguages = ['en']\n      }\n    } else {\n      detectedLanguages = this.config.languages.filter(lang => lang !== 'auto')\n    }\n\n    builder.setLanguages(detectedLanguages)\n\n    if (effectiveOptions.measurePerformance) {\n      builder.markPerformance('language_detection_end')\n      builder.markPerformance('normalization_start')\n    }\n\n    // Step 2: Text normalization\n    const normalizedText = this.config.normalizeText\n      ? textNormalizer.normalize(text, {\n          removeAccents: true,\n          expandContractions: true,\n          normalizeWhitespace: true,\n          preserveCase: false,\n        })\n      : text\n\n    if (effectiveOptions.measurePerformance) {\n      builder.markPerformance('normalization_end')\n      builder.markPerformance('matching_start')\n    }\n\n    // Step 3: Find profanity matches\n    const matches = this.matcher.findMatches(\n      normalizedText,\n      detectedLanguages,\n      false\n    )\n\n    builder.addMatches(matches)\n\n    if (effectiveOptions.measurePerformance) {\n      builder.markPerformance('matching_end')\n      builder.markPerformance('context_start')\n    }\n\n    // Step 4: Calculate overall confidence\n    const overallConfidence = this.calculateOverallConfidence(matches, text)\n    builder.setConfidence(overallConfidence)\n\n    if (effectiveOptions.measurePerformance) {\n      builder.markPerformance('context_end')\n      builder.markPerformance('filtering_start')\n    }\n\n    // Step 5: Apply filtering if requested\n    let filteredText = text\n    if (effectiveOptions.filterMode !== FilterMode.DETECT_ONLY) {\n      const filterResult = this.filterEngine.filter(text, matches, {\n        mode: effectiveOptions.filterMode,\n        confidenceThreshold: 0.5,\n      })\n      filteredText = filterResult.filteredText\n    }\n\n    builder.setFilteredText(filteredText)\n\n    if (effectiveOptions.measurePerformance) {\n      builder.markPerformance('filtering_end')\n    }\n\n    // Generate warnings and recommendations\n    this.addWarningsAndRecommendations(builder, matches, text)\n\n    return builder.build()\n  }\n\n  /**\n   * Check if text contains multiple Unicode scripts\n   */\n  private hasMultipleScripts(text: string): boolean {\n    const scripts = [\n      { pattern: /[\\u4e00-\\u9fff]/, name: 'Chinese' },\n      { pattern: /[\\u3040-\\u309f\\u30a0-\\u30ff]/, name: 'Japanese' },\n      { pattern: /[\\u0600-\\u06ff]/, name: 'Arabic' },\n      { pattern: /[\\u0400-\\u04ff]/, name: 'Cyrillic' },\n      { pattern: /[\\u0900-\\u097f]/, name: 'Devanagari' },\n      { pattern: /[\\uac00-\\ud7af]/, name: 'Korean' },\n      { pattern: /[a-zA-Z]/, name: 'Latin' },\n    ]\n\n    const detectedScripts = new Set<string>()\n    for (const script of scripts) {\n      if (script.pattern.test(text)) {\n        detectedScripts.add(script.name)\n      }\n    }\n\n    return detectedScripts.size > 1\n  }\n\n  /**\n   * Quick check if text contains profanity\n   */\n  async isProfane(text: string): Promise<boolean> {\n    const result = await this.analyze(text)\n    return result.hasProfanity\n  }\n\n  /**\n   * Filter profanity from text\n   */\n  async filter(\n    text: string,\n    mode: FilterMode = FilterMode.CENSOR\n  ): Promise<string> {\n    const result = await this.analyze(text, { filterMode: mode })\n    return result.filteredText\n  }\n\n  /**\n   * Batch analyze multiple texts (basic implementation)\n   * Note: Enhanced batch analysis is available via performance optimizations\n   */\n  async batchAnalyzeBasic(\n    texts: string[],\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<DetectionResult[]> {\n    await this.ensureInitialized()\n\n    const promises = texts.map(text => this.analyze(text, options))\n    return Promise.all(promises)\n  }\n\n  /**\n   * Get detection statistics\n   */\n  getStats(): {\n    isInitialized: boolean\n    configHash: string\n    matcherStats: {\n      totalLanguages: number\n      totalWords: number\n      trieStats: Record<\n        string,\n        {\n          totalWords: number\n          totalNodes: number\n          averageDepth: number\n          maxDepth: number\n          memoryUsage: number\n        }\n      >\n    }\n    filterStats: {\n      customReplacements: number\n      categoryReplacements: number\n      currentMode: import('../types/index.js').FilterMode\n      preserveStructure: boolean\n    }\n    supportedLanguages: LanguageCode[]\n  } {\n    return {\n      isInitialized: this.isInitialized,\n      configHash: this.configHash,\n      matcherStats: this.matcher.getStats(),\n      filterStats: this.filterEngine.getStats(),\n      supportedLanguages: this.config.languages,\n    }\n  }\n\n  /**\n   * Add custom words to the detector\n   */\n  addCustomWords(customWords: CustomWord[]): void {\n    this.config.customWords.push(...customWords)\n    this.matcher.addCustomWords(customWords)\n    this.configHash = this.generateConfigHash(this.config)\n  }\n\n  /**\n   * Update detector configuration\n   */\n  updateConfig(config: Partial<DetectorConfig>): void {\n    this.config = this.mergeWithDefaults({ ...this.config, ...config })\n    this.configHash = this.generateConfigHash(this.config)\n\n    // Update component configurations\n    this.matcher.updateConfig(this.createMatcherConfig())\n    this.filterEngine.updateConfig(this.createFilterConfig())\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): DetectorConfig {\n    return { ...this.config }\n  }\n\n  /**\n   * Reset detector (clear cache and reinitialize)\n   */\n  async reset(): Promise<void> {\n    this.isInitialized = false\n    await this.initialize()\n  }\n\n  /**\n   * Export detector configuration for serialization\n   */\n  exportConfig(): object {\n    return {\n      config: this.config,\n      configHash: this.configHash,\n      version: '1.0.0',\n      timestamp: new Date().toISOString(),\n    }\n  }\n\n  /**\n   * Import detector configuration\n   */\n  importConfig(exportedConfig: { config?: DetectorConfig }): void {\n    if (exportedConfig.config) {\n      this.updateConfig(exportedConfig.config)\n    }\n  }\n\n  /**\n   * Ensure detector is initialized\n   */\n  private async ensureInitialized(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize()\n    }\n  }\n\n  /**\n   * Create matcher configuration from detector config\n   */\n  private createMatcherConfig(): MatcherConfig {\n    return {\n      languages: this.config.languages,\n      minSeverity: this.config.minSeverity,\n      categories: this.config.categories,\n      fuzzyMatching: this.config.fuzzyMatching,\n      fuzzyThreshold: this.config.fuzzyThreshold,\n      whitelist: this.config.whitelist,\n      contextAware: true,\n      minWordLength: 2,\n      // Conservative edit distance: max 1 for high threshold (0.8), max 2 for lower thresholds\n      maxEditDistance:\n        this.config.fuzzyThreshold >= 0.8\n          ? 1\n          : Math.max(1, Math.floor(this.config.fuzzyThreshold * 3)),\n    }\n  }\n\n  /**\n   * Create filter configuration from detector config\n   */\n  private createFilterConfig(): FilterConfig {\n    return {\n      mode: FilterMode.CENSOR,\n      replacementChar: this.config.replacementChar,\n      preserveStructure: this.config.preserveStructure,\n      customReplacements: new Map(),\n      preserveSentenceStructure: true,\n      maintainLength: false,\n      confidenceThreshold: 0.5,\n      gradualFiltering: true,\n      categoryReplacements: new Map(),\n    }\n  }\n\n  /**\n   * Calculate overall confidence based on matches\n   */\n  private calculateOverallConfidence(\n    matches: DetectionMatch[],\n    text: string\n  ): number {\n    if (matches.length === 0) return 1.0\n\n    // Base confidence on average match confidence, text length, and context\n    const averageConfidence =\n      matches.reduce((sum, match) => sum + match.confidence, 0) / matches.length\n\n    // Adjust for text length (longer text generally more reliable)\n    const lengthFactor = Math.min(1.0, text.length / 100)\n\n    // Adjust for number of matches (more matches generally more confident)\n    const matchesFactor = Math.min(1.0, matches.length / 5)\n\n    return Math.max(\n      0.1,\n      Math.min(\n        1.0,\n        averageConfidence * (0.7 + lengthFactor * 0.2 + matchesFactor * 0.1)\n      )\n    )\n  }\n\n  /**\n   * Add warnings and recommendations to the result builder\n   */\n  private addWarningsAndRecommendations(\n    builder: DetectionResultBuilder,\n    matches: DetectionMatch[],\n    text: string\n  ): void {\n    // Add warnings for potential issues\n    if (text.length < 10) {\n      builder.addWarning('Very short text - results may be less reliable')\n    }\n\n    if (matches.some(m => m.confidence < 0.5)) {\n      builder.addWarning(\n        'Some matches have low confidence - manual review recommended'\n      )\n    }\n\n    if (\n      this.config.languages.length === 1 &&\n      this.config.languages[0] === 'auto'\n    ) {\n      builder.addWarning(\n        'Auto language detection enabled - specify languages for better performance'\n      )\n    }\n\n    // Add recommendations\n    if (matches.length > text.split(' ').length * 0.2) {\n      builder.addRecommendation(\n        'High profanity density detected - consider comprehensive content review'\n      )\n    }\n\n    if (matches.some(m => m.severity >= SeverityLevel.SEVERE)) {\n      builder.addRecommendation(\n        'Severe profanity detected - immediate action recommended'\n      )\n    }\n  }\n\n  /**\n   * Merge analysis options with defaults\n   */\n  private mergeAnalysisOptions(\n    options: Partial<AnalysisOptions>\n  ): AnalysisOptions {\n    return {\n      filterMode: FilterMode.DETECT_ONLY,\n      includeMatches: true,\n      includeConfidence: true,\n      measurePerformance: false,\n      maxLength: 100000,\n      ...options,\n    }\n  }\n\n  /**\n   * Generate configuration hash for caching\n   */\n  private generateConfigHash(config: DetectorConfig): string {\n    const configString = JSON.stringify({\n      languages: config.languages.sort(),\n      minSeverity: config.minSeverity,\n      categories: config.categories.sort(),\n      fuzzyMatching: config.fuzzyMatching,\n      fuzzyThreshold: config.fuzzyThreshold,\n      customWords: config.customWords.map(w => w.word).sort(),\n      whitelist: config.whitelist.sort(),\n    })\n\n    // Simple hash function\n    let hash = 0\n    for (let i = 0; i < configString.length; i++) {\n      const char = configString.charCodeAt(i)\n      hash = (hash << 5) - hash + char\n      hash = hash & hash // Convert to 32-bit integer\n    }\n\n    return hash.toString(36)\n  }\n\n  /**\n   * Merge configuration with defaults\n   */\n  private mergeWithDefaults(config: Partial<DetectorConfig>): DetectorConfig {\n    return {\n      ...DEFAULT_DETECTOR_CONFIG,\n      ...config,\n    }\n  }\n\n  /**\n   * PERFORMANCE OPTIMIZATIONS\n   */\n\n  // Analysis cache for frequently analyzed texts\n  private analysisCache = new Map<string, EnhancedDetectionResult>()\n  private readonly MAX_ANALYSIS_CACHE_SIZE = 500\n  private analysisCacheHits = 0\n  private analysisCacheMisses = 0\n\n  /**\n   * Cached analysis with intelligent cache management\n   */\n  async analyzeCached(\n    text: string,\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<EnhancedDetectionResult> {\n    const cacheKey = this.generateAnalysisCacheKey(text, options)\n\n    // Check cache first\n    if (this.analysisCache.has(cacheKey)) {\n      this.analysisCacheHits++\n      const cachedResult = this.analysisCache.get(cacheKey)\n      if (cachedResult) {\n        return cachedResult\n      }\n    }\n\n    this.analysisCacheMisses++\n    const result = await this.analyzeEnhanced(text, options)\n\n    // Add to cache if under limit\n    if (this.analysisCache.size < this.MAX_ANALYSIS_CACHE_SIZE) {\n      this.analysisCache.set(cacheKey, result)\n    } else {\n      // Remove oldest entries\n      const oldestKey = this.analysisCache.keys().next().value\n      if (oldestKey !== undefined) {\n        this.analysisCache.delete(oldestKey)\n      }\n      this.analysisCache.set(cacheKey, result)\n    }\n\n    return result\n  }\n\n  /**\n   * Batch analysis for multiple texts - significantly more efficient\n   */\n  async batchAnalyze(\n    texts: string[],\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<EnhancedDetectionResult[]> {\n    await this.ensureInitialized()\n\n    // Pre-warm language detector for better performance\n    if (texts.length > 10) {\n      const sampleTexts = texts.slice(0, 3).join(' ')\n      await this.languageDetector.detect(sampleTexts)\n    }\n\n    // PERFORMANCE OPTIMIZATION: Larger batch size for better parallelization\n    // Adjusted from 10 to 25 for better throughput\n    const BATCH_SIZE = 25\n    const results: EnhancedDetectionResult[] = []\n\n    for (let i = 0; i < texts.length; i += BATCH_SIZE) {\n      const batch = texts.slice(i, i + BATCH_SIZE)\n      const batchPromises = batch.map(text => this.analyzeCached(text, options))\n      const batchResults = await Promise.all(batchPromises)\n      results.push(...batchResults)\n    }\n\n    return results\n  }\n\n  /**\n   * Memory-efficient streaming analysis for large datasets\n   */\n  async *batchAnalyzeStream(\n    texts: Iterable<string>,\n    options: Partial<AnalysisOptions> = {}\n  ): AsyncGenerator<EnhancedDetectionResult, void, unknown> {\n    for (const text of texts) {\n      yield await this.analyzeCached(text, options)\n    }\n  }\n\n  /**\n   * Worker thread support for large text processing\n   *\n   * NOTE: This is currently optimized for single-threaded performance.\n   * With our fuzzy search optimizations, single-threaded analysis is already\n   * very fast (<20ms for 10k words). Chunking adds overhead without actual\n   * worker threads, so we use the optimized single-threaded path.\n   *\n   * True worker thread parallelization would require:\n   * 1. Serialization/deserialization of language data\n   * 2. Worker thread pool management\n   * 3. Inter-process communication overhead\n   *\n   * For most use cases, the current single-threaded performance is sufficient.\n   */\n  async analyzeWithWorkers(\n    text: string,\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<EnhancedDetectionResult> {\n    // PERFORMANCE: Use optimized single-threaded path\n    // Our fuzzy search optimizations make this fast enough for most use cases\n    // Chunking without actual worker threads adds overhead\n    return this.analyzeCached(text, options)\n  }\n\n  /**\n   * Lazy initialization of language data for memory efficiency\n   */\n  private lazyLoadedLanguages = new Set<LanguageCode>()\n\n  async ensureLanguageLoaded(\n    language: LanguageCode,\n    _dataPath?: string\n  ): Promise<void> {\n    if (this.lazyLoadedLanguages.has(language)) {\n      return\n    }\n\n    // Use static LANGUAGE_DATA imports\n    const langData = LANGUAGE_DATA[language]\n\n    if (langData?.words) {\n      await this.matcher.loadLanguage(language, langData.words)\n      this.lazyLoadedLanguages.add(language)\n    } else {\n      console.warn(`Language data for ${language} not found in LANGUAGE_DATA`)\n      throw new Error(`Unable to load language data for ${language}`)\n    }\n  }\n\n  /**\n   * Generate cache key for analysis\n   */\n  private generateAnalysisCacheKey(\n    text: string,\n    options: Partial<AnalysisOptions>\n  ): string {\n    const optionsHash = JSON.stringify(options)\n    return `${this.configHash}:${optionsHash}:${text.slice(0, 100)}` // Use first 100 chars for key\n  }\n\n  /**\n   * Get performance statistics\n   */\n  getPerformanceStats(): {\n    analysisCacheHits: number\n    analysisCacheMisses: number\n    analysisCacheHitRate: number\n    analysisCacheSize: number\n    lazyLoadedLanguages: number\n  } {\n    const total = this.analysisCacheHits + this.analysisCacheMisses\n    return {\n      analysisCacheHits: this.analysisCacheHits,\n      analysisCacheMisses: this.analysisCacheMisses,\n      analysisCacheHitRate: total > 0 ? this.analysisCacheHits / total : 0,\n      analysisCacheSize: this.analysisCache.size,\n      lazyLoadedLanguages: this.lazyLoadedLanguages.size,\n    }\n  }\n\n  /**\n   * Clear all caches and reset performance counters\n   */\n  clearCaches(): void {\n    this.analysisCache.clear()\n    this.analysisCacheHits = 0\n    this.analysisCacheMisses = 0\n\n    // Also clear trie caches if available\n    if (this.matcher && 'clearCaches' in this.matcher) {\n      ;(this.matcher as { clearCaches: () => void }).clearCaches()\n    }\n  }\n\n  /**\n   * Memory optimization - force garbage collection\n   */\n  optimizeMemory(): void {\n    this.clearCaches()\n    this.lazyLoadedLanguages.clear()\n\n    // Force garbage collection if available\n    if (global.gc) {\n      global.gc()\n    }\n  }\n\n  /**\n   * Warm up caches with common patterns\n   */\n  async warmUpCaches(commonTexts: string[]): Promise<void> {\n    const options: Partial<AnalysisOptions> = { measurePerformance: false }\n\n    for (const text of commonTexts) {\n      await this.analyzeCached(text, options)\n    }\n  }\n}\n","/**\n * Configuration validation and sanitization\n * Ensures all configuration options are valid and safe\n */\n\nimport type { DetectorConfig, AnalysisOptions, LanguageCode, CustomWord, ProfanityCategory } from '../types/index.js'\nimport { SeverityLevel, FilterMode } from '../types/index.js'\nimport { DEFAULT_DETECTOR_CONFIG, DEFAULT_ANALYSIS_OPTIONS, ALL_CATEGORIES } from './default-config.js'\n\n/**\n * Configuration validation result\n */\nexport interface ValidationResult {\n  isValid: boolean\n  errors: string[]\n  warnings: string[]\n  sanitizedConfig: DetectorConfig | undefined\n}\n\n/**\n * Analysis options validation result\n */\nexport interface AnalysisOptionsValidationResult {\n  isValid: boolean\n  errors: string[]\n  warnings: string[]\n  sanitizedOptions: AnalysisOptions | undefined\n}\n\n/**\n * Supported language codes\n */\nconst SUPPORTED_LANGUAGES: ReadonlySet<string> = new Set([\n  'auto', 'en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'zh', 'ja', 'ko', 'ar', 'hi'\n])\n\n/**\n * Validate and sanitize detector configuration\n */\nexport class ConfigValidator {\n  /**\n   * Validate a complete detector configuration\n   */\n  static validate(config: Partial<DetectorConfig>): ValidationResult {\n    const errors: string[] = []\n    const warnings: string[] = []\n\n    // Start with default config and override with provided values\n    const sanitizedConfig: DetectorConfig = { ...DEFAULT_DETECTOR_CONFIG }\n\n    // Validate languages\n    if (config.languages !== undefined) {\n      const languageResult = this.validateLanguages(config.languages)\n      errors.push(...languageResult.errors)\n      warnings.push(...languageResult.warnings)\n      if (languageResult.sanitizedLanguages) {\n        sanitizedConfig.languages = languageResult.sanitizedLanguages\n      }\n    }\n\n    // Validate severity level\n    if (config.minSeverity !== undefined) {\n      const severityResult = this.validateSeverity(config.minSeverity)\n      errors.push(...severityResult.errors)\n      if (severityResult.sanitizedSeverity !== undefined) {\n        sanitizedConfig.minSeverity = severityResult.sanitizedSeverity\n      }\n    }\n\n    // Validate categories\n    if (config.categories !== undefined) {\n      const categoryResult = this.validateCategories(config.categories)\n      errors.push(...categoryResult.errors)\n      warnings.push(...categoryResult.warnings)\n      if (categoryResult.sanitizedCategories) {\n        sanitizedConfig.categories = categoryResult.sanitizedCategories\n      }\n    }\n\n    // Validate fuzzy matching settings\n    if (config.fuzzyMatching !== undefined) {\n      sanitizedConfig.fuzzyMatching = Boolean(config.fuzzyMatching)\n    }\n\n    if (config.fuzzyThreshold !== undefined) {\n      const thresholdResult = this.validateFuzzyThreshold(config.fuzzyThreshold)\n      errors.push(...thresholdResult.errors)\n      warnings.push(...thresholdResult.warnings)\n      if (thresholdResult.sanitizedThreshold !== undefined) {\n        sanitizedConfig.fuzzyThreshold = thresholdResult.sanitizedThreshold\n      }\n    }\n\n    // Validate custom words\n    if (config.customWords !== undefined) {\n      const customWordsResult = this.validateCustomWords(config.customWords)\n      errors.push(...customWordsResult.errors)\n      warnings.push(...customWordsResult.warnings)\n      if (customWordsResult.sanitizedWords) {\n        sanitizedConfig.customWords = customWordsResult.sanitizedWords\n      }\n    }\n\n    // Validate whitelist\n    if (config.whitelist !== undefined) {\n      const whitelistResult = this.validateWhitelist(config.whitelist)\n      warnings.push(...whitelistResult.warnings)\n      if (whitelistResult.sanitizedWhitelist) {\n        sanitizedConfig.whitelist = whitelistResult.sanitizedWhitelist\n      }\n    }\n\n    // Validate boolean flags\n    if (config.detectAlternateScripts !== undefined) {\n      sanitizedConfig.detectAlternateScripts = Boolean(config.detectAlternateScripts)\n    }\n\n    if (config.normalizeText !== undefined) {\n      sanitizedConfig.normalizeText = Boolean(config.normalizeText)\n    }\n\n    if (config.preserveStructure !== undefined) {\n      sanitizedConfig.preserveStructure = Boolean(config.preserveStructure)\n    }\n\n    // Validate replacement character\n    if (config.replacementChar !== undefined) {\n      const charResult = this.validateReplacementChar(config.replacementChar)\n      warnings.push(...charResult.warnings)\n      if (charResult.sanitizedChar) {\n        sanitizedConfig.replacementChar = charResult.sanitizedChar\n      }\n    }\n\n    // Cross-validation: check for incompatible settings\n    this.performCrossValidation(sanitizedConfig, warnings)\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n      warnings,\n      // Always return sanitizedConfig for partial recovery, even when there are errors\n      sanitizedConfig\n    }\n  }\n\n  /**\n   * Validate analysis options\n   */\n  static validateAnalysisOptions(options: Partial<AnalysisOptions>): AnalysisOptionsValidationResult {\n    const errors: string[] = []\n    const warnings: string[] = []\n    const sanitizedOptions: AnalysisOptions = { ...DEFAULT_ANALYSIS_OPTIONS }\n\n    // Validate filter mode\n    if (options.filterMode !== undefined) {\n      if (!Object.values(FilterMode).includes(options.filterMode)) {\n        errors.push(`Invalid filter mode: ${options.filterMode}`)\n      } else {\n        sanitizedOptions.filterMode = options.filterMode\n      }\n    }\n\n    // Validate boolean options\n    if (options.includeMatches !== undefined) {\n      sanitizedOptions.includeMatches = Boolean(options.includeMatches)\n    }\n\n    if (options.includeConfidence !== undefined) {\n      sanitizedOptions.includeConfidence = Boolean(options.includeConfidence)\n    }\n\n    if (options.measurePerformance !== undefined) {\n      sanitizedOptions.measurePerformance = Boolean(options.measurePerformance)\n    }\n\n    // Validate max length\n    if (options.maxLength !== undefined) {\n      if (typeof options.maxLength !== 'number' || options.maxLength < 0) {\n        errors.push('maxLength must be a non-negative number')\n      } else if (options.maxLength > 10000000) { // 10MB limit\n        warnings.push('maxLength is very large, this may impact performance')\n        sanitizedOptions.maxLength = Math.min(options.maxLength, 10000000)\n      } else {\n        sanitizedOptions.maxLength = Math.floor(options.maxLength)\n      }\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n      warnings,\n      sanitizedOptions: errors.length === 0 ? sanitizedOptions : undefined\n    }\n  }\n\n  /**\n   * Validate languages array\n   */\n  private static validateLanguages(languages: unknown): {\n    errors: string[]\n    warnings: string[]\n    sanitizedLanguages?: LanguageCode[]\n  } {\n    const errors: string[] = []\n    const warnings: string[] = []\n\n    if (!Array.isArray(languages)) {\n      errors.push('languages must be an array')\n      return { errors, warnings }\n    }\n\n    if (languages.length === 0) {\n      errors.push('languages array cannot be empty')\n      return { errors, warnings }\n    }\n\n    const sanitized: LanguageCode[] = []\n    const seen = new Set<string>()\n\n    for (const lang of languages) {\n      if (typeof lang !== 'string') {\n        warnings.push(`Skipping non-string language: ${lang}`)\n        continue\n      }\n\n      if (!SUPPORTED_LANGUAGES.has(lang)) {\n        warnings.push(`Unsupported language: ${lang}, skipping`)\n        continue\n      }\n\n      if (seen.has(lang)) {\n        warnings.push(`Duplicate language: ${lang}, skipping`)\n        continue\n      }\n\n      seen.add(lang)\n      sanitized.push(lang as LanguageCode)\n    }\n\n    if (sanitized.length === 0) {\n      warnings.push('No valid languages found, defaulting to auto-detect')\n      return { errors, warnings, sanitizedLanguages: ['auto' as LanguageCode] }\n    }\n\n    // Special validation for 'auto' language\n    if (sanitized.includes('auto' as LanguageCode) && sanitized.length > 1) {\n      warnings.push(\"'auto' language with other languages may be redundant\")\n    }\n\n    return { errors, warnings, sanitizedLanguages: sanitized }\n  }\n\n  /**\n   * Validate severity level\n   */\n  private static validateSeverity(severity: unknown): {\n    errors: string[]\n    sanitizedSeverity?: SeverityLevel\n  } {\n    const errors: string[] = []\n\n    if (!Object.values(SeverityLevel).includes(severity as SeverityLevel)) {\n      errors.push(`Invalid severity level: ${severity}`)\n      // Return default severity for sanitization\n      return { errors, sanitizedSeverity: SeverityLevel.LOW }\n    }\n\n    return { errors, sanitizedSeverity: severity as SeverityLevel }\n  }\n\n  /**\n   * Validate categories array\n   */\n  private static validateCategories(categories: unknown): {\n    errors: string[]\n    warnings: string[]\n    sanitizedCategories?: ProfanityCategory[]\n  } {\n    const errors: string[] = []\n    const warnings: string[] = []\n\n    if (!Array.isArray(categories)) {\n      errors.push('categories must be an array')\n      return { errors, warnings }\n    }\n\n    const validCategories = ALL_CATEGORIES\n    const sanitized: ProfanityCategory[] = []\n    const seen = new Set<string>()\n\n    for (const category of categories) {\n      if (!validCategories.includes(category as ProfanityCategory)) {\n        warnings.push(`Invalid category: ${category}, skipping`)\n        continue\n      }\n\n      if (seen.has(String(category))) {\n        warnings.push(`Duplicate category: ${category}, skipping`)\n        continue\n      }\n\n      seen.add(String(category))\n      sanitized.push(category as ProfanityCategory)\n    }\n\n    if (sanitized.length === 0) {\n      warnings.push('No valid categories found, using all categories')\n      return { errors, warnings, sanitizedCategories: validCategories }\n    }\n\n    return { errors, warnings, sanitizedCategories: sanitized }\n  }\n\n  /**\n   * Validate fuzzy threshold\n   */\n  private static validateFuzzyThreshold(threshold: unknown): {\n    errors: string[]\n    warnings: string[]\n    sanitizedThreshold?: number\n  } {\n    const errors: string[] = []\n    const warnings: string[] = []\n\n    if (typeof threshold !== 'number') {\n      errors.push('fuzzyThreshold must be a number')\n      // Return default threshold for sanitization\n      return { errors, warnings, sanitizedThreshold: 0.8 }\n    }\n\n    if (threshold < 0 || threshold > 1) {\n      errors.push('fuzzyThreshold must be between 0 and 1')\n      // Return default threshold for sanitization\n      return { errors, warnings, sanitizedThreshold: 0.8 }\n    }\n\n    if (threshold < 0.5) {\n      warnings.push('fuzzyThreshold below 0.5 may produce many false positives')\n    }\n\n    if (threshold > 0.95) {\n      warnings.push('fuzzyThreshold above 0.95 may miss valid variations')\n    }\n\n    return { errors, warnings, sanitizedThreshold: threshold }\n  }\n\n  /**\n   * Validate custom words\n   */\n  private static validateCustomWords(customWords: unknown): {\n    errors: string[]\n    warnings: string[]\n    sanitizedWords?: CustomWord[]\n  } {\n    const errors: string[] = []\n    const warnings: string[] = []\n\n    if (!Array.isArray(customWords)) {\n      errors.push('customWords must be an array')\n      return { errors, warnings }\n    }\n\n    const sanitized: CustomWord[] = []\n    const seenWords = new Set<string>()\n\n    for (const word of customWords) {\n      if (typeof word === 'string') {\n        // Convert string to CustomWord object\n        if (seenWords.has(word.toLowerCase())) {\n          warnings.push(`Duplicate custom word: ${word}`)\n          continue\n        }\n        seenWords.add(word.toLowerCase())\n        sanitized.push({\n          word,\n          severity: SeverityLevel.MEDIUM,\n          categories: ['profanity'],\n          language: 'en'\n        })\n      } else if (typeof word === 'object' && word !== null) {\n        // Validate CustomWord object\n        if (typeof word.word !== 'string' || word.word.trim() === '') {\n          warnings.push('Skipping custom word with invalid word field')\n          continue\n        }\n\n        if (seenWords.has(word.word.toLowerCase())) {\n          warnings.push(`Duplicate custom word: ${word.word}`)\n          continue\n        }\n\n        seenWords.add(word.word.toLowerCase())\n\n        const filteredCategories = Array.isArray(word.categories)\n          ? word.categories.filter((c: unknown) => typeof c === 'string' && ALL_CATEGORIES.includes(c as ProfanityCategory))\n          : []\n\n        const validWord: CustomWord = {\n          word: word.word.trim(),\n          severity: Object.values(SeverityLevel).includes(word.severity) ? word.severity : SeverityLevel.MEDIUM,\n          categories: filteredCategories.length > 0 ? filteredCategories : ['profanity'],\n          language: typeof word.language === 'string' && SUPPORTED_LANGUAGES.has(word.language) ? word.language : 'en'\n        }\n\n        sanitized.push(validWord)\n      } else {\n        warnings.push(`Skipping invalid custom word: ${word}`)\n      }\n    }\n\n    return { errors, warnings, sanitizedWords: sanitized }\n  }\n\n  /**\n   * Validate whitelist\n   */\n  private static validateWhitelist(whitelist: unknown): {\n    warnings: string[]\n    sanitizedWhitelist?: string[]\n  } {\n    const warnings: string[] = []\n\n    if (!Array.isArray(whitelist)) {\n      warnings.push('whitelist must be an array, ignoring')\n      return { warnings, sanitizedWhitelist: [] }\n    }\n\n    const sanitized: string[] = []\n    const seen = new Set<string>()\n\n    for (const word of whitelist) {\n      if (typeof word !== 'string' || word.trim() === '') {\n        warnings.push(`Skipping invalid whitelist word: ${word}`)\n        continue\n      }\n\n      const normalizedWord = word.trim().toLowerCase()\n      if (seen.has(normalizedWord)) {\n        warnings.push(`Duplicate whitelist word: ${word}`)\n        continue\n      }\n\n      seen.add(normalizedWord)\n      sanitized.push(word.trim())\n    }\n\n    return { warnings, sanitizedWhitelist: sanitized }\n  }\n\n  /**\n   * Validate replacement character\n   */\n  private static validateReplacementChar(char: unknown): {\n    warnings: string[]\n    sanitizedChar: string | undefined\n  } {\n    const warnings: string[] = []\n\n    if (typeof char !== 'string') {\n      warnings.push('replacementChar must be a string, using default \"*\"')\n      return { warnings, sanitizedChar: '*' }\n    }\n\n    if (char.length === 0) {\n      warnings.push('replacementChar cannot be empty, using default \"*\"')\n      return { warnings, sanitizedChar: '*' }\n    }\n\n    if (char.length > 1) {\n      warnings.push('replacementChar should be a single character, using first character')\n      return { warnings, sanitizedChar: char[0] }\n    }\n\n    return { warnings, sanitizedChar: char }\n  }\n\n  /**\n   * Perform cross-validation of configuration settings\n   */\n  private static performCrossValidation(config: DetectorConfig, warnings: string[]): void {\n    // Check if fuzzy matching is disabled but threshold is set\n    if (!config.fuzzyMatching && config.fuzzyThreshold !== DEFAULT_DETECTOR_CONFIG.fuzzyThreshold) {\n      warnings.push('fuzzyThreshold specified but fuzzyMatching is disabled')\n    }\n\n    // Check for performance implications\n    if (config.languages.length > 5 && config.fuzzyMatching) {\n      warnings.push('Many languages with fuzzy matching enabled may impact performance')\n    }\n\n    // Check if categories and severity are compatible\n    if (config.minSeverity === SeverityLevel.HIGH && config.categories.length > 3) {\n      warnings.push('High severity with many categories may result in very few matches')\n    }\n  }\n\n  /**\n   * Quick validation for basic use cases\n   */\n  static quickValidate(config: Partial<DetectorConfig>): boolean {\n    try {\n      // Test for circular references by attempting to stringify\n      JSON.stringify(config)\n      const result = this.validate(config)\n      return result.isValid\n    } catch {\n      return false\n    }\n  }\n\n  /**\n   * Sanitize configuration without full validation\n   */\n  static sanitize(config: Partial<DetectorConfig>): DetectorConfig {\n    const result = this.validate(config)\n    return result.sanitizedConfig || DEFAULT_DETECTOR_CONFIG\n  }\n}","/**\n * Runtime configuration management\n * Handles configuration loading, validation, environment overrides, and hot-swapping\n */\n\nimport type {\n  DetectorConfig,\n  LanguageCode,\n  SeverityLevel,\n} from '../types/index.js'\nimport {\n  DEFAULT_DETECTOR_CONFIG,\n  getEnvironmentConfig,\n  getConfigPreset,\n  LANGUAGE_OPTIMIZED_CONFIGS,\n  CONFIG_PRESETS,\n} from './default-config.js'\nimport { ConfigValidator } from './config-validator.js'\nimport fs from 'fs/promises'\nimport { watch } from 'fs'\n\n/**\n * Configuration source types\n */\nexport type ConfigSource = 'default' | 'file' | 'environment' | 'runtime'\n\n/**\n * Configuration change event\n */\nexport interface ConfigChangeEvent {\n  source: ConfigSource\n  previousConfig: DetectorConfig\n  newConfig: DetectorConfig\n  timestamp: Date\n  changeDetails: {\n    added: string[]\n    modified: string[]\n    removed: string[]\n  }\n}\n\n/**\n * Configuration manager options\n */\nexport interface ConfigManagerOptions {\n  enableHotReload?: boolean\n  configFilePath?: string\n  validateOnLoad?: boolean\n  autoOptimizeForLanguages?: boolean\n  enableEnvironmentOverrides?: boolean\n  cacheValidatedConfigs?: boolean\n}\n\n/**\n * Runtime configuration manager\n */\nexport class ConfigManager {\n  private currentConfig: DetectorConfig\n  private configHistory: Array<{\n    config: DetectorConfig\n    timestamp: Date\n    source: ConfigSource\n  }> = []\n  private changeListeners: Array<(event: ConfigChangeEvent) => void> = []\n  private fileWatcher: ReturnType<typeof watch> | null | undefined\n  private configCache = new Map<string, DetectorConfig>()\n  private readonly maxHistorySize = 10\n\n  private readonly options: Required<ConfigManagerOptions>\n\n  constructor(\n    initialConfig: Partial<DetectorConfig> = {},\n    options: ConfigManagerOptions = {}\n  ) {\n    this.options = {\n      enableHotReload: false,\n      configFilePath: './content-shield.config.json',\n      validateOnLoad: true,\n      autoOptimizeForLanguages: true,\n      enableEnvironmentOverrides: true,\n      cacheValidatedConfigs: true,\n      ...options,\n    }\n\n    // Start with default config\n    let baseConfig = DEFAULT_DETECTOR_CONFIG\n\n    // Apply environment config if enabled\n    if (this.options.enableEnvironmentOverrides) {\n      baseConfig = { ...baseConfig, ...getEnvironmentConfig() }\n    }\n\n    // Apply provided config\n    const mergedConfig = { ...baseConfig, ...initialConfig }\n\n    // Validate and sanitize\n    if (this.options.validateOnLoad) {\n      const validation = ConfigValidator.validate(mergedConfig)\n      if (!validation.isValid) {\n        throw new Error(\n          `Configuration validation failed: ${validation.errors.join(', ')}`\n        )\n      }\n      // If validation is valid, sanitizedConfig should be available\n      this.currentConfig =\n        validation.sanitizedConfig || (mergedConfig as DetectorConfig)\n    } else {\n      this.currentConfig = mergedConfig as DetectorConfig\n    }\n\n    // Add to history\n    this.configHistory.push({\n      config: { ...this.currentConfig },\n      timestamp: new Date(),\n      source: 'default',\n    })\n\n    // Note: Auto-optimization is NOT run during initialization\n    // It only runs when configuration is explicitly changed via updateConfig\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): DetectorConfig {\n    return { ...this.currentConfig }\n  }\n\n  /**\n   * Update configuration with validation\n   */\n  async updateConfig(\n    newConfig: Partial<DetectorConfig>,\n    source: ConfigSource = 'runtime',\n    skipHistory = false,\n    skipNotification = false\n  ): Promise<void> {\n    const previousConfig = { ...this.currentConfig }\n    const mergedConfig = { ...this.currentConfig, ...newConfig }\n\n    // Validate new configuration\n    if (this.options.validateOnLoad) {\n      const validation = ConfigValidator.validate(mergedConfig)\n      if (!validation.isValid) {\n        throw new Error(\n          `Configuration validation failed: ${validation.errors.join(', ')}`\n        )\n      }\n      // If validation is valid, sanitizedConfig should be available\n      this.currentConfig =\n        validation.sanitizedConfig || (mergedConfig as DetectorConfig)\n    } else {\n      this.currentConfig = mergedConfig as DetectorConfig\n    }\n\n    // Add to history (unless explicitly skipped)\n    if (!skipHistory) {\n      this.configHistory.push({\n        config: { ...this.currentConfig },\n        timestamp: new Date(),\n        source,\n      })\n\n      // Limit history size\n      if (this.configHistory.length > this.maxHistorySize) {\n        this.configHistory.shift()\n      }\n    }\n\n    // Detect changes\n    const changeDetails = this.detectChanges(previousConfig, this.currentConfig)\n\n    // Auto-optimize if enabled (do this BEFORE notification so the final state is notified)\n    const shouldAutoOptimize =\n      this.options.autoOptimizeForLanguages &&\n      changeDetails.modified.includes('languages') &&\n      !skipNotification\n    if (shouldAutoOptimize) {\n      await this.autoOptimizeForLanguages()\n    }\n\n    // Notify listeners (unless explicitly skipped)\n    if (!skipNotification) {\n      // Re-detect changes after auto-optimization\n      const finalChangeDetails = shouldAutoOptimize\n        ? this.detectChanges(previousConfig, this.currentConfig)\n        : changeDetails\n\n      const event: ConfigChangeEvent = {\n        source,\n        previousConfig,\n        newConfig: { ...this.currentConfig },\n        timestamp: new Date(),\n        changeDetails: finalChangeDetails,\n      }\n\n      this.notifyListeners(event)\n    }\n  }\n\n  /**\n   * Load configuration from file\n   */\n  async loadFromFile(filePath?: string): Promise<void> {\n    const configPath = filePath || this.options.configFilePath\n\n    try {\n      const fileContent = await fs.readFile(configPath, 'utf-8')\n      const fileConfig = JSON.parse(fileContent)\n\n      await this.updateConfig(fileConfig, 'file')\n\n      // Enable hot reload if configured\n      if (this.options.enableHotReload && !this.fileWatcher) {\n        this.enableHotReload(configPath)\n      }\n    } catch (error) {\n      throw new Error(`Failed to load configuration from ${configPath}`, {\n        cause: error,\n      })\n    }\n  }\n\n  /**\n   * Save current configuration to file\n   */\n  async saveToFile(filePath?: string): Promise<void> {\n    const configPath = filePath || this.options.configFilePath\n\n    try {\n      const configJson = JSON.stringify(this.currentConfig, null, 2)\n      await fs.writeFile(configPath, configJson, 'utf-8')\n    } catch (error) {\n      throw new Error(`Failed to save configuration to ${configPath}`, {\n        cause: error,\n      })\n    }\n  }\n\n  /**\n   * Apply environment variable overrides\n   */\n  applyEnvironmentOverrides(): void {\n    const envOverrides: Partial<DetectorConfig> = {}\n\n    // Check for common environment variables\n    if (process.env.NAUGHTY_WORDS_LANGUAGES) {\n      envOverrides.languages = process.env.NAUGHTY_WORDS_LANGUAGES.split(\n        ','\n      ) as LanguageCode[]\n    }\n\n    if (process.env.NAUGHTY_WORDS_MIN_SEVERITY) {\n      const severityValue = parseInt(process.env.NAUGHTY_WORDS_MIN_SEVERITY, 10)\n      if (!isNaN(severityValue) && severityValue >= 1 && severityValue <= 4) {\n        envOverrides.minSeverity = severityValue as SeverityLevel\n      }\n    }\n\n    if (process.env.NAUGHTY_WORDS_FUZZY_MATCHING) {\n      envOverrides.fuzzyMatching =\n        process.env.NAUGHTY_WORDS_FUZZY_MATCHING === 'true'\n    }\n\n    if (process.env.NAUGHTY_WORDS_FUZZY_THRESHOLD) {\n      envOverrides.fuzzyThreshold = parseFloat(\n        process.env.NAUGHTY_WORDS_FUZZY_THRESHOLD\n      )\n    }\n\n    if (process.env.NAUGHTY_WORDS_NORMALIZE_TEXT) {\n      envOverrides.normalizeText =\n        process.env.NAUGHTY_WORDS_NORMALIZE_TEXT === 'true'\n    }\n\n    if (process.env.NAUGHTY_WORDS_REPLACEMENT_CHAR) {\n      envOverrides.replacementChar = process.env.NAUGHTY_WORDS_REPLACEMENT_CHAR\n    }\n\n    if (Object.keys(envOverrides).length > 0) {\n      this.updateConfig(envOverrides, 'environment')\n    }\n  }\n\n  /**\n   * Use a configuration preset\n   */\n  async usePreset(preset: keyof typeof CONFIG_PRESETS): Promise<void> {\n    const presetConfig = getConfigPreset(preset)\n    await this.updateConfig(presetConfig, 'runtime')\n  }\n\n  /**\n   * Auto-optimize configuration for detected languages\n   */\n  private async autoOptimizeForLanguages(): Promise<void> {\n    const optimizations: Partial<DetectorConfig> = {}\n\n    // If only one specific language, apply language-specific optimizations\n    if (\n      this.currentConfig.languages.length === 1 &&\n      this.currentConfig.languages[0] !== 'auto'\n    ) {\n      const language = this.currentConfig.languages[0]\n      const langOptimizations =\n        language && language in LANGUAGE_OPTIMIZED_CONFIGS\n          ? LANGUAGE_OPTIMIZED_CONFIGS[\n              language as keyof typeof LANGUAGE_OPTIMIZED_CONFIGS\n            ]\n          : undefined\n\n      if (langOptimizations) {\n        Object.assign(optimizations, langOptimizations)\n      }\n    }\n\n    // Apply performance optimizations for many languages\n    if (this.currentConfig.languages.length > 3) {\n      optimizations.fuzzyThreshold = Math.max(\n        0.7,\n        this.currentConfig.fuzzyThreshold\n      )\n    }\n\n    if (Object.keys(optimizations).length > 0) {\n      // Apply optimizations directly without triggering events or history\n      await this.updateConfig(optimizations, 'runtime', true, true)\n    }\n  }\n\n  /**\n   * Enable hot reload for configuration file\n   */\n  private async enableHotReload(filePath: string): Promise<void> {\n    try {\n      // Dynamically import fs watch functionality\n      const { watch } = await import('fs')\n\n      this.fileWatcher = watch(filePath, async eventType => {\n        if (eventType === 'change') {\n          try {\n            await this.loadFromFile(filePath)\n          } catch (error) {\n            console.warn(`Hot reload failed: ${error}`)\n          }\n        }\n      })\n    } catch (error) {\n      console.warn(`Could not enable hot reload: ${error}`)\n    }\n  }\n\n  /**\n   * Add configuration change listener\n   */\n  onConfigChange(listener: (event: ConfigChangeEvent) => void): () => void {\n    this.changeListeners.push(listener)\n\n    // Return unsubscribe function\n    return () => {\n      const index = this.changeListeners.indexOf(listener)\n      if (index >= 0) {\n        this.changeListeners.splice(index, 1)\n      }\n    }\n  }\n\n  /**\n   * Get configuration history\n   */\n  getConfigHistory(): Array<{\n    config: DetectorConfig\n    timestamp: Date\n    source: ConfigSource\n  }> {\n    return [...this.configHistory]\n  }\n\n  /**\n   * Revert to previous configuration\n   */\n  async revertToPrevious(): Promise<boolean> {\n    if (this.configHistory.length < 2) {\n      return false\n    }\n\n    // Remove current config from history\n    this.configHistory.pop()\n\n    // Get the now-last config (was previously second-to-last)\n    const previousConfigEntry =\n      this.configHistory[this.configHistory.length - 1]\n    if (!previousConfigEntry) {\n      return false\n    }\n\n    // Update current config without adding to history\n    const previousConfig = { ...this.currentConfig }\n    this.currentConfig = { ...previousConfigEntry.config }\n\n    // Detect changes and notify\n    const changeDetails = this.detectChanges(previousConfig, this.currentConfig)\n    const event: ConfigChangeEvent = {\n      source: 'runtime',\n      previousConfig,\n      newConfig: { ...this.currentConfig },\n      timestamp: new Date(),\n      changeDetails,\n    }\n    this.notifyListeners(event)\n\n    return true\n  }\n\n  /**\n   * Reset to default configuration\n   */\n  async resetToDefault(): Promise<void> {\n    // Clear history and start fresh\n    const previousConfig = { ...this.currentConfig }\n    this.currentConfig = { ...DEFAULT_DETECTOR_CONFIG }\n    this.configHistory = [\n      {\n        config: { ...this.currentConfig },\n        timestamp: new Date(),\n        source: 'default',\n      },\n    ]\n\n    // Detect changes and notify\n    const changeDetails = this.detectChanges(previousConfig, this.currentConfig)\n    const event: ConfigChangeEvent = {\n      source: 'runtime',\n      previousConfig,\n      newConfig: { ...this.currentConfig },\n      timestamp: new Date(),\n      changeDetails,\n    }\n    this.notifyListeners(event)\n  }\n\n  /**\n   * Validate current configuration\n   */\n  validateCurrentConfig(): {\n    isValid: boolean\n    errors: string[]\n    warnings: string[]\n  } {\n    const result = ConfigValidator.validate(this.currentConfig)\n    return {\n      isValid: result.isValid,\n      errors: result.errors,\n      warnings: result.warnings,\n    }\n  }\n\n  /**\n   * Get optimized configuration for specific languages\n   */\n  getOptimizedConfigForLanguages(languages: LanguageCode[]): DetectorConfig {\n    const cacheKey = languages.sort().join(',')\n\n    if (this.options.cacheValidatedConfigs && this.configCache.has(cacheKey)) {\n      const cachedConfig = this.configCache.get(cacheKey)\n      if (cachedConfig) {\n        return cachedConfig\n      }\n    }\n\n    let optimizedConfig = { ...this.currentConfig }\n    optimizedConfig.languages = languages\n\n    // Apply language-specific optimizations\n    if (languages.length === 1 && languages[0] !== 'auto') {\n      const language = languages[0]\n      const langOptimizations =\n        language && language in LANGUAGE_OPTIMIZED_CONFIGS\n          ? LANGUAGE_OPTIMIZED_CONFIGS[\n              language as keyof typeof LANGUAGE_OPTIMIZED_CONFIGS\n            ]\n          : undefined\n      if (langOptimizations) {\n        optimizedConfig = { ...optimizedConfig, ...langOptimizations }\n      }\n    }\n\n    // Cache the result\n    if (this.options.cacheValidatedConfigs) {\n      this.configCache.set(cacheKey, optimizedConfig)\n    }\n\n    return optimizedConfig\n  }\n\n  /**\n   * Dispose resources\n   */\n  dispose(): void {\n    if (this.fileWatcher) {\n      this.fileWatcher.close()\n      this.fileWatcher = undefined\n    }\n\n    this.changeListeners.length = 0\n    this.configCache.clear()\n    this.configHistory.length = 0\n  }\n\n  /**\n   * Detect changes between configurations\n   */\n  private detectChanges(\n    oldConfig: DetectorConfig,\n    newConfig: DetectorConfig\n  ): { added: string[]; modified: string[]; removed: string[] } {\n    const changes = {\n      added: [] as string[],\n      modified: [] as string[],\n      removed: [] as string[],\n    }\n\n    const allKeys = new Set([\n      ...Object.keys(oldConfig),\n      ...Object.keys(newConfig),\n    ])\n\n    for (const key of allKeys) {\n      const oldValue = (oldConfig as unknown as Record<string, unknown>)[key]\n      const newValue = (newConfig as unknown as Record<string, unknown>)[key]\n\n      if (oldValue === undefined && newValue !== undefined) {\n        changes.added.push(key)\n      } else if (oldValue !== undefined && newValue === undefined) {\n        changes.removed.push(key)\n      } else if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\n        changes.modified.push(key)\n      }\n    }\n\n    return changes\n  }\n\n  /**\n   * Notify all change listeners\n   */\n  private notifyListeners(event: ConfigChangeEvent): void {\n    for (const listener of this.changeListeners) {\n      try {\n        listener(event)\n      } catch (error) {\n        console.warn(`Configuration change listener error: ${error}`)\n      }\n    }\n  }\n}\n\n/**\n * Global configuration manager instance\n */\nlet globalConfigManager: ConfigManager | null = null\n\n/**\n * Get or create global configuration manager\n */\nexport function getGlobalConfigManager(\n  initialConfig?: Partial<DetectorConfig>,\n  options?: ConfigManagerOptions\n): ConfigManager {\n  if (!globalConfigManager) {\n    globalConfigManager = new ConfigManager(initialConfig, options)\n  }\n  return globalConfigManager\n}\n\n/**\n * Reset global configuration manager\n */\nexport function resetGlobalConfigManager(): void {\n  if (globalConfigManager) {\n    globalConfigManager.dispose()\n    globalConfigManager = null\n  }\n}\n","/**\n * Dynamic language data loading system\n * Handles lazy loading, caching, and optimization for language-specific data\n */\n\nimport fs from 'fs/promises'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport type {\n  LanguageCode,\n  SeverityLevel,\n  ProfanityCategory,\n  StaticLanguageData,\n} from '../types/index.js'\n\n/**\n * Language data structure\n */\nexport interface LanguageData {\n  metadata: {\n    name: string\n    code: LanguageCode\n    version: string\n    wordCount: number\n    lastUpdated: string\n    contributors?: string[]\n  }\n  profanity: Array<{\n    word: string\n    severity: SeverityLevel\n    categories: ProfanityCategory[]\n    variations?: string[]\n    context?: string[]\n    [key: string]: unknown // Allow additional properties for language-specific metadata\n  }>\n  categories: Record<string, string[] | string>\n  severity: Record<string, SeverityLevel | number>\n  variations: Record<string, string[] | string>\n  context: Record<\n    string,\n    | {\n        acceptable: string[]\n        problematic: string[]\n      }\n    | string\n  >\n}\n\n/**\n * Internal language data structure used during loading\n */\ninterface PartialLanguageData {\n  metadata?: {\n    name: string\n    code: LanguageCode\n    version: string\n    wordCount: number\n    lastUpdated: string\n    contributors?: string[]\n  }\n  profanity?:\n    | Array<{\n        word: string\n        severity: SeverityLevel\n        categories: ProfanityCategory[]\n        variations?: string[]\n        context?: string[]\n      }>\n    | {\n        words: Array<{\n          word: string\n          severity: SeverityLevel\n          categories: ProfanityCategory[]\n          variations?: string[]\n          context?: string[]\n        }>\n      }\n  categories?: Record<string, string[]>\n  severity?: Record<string, SeverityLevel>\n  variations?: Record<string, string[]>\n  context?: Record<\n    string,\n    {\n      acceptable: string[]\n      problematic: string[]\n    }\n  >\n  // Index signature to allow dynamic property access\n  [key: string]: unknown\n}\n\n/**\n * Language loading options\n */\nexport interface LanguageLoadOptions {\n  dataPath?: string\n  cacheEnabled?: boolean\n  preloadCommonWords?: boolean\n  validateData?: boolean\n  useCompressedFormat?: boolean\n  languageData?: Partial<Record<LanguageCode, StaticLanguageData>>\n}\n\n/**\n * Language load result\n */\nexport interface LanguageLoadResult {\n  success: boolean\n  data?: LanguageData\n  error?: string\n  loadTime: number\n  fromCache: boolean\n}\n\n/**\n * Dynamic language data loader\n */\nexport class LanguageLoader {\n  private cache = new Map<LanguageCode, LanguageData>()\n  private loadingPromises = new Map<LanguageCode, Promise<LanguageLoadResult>>()\n  private options: Required<Omit<LanguageLoadOptions, 'languageData'>>\n  private staticLanguageData:\n    | Partial<Record<LanguageCode, StaticLanguageData>>\n    | undefined\n\n  // Performance tracking\n  private loadTimes = new Map<LanguageCode, number>()\n  private cacheHits = 0\n  private cacheMisses = 0\n\n  constructor(options: LanguageLoadOptions = {}) {\n    // Resolve data path relative to package location\n    const defaultDataPath =\n      options.dataPath ||\n      path.join(\n        path.dirname(fileURLToPath(import.meta.url)),\n        '..',\n        'data',\n        'languages'\n      )\n\n    // Store static language data separately (only if provided)\n    if (options.languageData) {\n      this.staticLanguageData = options.languageData\n    }\n\n    this.options = {\n      dataPath: defaultDataPath,\n      cacheEnabled: true,\n      preloadCommonWords: true,\n      validateData: true,\n      useCompressedFormat: false,\n      ...options,\n    }\n  }\n\n  /**\n   * Load language data with caching and optimization\n   */\n  async loadLanguage(language: LanguageCode): Promise<LanguageLoadResult> {\n    const startTime = performance.now()\n\n    // Check cache first\n    if (this.options.cacheEnabled && this.cache.has(language)) {\n      this.cacheHits++\n      return {\n        success: true,\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- cache.has() check above guarantees value exists\n        data: this.cache.get(language)!,\n        loadTime: performance.now() - startTime,\n        fromCache: true,\n      }\n    }\n\n    // Check if already loading\n    if (this.loadingPromises.has(language)) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- loadingPromises.has() check above guarantees value exists\n      return await this.loadingPromises.get(language)!\n    }\n\n    // Start loading\n    const loadingPromise = this.performLanguageLoad(language, startTime)\n    this.loadingPromises.set(language, loadingPromise)\n\n    try {\n      const result = await loadingPromise\n      return result\n    } finally {\n      this.loadingPromises.delete(language)\n    }\n  }\n\n  /**\n   * Perform actual language loading\n   */\n  private async performLanguageLoad(\n    language: LanguageCode,\n    startTime: number\n  ): Promise<LanguageLoadResult> {\n    this.cacheMisses++\n\n    try {\n      let data: LanguageData\n\n      // Priority 1: Check for static language data first\n      const staticEntry = this.staticLanguageData?.[language]\n      if (staticEntry) {\n        data = await this.loadFromStaticData(staticEntry)\n      } else {\n        // Priority 2: Fall back to JSON file loading\n        const languageDir = path.join(this.options.dataPath, language)\n        data = await this.loadLanguageFiles(languageDir)\n      }\n\n      // Validate data if requested\n      if (this.options.validateData) {\n        this.validateLanguageData(data, language)\n      }\n\n      // Cache if enabled\n      if (this.options.cacheEnabled) {\n        this.cache.set(language, data)\n      }\n\n      const loadTime = performance.now() - startTime\n      this.loadTimes.set(language, loadTime)\n\n      return {\n        success: true,\n        data,\n        loadTime,\n        fromCache: false,\n      }\n    } catch (error) {\n      const loadTime = performance.now() - startTime\n\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : String(error),\n        loadTime,\n        fromCache: false,\n      }\n    }\n  }\n\n  /**\n   * Load language data from static imports (tree-shakeable)\n   */\n  private async loadFromStaticData(\n    staticData: StaticLanguageData\n  ): Promise<LanguageData> {\n    // Convert simplified StaticLanguageData to full LanguageData structure\n    const categories: Record<string, string[]> = {}\n    const severity: Record<string, SeverityLevel> = {}\n    const variations: Record<string, string[]> = {}\n    const context: Record<\n      string,\n      { acceptable: string[]; problematic: string[] }\n    > = {}\n\n    // Process each word entry to populate the data structures\n    for (const entry of staticData.words) {\n      const word = entry.word\n\n      // Add to severity map\n      severity[word] = entry.severity\n\n      // Add to categories map\n      for (const category of entry.categories) {\n        if (!categories[category]) {\n          categories[category] = []\n        }\n        if (!categories[category].includes(word)) {\n          categories[category].push(word)\n        }\n      }\n\n      // Add variations if present\n      if (entry.variations && entry.variations.length > 0) {\n        variations[word] = [...entry.variations]\n      }\n    }\n\n    // Convert word entries to the profanity array format\n    const profanity = staticData.words.map(entry => {\n      const item: {\n        word: string\n        severity: SeverityLevel\n        categories: ProfanityCategory[]\n        variations?: string[]\n        context?: string[]\n      } = {\n        word: entry.word,\n        severity: entry.severity,\n        categories: [...entry.categories],\n      }\n\n      if (entry.variations) {\n        item.variations = [...entry.variations]\n      }\n\n      if (entry.context_notes) {\n        item.context = [entry.context_notes]\n      }\n\n      return item\n    })\n\n    const { contributors, ...metaRest } = staticData.metadata\n    return {\n      metadata: contributors\n        ? { ...metaRest, contributors: [...contributors] }\n        : { ...metaRest },\n      profanity,\n      categories,\n      severity,\n      variations,\n      context,\n    }\n  }\n\n  /**\n   * Load all language files from directory\n   */\n  private async loadLanguageFiles(languageDir: string): Promise<LanguageData> {\n    const files = [\n      'metadata.json',\n      'profanity.json',\n      'categories.json',\n      'severity.json',\n      'variations.json',\n      'context.json',\n    ]\n\n    const loadPromises = files.map(async filename => {\n      const filePath = path.join(languageDir, filename)\n      try {\n        const content = await fs.readFile(filePath, 'utf-8')\n        return {\n          filename: filename.replace('.json', ''),\n          data: JSON.parse(content),\n        }\n      } catch {\n        // Some files might be optional\n        console.warn(\n          `Warning: Could not load ${filename} for language directory ${languageDir}`\n        )\n        return { filename: filename.replace('.json', ''), data: null }\n      }\n    })\n\n    const results = await Promise.all(loadPromises)\n    const languageData: PartialLanguageData = {}\n\n    for (const result of results) {\n      if (result.data) {\n        // Handle wrapper structure in profanity.json\n        if (result.filename === 'profanity' && result.data.words) {\n          languageData[result.filename] = result.data.words\n        } else {\n          languageData[result.filename] = result.data\n        }\n      }\n    }\n\n    // Ensure required fields exist\n    if (!languageData.metadata || !languageData.profanity) {\n      throw new Error(\n        'Missing required language data files (metadata.json, profanity.json)'\n      )\n    }\n\n    return languageData as LanguageData\n  }\n\n  /**\n   * Validate language data structure\n   */\n  private validateLanguageData(\n    data: LanguageData,\n    language: LanguageCode\n  ): void {\n    // Check metadata\n    if (!data.metadata || !data.metadata.name || !data.metadata.code) {\n      throw new Error(`Invalid metadata for language ${language}`)\n    }\n\n    if (data.metadata.code !== language) {\n      throw new Error(\n        `Language code mismatch: expected ${language}, got ${data.metadata.code}`\n      )\n    }\n\n    // Check profanity data\n    if (!Array.isArray(data.profanity)) {\n      throw new Error(`Invalid profanity data for language ${language}`)\n    }\n\n    // Validate profanity entries\n    for (let i = 0; i < Math.min(data.profanity.length, 10); i++) {\n      // Sample validation\n      const entry = data.profanity[i]\n      if (\n        !entry ||\n        !entry.word ||\n        !entry.severity ||\n        !Array.isArray(entry.categories)\n      ) {\n        throw new Error(\n          `Invalid profanity entry at index ${i} for language ${language}`\n        )\n      }\n    }\n  }\n\n  /**\n   * Preload common languages\n   */\n  async preloadCommonLanguages(\n    languages: LanguageCode[] = ['en', 'es', 'fr']\n  ): Promise<void> {\n    const preloadPromises = languages.map(lang => this.loadLanguage(lang))\n    await Promise.all(preloadPromises)\n  }\n\n  /**\n   * Batch load multiple languages\n   */\n  async loadLanguages(\n    languages: LanguageCode[]\n  ): Promise<Map<LanguageCode, LanguageLoadResult>> {\n    const loadPromises = languages.map(async lang => {\n      const result = await this.loadLanguage(lang)\n      return { lang, result }\n    })\n\n    const results = await Promise.all(loadPromises)\n    const resultMap = new Map<LanguageCode, LanguageLoadResult>()\n\n    for (const { lang, result } of results) {\n      resultMap.set(lang, result)\n    }\n\n    return resultMap\n  }\n\n  /**\n   * Get available languages in data directory\n   */\n  async getAvailableLanguages(): Promise<LanguageCode[]> {\n    try {\n      const entries = await fs.readdir(this.options.dataPath, {\n        withFileTypes: true,\n      })\n      const languages: LanguageCode[] = []\n\n      for (const entry of entries) {\n        if (entry.isDirectory()) {\n          // Check if it's a valid language directory\n          const metadataPath = path.join(\n            this.options.dataPath,\n            entry.name,\n            'metadata.json'\n          )\n          try {\n            await fs.access(metadataPath)\n            languages.push(entry.name as LanguageCode)\n          } catch {\n            // Skip directories without metadata.json\n          }\n        }\n      }\n\n      return languages\n    } catch (error) {\n      console.warn('Could not read language data directory:', error)\n      return []\n    }\n  }\n\n  /**\n   * Get language metadata without loading full data\n   */\n  async getLanguageMetadata(\n    language: LanguageCode\n  ): Promise<LanguageData['metadata'] | null> {\n    try {\n      const metadataPath = path.join(\n        this.options.dataPath,\n        language,\n        'metadata.json'\n      )\n      const content = await fs.readFile(metadataPath, 'utf-8')\n      return JSON.parse(content)\n    } catch {\n      return null\n    }\n  }\n\n  /**\n   * Check if language is available\n   */\n  async isLanguageAvailable(language: LanguageCode): Promise<boolean> {\n    const metadata = await this.getLanguageMetadata(language)\n    return metadata !== null\n  }\n\n  /**\n   * Clear cache for specific language or all languages\n   */\n  clearCache(language?: LanguageCode): void {\n    if (language) {\n      this.cache.delete(language)\n    } else {\n      this.cache.clear()\n    }\n  }\n\n  /**\n   * Get cache statistics\n   */\n  getCacheStats(): {\n    cacheSize: number\n    cacheHits: number\n    cacheMisses: number\n    hitRate: number\n    cachedLanguages: LanguageCode[]\n  } {\n    const total = this.cacheHits + this.cacheMisses\n    return {\n      cacheSize: this.cache.size,\n      cacheHits: this.cacheHits,\n      cacheMisses: this.cacheMisses,\n      hitRate: total > 0 ? this.cacheHits / total : 0,\n      cachedLanguages: Array.from(this.cache.keys()),\n    }\n  }\n\n  /**\n   * Get load performance statistics\n   */\n  getPerformanceStats(): Map<LanguageCode, number> {\n    return new Map(this.loadTimes)\n  }\n\n  /**\n   * Optimize memory usage\n   */\n  optimizeMemory(): void {\n    // Keep only recently used languages (simplified LRU)\n    const recentLanguages = Array.from(this.cache.keys()).slice(-5) // Keep last 5\n    const newCache = new Map<LanguageCode, LanguageData>()\n\n    for (const lang of recentLanguages) {\n      const data = this.cache.get(lang)\n      if (data) {\n        newCache.set(lang, data)\n      }\n    }\n\n    this.cache = newCache\n\n    // Force garbage collection if available\n    if (global.gc) {\n      global.gc()\n    }\n  }\n\n  /**\n   * Reload specific language data\n   */\n  async reloadLanguage(language: LanguageCode): Promise<LanguageLoadResult> {\n    // Clear from cache first\n    this.cache.delete(language)\n    return await this.loadLanguage(language)\n  }\n\n  /**\n   * Get language data size estimation\n   */\n  getLanguageDataSize(language: LanguageCode): number {\n    const data = this.cache.get(language)\n    if (!data) return 0\n\n    // Rough estimation of memory usage\n    const jsonSize = JSON.stringify(data).length\n    return jsonSize * 2 // Account for object overhead\n  }\n\n  /**\n   * Export cached data for serialization\n   */\n  exportCache(): Record<string, LanguageData> {\n    const exported: Record<string, LanguageData> = {}\n    for (const [lang, data] of this.cache) {\n      exported[lang] = data\n    }\n    return exported\n  }\n\n  /**\n   * Import cached data from serialization\n   */\n  importCache(data: Record<string, LanguageData>): void {\n    this.cache.clear()\n    for (const [lang, langData] of Object.entries(data)) {\n      this.cache.set(lang as LanguageCode, langData)\n    }\n  }\n\n  /**\n   * Dispose resources and cleanup\n   */\n  dispose(): void {\n    this.cache.clear()\n    this.loadingPromises.clear()\n    this.loadTimes.clear()\n    this.cacheHits = 0\n    this.cacheMisses = 0\n  }\n}\n\n/**\n * Global language loader instance\n */\nlet globalLanguageLoader: LanguageLoader | null = null\n\n/**\n * Get global language loader instance\n */\nexport function getGlobalLanguageLoader(\n  options?: LanguageLoadOptions\n): LanguageLoader {\n  if (!globalLanguageLoader) {\n    globalLanguageLoader = new LanguageLoader(options)\n  }\n  return globalLanguageLoader\n}\n\n/**\n * Reset global language loader\n */\nexport function resetGlobalLanguageLoader(): void {\n  if (globalLanguageLoader) {\n    globalLanguageLoader.dispose()\n    globalLanguageLoader = null\n  }\n}\n","/**\n * Multi-language detection and coordination system\n * Manages detection across multiple languages with intelligent optimization\n */\n\nimport type {\n  DetectorConfig,\n  LanguageCode,\n  DetectionResult,\n  DetectionMatch,\n  AnalysisOptions,\n  ProfanityCategory\n} from '../types/index.js'\nimport { SeverityLevel } from '../types/index.js'\nimport { ContentShieldDetector } from '../core/detector.js'\nimport { LanguageDetector } from '../core/language-detector.js'\nimport { LanguageLoader } from './language-loader.js'\nimport { ConfigManager } from '../config/config-manager.js'\n\n/**\n * Multi-language detection result\n */\nexport interface MultiLanguageDetectionResult extends DetectionResult {\n  languageResults: Map<LanguageCode, DetectionResult>\n  primaryLanguage: LanguageCode\n  languageConfidences: Map<LanguageCode, number>\n  crossLanguageMatches: boolean\n}\n\n/**\n * Multi-language detector options\n */\nexport interface MultiLanguageDetectorOptions {\n  languages: LanguageCode[]\n  autoDetectLanguages?: boolean\n  primaryLanguage?: LanguageCode\n  enableCrossLanguageMatching?: boolean\n  languageThreshold?: number // Minimum confidence for language detection\n  parallelProcessing?: boolean\n  cacheResults?: boolean\n  optimizeForPerformance?: boolean\n}\n\n/**\n * Language detection strategy\n */\nexport enum LanguageDetectionStrategy {\n  AUTO = 'auto', // Auto-detect based on text\n  EXPLICIT = 'explicit', // Use only specified languages\n  HYBRID = 'hybrid', // Combine auto-detection with explicit list\n}\n\n/**\n * Multi-language profanity detector\n */\nexport class MultiLanguageDetector {\n  private languageDetectors = new Map<LanguageCode, ContentShieldDetector>()\n  private languageDetector: LanguageDetector\n  private languageLoader: LanguageLoader\n  private configManager: ConfigManager\n  private options: Required<MultiLanguageDetectorOptions>\n\n  // Performance tracking\n  private detectionStats = new Map<LanguageCode, {\n    totalDetections: number\n    averageTime: number\n    lastUsed: Date\n  }>()\n\n  // Caching\n  private resultCache = new Map<string, MultiLanguageDetectionResult>()\n  private readonly MAX_CACHE_SIZE = 1000\n  private cacheHits = 0\n  private cacheMisses = 0\n\n  constructor(\n    baseConfig: Partial<DetectorConfig> = {},\n    options: Partial<MultiLanguageDetectorOptions> = {}\n  ) {\n    this.options = {\n      languages: ['en'],\n      autoDetectLanguages: true,\n      primaryLanguage: 'en',\n      enableCrossLanguageMatching: true,\n      languageThreshold: 0.3,\n      parallelProcessing: true,\n      cacheResults: true,\n      optimizeForPerformance: false,\n      ...options\n    }\n\n    this.languageDetector = new LanguageDetector()\n    this.languageLoader = new LanguageLoader()\n    this.configManager = new ConfigManager(baseConfig)\n\n    // Initialize language-specific detectors\n    this.initializeLanguageDetectors()\n  }\n\n  /**\n   * Initialize detectors for each configured language\n   */\n  private async initializeLanguageDetectors(): Promise<void> {\n    const initPromises = this.options.languages.map(async (language) => {\n      try {\n        const optimizedConfig = this.configManager.getOptimizedConfigForLanguages([language])\n        const detector = new ContentShieldDetector(optimizedConfig)\n        await detector.initialize()\n\n        this.languageDetectors.set(language, detector)\n        this.detectionStats.set(language, {\n          totalDetections: 0,\n          averageTime: 0,\n          lastUsed: new Date()\n        })\n      } catch (error) {\n        console.warn(`Failed to initialize detector for language ${language}:`, error)\n      }\n    })\n\n    await Promise.all(initPromises)\n  }\n\n  /**\n   * Detect profanity across multiple languages\n   */\n  async detect(\n    text: string,\n    options: Partial<AnalysisOptions> = {}\n  ): Promise<MultiLanguageDetectionResult> {\n    // Check cache first\n    if (this.options.cacheResults) {\n      const cacheKey = this.generateCacheKey(text, options)\n      const cached = this.resultCache.get(cacheKey)\n      if (cached) {\n        this.cacheHits++\n        return cached\n      }\n      this.cacheMisses++\n    }\n\n    const startTime = performance.now()\n\n    // Step 1: Detect languages in text\n    const detectedLanguages = await this.detectLanguagesInText(text)\n\n    // Step 2: Determine which languages to analyze\n    const languagesToAnalyze = this.selectLanguagesForAnalysis(detectedLanguages)\n\n    // Step 3: Perform analysis for each selected language\n    const languageResults = await this.analyzeWithMultipleLanguages(\n      text,\n      languagesToAnalyze,\n      options\n    )\n\n    // Step 4: Merge and optimize results\n    const mergedResult = this.mergeLanguageResults(\n      text,\n      languageResults,\n      detectedLanguages\n    )\n\n    // Update performance stats\n    this.updatePerformanceStats(languagesToAnalyze, performance.now() - startTime)\n\n    // Cache result if enabled\n    if (this.options.cacheResults) {\n      this.cacheResult(text, options, mergedResult)\n    }\n\n    return mergedResult\n  }\n\n  /**\n   * Detect languages present in text\n   */\n  private async detectLanguagesInText(text: string): Promise<Map<LanguageCode, number>> {\n    const detectionResults = await this.languageDetector.detect(text)\n    const languageConfidences = new Map<LanguageCode, number>()\n\n    for (const result of detectionResults) {\n      if (result.confidence >= this.options.languageThreshold) {\n        languageConfidences.set(result.language, result.confidence)\n      }\n    }\n\n    // Fallback to primary language if no languages detected\n    if (languageConfidences.size === 0 && this.options.primaryLanguage) {\n      languageConfidences.set(this.options.primaryLanguage, 0.5)\n    }\n\n    return languageConfidences\n  }\n\n  /**\n   * Select languages for analysis based on detection and configuration\n   */\n  private selectLanguagesForAnalysis(detectedLanguages: Map<LanguageCode, number>): LanguageCode[] {\n    const selected = new Set<LanguageCode>()\n\n    if (this.options.autoDetectLanguages) {\n      // Add detected languages above threshold\n      for (const [language, confidence] of detectedLanguages) {\n        if (confidence >= this.options.languageThreshold && this.languageDetectors.has(language)) {\n          selected.add(language)\n        }\n      }\n    }\n\n    // Always include configured languages if available\n    for (const language of this.options.languages) {\n      if (this.languageDetectors.has(language)) {\n        selected.add(language)\n      }\n    }\n\n    // Ensure primary language is included\n    if (this.options.primaryLanguage && this.languageDetectors.has(this.options.primaryLanguage)) {\n      selected.add(this.options.primaryLanguage)\n    }\n\n    return Array.from(selected)\n  }\n\n  /**\n   * Analyze text with multiple language detectors\n   */\n  private async analyzeWithMultipleLanguages(\n    text: string,\n    languages: LanguageCode[],\n    options: Partial<AnalysisOptions>\n  ): Promise<Map<LanguageCode, DetectionResult>> {\n    const results = new Map<LanguageCode, DetectionResult>()\n\n    if (this.options.parallelProcessing && languages.length > 1) {\n      // Parallel processing for multiple languages\n      const analysisPromises = languages.map(async (language) => {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- languageDetectors.get() guaranteed to return detector for languages passed to analyzeByLanguages()\n        const detector = this.languageDetectors.get(language)!\n        const result = await detector.analyze(text, options)\n        return { language, result }\n      })\n\n      const parallelResults = await Promise.all(analysisPromises)\n      for (const { language, result } of parallelResults) {\n        results.set(language, result)\n      }\n    } else {\n      // Sequential processing\n      for (const language of languages) {\n        const detector = this.languageDetectors.get(language)\n        if (detector) {\n          const result = await detector.analyze(text, options)\n          results.set(language, result)\n        }\n      }\n    }\n\n    return results\n  }\n\n  /**\n   * Merge results from multiple language detectors\n   */\n  private mergeLanguageResults(\n    originalText: string,\n    languageResults: Map<LanguageCode, DetectionResult>,\n    detectedLanguages: Map<LanguageCode, number>\n  ): MultiLanguageDetectionResult {\n    // Find primary result (highest confidence or primary language)\n    let primaryResult: DetectionResult | null = null\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- primaryLanguage is set in constructor with default value 'en'\n    let primaryLanguage: LanguageCode = this.options.primaryLanguage!\n\n    let highestConfidence = 0\n    for (const [language, result] of languageResults) {\n      const langConfidence = detectedLanguages.get(language) || 0.1\n      if (langConfidence > highestConfidence) {\n        highestConfidence = langConfidence\n        primaryResult = result\n        primaryLanguage = language\n      }\n    }\n\n    // Fallback to first result if no primary found\n    if (!primaryResult && languageResults.size > 0) {\n      const firstEntry = languageResults.entries().next().value\n      if (firstEntry) {\n        primaryResult = firstEntry[1]\n        primaryLanguage = firstEntry[0]\n      }\n    }\n\n    // Merge all matches\n    const allMatches: DetectionMatch[] = []\n    const allCategories = new Set<ProfanityCategory>()\n    let maxSeverity: SeverityLevel = SeverityLevel.LOW\n    let totalConfidence = 0\n\n    for (const result of languageResults.values()) {\n      if (result.matches) {\n        allMatches.push(...result.matches)\n        // Extract categories from matches\n        result.matches.forEach(match => {\n          match.categories.forEach(cat => allCategories.add(cat))\n        })\n      }\n      if (result.maxSeverity > maxSeverity) {\n        maxSeverity = result.maxSeverity\n      }\n      totalConfidence += (result.confidence || 0)\n    }\n\n    const avgConfidence = languageResults.size > 0 ? totalConfidence / languageResults.size : 0\n\n    // Detect cross-language matches\n    const crossLanguageMatches = this.detectCrossLanguageMatches(languageResults)\n\n    // Build merged result - use primary result as base and extend it\n    const baseResult = primaryResult || {\n      originalText,\n      filteredText: originalText,\n      hasProfanity: allMatches.length > 0,\n      totalMatches: allMatches.length,\n      maxSeverity,\n      matches: allMatches,\n      detectedLanguages: Array.from(detectedLanguages.keys()),\n      confidence: avgConfidence,\n      processingTime: 0\n    }\n\n    const mergedResult: MultiLanguageDetectionResult = {\n      ...baseResult,\n      languageResults,\n      primaryLanguage,\n      languageConfidences: detectedLanguages,\n      crossLanguageMatches\n    }\n\n    return mergedResult\n  }\n\n  /**\n   * Detect cross-language profanity matches\n   */\n  private detectCrossLanguageMatches(languageResults: Map<LanguageCode, DetectionResult>): boolean {\n    if (!this.options.enableCrossLanguageMatching || languageResults.size < 2) {\n      return false\n    }\n\n    const languageMatchCounts = new Map<LanguageCode, number>()\n\n    for (const [language, result] of languageResults) {\n      languageMatchCounts.set(language, result.matches?.length || 0)\n    }\n\n    // Check if multiple languages detected matches\n    const languagesWithMatches = Array.from(languageMatchCounts.values())\n      .filter(count => count > 0).length\n\n    return languagesWithMatches > 1\n  }\n\n  /**\n   * Add support for new language\n   */\n  async addLanguage(\n    language: LanguageCode,\n    config?: Partial<DetectorConfig>\n  ): Promise<boolean> {\n    try {\n      // Check if language data is available\n      const isAvailable = await this.languageLoader.isLanguageAvailable(language)\n      if (!isAvailable) {\n        console.warn(`Language data not available for ${language}`)\n        return false\n      }\n\n      // Create optimized configuration\n      const baseConfig = config || this.configManager.getConfig()\n      const optimizedConfig = this.configManager.getOptimizedConfigForLanguages([language])\n      const finalConfig = { ...baseConfig, ...optimizedConfig }\n\n      // Initialize detector\n      const detector = new ContentShieldDetector(finalConfig)\n      await detector.initialize()\n\n      // Add to collection\n      this.languageDetectors.set(language, detector)\n      this.detectionStats.set(language, {\n        totalDetections: 0,\n        averageTime: 0,\n        lastUsed: new Date()\n      })\n\n      // Update options\n      if (!this.options.languages.includes(language)) {\n        this.options.languages.push(language)\n      }\n\n      return true\n    } catch (error) {\n      console.error(`Failed to add language ${language}:`, error)\n      return false\n    }\n  }\n\n  /**\n   * Remove language support\n   */\n  removeLanguage(language: LanguageCode): boolean {\n    if (language === this.options.primaryLanguage) {\n      console.warn(`Cannot remove primary language ${language}`)\n      return false\n    }\n\n    const removed = this.languageDetectors.delete(language)\n    this.detectionStats.delete(language)\n\n    // Update options\n    this.options.languages = this.options.languages.filter(lang => lang !== language)\n\n    return removed\n  }\n\n  /**\n   * Get available languages\n   */\n  getAvailableLanguages(): LanguageCode[] {\n    return Array.from(this.languageDetectors.keys())\n  }\n\n  /**\n   * Get language-specific detector\n   */\n  getLanguageDetector(language: LanguageCode): ContentShieldDetector | undefined {\n    return this.languageDetectors.get(language)\n  }\n\n  /**\n   * Update configuration for all language detectors\n   */\n  async updateConfiguration(newConfig: Partial<DetectorConfig>): Promise<void> {\n    await this.configManager.updateConfig(newConfig)\n\n    // Update all language detectors\n    const updatePromises = Array.from(this.languageDetectors.entries()).map(\n      async ([language]) => {\n        const optimizedConfig = this.configManager.getOptimizedConfigForLanguages([language])\n        const finalConfig = { ...newConfig, ...optimizedConfig }\n\n        // Create new detector with updated config\n        const newDetector = new ContentShieldDetector(finalConfig)\n        await newDetector.initialize()\n\n        this.languageDetectors.set(language, newDetector)\n      }\n    )\n\n    await Promise.all(updatePromises)\n  }\n\n  /**\n   * Get performance statistics\n   */\n  getPerformanceStats(): {\n    languageStats: Map<LanguageCode, {\n      totalDetections: number\n      averageTime: number\n      lastUsed: Date\n    }>\n    cacheStats: {\n      size: number\n      hitRate: number\n    }\n  } {\n    const totalRequests = this.cacheHits + this.cacheMisses\n    const cacheStats = {\n      size: this.resultCache.size,\n      hitRate: totalRequests > 0 ? this.cacheHits / totalRequests : 0\n    }\n\n    return {\n      languageStats: new Map(this.detectionStats),\n      cacheStats\n    }\n  }\n\n  /**\n   * Warm up caches for common patterns\n   */\n  async warmUpCaches(commonTexts: string[]): Promise<void> {\n    const warmupPromises = commonTexts.map(text => this.detect(text))\n    await Promise.all(warmupPromises)\n  }\n\n  /**\n   * Optimize memory usage\n   */\n  optimizeMemory(): void {\n    // Clear result cache\n    this.resultCache.clear()\n\n    // Optimize individual detectors\n    for (const detector of this.languageDetectors.values()) {\n      if (typeof detector.optimizeMemory === 'function') {\n        detector.optimizeMemory()\n      }\n    }\n\n    // Optimize language loader\n    this.languageLoader.optimizeMemory()\n\n    // Force garbage collection\n    if (global.gc) {\n      global.gc()\n    }\n  }\n\n  /**\n   * Generate cache key for result caching\n   */\n  private generateCacheKey(text: string, options: Partial<AnalysisOptions>): string {\n    const optionsHash = JSON.stringify(options)\n    return `${text.slice(0, 50)}:${optionsHash}` // Use first 50 chars as key\n  }\n\n  /**\n   * Cache analysis result\n   */\n  private cacheResult(\n    text: string,\n    options: Partial<AnalysisOptions>,\n    result: MultiLanguageDetectionResult\n  ): void {\n    if (this.resultCache.size >= this.MAX_CACHE_SIZE) {\n      // Simple cache eviction - remove oldest entries\n      const keysToRemove = Array.from(this.resultCache.keys()).slice(0, this.MAX_CACHE_SIZE / 4)\n      keysToRemove.forEach(key => this.resultCache.delete(key))\n    }\n\n    const cacheKey = this.generateCacheKey(text, options)\n    this.resultCache.set(cacheKey, result)\n  }\n\n  /**\n   * Update performance statistics\n   */\n  private updatePerformanceStats(languages: LanguageCode[], totalTime: number): void {\n    const timePerLanguage = totalTime / languages.length\n\n    for (const language of languages) {\n      const stats = this.detectionStats.get(language)\n      if (stats) {\n        stats.totalDetections++\n        stats.averageTime = ((stats.averageTime * (stats.totalDetections - 1)) + timePerLanguage) / stats.totalDetections\n        stats.lastUsed = new Date()\n      }\n    }\n  }\n\n  /**\n   * Dispose resources\n   */\n  dispose(): void {\n    this.languageDetectors.clear()\n    this.detectionStats.clear()\n    this.resultCache.clear()\n    this.languageLoader.dispose()\n    this.configManager.dispose()\n  }\n}","import { ContentShieldDetector } from '../core/detector.js'\nimport { MultiLanguageDetector } from './multi-language-detector.js'\nimport { LanguageLoader } from './language-loader.js'\nimport type { DetectorConfig, LanguageCode } from '../types/index.js'\nimport { getConfigPreset, LANGUAGE_OPTIMIZED_CONFIGS } from '../config/index.js'\n\n/**\n * Factory options for creating detectors\n */\nexport interface DetectorFactoryOptions {\n  useOptimizedConfig?: boolean\n  enableCaching?: boolean\n  preloadLanguageData?: boolean\n  enableAdvancedFeatures?: boolean\n}\n\n/**\n * Create a detector optimized for specific language(s)\n */\nexport function createDetector(\n  languages: LanguageCode | LanguageCode[],\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  const languageArray = Array.isArray(languages) ? languages : [languages]\n\n  // Get optimized configuration\n  let detectorConfig = { ...getConfigPreset('default'), ...config }\n  detectorConfig.languages = languageArray\n\n  if (options.useOptimizedConfig !== false) {\n    // Apply language-specific optimizations\n    if (languageArray.length === 1) {\n      const language = languageArray[0]\n      const langOptimizations = language && language in LANGUAGE_OPTIMIZED_CONFIGS\n        ? LANGUAGE_OPTIMIZED_CONFIGS[language as keyof typeof LANGUAGE_OPTIMIZED_CONFIGS]\n        : undefined\n      if (langOptimizations) {\n        detectorConfig = { ...detectorConfig, ...langOptimizations }\n      }\n    }\n  }\n\n  const detector = new ContentShieldDetector(detectorConfig)\n\n  // Preload language data if requested\n  if (options.preloadLanguageData) {\n    detector.initialize().catch(error => {\n      console.warn('Language data preloading failed:', error)\n    })\n  }\n\n  return detector\n}\n\n/**\n * Create an advanced multi-language detector\n */\nexport function createAdvancedMultiLanguageDetector(\n  languages: LanguageCode[],\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): MultiLanguageDetector {\n  const baseConfig = { ...getConfigPreset('comprehensive'), ...config }\n\n  const multiDetectorOptions = {\n    languages,\n    autoDetectLanguages: true,\n    enableCrossLanguageMatching: true,\n    parallelProcessing: true,\n    cacheResults: options.enableCaching !== false,\n    optimizeForPerformance: options.useOptimizedConfig === true,\n  }\n\n  return new MultiLanguageDetector(baseConfig, multiDetectorOptions)\n}\n\n/**\n * Create a detector for English content\n */\nexport function createEnglishDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('en', {\n    ...getConfigPreset('default'),\n    fuzzyMatching: true,\n    normalizeText: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for Spanish content\n */\nexport function createSpanishDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('es', {\n    ...getConfigPreset('default'),\n    fuzzyThreshold: 0.7, // Spanish has more variations\n    detectAlternateScripts: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for French content\n */\nexport function createFrenchDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('fr', {\n    ...getConfigPreset('default'),\n    fuzzyThreshold: 0.7,\n    normalizeText: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for German content\n */\nexport function createGermanDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('de', {\n    ...getConfigPreset('default'),\n    fuzzyThreshold: 0.8, // German compound words\n    normalizeText: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for Russian content\n */\nexport function createRussianDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('ru', {\n    ...getConfigPreset('default'),\n    fuzzyThreshold: 0.7,\n    detectAlternateScripts: true, // Cyrillic variations\n    normalizeText: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for Chinese content\n */\nexport function createChineseDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('zh', {\n    ...getConfigPreset('strict'),\n    fuzzyThreshold: 0.9, // Chinese characters need precision\n    normalizeText: false, // Don't normalize Chinese\n    detectAlternateScripts: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for Japanese content\n */\nexport function createJapaneseDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('ja', {\n    ...getConfigPreset('strict'),\n    fuzzyThreshold: 0.9,\n    normalizeText: false,\n    detectAlternateScripts: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a detector for Arabic content\n */\nexport function createArabicDetector(\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): ContentShieldDetector {\n  return createDetector('ar', {\n    ...getConfigPreset('default'),\n    fuzzyThreshold: 0.7,\n    detectAlternateScripts: true, // Arabic script variations\n    normalizeText: true,\n    ...config\n  }, options)\n}\n\n/**\n * Create a high-performance detector optimized for speed\n */\nexport function createPerformanceDetector(\n  languages: LanguageCode | LanguageCode[] = 'en',\n  config: Partial<DetectorConfig> = {}\n): ContentShieldDetector {\n  return createDetector(languages, {\n    ...getConfigPreset('performance'),\n    ...config\n  }, {\n    useOptimizedConfig: true,\n    enableCaching: true,\n    preloadLanguageData: true\n  })\n}\n\n/**\n * Create a comprehensive detector for maximum accuracy\n */\nexport function createComprehensiveDetector(\n  languages: LanguageCode[] = ['auto'],\n  config: Partial<DetectorConfig> = {}\n): ContentShieldDetector {\n  return createDetector(languages, {\n    ...getConfigPreset('comprehensive'),\n    ...config\n  }, {\n    useOptimizedConfig: true,\n    enableCaching: true,\n    enableAdvancedFeatures: true\n  })\n}\n\n/**\n * Create a detector based on environment (development, production, testing)\n */\nexport function createEnvironmentDetector(\n  languages: LanguageCode | LanguageCode[] = 'en',\n  environment: 'development' | 'production' | 'testing' = 'production'\n): ContentShieldDetector {\n  const environmentConfigs = {\n    development: getConfigPreset('comprehensive'),\n    production: getConfigPreset('performance'),\n    testing: getConfigPreset('default')\n  }\n\n  const config = environmentConfigs[environment]\n  return createDetector(languages, config, {\n    useOptimizedConfig: environment === 'production',\n    enableCaching: environment !== 'testing',\n    preloadLanguageData: environment === 'production'\n  })\n}\n\n/**\n * Auto-detect and create appropriate detector for text\n */\nexport async function createAutoDetector(\n  sampleText: string,\n  config: Partial<DetectorConfig> = {}\n): Promise<ContentShieldDetector> {\n  // Quick language detection\n  const tempDetector = new ContentShieldDetector({ languages: ['auto'] })\n  const quickResult = await tempDetector.analyze(sampleText, { measurePerformance: false })\n\n  const detectedLanguages = quickResult.detectedLanguages || ['en']\n\n  // Create optimized detector for detected languages\n  return createDetector(detectedLanguages, config, {\n    useOptimizedConfig: true,\n    enableCaching: true\n  })\n}\n\n/**\n * Create detector with custom language data loader\n *\n * NOTE: This is currently a placeholder implementation. Full integration of custom loaders\n * would require architectural changes to pass the loader instance through the detector\n * initialization chain. For now, this function creates a detector with default loading behavior.\n *\n * Future enhancement: Modify ContentShieldDetector constructor to accept optional LanguageLoader\n * instance and use it instead of the default loading mechanism.\n */\nexport function createDetectorWithCustomLoader(\n  languages: LanguageCode | LanguageCode[],\n  dataPath: string,\n  config: Partial<DetectorConfig> = {}\n): ContentShieldDetector {\n  // Create custom language loader (currently unused - see function documentation)\n  new LanguageLoader({ dataPath })\n\n  // Create detector with custom configuration\n  const detector = createDetector(languages, config)\n\n  return detector\n}\n\n/**\n * Get language-specific factory function\n */\nexport function getLanguageFactory(language: LanguageCode):\n  ((config?: Partial<DetectorConfig>, options?: DetectorFactoryOptions) => ContentShieldDetector) | null {\n\n  const factories = {\n    en: createEnglishDetector,\n    es: createSpanishDetector,\n    fr: createFrenchDetector,\n    de: createGermanDetector,\n    ru: createRussianDetector,\n    zh: createChineseDetector,\n    ja: createJapaneseDetector,\n    ar: createArabicDetector,\n  }\n\n  return factories[language as keyof typeof factories] || null\n}\n\n/**\n * Create multiple language-specific detectors\n */\nexport function createDetectorCollection(\n  languages: LanguageCode[],\n  config: Partial<DetectorConfig> = {},\n  options: DetectorFactoryOptions = {}\n): Map<LanguageCode, ContentShieldDetector> {\n  const detectors = new Map<LanguageCode, ContentShieldDetector>()\n\n  for (const language of languages) {\n    const factory = getLanguageFactory(language)\n    if (factory) {\n      detectors.set(language, factory(config, options))\n    } else {\n      // Fallback to generic detector\n      detectors.set(language, createDetector(language, config, options))\n    }\n  }\n\n  return detectors\n}\n\n/**\n * Legacy compatibility - original multi-language detector\n */\nexport function createMultiLanguageDetector(\n  languages: LanguageCode[],\n  config: Partial<DetectorConfig> = {}\n): ContentShieldDetector {\n  return createDetector(languages, config)\n}\n","import { levenshteinDistance } from './text-normalizer.js'\n\n/**\n * Fuzzy matching utilities for profanity detection\n */\n\n/**\n * Check if two strings match within a fuzzy threshold\n */\nexport function fuzzyMatch(\n  text: string,\n  pattern: string,\n  threshold: number = 0.8\n): boolean {\n  if (text === pattern) return true\n\n  const distance = levenshteinDistance(\n    text.toLowerCase(),\n    pattern.toLowerCase()\n  )\n  const maxLength = Math.max(text.length, pattern.length)\n  const similarity = 1 - distance / maxLength\n\n  return similarity >= threshold\n}\n\n/**\n * Find fuzzy matches in text\n */\nexport function findFuzzyMatches(\n  text: string,\n  patterns: string[],\n  threshold: number = 0.8\n): Array<{\n  pattern: string\n  match: string\n  similarity: number\n  start: number\n  end: number\n}> {\n  const matches: Array<{\n    pattern: string\n    match: string\n    similarity: number\n    start: number\n    end: number\n  }> = []\n  const words = text.split(/\\s+/)\n  let currentIndex = 0\n\n  for (const word of words) {\n    const wordStart = text.indexOf(word, currentIndex)\n    const wordEnd = wordStart + word.length\n\n    for (const pattern of patterns) {\n      if (fuzzyMatch(word, pattern, threshold)) {\n        const distance = levenshteinDistance(\n          word.toLowerCase(),\n          pattern.toLowerCase()\n        )\n        const similarity = 1 - distance / Math.max(word.length, pattern.length)\n\n        matches.push({\n          pattern,\n          match: word,\n          similarity,\n          start: wordStart,\n          end: wordEnd,\n        })\n      }\n    }\n\n    currentIndex = wordEnd\n  }\n\n  return matches\n}\n\n/**\n * Calculate similarity score between two strings\n */\nexport function calculateSimilarity(a: string, b: string): number {\n  if (a === b) return 1.0\n\n  const distance = levenshteinDistance(a.toLowerCase(), b.toLowerCase())\n  const maxLength = Math.max(a.length, b.length)\n\n  return 1 - distance / maxLength\n}\n\n/**\n * Find the best match from a list of patterns\n */\nexport function findBestMatch(\n  text: string,\n  patterns: string[],\n  minThreshold: number = 0.8\n): { pattern: string; similarity: number } | null {\n  let bestMatch: { pattern: string; similarity: number } | null = null\n\n  for (const pattern of patterns) {\n    const similarity = calculateSimilarity(text, pattern)\n\n    if (\n      similarity >= minThreshold &&\n      (!bestMatch || similarity > bestMatch.similarity)\n    ) {\n      bestMatch = { pattern, similarity }\n    }\n  }\n\n  return bestMatch\n}\n","import type { DetectorConfig } from '../types/index.js'\nimport { SeverityLevel as SL } from '../types/index.js'\nimport { ALL_CATEGORIES } from '../config/default-config.js'\n\n/**\n * Create a default detector configuration\n */\nexport function createDefaultConfig(): DetectorConfig {\n  return {\n    languages: ['auto'],\n    minSeverity: SL.LOW,\n    categories: ALL_CATEGORIES,\n    fuzzyMatching: true,\n    fuzzyThreshold: 0.8,\n    customWords: [],\n    whitelist: [],\n    detectAlternateScripts: true,\n    normalizeText: true,\n    replacementChar: '*',\n    preserveStructure: true,\n  }\n}\n\n/**\n * Create a strict configuration for high-security environments\n */\nexport function createStrictConfig(): DetectorConfig {\n  return {\n    ...createDefaultConfig(),\n    minSeverity: SL.LOW,\n    fuzzyMatching: true,\n    fuzzyThreshold: 0.6, // More aggressive fuzzy matching\n    detectAlternateScripts: true,\n  }\n}\n\n/**\n * Create a lenient configuration for casual environments\n */\nexport function createLenientConfig(): DetectorConfig {\n  return {\n    ...createDefaultConfig(),\n    minSeverity: SL.MODERATE,\n    fuzzyMatching: false,\n    categories: ['hate_speech', 'discrimination'], // Only severe categories\n  }\n}\n\n/**\n * Create a configuration for family-friendly content\n */\nexport function createFamilyFriendlyConfig(): DetectorConfig {\n  return {\n    ...createDefaultConfig(),\n    minSeverity: SL.LOW,\n    categories: ALL_CATEGORIES,\n    fuzzyMatching: true,\n    fuzzyThreshold: 0.9,\n  }\n}\n","import { ContentShieldDetector } from './detector.js'\nimport type { DetectorConfig } from '../types/index.js'\nimport { FilterMode } from '../types/index.js'\n\n// Global default instance for quick-start functions\nlet defaultDetector: ContentShieldDetector | null = null\nlet initPromise: Promise<void> | null = null\n\nasync function getDefaultDetector(): Promise<ContentShieldDetector> {\n  if (!defaultDetector) {\n    defaultDetector = new ContentShieldDetector()\n    initPromise = defaultDetector.initialize()\n    await initPromise\n    initPromise = null\n  }\n  return defaultDetector\n}\n\n/**\n * Quick detection function using default configuration\n */\nexport async function detect(text: string) {\n  const detector = await getDefaultDetector()\n  return await detector.analyze(text)\n}\n\n/**\n * Quick filter function using default configuration\n */\nexport async function filter(\n  text: string,\n  mode: FilterMode = FilterMode.CENSOR\n) {\n  const detector = await getDefaultDetector()\n  return await detector.filter(text, mode)\n}\n\n/**\n * Quick clean check using default configuration\n */\nexport async function isClean(text: string): Promise<boolean> {\n  const detector = await getDefaultDetector()\n  return !(await detector.isProfane(text))\n}\n\n/**\n * Configure the default detector instance with custom settings.\n *\n * This function allows you to configure the global detector used by quick-start functions.\n * Once configured, all subsequent calls to detect(), filter(), and isClean() will use\n * these settings.\n *\n * @param config - Partial detector configuration to apply\n *\n * @example\n * ```typescript\n * // Configure with static language data (tree-shakeable)\n * import { configure, detect } from 'content-shield'\n * import { EN } from 'content-shield/languages/en'\n *\n * await configure({\n *   languageData: { en: EN },\n *   languages: ['en']\n * })\n *\n * const result = await detect('some text')\n * ```\n *\n * @example\n * ```typescript\n * // Configure with dynamic loading (loads from data directory)\n * import { configure, detect } from 'content-shield'\n *\n * await configure({\n *   languages: ['en', 'es'],\n *   minSeverity: SeverityLevel.HIGH\n * })\n *\n * const result = await detect('some text')\n * ```\n *\n * @example\n * ```typescript\n * // Configure multiple languages with static imports\n * import { configure, detect } from 'content-shield'\n * import { EN } from 'content-shield/languages/en'\n * import { ES } from 'content-shield/languages/es'\n *\n * await configure({\n *   languageData: {\n *     en: EN,\n *     es: ES\n *   },\n *   languages: ['en', 'es'],\n *   fuzzyMatching: true\n * })\n *\n * const result = await detect('text with multiple languages')\n * ```\n */\nexport async function configure(\n  config: Partial<DetectorConfig>\n): Promise<void> {\n  if (!defaultDetector) {\n    defaultDetector = new ContentShieldDetector(config)\n    initPromise = defaultDetector.initialize()\n    await initPromise\n    initPromise = null\n  } else {\n    defaultDetector.updateConfig(config)\n  }\n}\n\n/**\n * Reset the default detector instance\n */\nexport function reset(): void {\n  defaultDetector = null\n  initPromise = null\n}\n","/**\n * ContentShield - A modern TypeScript library for multi-language profanity detection\n * and content moderation with severity levels and customizable filtering\n *\n * Features:\n * - Multi-language support (17 languages)\n * - Performance optimizations with intelligent caching\n * - Comprehensive configuration system\n * - Advanced language integration\n * - Worker thread support for large texts\n * - Memory-efficient operations\n * - Real-time configuration management\n */\n\n// Export all types first\nexport * from './types/index.js'\n\n// Import types for internal use\nimport type {\n  DetectorConfig,\n  LanguageCode,\n  DetectionResult\n} from './types/index.js'\n\n// Core detection classes\nexport { ContentShieldDetector } from './core/detector.js'\nexport { LanguageDetector } from './core/language-detector.js'\nexport { ProfanityFilter } from './core/filter.js'\nexport { ProfanityTrie } from './core/trie.js'\nexport { ProfanityMatcher } from './core/profanity-matcher.js'\nexport { DetectionResultBuilder } from './core/detection-result.js'\n\n// Configuration system\nexport * from './config/index.js'\n\n// Language integration system\nexport * from './languages/index.js'\n\n// Import functions for internal use\nimport { ContentShieldDetector } from './core/detector.js'\nimport { ProfanityFilter } from './core/filter.js'\nimport {\n  getConfigPreset,\n  getGlobalConfigManager\n} from './config/index.js'\nimport {\n  createDetector,\n  createPerformanceDetector,\n  createComprehensiveDetector,\n  createAutoDetector,\n  getGlobalLanguageLoader\n} from './languages/index.js'\n\n// Utility functions\nexport { normalizeText } from './utils/text-normalizer.js'\nexport {\n  fuzzyMatch,\n  findFuzzyMatches,\n  calculateSimilarity,\n  findBestMatch\n} from './utils/fuzzy-matcher.js'\nexport {\n  createDefaultConfig,\n  createStrictConfig,\n  createLenientConfig,\n  createFamilyFriendlyConfig\n} from './utils/config.js'\n\n// Quick-start functions\nexport { detect, filter, isClean, configure, reset } from './core/quick-start.js'\n\n// Performance monitoring and optimization\nexport interface PerformanceMonitor {\n  startTiming(operation: string): string\n  endTiming(timerId: string): number\n  getStats(): Record<string, { count: number; totalTime: number; avgTime: number }>\n  reset(): void\n}\n\nclass SimplePerformanceMonitor implements PerformanceMonitor {\n  private timers = new Map<string, number>()\n  private stats = new Map<string, { count: number; totalTime: number }>()\n\n  startTiming(operation: string): string {\n    const timerId = `${operation}_${Date.now()}_${Math.random()}`\n    this.timers.set(timerId, performance.now())\n    return timerId\n  }\n\n  endTiming(timerId: string): number {\n    const startTime = this.timers.get(timerId)\n    if (!startTime) return 0\n\n    const duration = performance.now() - startTime\n    this.timers.delete(timerId)\n\n    // Extract operation name from timer ID\n    const operation = timerId.split('_')[0] || 'unknown'\n    const existing = this.stats.get(operation) || { count: 0, totalTime: 0 }\n    this.stats.set(operation, {\n      count: existing.count + 1,\n      totalTime: existing.totalTime + duration\n    })\n\n    return duration\n  }\n\n  getStats(): Record<string, { count: number; totalTime: number; avgTime: number }> {\n    const result: Record<string, { count: number; totalTime: number; avgTime: number }> = {}\n\n    for (const [operation, stats] of this.stats) {\n      result[operation] = {\n        count: stats.count,\n        totalTime: stats.totalTime,\n        avgTime: stats.totalTime / stats.count\n      }\n    }\n\n    return result\n  }\n\n  reset(): void {\n    this.timers.clear()\n    this.stats.clear()\n  }\n}\n\nexport const performanceMonitor = new SimplePerformanceMonitor()\n\n// Enhanced convenience functions\nexport interface EnhancedOptions {\n  language?: LanguageCode | LanguageCode[]\n  performance?: boolean\n  caching?: boolean\n  fuzzyMatching?: boolean\n  customConfig?: Partial<DetectorConfig>\n}\n\n/**\n * Enhanced detect function with advanced options\n */\nexport async function detectEnhanced(\n  text: string,\n  options: EnhancedOptions = {}\n): Promise<DetectionResult> {\n  const {\n    language = 'auto',\n    performance = false,\n    caching = true,\n    customConfig = {}\n  } = options\n\n  const languages = Array.isArray(language) ? language : [language]\n\n  // Choose appropriate detector based on requirements\n  let detector: ContentShieldDetector\n\n  if (performance) {\n    detector = createPerformanceDetector(languages, customConfig)\n  } else {\n    detector = createComprehensiveDetector(languages, customConfig)\n  }\n\n  await detector.initialize()\n\n  // Use cached analysis if enabled\n  if (caching && typeof detector.analyzeCached === 'function') {\n    return await detector.analyzeCached(text)\n  }\n\n  return await detector.analyze(text)\n}\n\n/**\n * Enhanced filter function with advanced options\n */\nexport async function filterEnhanced(\n  text: string,\n  options: EnhancedOptions = {}\n): Promise<string> {\n  const result = await detectEnhanced(text, options)\n\n  if (result.matches && result.matches.length > 0) {\n    const filter = new ProfanityFilter()\n    const filterResult = filter.filter(text, result.matches)\n    return filterResult.filteredText\n  }\n\n  return text\n}\n\n/**\n * Batch processing function for multiple texts\n */\nexport async function batchDetect(\n  texts: string[],\n  options: EnhancedOptions = {}\n): Promise<DetectionResult[]> {\n  const detector = createPerformanceDetector(\n    options.language || 'auto',\n    options.customConfig\n  )\n\n  await detector.initialize()\n\n  if (typeof detector.batchAnalyze === 'function') {\n    return await detector.batchAnalyze(texts)\n  }\n\n  // Fallback to individual processing\n  const results = []\n  for (const text of texts) {\n    results.push(await detector.analyze(text))\n  }\n  return results\n}\n\n/**\n * Stream processing function for large datasets\n */\nexport async function* streamDetect(\n  texts: Iterable<string>,\n  options: EnhancedOptions = {}\n): AsyncGenerator<DetectionResult, void, unknown> {\n  const detector = createPerformanceDetector(\n    options.language || 'auto',\n    options.customConfig\n  )\n\n  await detector.initialize()\n\n  if (typeof detector.batchAnalyzeStream === 'function') {\n    yield* detector.batchAnalyzeStream(texts)\n  } else {\n    // Fallback to individual processing\n    for (const text of texts) {\n      yield await detector.analyze(text)\n    }\n  }\n}\n\n/**\n * Create a pre-configured detector instance\n */\nexport async function createConfiguredDetector(\n  preset: 'performance' | 'comprehensive' | 'strict' | 'lenient' = 'comprehensive',\n  languages: LanguageCode | LanguageCode[] = 'auto',\n  customConfig: Partial<DetectorConfig> = {}\n): Promise<ContentShieldDetector> {\n  let detector: ContentShieldDetector\n\n  switch (preset) {\n    case 'performance':\n      detector = createPerformanceDetector(languages, customConfig)\n      break\n    case 'strict':\n      detector = createDetector(languages, { ...getConfigPreset('strict'), ...customConfig })\n      break\n    case 'lenient':\n      detector = createDetector(languages, { ...getConfigPreset('lenient'), ...customConfig })\n      break\n    default:\n      detector = createComprehensiveDetector(\n        Array.isArray(languages) ? languages : [languages],\n        customConfig\n      )\n  }\n\n  await detector.initialize()\n  return detector\n}\n\n/**\n * Auto-configure detector based on sample text\n */\nexport async function createSmartDetector(\n  sampleTexts: string[],\n  customConfig: Partial<DetectorConfig> = {}\n): Promise<ContentShieldDetector> {\n  // Combine sample texts for analysis\n  const combinedText = sampleTexts.join(' ').slice(0, 1000) // Limit to 1000 chars\n\n  // Use auto-detector function\n  const detector = await createAutoDetector(combinedText, customConfig)\n  return detector\n}\n\n/**\n * Utility function to get library information\n */\nexport function getLibraryInfo(): {\n  version: string\n  supportedLanguages: LanguageCode[]\n  features: string[]\n} {\n  return {\n    version: VERSION,\n    supportedLanguages: ['en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'zh', 'ja', 'ko', 'ar', 'hi', 'nl', 'sv', 'pl', 'he', 'tr'],\n    features: [\n      'Multi-language detection',\n      'Performance optimization',\n      'Intelligent caching',\n      'Fuzzy matching',\n      'Real-time configuration',\n      'Worker thread support',\n      'Batch processing',\n      'Stream processing',\n      'Memory optimization',\n      'Cross-language matching',\n      'Language-specific optimization',\n      'Auto-language detection'\n    ]\n  }\n}\n\n/**\n * Health check function\n */\nexport async function healthCheck(): Promise<{\n  status: 'healthy' | 'warning' | 'error'\n  checks: Record<string, boolean>\n  details: Record<string, unknown>\n}> {\n  const checks = {\n    coreInit: false,\n    languageLoader: false,\n    configSystem: false,\n    performance: false\n  }\n\n  const details: Record<string, unknown> = {}\n\n  try {\n    // Test core initialization\n    const detector = new ContentShieldDetector()\n    await detector.initialize()\n    checks.coreInit = true\n\n    // Test performance features\n    const perfStats = detector.getPerformanceStats?.()\n    checks.performance = perfStats !== undefined\n    details.performanceFeatures = perfStats !== undefined\n\n    // Test language loader\n    const loader = getGlobalLanguageLoader()\n    const availableLanguages = await loader.getAvailableLanguages()\n    checks.languageLoader = availableLanguages.length > 0\n    details.availableLanguages = availableLanguages.length\n\n    // Test config system\n    const configManager = getGlobalConfigManager()\n    const validation = configManager.validateCurrentConfig()\n    checks.configSystem = validation.isValid\n    details.configValid = validation.isValid\n\n    // Cleanup\n    detector.optimizeMemory?.()\n  } catch (error) {\n    details.error = error instanceof Error ? error.message : String(error)\n  }\n\n  const passedChecks = Object.values(checks).filter(Boolean).length\n  const totalChecks = Object.keys(checks).length\n\n  let status: 'healthy' | 'warning' | 'error' = 'healthy'\n  if (passedChecks === 0) {\n    status = 'error'\n  } else if (passedChecks < totalChecks) {\n    status = 'warning'\n  }\n\n  return { status, checks, details }\n}\n\n// Version info\nexport const VERSION = '0.1.0'\n\n// Re-export key types for convenience\nexport type {\n  DetectorConfig,\n  LanguageCode,\n  DetectionResult,\n  AnalysisOptions,\n  CustomWord,\n  SeverityLevel,\n  ProfanityCategory,\n  FilterMode\n} from './types/index.js'\n\n// Re-export filter types\nexport type {\n  FilterConfig,\n  FilterResult,\n  FilterDetail\n} from './core/filter.js'\n"]}