{"version":3,"file":"autocomplete.bundle.mjs","sources":["../../node_modules/mustache/mustache.mjs","../../src/mustache/fromMustacheTemplate.ts","../../node_modules/@nosto/nosto-js/dist/settings-DN0V2st5.js","../../node_modules/@nosto/nosto-js/dist/index.es.js","../../src/lib/client.ts","../../node_modules/@nosto/search-js/dist/index.es-XNBESE3P.js","../../node_modules/@nosto/search-js/dist/storage-B97DRj5i.js","../../node_modules/@nosto/search-js/dist/search-D1jQPG6P.js","../../src/lib/search.ts","../../src/lib/config.ts","../../node_modules/@nosto/search-js/dist/disableNativeAutocomplete-Bkta_WR2.js","../../src/lib/dropdown.ts","../../src/utils/promise.ts","../../src/utils/state.ts","../../src/utils/dom.ts","../../src/utils/ga.ts","../../src/utils/debounce.ts","../../src/utils/history.ts","../../src/lib/autocomplete.ts","../../node_modules/@nosto/search-js/dist/currencies/currencies.es.js","../../src/lib/components.ts","../../src/mustache/NostoAutocomplete.ts"],"sourcesContent":["/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\nvar objectToString = Object.prototype.toString;\nvar isArray = Array.isArray || function isArrayPolyfill (object) {\n  return objectToString.call(object) === '[object Array]';\n};\n\nfunction isFunction (object) {\n  return typeof object === 'function';\n}\n\n/**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\nfunction typeStr (obj) {\n  return isArray(obj) ? 'array' : typeof obj;\n}\n\nfunction escapeRegExp (string) {\n  return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n/**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\nfunction hasProperty (obj, propName) {\n  return obj != null && typeof obj === 'object' && (propName in obj);\n}\n\n/**\n * Safe way of detecting whether or not the given thing is a primitive and\n * whether it has the given property\n */\nfunction primitiveHasOwnProperty (primitive, propName) {\n  return (\n    primitive != null\n    && typeof primitive !== 'object'\n    && primitive.hasOwnProperty\n    && primitive.hasOwnProperty(propName)\n  );\n}\n\n// Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n// See https://github.com/janl/mustache.js/issues/189\nvar regExpTest = RegExp.prototype.test;\nfunction testRegExp (re, string) {\n  return regExpTest.call(re, string);\n}\n\nvar nonSpaceRe = /\\S/;\nfunction isWhitespace (string) {\n  return !testRegExp(nonSpaceRe, string);\n}\n\nvar entityMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n  '/': '&#x2F;',\n  '`': '&#x60;',\n  '=': '&#x3D;'\n};\n\nfunction escapeHtml (string) {\n  return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap (s) {\n    return entityMap[s];\n  });\n}\n\nvar whiteRe = /\\s*/;\nvar spaceRe = /\\s+/;\nvar equalsRe = /\\s*=/;\nvar curlyRe = /\\s*\\}/;\nvar tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n/**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n *\n * Tokens for partials also contain two more elements: 1) a string value of\n * indendation prior to that tag and 2) the index of that tag on that line -\n * eg a value of 2 indicates the partial is the third tag on this line.\n */\nfunction parseTemplate (template, tags) {\n  if (!template)\n    return [];\n  var lineHasNonSpace = false;\n  var sections = [];     // Stack to hold section tokens\n  var tokens = [];       // Buffer to hold the tokens\n  var spaces = [];       // Indices of whitespace tokens on the current line\n  var hasTag = false;    // Is there a {{tag}} on the current line?\n  var nonSpace = false;  // Is there a non-space char on the current line?\n  var indentation = '';  // Tracks indentation for tags that use it\n  var tagIndex = 0;      // Stores a count of number of tags encountered on a line\n\n  // Strips all whitespace tokens array for the current line\n  // if there was a {{#tag}} on it and otherwise only space.\n  function stripSpace () {\n    if (hasTag && !nonSpace) {\n      while (spaces.length)\n        delete tokens[spaces.pop()];\n    } else {\n      spaces = [];\n    }\n\n    hasTag = false;\n    nonSpace = false;\n  }\n\n  var openingTagRe, closingTagRe, closingCurlyRe;\n  function compileTags (tagsToCompile) {\n    if (typeof tagsToCompile === 'string')\n      tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n    if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n      throw new Error('Invalid tags: ' + tagsToCompile);\n\n    openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + '\\\\s*');\n    closingTagRe = new RegExp('\\\\s*' + escapeRegExp(tagsToCompile[1]));\n    closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + tagsToCompile[1]));\n  }\n\n  compileTags(tags || mustache.tags);\n\n  var scanner = new Scanner(template);\n\n  var start, type, value, chr, token, openSection;\n  while (!scanner.eos()) {\n    start = scanner.pos;\n\n    // Match any text between tags.\n    value = scanner.scanUntil(openingTagRe);\n\n    if (value) {\n      for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n        chr = value.charAt(i);\n\n        if (isWhitespace(chr)) {\n          spaces.push(tokens.length);\n          indentation += chr;\n        } else {\n          nonSpace = true;\n          lineHasNonSpace = true;\n          indentation += ' ';\n        }\n\n        tokens.push([ 'text', chr, start, start + 1 ]);\n        start += 1;\n\n        // Check for whitespace on the current line.\n        if (chr === '\\n') {\n          stripSpace();\n          indentation = '';\n          tagIndex = 0;\n          lineHasNonSpace = false;\n        }\n      }\n    }\n\n    // Match the opening tag.\n    if (!scanner.scan(openingTagRe))\n      break;\n\n    hasTag = true;\n\n    // Get the tag type.\n    type = scanner.scan(tagRe) || 'name';\n    scanner.scan(whiteRe);\n\n    // Get the tag value.\n    if (type === '=') {\n      value = scanner.scanUntil(equalsRe);\n      scanner.scan(equalsRe);\n      scanner.scanUntil(closingTagRe);\n    } else if (type === '{') {\n      value = scanner.scanUntil(closingCurlyRe);\n      scanner.scan(curlyRe);\n      scanner.scanUntil(closingTagRe);\n      type = '&';\n    } else {\n      value = scanner.scanUntil(closingTagRe);\n    }\n\n    // Match the closing tag.\n    if (!scanner.scan(closingTagRe))\n      throw new Error('Unclosed tag at ' + scanner.pos);\n\n    if (type == '>') {\n      token = [ type, value, start, scanner.pos, indentation, tagIndex, lineHasNonSpace ];\n    } else {\n      token = [ type, value, start, scanner.pos ];\n    }\n    tagIndex++;\n    tokens.push(token);\n\n    if (type === '#' || type === '^') {\n      sections.push(token);\n    } else if (type === '/') {\n      // Check section nesting.\n      openSection = sections.pop();\n\n      if (!openSection)\n        throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n      if (openSection[1] !== value)\n        throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + start);\n    } else if (type === 'name' || type === '{' || type === '&') {\n      nonSpace = true;\n    } else if (type === '=') {\n      // Set the tags for the next time around.\n      compileTags(value);\n    }\n  }\n\n  stripSpace();\n\n  // Make sure there are no open sections when we're done.\n  openSection = sections.pop();\n\n  if (openSection)\n    throw new Error('Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos);\n\n  return nestTokens(squashTokens(tokens));\n}\n\n/**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\nfunction squashTokens (tokens) {\n  var squashedTokens = [];\n\n  var token, lastToken;\n  for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n    token = tokens[i];\n\n    if (token) {\n      if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n        lastToken[1] += token[1];\n        lastToken[3] = token[3];\n      } else {\n        squashedTokens.push(token);\n        lastToken = token;\n      }\n    }\n  }\n\n  return squashedTokens;\n}\n\n/**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\nfunction nestTokens (tokens) {\n  var nestedTokens = [];\n  var collector = nestedTokens;\n  var sections = [];\n\n  var token, section;\n  for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n    token = tokens[i];\n\n    switch (token[0]) {\n      case '#':\n      case '^':\n        collector.push(token);\n        sections.push(token);\n        collector = token[4] = [];\n        break;\n      case '/':\n        section = sections.pop();\n        section[5] = token[2];\n        collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n        break;\n      default:\n        collector.push(token);\n    }\n  }\n\n  return nestedTokens;\n}\n\n/**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\nfunction Scanner (string) {\n  this.string = string;\n  this.tail = string;\n  this.pos = 0;\n}\n\n/**\n * Returns `true` if the tail is empty (end of string).\n */\nScanner.prototype.eos = function eos () {\n  return this.tail === '';\n};\n\n/**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\nScanner.prototype.scan = function scan (re) {\n  var match = this.tail.match(re);\n\n  if (!match || match.index !== 0)\n    return '';\n\n  var string = match[0];\n\n  this.tail = this.tail.substring(string.length);\n  this.pos += string.length;\n\n  return string;\n};\n\n/**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\nScanner.prototype.scanUntil = function scanUntil (re) {\n  var index = this.tail.search(re), match;\n\n  switch (index) {\n    case -1:\n      match = this.tail;\n      this.tail = '';\n      break;\n    case 0:\n      match = '';\n      break;\n    default:\n      match = this.tail.substring(0, index);\n      this.tail = this.tail.substring(index);\n  }\n\n  this.pos += match.length;\n\n  return match;\n};\n\n/**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\nfunction Context (view, parentContext) {\n  this.view = view;\n  this.cache = { '.': this.view };\n  this.parent = parentContext;\n}\n\n/**\n * Creates a new context using the given view with this context\n * as the parent.\n */\nContext.prototype.push = function push (view) {\n  return new Context(view, this);\n};\n\n/**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\nContext.prototype.lookup = function lookup (name) {\n  var cache = this.cache;\n\n  var value;\n  if (cache.hasOwnProperty(name)) {\n    value = cache[name];\n  } else {\n    var context = this, intermediateValue, names, index, lookupHit = false;\n\n    while (context) {\n      if (name.indexOf('.') > 0) {\n        intermediateValue = context.view;\n        names = name.split('.');\n        index = 0;\n\n        /**\n         * Using the dot notion path in `name`, we descend through the\n         * nested objects.\n         *\n         * To be certain that the lookup has been successful, we have to\n         * check if the last object in the path actually has the property\n         * we are looking for. We store the result in `lookupHit`.\n         *\n         * This is specially necessary for when the value has been set to\n         * `undefined` and we want to avoid looking up parent contexts.\n         *\n         * In the case where dot notation is used, we consider the lookup\n         * to be successful even if the last \"object\" in the path is\n         * not actually an object but a primitive (e.g., a string, or an\n         * integer), because it is sometimes useful to access a property\n         * of an autoboxed primitive, such as the length of a string.\n         **/\n        while (intermediateValue != null && index < names.length) {\n          if (index === names.length - 1)\n            lookupHit = (\n              hasProperty(intermediateValue, names[index])\n              || primitiveHasOwnProperty(intermediateValue, names[index])\n            );\n\n          intermediateValue = intermediateValue[names[index++]];\n        }\n      } else {\n        intermediateValue = context.view[name];\n\n        /**\n         * Only checking against `hasProperty`, which always returns `false` if\n         * `context.view` is not an object. Deliberately omitting the check\n         * against `primitiveHasOwnProperty` if dot notation is not used.\n         *\n         * Consider this example:\n         * ```\n         * Mustache.render(\"The length of a football field is {{#length}}{{length}}{{/length}}.\", {length: \"100 yards\"})\n         * ```\n         *\n         * If we were to check also against `primitiveHasOwnProperty`, as we do\n         * in the dot notation case, then render call would return:\n         *\n         * \"The length of a football field is 9.\"\n         *\n         * rather than the expected:\n         *\n         * \"The length of a football field is 100 yards.\"\n         **/\n        lookupHit = hasProperty(context.view, name);\n      }\n\n      if (lookupHit) {\n        value = intermediateValue;\n        break;\n      }\n\n      context = context.parent;\n    }\n\n    cache[name] = value;\n  }\n\n  if (isFunction(value))\n    value = value.call(this.view);\n\n  return value;\n};\n\n/**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\nfunction Writer () {\n  this.templateCache = {\n    _cache: {},\n    set: function set (key, value) {\n      this._cache[key] = value;\n    },\n    get: function get (key) {\n      return this._cache[key];\n    },\n    clear: function clear () {\n      this._cache = {};\n    }\n  };\n}\n\n/**\n * Clears all cached templates in this writer.\n */\nWriter.prototype.clearCache = function clearCache () {\n  if (typeof this.templateCache !== 'undefined') {\n    this.templateCache.clear();\n  }\n};\n\n/**\n * Parses and caches the given `template` according to the given `tags` or\n * `mustache.tags` if `tags` is omitted,  and returns the array of tokens\n * that is generated from the parse.\n */\nWriter.prototype.parse = function parse (template, tags) {\n  var cache = this.templateCache;\n  var cacheKey = template + ':' + (tags || mustache.tags).join(':');\n  var isCacheEnabled = typeof cache !== 'undefined';\n  var tokens = isCacheEnabled ? cache.get(cacheKey) : undefined;\n\n  if (tokens == undefined) {\n    tokens = parseTemplate(template, tags);\n    isCacheEnabled && cache.set(cacheKey, tokens);\n  }\n  return tokens;\n};\n\n/**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n *\n * If the optional `config` argument is given here, then it should be an\n * object with a `tags` attribute or an `escape` attribute or both.\n * If an array is passed, then it will be interpreted the same way as\n * a `tags` attribute on a `config` object.\n *\n * The `tags` attribute of a `config` object must be an array with two\n * string values: the opening and closing tags used in the template (e.g.\n * [ \"<%\", \"%>\" ]). The default is to mustache.tags.\n *\n * The `escape` attribute of a `config` object must be a function which\n * accepts a string as input and outputs a safely escaped string.\n * If an `escape` function is not provided, then an HTML-safe string\n * escaping function is used as the default.\n */\nWriter.prototype.render = function render (template, view, partials, config) {\n  var tags = this.getConfigTags(config);\n  var tokens = this.parse(template, tags);\n  var context = (view instanceof Context) ? view : new Context(view, undefined);\n  return this.renderTokens(tokens, context, partials, template, config);\n};\n\n/**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\nWriter.prototype.renderTokens = function renderTokens (tokens, context, partials, originalTemplate, config) {\n  var buffer = '';\n\n  var token, symbol, value;\n  for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n    value = undefined;\n    token = tokens[i];\n    symbol = token[0];\n\n    if (symbol === '#') value = this.renderSection(token, context, partials, originalTemplate, config);\n    else if (symbol === '^') value = this.renderInverted(token, context, partials, originalTemplate, config);\n    else if (symbol === '>') value = this.renderPartial(token, context, partials, config);\n    else if (symbol === '&') value = this.unescapedValue(token, context);\n    else if (symbol === 'name') value = this.escapedValue(token, context, config);\n    else if (symbol === 'text') value = this.rawValue(token);\n\n    if (value !== undefined)\n      buffer += value;\n  }\n\n  return buffer;\n};\n\nWriter.prototype.renderSection = function renderSection (token, context, partials, originalTemplate, config) {\n  var self = this;\n  var buffer = '';\n  var value = context.lookup(token[1]);\n\n  // This function is used to render an arbitrary template\n  // in the current context by higher-order sections.\n  function subRender (template) {\n    return self.render(template, context, partials, config);\n  }\n\n  if (!value) return;\n\n  if (isArray(value)) {\n    for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n      buffer += this.renderTokens(token[4], context.push(value[j]), partials, originalTemplate, config);\n    }\n  } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n    buffer += this.renderTokens(token[4], context.push(value), partials, originalTemplate, config);\n  } else if (isFunction(value)) {\n    if (typeof originalTemplate !== 'string')\n      throw new Error('Cannot use higher-order sections without the original template');\n\n    // Extract the portion of the original template that the section contains.\n    value = value.call(context.view, originalTemplate.slice(token[3], token[5]), subRender);\n\n    if (value != null)\n      buffer += value;\n  } else {\n    buffer += this.renderTokens(token[4], context, partials, originalTemplate, config);\n  }\n  return buffer;\n};\n\nWriter.prototype.renderInverted = function renderInverted (token, context, partials, originalTemplate, config) {\n  var value = context.lookup(token[1]);\n\n  // Use JavaScript's definition of falsy. Include empty arrays.\n  // See https://github.com/janl/mustache.js/issues/186\n  if (!value || (isArray(value) && value.length === 0))\n    return this.renderTokens(token[4], context, partials, originalTemplate, config);\n};\n\nWriter.prototype.indentPartial = function indentPartial (partial, indentation, lineHasNonSpace) {\n  var filteredIndentation = indentation.replace(/[^ \\t]/g, '');\n  var partialByNl = partial.split('\\n');\n  for (var i = 0; i < partialByNl.length; i++) {\n    if (partialByNl[i].length && (i > 0 || !lineHasNonSpace)) {\n      partialByNl[i] = filteredIndentation + partialByNl[i];\n    }\n  }\n  return partialByNl.join('\\n');\n};\n\nWriter.prototype.renderPartial = function renderPartial (token, context, partials, config) {\n  if (!partials) return;\n  var tags = this.getConfigTags(config);\n\n  var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n  if (value != null) {\n    var lineHasNonSpace = token[6];\n    var tagIndex = token[5];\n    var indentation = token[4];\n    var indentedValue = value;\n    if (tagIndex == 0 && indentation) {\n      indentedValue = this.indentPartial(value, indentation, lineHasNonSpace);\n    }\n    var tokens = this.parse(indentedValue, tags);\n    return this.renderTokens(tokens, context, partials, indentedValue, config);\n  }\n};\n\nWriter.prototype.unescapedValue = function unescapedValue (token, context) {\n  var value = context.lookup(token[1]);\n  if (value != null)\n    return value;\n};\n\nWriter.prototype.escapedValue = function escapedValue (token, context, config) {\n  var escape = this.getConfigEscape(config) || mustache.escape;\n  var value = context.lookup(token[1]);\n  if (value != null)\n    return (typeof value === 'number' && escape === mustache.escape) ? String(value) : escape(value);\n};\n\nWriter.prototype.rawValue = function rawValue (token) {\n  return token[1];\n};\n\nWriter.prototype.getConfigTags = function getConfigTags (config) {\n  if (isArray(config)) {\n    return config;\n  }\n  else if (config && typeof config === 'object') {\n    return config.tags;\n  }\n  else {\n    return undefined;\n  }\n};\n\nWriter.prototype.getConfigEscape = function getConfigEscape (config) {\n  if (config && typeof config === 'object' && !isArray(config)) {\n    return config.escape;\n  }\n  else {\n    return undefined;\n  }\n};\n\nvar mustache = {\n  name: 'mustache.js',\n  version: '4.2.0',\n  tags: [ '{{', '}}' ],\n  clearCache: undefined,\n  escape: undefined,\n  parse: undefined,\n  render: undefined,\n  Scanner: undefined,\n  Context: undefined,\n  Writer: undefined,\n  /**\n   * Allows a user to override the default caching strategy, by providing an\n   * object with set, get and clear methods. This can also be used to disable\n   * the cache by setting it to the literal `undefined`.\n   */\n  set templateCache (cache) {\n    defaultWriter.templateCache = cache;\n  },\n  /**\n   * Gets the default or overridden caching object from the default writer.\n   */\n  get templateCache () {\n    return defaultWriter.templateCache;\n  }\n};\n\n// All high-level mustache.* functions use this writer.\nvar defaultWriter = new Writer();\n\n/**\n * Clears all cached templates in the default writer.\n */\nmustache.clearCache = function clearCache () {\n  return defaultWriter.clearCache();\n};\n\n/**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\nmustache.parse = function parse (template, tags) {\n  return defaultWriter.parse(template, tags);\n};\n\n/**\n * Renders the `template` with the given `view`, `partials`, and `config`\n * using the default writer.\n */\nmustache.render = function render (template, view, partials, config) {\n  if (typeof template !== 'string') {\n    throw new TypeError('Invalid template! Template should be a \"string\" ' +\n                        'but \"' + typeStr(template) + '\" was given as the first ' +\n                        'argument for mustache#render(template, view, partials)');\n  }\n\n  return defaultWriter.render(template, view, partials, config);\n};\n\n// Export the escaping function so that the user may override it.\n// See https://github.com/janl/mustache.js/issues/244\nmustache.escape = escapeHtml;\n\n// Export these mainly for testing, but also for advanced usage.\nmustache.Scanner = Scanner;\nmustache.Context = Context;\nmustache.Writer = Writer;\n\nexport default mustache;\n","import { DefaultState } from \"../utils/state\"\nimport Mustache from \"mustache\"\n\nexport { default as defaultMustacheTemplate } from \"./autocomplete.mustache\"\n\nexport type Options = {\n  /**\n   * Mustache helpers to extend template functionality.\n   */\n  helpers?: object\n}\n\n/**\n * Render a Mustache template into a container\n *\n * @param template Mustache template\n * @param options Options object.\n * @returns Render function\n * @group Autocomplete\n * @category Mustache\n/**\n * @example\n * ```js\n * import { fromMustacheTemplate } from \"@nosto/autocomplete/mustache\";\n *\n * const render = fromMustacheTemplate(`\n *   <div>\n *      <h1>{{title}}</h1>\n *     <ul>\n *      {{#products}}\n *       <li>{{name}}</li>\n *     {{/products}}\n *    </ul>\n *   </div>\n *   `, {\n *    helpers: {\n *     toJson: function () {\n *      return JSON.stringify(this)\n *    }});\n *\n * render(document.getElementById(\"container\"), {\n *   title: \"My Title\",\n *   products: [\n *     { name: \"Product 1\" },\n *     { name: \"Product 2\" },\n *     { name: \"Product 3\" }\n *   ]\n * });\n * ```\n */\nexport function fromMustacheTemplate<State extends object = DefaultState>(template: string, options?: Options) {\n  if (Mustache === undefined) {\n    throw new Error(\"Mustache is not defined. Please include the Mustache dependency or library in your page.\")\n  }\n\n  const { helpers } = options || {}\n\n  return (container: HTMLElement, state: State) => {\n    container.innerHTML = Mustache.render(template, {\n      ...state,\n      imagePlaceholder: \"https://cdn.nosto.com/nosto/9/mock\",\n      toJson: function () {\n        return JSON.stringify(this)\n      },\n      showListPrice: function () {\n        return this.listPrice !== this.price\n      },\n      ...helpers\n    })\n\n    return Promise.resolve()\n  }\n}\n","function o() {\n  window.nostojs = window.nostojs ?? function(n) {\n    (window.nostojs.q = window.nostojs.q ?? []).push(n);\n  };\n}\nasync function s(n) {\n  return window.nostojs(n);\n}\nlet t = null;\ntypeof window < \"u\" && (o(), s((n) => {\n  t = n.internal.getSettings();\n}));\nfunction i() {\n  return t;\n}\nfunction e(n) {\n  t = n;\n}\nexport {\n  i as g,\n  o as i,\n  s as n,\n  e as s\n};\n","import { i as g } from \"./settings-DN0V2st5.js\";\nimport { g as x, n as L } from \"./settings-DN0V2st5.js\";\nfunction b() {\n  return typeof window.nosto < \"u\";\n}\nfunction k() {\n  return window.nosto;\n}\nconst f = {\n  production: \"https://connect.nosto.com/\",\n  staging: \"https://connect.staging.nosto.com/\",\n  local: \"https://connect.nosto.com/\"\n};\nfunction u(o) {\n  return f[o ?? \"production\"];\n}\nfunction h({ merchantId: o, env: n, options: e, shopifyInternational: a, scriptLoader: s }) {\n  const t = document.querySelector(\"script[nosto-language], script[nosto-market-id]\"), r = String(a?.marketId || \"\"), i = a?.language || \"\", l = t?.getAttribute(\"nosto-language\") !== i || t?.getAttribute(\"nosto-market-id\") !== r;\n  if (!t || l) {\n    const d = document.querySelector(\"#nosto-sandbox\");\n    t?.parentNode?.removeChild(t), d?.parentNode?.removeChild(d);\n    const c = new URL(\"/script/shopify/market/nosto.js\", u(n));\n    c.searchParams.append(\"merchant\", o), c.searchParams.append(\"market\", r), c.searchParams.append(\"locale\", i.toLowerCase());\n    const m = {\n      ...e?.attributes,\n      \"nosto-language\": i,\n      \"nosto-market-id\": r\n    };\n    return (s ?? p)(c.toString(), { ...e, attributes: m });\n  }\n  return Promise.resolve();\n}\nfunction y(o) {\n  if (o.shopifyInternational)\n    return h(o);\n  const { merchantId: n, env: e, options: a, scriptLoader: s } = o, t = s ?? p, r = new URL(`/include/${n}`, u(e));\n  return t(r.toString(), a);\n}\nfunction p(o, n) {\n  return new Promise((a, s) => {\n    const t = document.createElement(\"script\");\n    t.src = o, t.async = !0, t.type = \"text/javascript\", t.onload = () => a(), t.onerror = () => s(), Object.entries(n?.attributes ?? {}).forEach(([r, i]) => t.setAttribute(r, i)), n?.position === \"head\" ? document.head.appendChild(t) : document.body.appendChild(t);\n  });\n}\nasync function C(o, n, e) {\n  if (!window.Nosto?.addSkuToCart)\n    throw new Error(\"Nosto addSkuToCart function is not available\");\n  await window.Nosto.addSkuToCart(o, n, e);\n}\ntypeof window < \"u\" && g();\nexport {\n  C as addSkuToCart,\n  k as getNostoWindow,\n  x as getSettings,\n  y as init,\n  g as initNostoStub,\n  b as isNostoLoaded,\n  L as nostojs\n};\n","import { nostojs } from \"@nosto/nosto-js\"\nimport { SearchHit } from \"@nosto/nosto-js/client\"\n\nexport function recordSearchClick(hit: SearchHit) {\n  nostojs(api => api.recordSearchClick(\"autocomplete\", hit))\n}\n\nexport function recordSearchSubmit(query: string) {\n  nostojs(api => api.recordSearchSubmit(query))\n}\n","function n() {\n  window.nostojs = window.nostojs ?? function(o) {\n    (window.nostojs.q = window.nostojs.q ?? []).push(o);\n  };\n}\nasync function s(o) {\n  return window.nostojs(o);\n}\nlet t = null;\ntypeof window < \"u\" && (n(), s((o) => {\n  t = o.internal.getSettings();\n}));\nfunction d() {\n  return t;\n}\nasync function u(o, i, w) {\n  if (!window.Nosto?.addSkuToCart)\n    throw new Error(\"Nosto addSkuToCart function is not available\");\n  await window.Nosto.addSkuToCart(o, i, w);\n}\ntypeof window < \"u\" && n();\nexport {\n  u as C,\n  d as i,\n  s\n};\n","import { s as I } from \"./index.es-XNBESE3P.js\";\nfunction c(e) {\n  return String(e) === \"[object Object]\";\n}\nfunction g(e) {\n  if (!c(e))\n    return !1;\n  const t = e.constructor;\n  if (t === void 0)\n    return !0;\n  const r = t.prototype;\n  return !(!c(r) || !r.hasOwnProperty(\"isPrototypeOf\"));\n}\nfunction u(e, t) {\n  if (e === t)\n    return !0;\n  if (e instanceof Date && t instanceof Date)\n    return e.getTime() === t.getTime();\n  if (Array.isArray(e) && Array.isArray(t))\n    return e.length !== t.length ? !1 : e.every((r, n) => u(r, t[n]));\n  if (g(e) && g(t)) {\n    const r = Object.entries(e);\n    return r.length !== Object.keys(t).length ? !1 : r.every(([n, S]) => u(S, t[n]));\n  }\n  return !1;\n}\nfunction f() {\n  const e = /* @__PURE__ */ new Map();\n  return {\n    getItem(t) {\n      return e.get(t) ?? null;\n    },\n    setItem(t, r) {\n      e.set(t, r);\n    },\n    removeItem(t) {\n      e.delete(t);\n    },\n    clear() {\n      e.clear();\n    },\n    key(t) {\n      return Array.from(e.keys())[t] ?? null;\n    },\n    get length() {\n      return e.size;\n    }\n  };\n}\nfunction a(e) {\n  return (...t) => {\n    I((r) => {\n      (r.internal.context.mode.isPreview() ? console[e] : r.internal.logger[e])(...t);\n    });\n  };\n}\nconst i = {\n  debug: a(\"debug\"),\n  info: a(\"info\"),\n  warn: a(\"warn\"),\n  error: a(\"error\")\n};\nfunction l(e, t, r) {\n  try {\n    const n = JSON.stringify(t);\n    r.setItem(e, n);\n  } catch (n) {\n    i.warn(n);\n  }\n}\nfunction m(e, t) {\n  try {\n    const r = t.getItem(e);\n    if (r)\n      return JSON.parse(r);\n  } catch (r) {\n    i.warn(r);\n  }\n}\nfunction y(e, t) {\n  try {\n    t.removeItem(e);\n  } catch (r) {\n    i.warn(r);\n  }\n}\nlet o, s;\ntry {\n  o = window.localStorage, s = window.sessionStorage;\n} catch (e) {\n  i.warn(e), o = f(), s = f();\n}\nfunction h(e, t) {\n  l(e, t, o);\n}\nfunction d(e, t) {\n  l(e, t, s);\n}\nfunction p(e) {\n  return m(e, o);\n}\nfunction O(e) {\n  return m(e, s);\n}\nfunction v(e) {\n  y(e, o);\n}\nfunction j(e) {\n  y(e, s);\n}\nexport {\n  O as a,\n  g as b,\n  j as c,\n  d,\n  p as g,\n  u as i,\n  i as l,\n  v as r,\n  h as s\n};\n","import { s as m } from \"./index.es-XNBESE3P.js\";\nimport { d as g, a as y, i as l, l as S } from \"./storage-B97DRj5i.js\";\nasync function C(t, { hitDecorators: e, ...n }, s) {\n  const r = await s(t, n);\n  if (!r.products?.hits?.length || !e?.length)\n    return r;\n  const c = (o) => e.reduce((i, a) => a(i), o);\n  return {\n    ...r,\n    products: {\n      ...r.products,\n      hits: r.products.hits.map(c)\n    }\n  };\n}\nconst h = \"nosto:search-js:cache\", R = 60 * 1e3;\nfunction b(t, e) {\n  g(h, { query: t, result: e, created: Date.now() });\n}\nfunction k(t) {\n  const e = y(h);\n  if (!e || !T(e))\n    return null;\n  const n = d(e.query);\n  return !l(d(t), n) || Date.now() - e.created > R ? null : e.result;\n}\nfunction d(t) {\n  const e = {\n    ...t,\n    time: void 0,\n    products: {\n      ...t.products,\n      size: void 0\n    }\n  };\n  return JSON.parse(JSON.stringify(e));\n}\nfunction T(t) {\n  return typeof t == \"object\" && t !== null && \"query\" in t && \"result\" in t && \"created\" in t;\n}\nasync function z(t, { usePersistentCache: e, ...n }, s) {\n  if (!e)\n    return s(t, n);\n  const r = await E(t, n, s);\n  return b(t, r), r;\n}\nasync function E(t, e, n) {\n  const { from: s = 0, size: r = 0 } = t.products || {}, c = k(t);\n  if (!c)\n    return await n(t, e);\n  const o = c?.products?.size ?? 0, i = c?.products?.hits ?? [];\n  if (r === o)\n    return c;\n  if (r < o)\n    return {\n      ...c,\n      products: {\n        ...c.products,\n        size: r,\n        hits: i.slice(0, r),\n        total: c.products?.total || 0\n      }\n    };\n  const a = r - i.length, p = s > 0 ? s + 1 : r - a, w = {\n    ...t,\n    products: {\n      ...t.products,\n      from: p,\n      size: a\n    }\n  }, f = await n(w, e);\n  return {\n    ...c,\n    products: {\n      ...c.products,\n      size: r,\n      hits: [...c.products?.hits || [], ...f.products?.hits || []],\n      total: f.products?.total || 0\n    }\n  };\n}\nconst N = 3e4, u = /* @__PURE__ */ new Map();\nfunction W(t, e) {\n  const n = u.get(t);\n  if (!n) return;\n  const s = Date.now() - n.created > N, r = l(e, n.query);\n  if (s || !r) {\n    u.delete(t);\n    return;\n  }\n  return n.result;\n}\nfunction _(t, e, n) {\n  u.set(t, {\n    query: e,\n    result: n,\n    created: Date.now()\n  });\n}\nasync function D(t, e, n) {\n  if (!e.useMemoryCache)\n    return n(t, e);\n  const s = JSON.stringify(t), r = W(s, t);\n  if (r) return r;\n  const c = await n(t, e);\n  return _(s, t, c), c;\n}\nasync function M(t, e, n) {\n  if (!e.redirect)\n    return n(t, e);\n  const s = await n(t, e);\n  if (s.keywords?.hits?.length) {\n    const r = s.keywords.hits.find((c) => c.keyword === t.query && c._redirect);\n    r && r._redirect && (window.location.href = r._redirect);\n  }\n  return s;\n}\nfunction O(t) {\n  return new Promise((e) => setTimeout(e, t));\n}\nasync function j(t, { maxRetries: e = 0, retryInterval: n = 0, ...s }, r) {\n  let c = 0;\n  for (; ; )\n    try {\n      return await r(t, s);\n    } catch (o) {\n      if (c >= e)\n        throw o;\n      if (!J(o))\n        throw S.info(\"Skipping retry logic for\", o), o;\n      c++, await O(n);\n    }\n}\nfunction J(t) {\n  return !t || typeof t != \"object\" ? !1 : !(\"status\" in t) || V(t.status);\n}\nfunction V(t) {\n  return typeof t == \"number\" && (t < 400 || t >= 500);\n}\nasync function K(t, e = {}) {\n  const n = await new Promise(m);\n  return x(\n    n.search,\n    j,\n    M,\n    D,\n    z,\n    C\n  )(t, e);\n}\nfunction x(t, ...e) {\n  return e.reduce((n, s) => (r, c) => s(r, c, n), t);\n}\nexport {\n  K as s\n};\n","import type { SearchQuery } from \"@nosto/nosto-js/client\"\nimport { search as searchFn, SearchOptions } from \"@nosto/search-js\"\n\nconst defaultProductFields = [\n  \"productId\",\n  \"url\",\n  \"name\",\n  \"imageUrl\",\n  \"imageHash\",\n  \"thumbUrl\",\n  \"description\",\n  \"brand\",\n  \"variantId\",\n  \"availability\",\n  \"price\",\n  \"priceText\",\n  \"categoryIds\",\n  \"categories\",\n  \"customFields.key\",\n  \"customFields.value\",\n  \"priceCurrencyCode\",\n  \"datePublished\",\n  \"listPrice\",\n  \"unitPricingBaseMeasure\",\n  \"unitPricingUnit\",\n  \"unitPricingMeasure\",\n  \"googleCategory\",\n  \"gtin\",\n  \"ageGroup\",\n  \"gender\",\n  \"condition\",\n  \"alternateImageUrls\",\n  \"ratingValue\",\n  \"reviewCount\",\n  \"inventoryLevel\",\n  \"skus.id\",\n  \"skus.name\",\n  \"skus.price\",\n  \"skus.listPrice\",\n  \"skus.priceText\",\n  \"skus.url\",\n  \"skus.imageUrl\",\n  \"skus.inventoryLevel\",\n  \"skus.customFields.key\",\n  \"skus.customFields.value\",\n  \"skus.availability\",\n  \"pid\",\n  \"onDiscount\",\n  \"extra.key\",\n  \"extra.value\",\n  \"saleable\",\n  \"available\",\n  \"tags1\",\n  \"tags2\",\n  \"tags3\"\n]\n\n/**\n *\n * @param query Query object.\n * @param options Options object.\n * @returns Promise of search response.\n * @group Autocomplete\n * @category Core\n * @example\n * ```js\n * import { search } from \"@nosto/autocomplete\"\n *\n * search({\n *     query: \"shoes\",\n *     products: {\n *       fields: [\"name\", \"price\"],\n *       facets: [\"brand\", \"category\"],\n *       size: 10,\n *       from: 0,\n *     }\n * }).then((state) => {\n *    console.log(state.response)\n * })\n * ```\n */\nexport async function search(query: SearchQuery, options: SearchOptions = {}) {\n  const fields = query.products?.fields ?? defaultProductFields\n  const facets = query.products?.facets ?? [\"*\"]\n  const size = query.products?.size ?? 20\n  const from = query.products?.from ?? 0\n\n  const response = await searchFn(\n    {\n      ...query,\n      products: {\n        ...query.products,\n        fields,\n        facets,\n        size,\n        from\n      }\n    },\n    options\n  )\n\n  return { query, response }\n}\n","import type { SearchQuery } from \"@nosto/nosto-js/client\"\nimport { SearchAutocompleteOptions } from \"./autocomplete\"\nimport { search } from \"./search\"\nimport { HitDecorator } from \"@nosto/search-js\"\n\n/**\n * @group Autocomplete\n * @category Core\n */\nexport interface GoogleAnalyticsConfig {\n  /**\n   * Path of search page\n   * @default \"/search\"\n   */\n  serpPath?: string\n  /**\n   * Search query url parameter name\n   * @default \"query\"\n   */\n  queryParamName?: string\n  /**\n   * Enable Google Analytics\n   * @default true\n   */\n  enabled?: boolean\n}\n\nexport type Selector = string | Element\n\n/**\n * @group Autocomplete\n * @category Core\n */\nexport interface AutocompleteConfig<State> {\n  /**\n   * The input element to attach the autocomplete to\n   */\n  inputSelector: Selector\n  /**\n   * The dropdown element to attach the autocomplete to\n   */\n  dropdownSelector: Selector | ((input: HTMLInputElement) => Selector)\n  /**\n   * The function to use to render the dropdown\n   */\n  render: (container: HTMLElement, state: State) => void | PromiseLike<void>\n  /**\n   * Minimum length of the query before searching\n   */\n  minQueryLength?: number\n  /**\n   * The function to use to fetch the search state\n   */\n  fetch: SearchQuery | ((input: string) => PromiseLike<State>)\n  /**\n   * The function to use to submit the search\n   */\n  submit?: (query: string, config: AutocompleteConfig<State>, options?: SearchAutocompleteOptions) => void\n  /**\n   * Enable history\n   */\n  historyEnabled?: boolean\n  /**\n   * Max number of history items to show\n   */\n  historySize?: number\n  /**\n   * Enable Nosto Analytics\n   */\n  nostoAnalytics?: boolean\n  /**\n   * Google Analytics configuration. Set to `false` to disable.\n   */\n  googleAnalytics?: GoogleAnalyticsConfig | boolean\n  /**\n   * Decorate each search hit before rendering\n   *\n   * @example\n   * ```ts\n   * import { priceDecorator } from \"@nosto/autocomplete\"\n   *\n   * autocomplete({\n   *   hitDecorators: [\n   *     priceDecorator({ defaultCurrency: \"USD\" })\n   *   ]\n   * })\n   * ```\n   */\n  hitDecorators?: HitDecorator[]\n  /**\n   * Whether to submit the form natively or not\n   */\n  nativeSubmit?: boolean\n  /**\n   * A function to call when the user clicks on a search hit to use custom routing\n   * @example\n   * ```ts\n   * autocomplete({\n   *  routingHandler: (url) => {\n   *    location.href = url\n   *  }\n   * })\n   * ```\n   */\n  routingHandler?: (url: string) => void\n}\n\nexport const defaultGaConfig = {\n  serpPath: \"/search\",\n  queryParamName: \"query\",\n  enabled: true\n}\n\nexport function getDefaultConfig<State>() {\n  return {\n    minQueryLength: 2,\n    historyEnabled: true,\n    historySize: 5,\n    hitDecorators: [],\n    nostoAnalytics: true,\n    googleAnalytics: defaultGaConfig,\n    routingHandler: url => {\n      location.href = url\n    },\n    nativeSubmit: false,\n    submit: (query, config, options) => {\n      if (query.length >= (config.minQueryLength ?? getDefaultConfig<State>().minQueryLength)) {\n        search(\n          {\n            query\n          },\n          {\n            redirect: true,\n            track: config.nostoAnalytics ? \"serp\" : undefined,\n            hitDecorators: config.hitDecorators,\n            ...options\n          }\n        )\n      }\n    }\n  } satisfies Partial<AutocompleteConfig<State>>\n}\n","function y(f, { onClick: d, onFocus: r, onInput: v, onKeyDown: u, onSubmit: l }, { form: c = f.form ?? void 0, nativeSubmit: p } = {}) {\n  const o = [];\n  function i(e, s, a) {\n    e.addEventListener(s, a), o.push(() => e.removeEventListener(s, a));\n  }\n  return (u || l) && i(f, \"keydown\", (e) => {\n    const s = u?.(f.value, e.key);\n    u && (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") ? e.preventDefault() : l && e.key === \"Enter\" && (f.value !== \"\" && !e.repeat && !s && l(f.value), p || e.preventDefault());\n  }), l && c && (i(c, \"submit\", (e) => {\n    p || e.preventDefault(), l(f.value);\n  }), c.querySelectorAll(\"[type=submit]\").forEach((e) => {\n    i(e, \"click\", (s) => {\n      p || s.preventDefault(), l(f.value);\n    });\n  })), d && i(f, \"click\", () => d(f.value)), r && i(f, \"focus\", () => r(f.value)), v && i(f, \"input\", () => v(f.value)), {\n    destroy() {\n      o.forEach((e) => e());\n    }\n  };\n}\nfunction k(f) {\n  f.setAttribute(\"autocomplete\", \"off\");\n}\nexport {\n  y as b,\n  k as d\n};\n","import { logger } from \"@nosto/search-js/utils\"\nimport { SearchAutocompleteOptions } from \"./autocomplete\"\n\ntype OnClickBindings<State> = {\n  [key: string]: (obj: { data: string | undefined; el: HTMLElement; update: (state: State) => void }) => unknown\n}\n\nexport function createDropdown<State>(\n  container: HTMLElement,\n  initialState: PromiseLike<State>,\n  render: (container: HTMLElement, state: State) => void | PromiseLike<void>,\n  submit: (inputValue: string, options?: SearchAutocompleteOptions) => unknown,\n  updateInput: (inputValue: string) => void,\n  routingHandler: (url: string) => void,\n  onClickBindings?: OnClickBindings<State>\n) {\n  let elements: HTMLElement[] = []\n  let unbindCallbacks: Array<() => void> = []\n\n  let isEmpty: boolean = true\n  let selectedIndex: number = -1\n\n  function handleElementSubmit(el: HTMLElement): void {\n    const hit = el?.dataset?.nsHit\n\n    if (hit) {\n      const parsedHit = parseHit(hit)\n      hide()\n\n      if (parsedHit?.item) {\n        submit(parsedHit.item)\n        return\n      }\n\n      if (parsedHit?.keyword) {\n        submit(parsedHit.keyword, {\n          redirect: !!parsedHit?._redirect,\n          isKeyword: true\n        })\n\n        if (parsedHit?._redirect) {\n          routingHandler(parsedHit._redirect)\n        }\n        return\n      }\n\n      if (parsedHit?.url) {\n        routingHandler(parsedHit.url)\n      }\n    }\n  }\n\n  function loadElements() {\n    isEmpty = !container.innerHTML.trim()\n\n    if (!isEmpty) {\n      elements = Array.from<HTMLElement>(container.querySelectorAll(\"[data-ns-hit]\")).map(el => {\n        bindElementSubmit(el)\n        return el\n      })\n    }\n  }\n\n  function bindDataCallbacks() {\n    Object.entries(onClickBindings ?? {}).map(([key, callback]) => {\n      // Convert camelCase to kebab-case\n      const dataKey = `[data-ns-${key.replace(/([A-Z])/g, \"-$1\").toLowerCase()}]`\n\n      Array.from<HTMLElement>(container.querySelectorAll(dataKey)).map(el => {\n        const data = el?.dataset?.[`ns${key.charAt(0).toUpperCase() + key.slice(1)}`]\n        const onClick = () => {\n          callback({\n            data,\n            el,\n            update\n          })\n        }\n\n        el.addEventListener(\"click\", onClick)\n        unbindCallbacks.push(() => {\n          el.removeEventListener(\"click\", onClick)\n        })\n      })\n    })\n  }\n\n  function bindElementSubmit(el: HTMLElement) {\n    const onSubmit = () => {\n      handleElementSubmit(el)\n    }\n\n    el.addEventListener(\"click\", onSubmit)\n    unbindCallbacks.push(() => {\n      el.removeEventListener(\"click\", onSubmit)\n    })\n  }\n\n  function highlight(index: number, prevIndex?: number) {\n    if (typeof prevIndex === \"number\" && elements[prevIndex]) {\n      elements[prevIndex].classList.remove(\"selected\")\n    }\n\n    if (typeof index === \"number\" && elements[index]) {\n      elements[index]?.classList.add(\"selected\")\n\n      const hit = elements[index]?.dataset?.nsHit\n\n      if (hit) {\n        const parsedHit = parseHit(hit)\n\n        if (parsedHit.item) {\n          updateInput(parsedHit.item)\n          return\n        }\n\n        if (parsedHit.keyword) {\n          updateInput(parsedHit.keyword)\n          return\n        }\n      }\n    }\n  }\n\n  function dispose() {\n    resetHighlight()\n    elements = []\n    unbindCallbacks.forEach(v => v())\n    unbindCallbacks = []\n  }\n\n  async function update(state: State) {\n    dispose()\n    await render(container, state)\n\n    // Without setTimeout React does not have committed DOM changes yet, so we don't have the correct elements.\n    setTimeout(() => {\n      loadElements()\n      bindDataCallbacks()\n      show()\n    }, 0)\n  }\n\n  function hide() {\n    resetHighlight()\n    container.style.display = \"none\"\n  }\n\n  function show() {\n    if (!isEmpty) {\n      container.style.display = \"\"\n    } else {\n      hide()\n    }\n  }\n\n  function clear() {\n    dispose()\n    isEmpty = true\n    hide()\n  }\n\n  function isOpen() {\n    return container.style.display !== \"none\"\n  }\n\n  function goDown() {\n    let prevIndex = selectedIndex\n\n    if (selectedIndex === elements.length - 1) {\n      selectedIndex = 0\n    } else {\n      prevIndex = selectedIndex++\n    }\n\n    highlight(selectedIndex, prevIndex)\n  }\n\n  function goUp() {\n    if (hasHighlight()) {\n      let prevIndex = selectedIndex\n\n      if (selectedIndex === 0) {\n        selectedIndex = elements.length - 1\n      } else {\n        prevIndex = selectedIndex--\n      }\n\n      highlight(selectedIndex, prevIndex)\n    } else {\n      selectedIndex = elements.length - 1\n      highlight(selectedIndex)\n    }\n  }\n\n  function handleSubmit() {\n    if (isOpen() && hasHighlight() && elements[selectedIndex]) {\n      handleElementSubmit(elements[selectedIndex])\n    }\n  }\n\n  function hasHighlight() {\n    return selectedIndex > -1\n  }\n\n  function getHighlight() {\n    return elements[selectedIndex]\n  }\n\n  function resetHighlight() {\n    if (hasHighlight()) {\n      elements[selectedIndex]?.classList.remove(\"selected\")\n      selectedIndex = -1\n    }\n  }\n\n  function destroy() {\n    dispose()\n    isEmpty = true\n    container.innerHTML = \"\"\n  }\n\n  async function init() {\n    const state = await Promise.resolve(initialState)\n    await Promise.resolve(render(container, state))\n\n    // Without setTimeout React does not have committed DOM changes yet, so we don't have the correct elements.\n    setTimeout(() => {\n      loadElements()\n      bindDataCallbacks()\n      hide()\n    }, 0)\n  }\n  init()\n\n  return {\n    update,\n    clear,\n    isOpen,\n    goDown,\n    goUp,\n    handleSubmit,\n    destroy,\n    show,\n    hide,\n    resetHighlight,\n    hasHighlight,\n    getHighlight,\n    container\n  }\n}\n\nexport type Dropdown<T> = ReturnType<typeof createDropdown<T>>\n\ninterface Hit {\n  item?: string\n  keyword?: string\n  url?: string\n  _redirect?: string\n}\n\nexport function parseHit(hit: string): Hit {\n  try {\n    const parsedHit: Hit | undefined | null = JSON.parse(hit)\n    return parsedHit ?? {}\n  } catch (error) {\n    logger.warn(\"Could not parse hit\", error)\n    return {}\n  }\n}\n","export type Cancellable<T> = { promise: PromiseLike<T>; cancel: () => void }\n\nexport class CancellableError extends Error {}\n\nexport function makeCancellable<T>(promise: PromiseLike<T>): Cancellable<T> {\n  let hasCanceled_ = false\n\n  const wrappedPromise = new Promise<T>((resolve, reject) => {\n    // eslint-disable-next-line promise/prefer-await-to-then\n    return promise.then(\n      val => (hasCanceled_ ? reject(new CancellableError(\"cancelled promise\")) : resolve(val)),\n      error => (hasCanceled_ ? reject(new CancellableError(\"cancelled promise\")) : reject(error))\n    )\n  })\n\n  return {\n    promise: wrappedPromise,\n    cancel() {\n      hasCanceled_ = true\n    }\n  }\n}\n","import { AutocompleteConfig } from \"../lib/config\"\nimport { History } from \"./history\"\nimport { Cancellable, makeCancellable } from \"./promise\"\nimport { search } from \"../lib/search\"\nimport { SearchAutocompleteOptions } from \"../lib/autocomplete\"\nimport type { InputSearchQuery, SearchResult } from \"@nosto/nosto-js/client\"\n\n/**\n * @group Autocomplete\n * @category Core\n */\nexport interface DefaultState {\n  /**\n   * The current search query object.\n   */\n  query?: InputSearchQuery\n  /**\n   * The current search response.\n   */\n  response?: SearchResult\n  /**\n   * The history items.\n   */\n  history?: { item: string }[]\n}\n\nexport type StateActions<State> = {\n  updateState(inputValue?: string): PromiseLike<State>\n  addHistoryItem(item: string): PromiseLike<State>\n  removeHistoryItem(item: string): PromiseLike<State>\n  clearHistory(): PromiseLike<State>\n}\n\nexport function getStateActions<State>({\n  config,\n  history,\n  input\n}: {\n  config: Required<AutocompleteConfig<State>>\n  history?: History\n  input: HTMLInputElement\n}): StateActions<State> {\n  let cancellable: Cancellable<State> | undefined\n\n  const fetchState = (\n    value: string,\n    config: AutocompleteConfig<State>,\n    options?: SearchAutocompleteOptions\n  ): PromiseLike<State> => {\n    if (typeof config.fetch === \"function\") {\n      return config.fetch(value)\n    } else {\n      // @ts-expect-error type mismatch\n      return search(\n        {\n          query: value,\n          ...config.fetch\n        },\n        {\n          track: config.nostoAnalytics ? \"autocomplete\" : undefined,\n          redirect: false,\n          hitDecorators: config.hitDecorators,\n          ...options\n        }\n      )\n    }\n  }\n\n  function getHistoryState(query: string): PromiseLike<State> {\n    // @ts-expect-error type mismatch\n    return Promise.resolve({\n      query: {\n        query\n      },\n      history: history?.getItems()\n    })\n  }\n\n  function updateState(inputValue?: string, options?: SearchAutocompleteOptions): PromiseLike<State> {\n    cancellable?.cancel()\n\n    if (inputValue && inputValue.length >= config.minQueryLength) {\n      cancellable = makeCancellable(fetchState(inputValue, config, options))\n      return cancellable.promise\n    } else if (history) {\n      return getHistoryState(inputValue ?? \"\")\n    }\n\n    return (\n      // @ts-expect-error type mismatch\n      cancellable?.promise ?? Promise.resolve<State>({})\n    )\n  }\n\n  function addHistoryItem(item: string): PromiseLike<State> {\n    if (history) {\n      history.add(item)\n    }\n    return getHistoryState(input.value)\n  }\n\n  function removeHistoryItem(item: string): PromiseLike<State> {\n    if (history) {\n      history.remove(item)\n    }\n    return getHistoryState(input.value)\n  }\n\n  function clearHistory(): PromiseLike<State> {\n    if (history) {\n      history.clear()\n    }\n    return getHistoryState(input.value)\n  }\n\n  return {\n    updateState,\n    addHistoryItem,\n    removeHistoryItem,\n    clearHistory\n  }\n}\n","type Selector = string | Element\n\nexport function findAll<T extends Element>(selector: Selector, filterType?: { new (): T }): T[] {\n  const elements = typeof selector === \"string\" ? Array.from(document.querySelectorAll(selector)) : [selector]\n  return elements.filter((v): v is T => (filterType ? v instanceof filterType : true))\n}\n\nexport async function DOMReady(): Promise<void> {\n  return new Promise(resolve => {\n    if (document.readyState !== \"loading\") {\n      resolve()\n    } else {\n      window.addEventListener(\"DOMContentLoaded\", () => {\n        resolve()\n      })\n    }\n  })\n}\n\nexport function parents(target: Selector, selector?: string): Element[] {\n  let parentList: Element[] = []\n  findAll(target).forEach(element => {\n    const parent = element.parentNode\n    if (parent !== document && parent instanceof Element) {\n      parentList.push(parent)\n      parentList = parentList.concat(parents(parent))\n    }\n  })\n  return parentList.filter(element => selector === undefined || matches(element, selector))\n}\n\nexport function matches(target: Selector, selector: string): boolean {\n  const matchesFunc =\n    Element.prototype.matches ||\n    // @ts-expect-error proprietary method\n    Element.prototype.msMatchesSelector ||\n    Element.prototype.webkitMatchesSelector\n  return findAll(target).some(element => matchesFunc.call(element, selector))\n}\n\nexport function bindClickOutside([element, input]: Array<HTMLElement>, callback: () => void) {\n  const onClick = (event: MouseEvent) => {\n    const target = event.target\n\n    if (target instanceof HTMLElement && element) {\n      if (target !== element && target !== input && !parents(target).includes(element)) {\n        callback()\n      }\n    }\n  }\n\n  document.addEventListener(\"click\", onClick)\n\n  return {\n    destroy: () => {\n      document.removeEventListener(\"click\", onClick)\n    }\n  }\n}\n","import { logger } from \"@nosto/search-js/utils\"\nimport { AutocompleteConfig, defaultGaConfig } from \"../lib/config\"\n\nconst localStorageKey = \"nosto:autocomplete:gaEvent\"\n\nexport function trackGaPageView(options?: { delay?: boolean; title?: string; location?: string }) {\n  const { delay = false, title = document.title, location = window.location.href } = options || {}\n\n  if (delay) {\n    saveToLocalStorage(title, location)\n  } else {\n    if (\"gtag\" in window && typeof window.gtag === \"function\") {\n      const accounts =\n        \"google_tag_manager\" in window && typeof window.google_tag_manager === \"object\"\n          ? Object.keys(window.google_tag_manager || []).filter(e => {\n              return e.substring(0, 2) == \"G-\"\n            })\n          : []\n\n      if (accounts.length > 1) {\n        for (let i = 0; i < accounts.length; i++) {\n          window.gtag(\"event\", \"page_view\", {\n            page_title: title,\n            page_location: location,\n            send_to: accounts[i]\n          })\n        }\n      } else {\n        window.gtag(\"event\", \"page_view\", {\n          page_title: title,\n          page_location: location\n        })\n      }\n    }\n    if (\n      \"ga\" in window &&\n      typeof window.ga === \"function\" &&\n      \"getAll\" in window.ga &&\n      typeof window.ga.getAll === \"function\"\n    ) {\n      try {\n        const url = new URL(location)\n        const trackers = window.ga!.getAll()\n        if (trackers?.length > 0) {\n          trackers[0]?.send(\"pageview\", url.pathname + url.search)\n        }\n      } catch (error) {\n        logger.warn(\"Could not send pageview to GA\", error)\n      }\n    }\n  }\n}\n\nexport const isGaEnabled = <State>(config: AutocompleteConfig<State>) =>\n  typeof config.googleAnalytics === \"boolean\"\n    ? config.googleAnalytics\n    : typeof config.googleAnalytics === \"object\" && config.googleAnalytics.enabled\n\nexport const getGaTrackUrl = <State>(value: string | undefined, config: AutocompleteConfig<State>) => {\n  const gaConfig = isGaEnabled(config)\n    ? typeof config.googleAnalytics === \"boolean\"\n      ? defaultGaConfig\n      : {\n          ...defaultGaConfig,\n          ...config.googleAnalytics\n        }\n    : undefined\n\n  if (value && gaConfig) {\n    try {\n      return new URL(\n        `${gaConfig?.serpPath || location.pathname}?${`${encodeURIComponent(\n          gaConfig.queryParamName\n        )}=${encodeURIComponent(value).replace(/%20/g, \"+\")}`}`,\n        window.location.origin\n      ).toString()\n    } catch (error) {\n      logger.warn(\"Could not create track url\", error)\n      return undefined\n    }\n  }\n}\n\nfunction saveToLocalStorage(title: string, location: string): void {\n  localStorage.setItem(localStorageKey, JSON.stringify({ title, location }))\n}\n\ninterface Event {\n  title: string\n  location: string\n}\n\nexport function consumeLocalStorageEvent() {\n  const eventString = localStorage.getItem(localStorageKey)\n  if (typeof eventString === \"string\") {\n    localStorage.removeItem(localStorageKey)\n    try {\n      const event: Event = JSON.parse(eventString)\n      trackGaPageView(event)\n    } catch (e) {\n      logger.warn(\"Could not consume pageView\", e)\n    }\n  }\n}\n","export default function (delay: number) {\n  let timeoutId: ReturnType<typeof setTimeout> | undefined\n  let leadingExecuted = false\n\n  return (callback: () => void) => {\n    if (!leadingExecuted) {\n      callback()\n      leadingExecuted = true\n    } else {\n      if (timeoutId) {\n        clearTimeout(timeoutId)\n      }\n      timeoutId = setTimeout(async () => {\n        await callback()\n        leadingExecuted = false\n      }, delay)\n    }\n  }\n}\n","import { logger } from \"@nosto/search-js/utils\"\nimport { DefaultState } from \"./state\"\n\ntype Items = NonNullable<DefaultState[\"history\"]>\n\nexport function createHistory(size: number) {\n  const localStorageKey = \"nosto:autocomplete:history\"\n  let items = get()\n\n  function get(): Items {\n    try {\n      return JSON.parse(localStorage.getItem(localStorageKey) ?? \"[]\") ?? []\n    } catch (err) {\n      logger.error(\"Could not get history items.\", err)\n      return []\n    }\n  }\n\n  function set(data: Items) {\n    try {\n      localStorage.setItem(localStorageKey, JSON.stringify(data))\n    } catch (err) {\n      logger.error(\"Could not set history items.\", err)\n    }\n  }\n\n  function add(item: string) {\n    set((items = [{ item }, ...(items?.filter(v => v.item !== item) || [])].slice(0, size)))\n  }\n\n  function clear() {\n    set((items = []))\n  }\n\n  function remove(item: string) {\n    set((items = items.filter(v => v.item !== item)))\n  }\n\n  function getItems() {\n    return items\n  }\n\n  return {\n    add,\n    clear,\n    remove,\n    getItems\n  }\n}\n\nexport type History = ReturnType<typeof createHistory>\n","import { recordSearchClick, recordSearchSubmit } from \"./client\"\nimport { AutocompleteConfig, getDefaultConfig } from \"./config\"\nimport { Dropdown, createDropdown, parseHit } from \"./dropdown\"\nimport { DefaultState, StateActions, getStateActions } from \"../utils/state\"\nimport { bindClickOutside, findAll } from \"../utils/dom\"\nimport { consumeLocalStorageEvent, getGaTrackUrl, isGaEnabled, trackGaPageView } from \"../utils/ga\"\nimport createDebouncer from \"../utils/debounce\"\nimport { createHistory } from \"../utils/history\"\nimport { bindInput, disableNativeAutocomplete } from \"@nosto/search-js/utils\"\nimport type { SearchOptions } from \"@nosto/nosto-js/client\"\nimport { logger } from \"@nosto/search-js/utils\"\n\nexport type AutocompleteInstance = {\n  /**\n   * Open the dropdown.\n   */\n  open(): void\n  /**\n   * Close the dropdown.\n   */\n  close(): void\n  /**\n   * Destroy the autocomplete instance.\n   */\n  destroy(): void\n}\n\nexport type SearchAutocompleteOptions = Pick<SearchOptions, \"isKeyword\" | \"redirect\">\n\n/**\n * @param config Autocomplete configuration.\n * @returns Autocomplete instance.\n * @group Autocomplete\n * @category Core\n * @example\n * ```js\n * import { autocomplete } from '@nosto/autocomplete';\n *\n * // Basic usage\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: (container, state) => {\n *     container.innerHTML = `\n *        <div>\n *         <h1>${state.query}</h1>\n *        <ul>\n *        ${state.response.products\n *          .map((product) => `<li>${product.name}</li>`)\n *          .join('')}\n *       </ul>\n *     </div>\n *    `;\n *   },\n *   fetch: {\n *     products: {\n *       fields: ['name', 'url', 'imageUrl', 'price', 'listPrice', 'brand'],\n *       size: 5\n *     },\n *     keywords: {\n *       size: 5,\n *       fields: ['keyword', '_highlight.keyword'],\n *       highlight: {\n *         preTag: `<strong>`,\n *         postTag: '</strong>'\n *       }\n *     }\n *   }\n * });\n *\n * // Liquid template.\n * import { autocomplete, fromRemoteLiquidTemplate, fromLiquidTemplate, defaultLiquidTemplate } from '@nosto/autocomplete/liquid';\n *\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: fromRemoteLiquidTemplate('autocomplete.liquid'),\n *   // Or:\n *   render: window.nostoAutocomplete.fromLiquidTemplate(defaultLiquidTemplate),\n *   ...\n * });\n *\n * // Mustache template.\n * import { autocomplete, fromRemoteMustacheTemplate, fromMustacheTemplate, defaultMustacheTemplate } from '@nosto/autocomplete/mustache';\n *\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: fromRemoteMustacheTemplate('autocomplete.mustache'),\n *   // Or:\n *   render: fromMustacheTemplate(defaultMustacheTemplate),\n *   ...\n * });\n *\n * // React example.\n * import { autocomplete, Autocomplete } from '@nosto/autocomplete/react';\n * import ReactDOM from 'react-dom';\n *\n * let reactRoot;\n *\n * autocomplete({\n *   inputSelector: '#search',\n *   dropdownSelector: '#dropdown',\n *   render: function (container, state) {\n *     if (!reactRoot) {\n *       reactRoot = ReactDOM.createRoot(container);\n *     }\n *     reactRoot.render(<Autocomplete {...state} />);\n *   },\n *   ...\n * });\n * ```\n */\nexport function autocomplete<State = DefaultState>(config: AutocompleteConfig<State>): AutocompleteInstance {\n  const fullConfig = {\n    ...getDefaultConfig<State>(),\n    ...config\n  } satisfies AutocompleteConfig<State>\n\n  const history = fullConfig.historyEnabled ? createHistory(fullConfig.historySize) : undefined\n\n  const debounce = createDebouncer(300)\n\n  if (isGaEnabled(config)) {\n    setTimeout(consumeLocalStorageEvent, 1000)\n  }\n\n  const dropdowns = findAll(config.inputSelector, HTMLInputElement).map(inputElement => {\n    const actions = getStateActions({\n      config: fullConfig,\n      history,\n      input: inputElement\n    })\n\n    const dropdown = createInputDropdown({\n      input: inputElement,\n      config: fullConfig,\n      actions\n    })\n\n    if (!dropdown) {\n      return\n    }\n\n    disableNativeAutocomplete(inputElement)\n\n    const input = bindInput(\n      inputElement,\n      {\n        onInput: async value => {\n          debounce(async () => {\n            const state = await actions.updateState(value)\n            dropdown.update(state)\n          })\n        },\n        onClick() {\n          dropdown.resetHighlight()\n        },\n        onFocus() {\n          dropdown.show()\n        },\n        onSubmit() {\n          if (dropdown.isOpen() && dropdown.hasHighlight()) {\n            const data = dropdown.getHighlight()?.dataset?.nsHit\n            if (data) {\n              trackClick({\n                config: fullConfig,\n                data,\n                query: inputElement.value\n              })\n            }\n            dropdown.handleSubmit()\n          } else {\n            submitWithContext({\n              actions,\n              config: fullConfig\n            })(inputElement.value)\n          }\n        },\n        onKeyDown(_, key) {\n          if (key === \"Escape\") {\n            dropdown.hide()\n          } else if (key === \"ArrowDown\") {\n            if (dropdown.isOpen()) {\n              dropdown.goDown()\n            } else {\n              dropdown.show()\n            }\n          } else if (key === \"ArrowUp\") {\n            if (dropdown.isOpen()) {\n              dropdown.goUp()\n            }\n          }\n        }\n      },\n      {\n        nativeSubmit: fullConfig.nativeSubmit\n      }\n    )\n\n    const clickOutside = bindClickOutside([dropdown.container, inputElement], () => {\n      dropdown.hide()\n    })\n\n    return {\n      open() {\n        dropdown.show()\n      },\n      close() {\n        dropdown.hide()\n      },\n      destroy() {\n        input.destroy()\n        clickOutside.destroy()\n        dropdown.destroy()\n      }\n    }\n  })\n\n  return {\n    destroy() {\n      dropdowns.forEach(dropdown => dropdown?.destroy())\n    },\n    open() {\n      dropdowns.forEach(dropdown => dropdown?.open())\n    },\n    close() {\n      dropdowns.forEach(dropdown => dropdown?.close())\n    }\n  }\n}\n\nfunction createInputDropdown<State>({\n  input,\n  config,\n  actions\n}: {\n  input: HTMLInputElement\n  config: AutocompleteConfig<State>\n  actions: StateActions<State>\n}): Dropdown<State> | undefined {\n  const dropdownElements =\n    typeof config.dropdownSelector === \"function\"\n      ? findAll(config.dropdownSelector(input), HTMLElement)\n      : findAll(config.dropdownSelector, HTMLElement)\n\n  if (dropdownElements.length === 0) {\n    logger.error(`No dropdown element found for input ${input}`)\n    return\n  } else if (dropdownElements.length > 1) {\n    logger.error(`Multiple dropdown elements found for input ${input}, using the first element`)\n  }\n\n  const dropdownElement = dropdownElements[0]\n\n  return createDropdown<State>(\n    dropdownElement,\n    actions.updateState(input.value),\n    config.render,\n    submitWithContext({\n      actions,\n      config\n    }),\n    value => (input.value = value),\n    config.routingHandler!,\n    {\n      removeHistory: async function ({ data, update }) {\n        if (data === \"all\") {\n          const state = await actions.clearHistory()\n          return update(state)\n        } else if (data) {\n          const state = await actions.removeHistoryItem(data)\n          return update(state)\n        }\n      },\n      hit: function ({ data }) {\n        if (data) {\n          trackClick({ config, data, query: input.value })\n        }\n      }\n    }\n  )\n}\n\nasync function trackClick<State>({\n  config,\n  data,\n  query\n}: {\n  config: AutocompleteConfig<State>\n  data: string\n  query: string\n}) {\n  if (!config.googleAnalytics && !config.nostoAnalytics) {\n    return\n  }\n\n  const parsedHit = parseHit(data)\n\n  if (config.nostoAnalytics) {\n    if (parsedHit) {\n      // @ts-expect-error type mismatch\n      recordSearchClick(parsedHit)\n    }\n  }\n\n  if (isGaEnabled(config)) {\n    if (parsedHit._redirect) {\n      trackGaPageView({\n        delay: true,\n        location: getGaTrackUrl(parsedHit.keyword, config)\n      })\n    }\n\n    if (parsedHit.url) {\n      trackGaPageView({\n        delay: true,\n        location: getGaTrackUrl(query, config)\n      })\n    }\n  }\n}\n\nfunction submitWithContext<State>(context: { config: AutocompleteConfig<State>; actions: StateActions<State> }) {\n  return async (value: string, options?: SearchAutocompleteOptions) => {\n    const { config, actions } = context\n    const { redirect = false } = options ?? {}\n\n    if (value.length > 0) {\n      if (config.historyEnabled) {\n        actions.addHistoryItem(value)\n      }\n\n      if (config.nostoAnalytics) {\n        recordSearchSubmit(value)\n      }\n\n      if (isGaEnabled(config)) {\n        trackGaPageView({\n          delay: true,\n          location: getGaTrackUrl(value, config)\n        })\n      }\n\n      if (!redirect && typeof config?.submit === \"function\") {\n        config.submit(value, config, options)\n      }\n    }\n  }\n}\n","import { s as y } from \"../index.es-XNBESE3P.js\";\nconst g = {\n  defaultCurrency: \"EUR\",\n  defaultLocale: \"en-US\",\n  /** @hidden  */\n  currencySettings: {}\n}, p = {\n  EUR: \"de-DE\",\n  GBP: \"en-GB\",\n  USD: \"en-US\",\n  AUD: \"en-AU\",\n  CAD: \"en-CA\",\n  //India, Afghanistan, Bangladesh, Bhutan, Myanmar, Nepal, and Pakistan uses lakhs and crores notation\n  INR: \"en-IN\",\n  AFN: \"en-IN\",\n  BDT: \"en-IN\",\n  BTN: \"en-IN\",\n  MMK: \"en-IN\",\n  NPR: \"en-IN\",\n  PKR: \"en-IN\"\n};\nfunction d(u = {}) {\n  const i = {\n    ...g,\n    ...u\n  };\n  u.currencySettings || y((t) => {\n    i.currencySettings = t.internal.getSettings().currencySettings ?? {};\n  });\n  function s(t, e) {\n    const { defaultCurrency: n, currencySettings: r, defaultLocale: o } = i, a = e ?? n, f = p[a] ?? o;\n    if (a in r) {\n      const c = r[a], l = new Intl.NumberFormat(f, {\n        useGrouping: !!c.groupingSeparator,\n        minimumFractionDigits: c.decimalPlaces,\n        maximumFractionDigits: c.decimalPlaces\n      }).formatToParts(t).map((m) => m.type === \"group\" ? c.groupingSeparator : m.type === \"decimal\" ? c.decimalCharacter : m.value).join(\"\");\n      return c?.currencyBeforeAmount ? `${c.currencyToken}${l}` : `${l}${c?.currencyToken}`;\n    }\n    return new Intl.NumberFormat(f, {\n      style: \"currency\",\n      currency: a\n    }).format(t);\n  }\n  return {\n    formatCurrency: s\n  };\n}\nfunction S(u) {\n  const { formatCurrency: i } = d(u);\n  function s(e, n) {\n    const r = {};\n    return e.price !== void 0 && (r.priceText = i(e.price, n)), e.listPrice !== void 0 && (r.listPriceText = i(e.listPrice, n)), Object.assign({}, e, r);\n  }\n  function t(e) {\n    return e.price !== void 0 || e.listPrice !== void 0;\n  }\n  return function(n) {\n    if (!t(n))\n      return n;\n    const r = s(n, n.priceCurrencyCode);\n    return r.skus && r.skus.some(t) && (r.skus = r.skus.map((o) => t(o) ? s(o, n.priceCurrencyCode) : o)), r;\n  };\n}\nexport {\n  d as getCurrencyFormatting,\n  S as priceDecorator\n};\n","import { autocomplete } from \"./autocomplete\"\nimport type { AutocompleteConfig } from \"./config\"\nimport type { DefaultState } from \"../index\"\n\ntype TemplateProps = {\n  handler: (template: string) => AutocompleteConfig<DefaultState>[\"render\"]\n  defaultTemplate: string\n}\n\nexport async function initAutocomplete(element: HTMLElement, { handler, defaultTemplate }: TemplateProps) {\n  const templateContent = element.querySelector<HTMLScriptElement>(\"script[autocomplete-template]\")?.textContent\n\n  const config = getConfigFromScript(element)\n  if (!Object.keys(config).length) {\n    throw new Error(\"NostoAutocomplete: Missing required config.\")\n  }\n  return autocomplete({\n    ...config,\n    nativeSubmit: true,\n    render: handler(templateContent ?? defaultTemplate),\n    submit(value) {\n      element.querySelector<HTMLInputElement>(config.inputSelector)!.value = value\n      element.querySelector(\"form\")?.submit()\n    }\n  })\n}\n\nfunction getConfigFromScript(element: HTMLElement) {\n  const config = element.querySelector(\"script[autocomplete-config]\")\n  return config ? JSON.parse(config.textContent!) : {}\n}\n","import { initAutocomplete } from \"../lib/components\"\nimport { fromMustacheTemplate, defaultMustacheTemplate } from \"./fromMustacheTemplate\"\n\n/**\n * Nosto Autocomplete Web Component using Mustache templates.\n *\n * This component integrates the Nosto Autocomplete functionality with Mustache templating.\n * It fetches the configuration from a script tag, compiles the Mustache template,\n * and initializes the autocomplete with the compiled template as the render function.\n * If a custom template isn't passed, the component will use the default Liquid template.\n *\n * @example\n * ```html\n * <nosto-autocomplete>\n *   <form>\n *     <input type=\"text\" id=\"input\" />\n *     <div id=\"results\"></div>\n *   </form>\n *   <script autocomplete-config type=\"application/json\">\n *     {\n *       \"inputSelector\": \"#input\",\n *       \"dropdownSelector\": \"#results\",\n *       \"fetch\": {\n *         \"products\": {\n *           \"fields\": [\"name\", \"url\", \"imageUrl\", \"price\", \"listPrice\", \"brand\"],\n *           \"size\": 5\n *         },\n *         \"keywords\": {\n *           \"size\": 5,\n *           \"fields\": [\"keyword\", \"_highlight.keyword\"]\n *         }\n *       }\n *     }\n *   </script>\n *   <script type=\"text/x-mustache-template\" autocomplete-template>\n *     <h1>{{query}}</h1>\n *     <ul>\n *       {{#products}}\n *         <li>{{name}}</li>\n *       {{/products}}\n *     </ul>\n *   </script>\n * </nosto-autocomplete>\n * ```\n */\nexport class NostoAutocomplete extends HTMLElement {\n  async connectedCallback() {\n    return initAutocomplete(this, {\n      handler: fromMustacheTemplate,\n      defaultTemplate: defaultMustacheTemplate\n    })\n  }\n}\n\ncustomElements.define(\"nosto-autocomplete\", NostoAutocomplete)\n"],"names":["objectToString","isArray","object","isFunction","typeStr","obj","escapeRegExp","string","hasProperty","propName","primitiveHasOwnProperty","primitive","regExpTest","testRegExp","re","nonSpaceRe","isWhitespace","entityMap","escapeHtml","s","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","parseTemplate","template","tags","lineHasNonSpace","sections","tokens","spaces","hasTag","nonSpace","indentation","tagIndex","stripSpace","openingTagRe","closingTagRe","closingCurlyRe","compileTags","tagsToCompile","mustache","scanner","Scanner","start","type","value","chr","token","openSection","i","valueLength","nestTokens","squashTokens","squashedTokens","lastToken","numTokens","nestedTokens","collector","section","match","index","Context","view","parentContext","name","cache","context","intermediateValue","names","lookupHit","Writer","key","cacheKey","isCacheEnabled","partials","config","originalTemplate","buffer","symbol","self","subRender","j","partial","filteredIndentation","partialByNl","indentedValue","escape","defaultWriter","fromMustacheTemplate","options","Mustache","helpers","container","state","o","n","g","recordSearchClick","hit","nostojs","api","recordSearchSubmit","query","c","r","u","S","f","a","I","l","m","d","O","C","t","e","h","R","b","k","y","T","z","E","p","w","N","W","_","D","M","J","V","K","x","defaultProductFields","search","fields","facets","size","from","response","searchFn","defaultGaConfig","getDefaultConfig","url","v","createDropdown","initialState","render","submit","updateInput","routingHandler","onClickBindings","elements","unbindCallbacks","isEmpty","selectedIndex","handleElementSubmit","el","parsedHit","parseHit","hide","loadElements","bindElementSubmit","bindDataCallbacks","callback","dataKey","data","onClick","update","onSubmit","highlight","prevIndex","dispose","resetHighlight","show","clear","isOpen","goDown","goUp","hasHighlight","handleSubmit","getHighlight","destroy","init","error","logger","CancellableError","makeCancellable","promise","hasCanceled_","resolve","reject","val","getStateActions","history","input","cancellable","fetchState","getHistoryState","updateState","inputValue","addHistoryItem","item","removeHistoryItem","clearHistory","findAll","selector","filterType","parents","target","parentList","element","parent","bindClickOutside","event","localStorageKey","trackGaPageView","delay","title","location","saveToLocalStorage","accounts","trackers","isGaEnabled","getGaTrackUrl","gaConfig","consumeLocalStorageEvent","eventString","timeoutId","leadingExecuted","createHistory","items","get","err","set","add","remove","getItems","autocomplete","fullConfig","debounce","createDebouncer","dropdowns","inputElement","actions","dropdown","createInputDropdown","disableNativeAutocomplete","bindInput","trackClick","submitWithContext","clickOutside","dropdownElements","dropdownElement","redirect","initAutocomplete","handler","defaultTemplate","templateContent","getConfigFromScript","NostoAutocomplete","defaultMustacheTemplate"],"mappings":"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","x_google_ignoreList":[0,2,3,5,6,7,10,19]}