{"version":3,"file":"matching.mjs","names":[],"sources":["../../src/preset/matching.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport { CURRENT_PRESET_SENTINEL, type LiveCompactionConfig } from '@live-compaction/config';\nimport type { ParsedCompactInstructions, PresetMatchResult } from '@live-compaction/types';\n\nexport function sha256(text: string): string {\n\treturn createHash('sha256').update(text).digest('hex');\n}\n\nexport function parseCompactInstructions(text?: string): ParsedCompactInstructions {\n\tconst trimmed = text?.trim() ?? '';\n\tif (!trimmed) {\n\t\treturn { usesPresetDirective: false };\n\t}\n\n\tif (!trimmed.startsWith('--preset') && !trimmed.startsWith('-p')) {\n\t\treturn {\n\t\t\tusesPresetDirective: false,\n\t\t\tfocusText: trimmed,\n\t\t};\n\t}\n\n\tconst presetPrefixPattern = /^(?:--preset\\s+|-p\\s+)(\\S+)\\s*([\\s\\S]*)$/;\n\tconst match = presetPrefixPattern.exec(trimmed);\n\n\tif (!match) {\n\t\treturn { usesPresetDirective: true };\n\t}\n\n\tconst presetQuery = match[1];\n\tconst focusText = match[2]?.trim() || undefined;\n\treturn { usesPresetDirective: true, presetQuery, focusText };\n}\n\nfunction normalizePresetKey(value: string): string {\n\treturn value.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nexport function resolvePresetMatch(config: LiveCompactionConfig, query: string): PresetMatchResult {\n\tconst normalizedQuery = normalizePresetKey(query);\n\tif (!normalizedQuery) {\n\t\treturn { kind: 'unmatched' };\n\t}\n\n\tif (normalizedQuery === 'current' || normalizedQuery === CURRENT_PRESET_SENTINEL) {\n\t\treturn { kind: 'matched', name: CURRENT_PRESET_SENTINEL };\n\t}\n\n\tconst exactKey = Object.keys(config.presets).find(\n\t\t(name) => normalizePresetKey(name) === normalizedQuery,\n\t);\n\tif (exactKey) {\n\t\treturn {\n\t\t\tkind: 'matched',\n\t\t\tname: exactKey,\n\t\t\tpreset: config.presets[exactKey],\n\t\t};\n\t}\n\n\tconst prefixMatches = Object.keys(config.presets).filter((name) =>\n\t\tnormalizePresetKey(name).startsWith(normalizedQuery),\n\t);\n\tif (prefixMatches.length === 1) {\n\t\treturn {\n\t\t\tkind: 'matched',\n\t\t\tname: prefixMatches[0],\n\t\t\tpreset: config.presets[prefixMatches[0]],\n\t\t};\n\t}\n\tif (prefixMatches.length > 1) {\n\t\treturn { kind: 'ambiguous' };\n\t}\n\n\treturn { kind: 'unmatched' };\n}\n"],"mappings":";;;;AAKA,SAAgB,OAAO,MAAsB;CAC5C,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK;AACtD;AAEA,SAAgB,yBAAyB,MAA0C;CAClF,MAAM,UAAU,MAAM,KAAK,KAAK;CAChC,IAAI,CAAC,SACJ,OAAO,EAAE,qBAAqB,MAAM;CAGrC,IAAI,CAAC,QAAQ,WAAW,UAAU,KAAK,CAAC,QAAQ,WAAW,IAAI,GAC9D,OAAO;EACN,qBAAqB;EACrB,WAAW;CACZ;CAID,MAAM,QAAQ,2CAAoB,KAAK,OAAO;CAE9C,IAAI,CAAC,OACJ,OAAO,EAAE,qBAAqB,KAAK;CAKpC,OAAO;EAAE,qBAAqB;EAAM,aAFhB,MAAM;EAEuB,WAD/B,MAAM,EAAE,EAAE,KAAK,KAAK,KAAA;CACqB;AAC5D;AAEA,SAAS,mBAAmB,OAAuB;CAClD,OAAO,MAAM,YAAY,CAAC,CAAC,QAAQ,cAAc,EAAE;AACpD;AAEA,SAAgB,mBAAmB,QAA8B,OAAkC;CAClG,MAAM,kBAAkB,mBAAmB,KAAK;CAChD,IAAI,CAAC,iBACJ,OAAO,EAAE,MAAM,YAAY;CAG5B,IAAI,oBAAoB,aAAa,oBAAA,WACpC,OAAO;EAAE,MAAM;EAAW,MAAM;CAAwB;CAGzD,MAAM,WAAW,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,MAC3C,SAAS,mBAAmB,IAAI,MAAM,eACxC;CACA,IAAI,UACH,OAAO;EACN,MAAM;EACN,MAAM;EACN,QAAQ,OAAO,QAAQ;CACxB;CAGD,MAAM,gBAAgB,OAAO,KAAK,OAAO,OAAO,CAAC,CAAC,QAAQ,SACzD,mBAAmB,IAAI,CAAC,CAAC,WAAW,eAAe,CACpD;CACA,IAAI,cAAc,WAAW,GAC5B,OAAO;EACN,MAAM;EACN,MAAM,cAAc;EACpB,QAAQ,OAAO,QAAQ,cAAc;CACtC;CAED,IAAI,cAAc,SAAS,GAC1B,OAAO,EAAE,MAAM,YAAY;CAG5B,OAAO,EAAE,MAAM,YAAY;AAC5B"}