{
  "version": 3,
  "sources": ["/cdn/shop/t/24/assets/wmn-search-fuzzy.js"],
  "sourcesContent": ["/**\n * WMN multi-signal fuzzy search scorer (dependency-free).\n * Normalize \u2192 field weights \u2192 exact/prefix/substring/Levenshtein/Dice \u2192 sort.\n */\n(function (window) {\n  'use strict';\n\n  var FIELD_WEIGHTS = {\n    title: 1,\n    artist: 0.85,\n    handle: 0.7,\n    tags: 0.45\n  };\n\n  var EXACT_TOKEN = 120;\n  var PREFIX_TOKEN = 90;\n  var SUBSTRING = 55;\n  var LEV_BASE = 70;\n  var DICE_WEIGHT = 40;\n  var COVERAGE_BONUS = 80;\n  var AFFINITY_SCALE = 0.08;\n  var ORDER_PRIOR = 0.02;\n\n  function normalize(str) {\n    var s = String(str || '').toLowerCase();\n    try {\n      s = s.normalize('NFKD').replace(/[\\u0300-\\u036f]/g, '');\n    } catch (e) {\n      /* older browsers */\n    }\n    return s\n      .replace(/['']/g, '')\n      .replace(/[^a-z0-9]+/g, ' ')\n      .replace(/^\\s+|\\s+$/g, '')\n      .replace(/\\s+/g, ' ');\n  }\n\n  function tokens(str) {\n    var n = normalize(str);\n    if (!n) return [];\n    return n.split(' ');\n  }\n\n  function levenshtein(a, b) {\n    a = String(a || '');\n    b = String(b || '');\n    if (a === b) return 0;\n    if (!a.length) return b.length;\n    if (!b.length) return a.length;\n    if (a.length > b.length) {\n      var tmp = a;\n      a = b;\n      b = tmp;\n    }\n    var prev = new Array(a.length + 1);\n    var i;\n    var j;\n    for (i = 0; i <= a.length; i++) prev[i] = i;\n    for (j = 1; j <= b.length; j++) {\n      var cur = [j];\n      for (i = 1; i <= a.length; i++) {\n        var cost = a.charAt(i - 1) === b.charAt(j - 1) ? 0 : 1;\n        cur[i] = Math.min(prev[i] + 1, cur[i - 1] + 1, prev[i - 1] + cost);\n      }\n      prev = cur;\n    }\n    return prev[a.length];\n  }\n\n  function maxLevAllowed(len) {\n    if (len <= 3) return 0;\n    if (len <= 5) return 1;\n    return 2;\n  }\n\n  function levOk(dist, aLen, bLen) {\n    var m = Math.max(aLen, bLen);\n    if (!m) return false;\n    if (dist / m > 0.34) return false;\n    return dist <= maxLevAllowed(Math.min(aLen, bLen));\n  }\n\n  function bigrams(str) {\n    var s = normalize(str).replace(/\\s+/g, '');\n    var out = [];\n    if (s.length < 2) return out;\n    for (var i = 0; i < s.length - 1; i++) {\n      out.push(s.charAt(i) + s.charAt(i + 1));\n    }\n    return out;\n  }\n\n  function diceCoefficient(a, b) {\n    var ba = bigrams(a);\n    var bb = bigrams(b);\n    if (!ba.length || !bb.length) return 0;\n    var counts = {};\n    var i;\n    for (i = 0; i < ba.length; i++) {\n      counts[ba[i]] = (counts[ba[i]] || 0) + 1;\n    }\n    var intersect = 0;\n    for (i = 0; i < bb.length; i++) {\n      var g = bb[i];\n      if (counts[g]) {\n        intersect++;\n        counts[g]--;\n      }\n    }\n    return (2 * intersect) / (ba.length + bb.length);\n  }\n\n  function bestTokenScore(qToken, fieldTokens, fieldNorm) {\n    var best = 0;\n    var qi;\n    if (!qToken) return 0;\n    if (fieldNorm === qToken) best = Math.max(best, EXACT_TOKEN * 1.2);\n    if (fieldNorm.indexOf(qToken) !== -1) {\n      best = Math.max(best, SUBSTRING);\n    }\n    for (qi = 0; qi < fieldTokens.length; qi++) {\n      var ft = fieldTokens[qi];\n      if (!ft) continue;\n      if (ft === qToken) {\n        best = Math.max(best, EXACT_TOKEN);\n        continue;\n      }\n      // Prefix: \"john\" must not match \"johnson\" / \"johnny\" / \"johnnie\".\n      if (ft.indexOf(qToken) === 0) {\n        var extra = ft.length - qToken.length;\n        if (qToken.length <= 4 && extra > 1) {\n          /* weak short prefix \u2014 ignore */\n        } else {\n          best = Math.max(best, PREFIX_TOKEN);\n        }\n        continue;\n      }\n      if (qToken.indexOf(ft) === 0 && ft.length >= 3) {\n        var qExtra = qToken.length - ft.length;\n        if (ft.length <= 4 && qExtra > 1) {\n          /* ignore */\n        } else {\n          best = Math.max(best, PREFIX_TOKEN * 0.75);\n        }\n      }\n      // Field token is a substring of the query (\"in\" inside \"tinariwen\") \u2014\n      // only allow for substantial tokens or we false-positive half the catalog.\n      if (ft.indexOf(qToken) !== -1) {\n        best = Math.max(best, SUBSTRING * 0.85);\n      } else if (ft.length >= 4 && qToken.indexOf(ft) !== -1) {\n        best = Math.max(best, SUBSTRING * 0.85);\n      }\n      var dist = levenshtein(qToken, ft);\n      if (levOk(dist, qToken.length, ft.length)) {\n        var levScore =\n          LEV_BASE * (1 - dist / Math.max(qToken.length, ft.length, 1));\n        best = Math.max(best, levScore);\n      }\n    }\n    return best;\n  }\n\n  function fieldBundle(item) {\n    var title = item.title || '';\n    var artist = item.artist || item.type || '';\n    var handle = String(item.handle || '')\n      .replace(/-/g, ' ');\n    var tags = '';\n    if (Array.isArray(item.genres) && item.genres.length) {\n      // Mirror genre hard-filter (fy-focus-hard-v7): sole genre tag OR\n      // title/handle word-bound evidence. Drops Highlife (jazz+highlife)\n      // and Music of Africa (blues+jazz+folk) from contributing \"jazz\".\n      var genres = item.genres;\n      var titleLow = String(title).toLowerCase();\n      var handleLow = String(item.handle || '').toLowerCase();\n      var kept = [];\n      var gi;\n      for (gi = 0; gi < genres.length; gi++) {\n        var gSlug = String(genres[gi] || '');\n        if (!gSlug) continue;\n        var gWords = gSlug.replace(/-/g, ' ').trim();\n        if (!gWords) continue;\n        if (genres.length === 1) {\n          kept.push(gWords);\n          continue;\n        }\n        if (handleLow.indexOf(gSlug) !== -1) {\n          kept.push(gWords);\n          continue;\n        }\n        var gRe = new RegExp(\n          '\\\\b' + gWords.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b',\n          'i'\n        );\n        if (gRe.test(titleLow) || gRe.test(handleLow.replace(/-/g, ' '))) {\n          kept.push(gWords);\n        }\n      }\n      tags = kept.join(' ');\n    } else if (Array.isArray(item.tags)) tags = item.tags.join(' ');\n    else if (typeof item.tags === 'string') tags = item.tags;\n    return {\n      title: title,\n      artist: artist,\n      handle: handle,\n      tags: tags\n    };\n  }\n\n  function scoreItem(query, item, opts) {\n    opts = opts || {};\n    var qTokens = tokens(query);\n    if (!qTokens.length) return 0;\n\n    var fields = fieldBundle(item);\n    var matchedTokens = 0;\n    var fuzzy = 0;\n    var f;\n    var t;\n\n    for (t = 0; t < qTokens.length; t++) {\n      var qt = qTokens[t];\n      var tokenBest = 0;\n      for (f in FIELD_WEIGHTS) {\n        if (!Object.prototype.hasOwnProperty.call(FIELD_WEIGHTS, f)) continue;\n        var raw = fields[f] || '';\n        var fn = normalize(raw);\n        var ftoks = tokens(raw);\n        var s = bestTokenScore(qt, ftoks, fn) * FIELD_WEIGHTS[f];\n        if (s > tokenBest) tokenBest = s;\n      }\n      // Distinctive tokens (coltrane, tinariwen) must hit \u2014 short ones\n      // alone (\"john\") created Johnson / Johnny Cash false positives.\n      if (qt.length >= 5 && tokenBest <= 0) {\n        return 0;\n      }\n      if (tokenBest > 0) matchedTokens++;\n      fuzzy += tokenBest;\n    }\n\n    var coverage = matchedTokens / qTokens.length;\n    fuzzy += coverage * COVERAGE_BONUS;\n\n    var titleDice = diceCoefficient(query, fields.title);\n    if (titleDice >= 0.35) {\n      fuzzy += titleDice * DICE_WEIGHT;\n    }\n\n    var affinityBoost = 0;\n    if (\n      opts.affinity &&\n      item.handle &&\n      opts.affinity.handles &&\n      opts.affinity.handles[item.handle]\n    ) {\n      affinityBoost = opts.affinity.handles[item.handle] * AFFINITY_SCALE;\n    }\n\n    var base = fuzzy + affinityBoost;\n    // Order prior only breaks ties among real matches \u2014 never creates a match.\n    if (base <= 0) return 0;\n\n    var orderPrior = 0;\n    if (typeof opts.index === 'number') {\n      orderPrior = Math.max(0, 50 - opts.index) * ORDER_PRIOR;\n    }\n\n    return base + orderPrior;\n  }\n\n  /**\n   * Rank candidates by fuzzy score. Returns a new array (top `limit`).\n   * Items with score <= 0 are dropped when `requireMatch` is true (default for non-empty query).\n   */\n  function rank(query, items, options) {\n    options = options || {};\n    var limit = options.limit || 32;\n    var requireMatch = options.requireMatch !== false;\n    var affinity = options.affinity || null;\n    var list = Array.isArray(items) ? items : [];\n    var q = normalize(query);\n    if (!q) {\n      return list.slice(0, limit);\n    }\n\n    var scored = [];\n    for (var i = 0; i < list.length; i++) {\n      var item = list[i];\n      if (!item) continue;\n      var s = scoreItem(query, item, { affinity: affinity, index: i });\n      // Require a real lexical hit \u2014 ignore near-zero noise from order prior.\n      if (requireMatch && s < 40) continue;\n      scored.push({ item: item, score: s });\n    }\n    scored.sort(function (a, b) {\n      return b.score - a.score;\n    });\n    var out = [];\n    for (var j = 0; j < scored.length && out.length < limit; j++) {\n      out.push(scored[j].item);\n    }\n    return out;\n  }\n\n  window.wmnSearchFuzzy = {\n    normalize: normalize,\n    tokens: tokens,\n    levenshtein: levenshtein,\n    scoreItem: scoreItem,\n    rank: rank\n  };\n})(window);\n"],
  "mappings": "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",
  "names": ["window"]
}
