{"version":3,"file":"config.cjs","sources":["../../../src/core/config.ts"],"sourcesContent":["import type {\n  //\n  FuzzyConfig,\n  FuzzyFeature,\n  MatchTypeScores,\n  ScoringModifiers,\n} from \"./types.js\";\n\n/**\n * Default match type scores\n * These values determine the base score for each match type\n * Updated to provide more granular scoring with better differentiation\n */\nexport const DEFAULT_MATCH_TYPE_SCORES: MatchTypeScores = {\n  exact: 1.0, // Perfect matches get full score\n  prefix: 0.97, // High base for prefixes (will be scaled by length ratio)\n  substring: 0.87, // Good base for substrings (will be adjusted by position/coverage)\n  phonetic: 0.4, // Moderate - phonetic is a weaker signal\n  fuzzy: 0.7, // Good base for fuzzy matches (will be scaled by edit distance)\n  fuzzyMin: 0.3, // Lower minimum to allow more fuzzy matches through\n  synonym: 0.45, // Moderate for synonyms (will be scaled by length)\n  compound: 0.82, // Strong for compound matches (will be scaled by length)\n  ngram: 0.28, // Very low - n-grams are weakest signal, avoid gibberish\n};\n\n/**\n * Default scoring modifiers\n * These values control additional scoring behavior\n */\nexport const DEFAULT_SCORING_MODIFIERS: ScoringModifiers = {\n  baseScore: 0.0, // Don't add base score - let match types determine score\n  shortWordBoost: 0.0, // Disable boost - was inflating weak matches\n  shortWordMaxDiff: 3,\n  prefixLengthPenalty: false,\n};\n\n/**\n * Default configuration for FuzzyFindJS\n * Provides sensible defaults that work out of the box\n */\nexport const DEFAULT_CONFIG: FuzzyConfig = {\n  languages: [\"english\"],\n  features: [\"phonetic\", \"compound\", \"synonyms\", \"keyboard-neighbors\", \"partial-words\", \"missing-letters\", \"extra-letters\", \"transpositions\"],\n  performance: \"balanced\",\n  maxResults: 10,\n  minQueryLength: 1,        // Allow short words (1-2 chars) for better fuzzy matching\n  fuzzyThreshold: 0.33,     // Balanced threshold - filters gibberish while keeping good matches\n  maxEditDistance: 2,\n  ngramSize: 3,\n  enableAlphanumericSegmentation: true, // Enabled by default - opt-out for performance if needed\n  alphanumericAlphaWeight: 0.7,\n  alphanumericNumericWeight: 0.3,\n  alphanumericNumericEditDistanceMultiplier: 1.5,\n  matchTypeScores: DEFAULT_MATCH_TYPE_SCORES,\n  scoringModifiers: DEFAULT_SCORING_MODIFIERS,\n};\n\n/**\n * Performance-optimized configurations\n */\nexport const PERFORMANCE_CONFIGS: Record<string, Partial<FuzzyConfig>> = {\n  fast: {\n    performance: \"fast\",\n    features: [\"partial-words\", \"compound\", \"missing-letters\", \"extra-letters\", \"transpositions\"],\n    maxEditDistance: 3,\n    fuzzyThreshold: 0.33, // Lower threshold for better recall\n    maxResults: 3,\n    enableAlphanumericSegmentation: true,\n    matchTypeScores: {\n      exact: 1.0,\n      prefix: 0.93, // High base, will be scaled by length\n      substring: 0.77, // Moderate base, will be scaled by position/coverage\n      fuzzy: 0.65,\n      ngram: 0.29,\n      fuzzyMin: 0.25, // Lower minimum for better recall\n    },\n  },\n  balanced: {\n    performance: \"balanced\",\n    features: [\"phonetic\", \"compound\", \"keyboard-neighbors\", \"partial-words\", \"missing-letters\", \"extra-letters\", \"transpositions\"],\n    maxEditDistance: 3,\n    fuzzyThreshold: 0.33, // Slightly higher to filter gibberish n-gram matches\n    maxResults: 10,\n    enableAlphanumericSegmentation: true,\n    matchTypeScores: {\n      ngram: 0.27, // Even lower for balanced mode to avoid gibberish\n    },\n  },\n  comprehensive: {\n    performance: \"comprehensive\",\n    features: [\"phonetic\", \"compound\", \"synonyms\", \"keyboard-neighbors\", \"partial-words\", \"missing-letters\", \"extra-letters\", \"transpositions\"],\n    maxEditDistance: 3,\n    fuzzyThreshold: 0.27, // Very low threshold for maximum recall\n    maxResults: 20,\n    enableAlphanumericSegmentation: true,\n    matchTypeScores: {\n      exact: 1.0,\n      prefix: 0.93, // High base (will be scaled down by length ratio)\n      substring: 0.8, // Good base (will be adjusted by position/coverage)\n      fuzzy: 0.65,\n      fuzzyMin: 0.15, // Very low for maximum recall\n      phonetic: 0.45, // Moderate for comprehensive matching\n      synonym: 0.5,\n      compound: 0.75,\n      ngram: 0.35,\n    },\n  },\n};\n\n/**\n * Language-specific feature recommendations\n */\nexport const LANGUAGE_FEATURES: Record<string, FuzzyFeature[]> = {\n  german: [\n    //\n    \"phonetic\",\n    \"compound\",\n    \"synonyms\",\n    \"keyboard-neighbors\",\n    \"partial-words\",\n    \"missing-letters\",\n    \"extra-letters\",\n  ],\n  english: [\n    //\n    \"phonetic\",\n    \"synonyms\",\n    \"keyboard-neighbors\",\n    \"partial-words\",\n    \"missing-letters\",\n    \"transpositions\",\n  ],\n  spanish: [\n    //\n    \"phonetic\",\n    \"synonyms\",\n    \"keyboard-neighbors\",\n    \"partial-words\",\n    \"missing-letters\",\n  ],\n  french: [\n    //\n    \"phonetic\",\n    \"synonyms\",\n    \"keyboard-neighbors\",\n    \"partial-words\",\n    \"missing-letters\",\n  ],\n};\n\n/**\n * Merge user configuration with defaults\n */\nexport function mergeConfig(userConfig: Partial<FuzzyConfig> = {}): FuzzyConfig {\n  const baseConfig = { ...DEFAULT_CONFIG };\n\n  // Apply performance preset if specified\n  if (userConfig.performance && userConfig.performance !== \"balanced\") {\n    const performanceConfig = PERFORMANCE_CONFIGS[userConfig.performance];\n    Object.assign(baseConfig, performanceConfig);\n\n    // Deep merge scoring configs from performance preset\n    if (performanceConfig.matchTypeScores) {\n      baseConfig.matchTypeScores = {\n        ...DEFAULT_MATCH_TYPE_SCORES,\n        ...performanceConfig.matchTypeScores,\n      };\n    }\n    if (performanceConfig.scoringModifiers) {\n      baseConfig.scoringModifiers = {\n        ...DEFAULT_SCORING_MODIFIERS,\n        ...performanceConfig.scoringModifiers,\n      };\n    }\n  }\n\n  // Apply user overrides\n  const mergedConfig = { ...baseConfig, ...userConfig };\n\n  // Deep merge user scoring configs\n  if (userConfig.matchTypeScores) {\n    mergedConfig.matchTypeScores = {\n      ...baseConfig.matchTypeScores,\n      ...userConfig.matchTypeScores,\n    };\n  }\n  if (userConfig.scoringModifiers) {\n    mergedConfig.scoringModifiers = {\n      ...baseConfig.scoringModifiers,\n      ...userConfig.scoringModifiers,\n    };\n  }\n\n  // Auto-adjust features based on languages if not explicitly set\n  if (!userConfig.features && userConfig.languages) {\n    const recommendedFeatures = new Set<FuzzyFeature>();\n\n    for (const lang of userConfig.languages) {\n      const langFeatures = LANGUAGE_FEATURES[lang] || LANGUAGE_FEATURES.english;\n      langFeatures.forEach((feature) => recommendedFeatures.add(feature));\n    }\n\n    mergedConfig.features = Array.from(recommendedFeatures);\n  }\n\n  return mergedConfig;\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(config: FuzzyConfig): void {\n  if (config.maxResults < 1) {\n    throw new Error(\"maxResults must be at least 1\");\n  }\n\n  if (config.minQueryLength < 1) {\n    throw new Error(\"minQueryLength must be at least 1\");\n  }\n\n  if (config.fuzzyThreshold < 0 || config.fuzzyThreshold > 1) {\n    throw new Error(\"fuzzyThreshold must be between 0 and 1\");\n  }\n\n  if (config.maxEditDistance < 0) {\n    throw new Error(\"maxEditDistance must be non-negative\");\n  }\n\n  if (config.ngramSize < 2) {\n    throw new Error(\"ngramSize must be at least 2\");\n  }\n\n  if (config.languages.length === 0) {\n    throw new Error(\"At least one language must be specified\");\n  }\n}\n"],"names":[],"mappings":"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"}