diff --git a/src/errors/error-handler.ts b/src/errors/error-handler.ts index 90f22f8..efb24f6 100644 --- a/src/errors/error-handler.ts +++ b/src/errors/error-handler.ts @@ -1,4 +1,5 @@ import { withTimeout as withTimeoutRace } from '../performance/timeout-wrapper.js'; + import { TextProcessingError } from './text-error.js'; export interface ErrorHandlerOptions { diff --git a/src/patterns/pattern-compiler.ts b/src/patterns/pattern-compiler.ts index 25a8467..fb63b8e 100644 --- a/src/patterns/pattern-compiler.ts +++ b/src/patterns/pattern-compiler.ts @@ -1,5 +1,5 @@ -import { escapeRegex } from '../security/escape-regex.js'; import { RegexCache } from '../cache/regex-cache.js'; +import { escapeRegex } from '../security/escape-regex.js'; export class PatternCompiler { private readonly cache = RegexCache.getInstance(); diff --git a/src/spellcheck/confidence/confidence-scorer.ts b/src/spellcheck/confidence/confidence-scorer.ts index 4d56efb..c472680 100644 --- a/src/spellcheck/confidence/confidence-scorer.ts +++ b/src/spellcheck/confidence/confidence-scorer.ts @@ -253,12 +253,12 @@ export class ConfidenceScorer { * (e.g., "the" = 23 billion). We map to the same tiered scale as getWordFrequency. */ private normalizeEngineFrequency(count: number): number { - if (count >= 1_000_000_000) return 1000; // Top-tier (the, of, and...) - if (count >= 100_000_000) return 800; - if (count >= 10_000_000) return 600; - if (count >= 1_000_000) return 400; - if (count >= 100_000) return 250; - if (count >= 10_000) return 150; + if (count >= 1_000_000_000) {return 1000;} // Top-tier (the, of, and...) + if (count >= 100_000_000) {return 800;} + if (count >= 10_000_000) {return 600;} + if (count >= 1_000_000) {return 400;} + if (count >= 100_000) {return 250;} + if (count >= 10_000) {return 150;} return 100; } @@ -269,13 +269,13 @@ export class ConfidenceScorer { private getWordFrequency(word: string): number { const rank = ConfidenceScorer.getFrequencyMap().get(word.toLowerCase()); - if (!rank) return 50; // Unknown words get a low default - if (rank <= 100) return 1000; - if (rank <= 500) return 800; - if (rank <= 1000) return 600; - if (rank <= 2000) return 400; - if (rank <= 3000) return 250; - if (rank <= 5000) return 150; + if (!rank) {return 50;} // Unknown words get a low default + if (rank <= 100) {return 1000;} + if (rank <= 500) {return 800;} + if (rank <= 1000) {return 600;} + if (rank <= 2000) {return 400;} + if (rank <= 3000) {return 250;} + if (rank <= 5000) {return 150;} return 100; } diff --git a/src/spellcheck/dictionaries/implementations/english-dictionary.ts b/src/spellcheck/dictionaries/implementations/english-dictionary.ts index a736e56..6613489 100644 --- a/src/spellcheck/dictionaries/implementations/english-dictionary.ts +++ b/src/spellcheck/dictionaries/implementations/english-dictionary.ts @@ -1,6 +1,7 @@ -import type { DictionaryDataLoader } from '../core/dictionary-loader.js'; import { DictionaryBase } from '../core/dictionary-base.js'; +import type { DictionaryDataLoader } from '../core/dictionary-loader.js'; + export class EnglishDictionary extends DictionaryBase { private readonly loader: DictionaryDataLoader; diff --git a/src/spellcheck/dictionaries/implementations/technical-dictionary.ts b/src/spellcheck/dictionaries/implementations/technical-dictionary.ts index e3e79d7..9fc9470 100644 --- a/src/spellcheck/dictionaries/implementations/technical-dictionary.ts +++ b/src/spellcheck/dictionaries/implementations/technical-dictionary.ts @@ -1,6 +1,7 @@ -import type { DictionaryDataLoader } from '../core/dictionary-loader.js'; import { DictionaryBase } from '../core/dictionary-base.js'; +import type { DictionaryDataLoader } from '../core/dictionary-loader.js'; + export class TechnicalDictionary extends DictionaryBase { private readonly loader: DictionaryDataLoader; diff --git a/src/spellcheck/dictionaries/loaders/fetch-loader.ts b/src/spellcheck/dictionaries/loaders/fetch-loader.ts index a7eadec..d611ee3 100644 --- a/src/spellcheck/dictionaries/loaders/fetch-loader.ts +++ b/src/spellcheck/dictionaries/loaders/fetch-loader.ts @@ -1,11 +1,11 @@ -import type { DictionaryDataLoader } from '../core/dictionary-loader'; +import type { DictionaryDataLoader } from '../core/dictionary-loader.js'; export class FetchDictionaryLoader implements DictionaryDataLoader { private readonly baseUrl: URL; constructor(baseUrl: string) { // Ensure trailing slash for correct URL resolution - const normalized = baseUrl.endsWith('/') ? baseUrl : baseUrl + '/'; + const normalized = baseUrl.endsWith('/') ? baseUrl : `${baseUrl }/`; this.baseUrl = new URL(normalized); } diff --git a/src/spellcheck/dictionaries/loaders/node-loader.ts b/src/spellcheck/dictionaries/loaders/node-loader.ts index c269e2f..4b6de50 100644 --- a/src/spellcheck/dictionaries/loaders/node-loader.ts +++ b/src/spellcheck/dictionaries/loaders/node-loader.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import type { DictionaryDataLoader } from '../core/dictionary-loader'; +import type { DictionaryDataLoader } from '../core/dictionary-loader.js'; export class NodeDictionaryLoader implements DictionaryDataLoader { private readonly rootPath: string; diff --git a/src/spellcheck/engines/symspell-engine.ts b/src/spellcheck/engines/symspell-engine.ts index 24a0db4..68890c0 100644 --- a/src/spellcheck/engines/symspell-engine.ts +++ b/src/spellcheck/engines/symspell-engine.ts @@ -39,12 +39,12 @@ export class SymSpellEngine implements SpellEngine { } contains(word: string): boolean { - if (!this.checker) return false; + if (!this.checker) {return false;} return this.checker.wordExists(word.toLowerCase()); } suggest(word: string, maxSuggestions = 5): SpellSuggestion[] { - if (!this.checker) return []; + if (!this.checker) {return [];} const results = this.checker.lookup( word.toLowerCase(), @@ -60,12 +60,12 @@ export class SymSpellEngine implements SpellEngine { } addWord(word: string, frequency = 1): void { - if (!this.checker) return; + if (!this.checker) {return;} this.checker.addWord(word.toLowerCase(), frequency); } bigramFrequency(word1: string, word2: string): number { - if (!this.checker) return 0; + if (!this.checker) {return 0;} return this.checker.bigramFrequency(word1.toLowerCase(), word2.toLowerCase()); } } diff --git a/src/spellcheck/spell-checker.ts b/src/spellcheck/spell-checker.ts index dfbcd3a..685b41b 100644 --- a/src/spellcheck/spell-checker.ts +++ b/src/spellcheck/spell-checker.ts @@ -1,3 +1,6 @@ +import { escapeRegex } from '../security/escape-regex.js'; +import { assertInputLength } from '../security/input-length-guard.js'; + import { ConfidenceScorer, CorrectionConfidence, @@ -6,10 +9,9 @@ import { import { CustomDictionary, DictionaryManager } from './dictionaries/core/dictionary-manager.js'; import { TypoManager } from './typos/index.js'; -import { escapeRegex } from '../security/escape-regex.js'; -import { assertInputLength } from '../security/input-length-guard.js'; -import type { SpellEngine } from './engines/types.js'; + import type { ConfidenceScorerOptions } from './confidence/confidence-scorer.js'; +import type { SpellEngine } from './engines/types.js'; import type { SpellCheckOptions, SpellCheckResult, @@ -149,7 +151,7 @@ export class SpellChecker { // (correct words map to themselves) const bestWords: string[] = words.map((w) => { const lower = w.word.toLowerCase(); - if (this.containsWord(lower)) return lower; + if (this.containsWord(lower)) {return lower;} const suggestions = this.getSuggestions(lower, 5); return suggestions.length > 0 ? suggestions[0] : lower; }); @@ -158,10 +160,10 @@ export class SpellChecker { // rescore using bigram context with neighbors for (let i = 0; i < words.length; i++) { const original = words[i].word.toLowerCase(); - if (this.containsWord(original)) continue; + if (this.containsWord(original)) {continue;} const candidates = this.engine.suggest(original, 10); - if (candidates.length < 2) continue; + if (candidates.length < 2) {continue;} // Get context words (use best guesses for neighbors) const prevWord = i > 0 ? bestWords[i - 1] : null; @@ -680,16 +682,16 @@ export class SpellChecker { // Transform 1a: Collapse runs of 3+ identical chars → 1 const collapsed = lower.replace(/(.)\1{2,}/g, '$1'); - if (collapsed !== lower) candidates.add(collapsed); + if (collapsed !== lower) {candidates.add(collapsed);} // Transform 1b: More aggressive collapse — runs of 2+ identical chars → 1 // Handles cases like "tt" in "mmmporttant" → "mportant" const collapsedAll = lower.replace(/(.)\1+/g, '$1'); - if (collapsedAll !== lower && collapsedAll !== collapsed) candidates.add(collapsedAll); + if (collapsedAll !== lower && collapsedAll !== collapsed) {candidates.add(collapsedAll);} // Transform 2: Strip embedded digits const stripped = lower.replace(/[0-9]/g, ''); - if (stripped !== lower && stripped.length >= 2) candidates.add(stripped); + if (stripped !== lower && stripped.length >= 2) {candidates.add(stripped);} // Transform 3a: 3+ collapse + strip digits const both3 = collapsed.replace(/[0-9]/g, ''); @@ -706,15 +708,15 @@ export class SpellChecker { // Transform 4: Double-letter restoration on collapsed forms. // After collapsing "eee" → "e", try restoring common doubles like "ee", "ll", etc. const baseForms = new Set([collapsed, collapsedAll]); - if (both3.length >= 2) baseForms.add(both3); - if (both2.length >= 2) baseForms.add(both2); + if (both3.length >= 2) {baseForms.add(both3);} + if (both2.length >= 2) {baseForms.add(both2);} for (const base of baseForms) { for (let i = 0; i < base.length; i++) { const char = base[i]; if (SpellChecker.COMMON_DOUBLE_LETTERS.includes(char)) { const restored = base.slice(0, i) + char + base.slice(i); - if (restored !== lower) candidates.add(restored); + if (restored !== lower) {candidates.add(restored);} } } }