{"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-B8mbAxS4.js","../../node_modules/@nosto/search-js/dist/logger-DVwg4Wor.js","../../node_modules/@nosto/search-js/dist/search-BrR80UbS.js","../../src/lib/search.ts","../../src/lib/config.ts","../../node_modules/@nosto/search-js/dist/utils/utils.es.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>(\n  template: string,\n  options?: Options\n) {\n  if (Mustache === undefined) {\n    throw new Error(\n      \"Mustache is not defined. Please include the Mustache dependency or library in your page.\"\n    )\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}","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 b } from \"./settings-DN0V2st5.js\";\nimport { g as T, n as U } from \"./settings-DN0V2st5.js\";\nfunction C() {\n  return typeof window.nosto < \"u\";\n}\nfunction N() {\n  return window.nosto;\n}\nconst h = {\n  production: \"https://connect.nosto.com/\",\n  staging: \"https://connect.staging.nosto.com/\",\n  local: \"https://connect.nosto.com/\"\n};\nfunction l(r) {\n  return h[r ?? \"production\"];\n}\nfunction k({ merchantId: r, env: o, options: n, shopifyInternational: e, scriptLoader: a }) {\n  var i, m;\n  const t = document.querySelector(\"script[nosto-language], script[nosto-market-id]\"), c = String((e == null ? void 0 : e.marketId) || \"\"), d = (e == null ? void 0 : e.language) || \"\", w = (t == null ? void 0 : t.getAttribute(\"nosto-language\")) !== d || (t == null ? void 0 : t.getAttribute(\"nosto-market-id\")) !== c;\n  if (!t || w) {\n    const s = document.querySelector(\"#nosto-sandbox\");\n    (i = t == null ? void 0 : t.parentNode) == null || i.removeChild(t), (m = s == null ? void 0 : s.parentNode) == null || m.removeChild(s);\n    const u = new URL(\"/script/shopify/market/nosto.js\", l(o));\n    u.searchParams.append(\"merchant\", r), u.searchParams.append(\"market\", c), u.searchParams.append(\"locale\", d.toLowerCase());\n    const f = {\n      ...n == null ? void 0 : n.attributes,\n      \"nosto-language\": d,\n      \"nosto-market-id\": c\n    };\n    return (a ?? g)(u.toString(), { ...n, attributes: f });\n  }\n  return Promise.resolve();\n}\nfunction v(r) {\n  if (r.shopifyInternational)\n    return k(r);\n  const { merchantId: o, env: n, options: e, scriptLoader: a } = r, t = a ?? g, c = new URL(`/include/${o}`, l(n));\n  return t(c.toString(), e);\n}\nfunction g(r, o) {\n  return new Promise((e, a) => {\n    const t = document.createElement(\"script\");\n    t.src = r, t.async = !0, t.type = \"text/javascript\", t.onload = () => e(), t.onerror = () => a(), Object.entries((o == null ? void 0 : o.attributes) ?? {}).forEach(([c, d]) => t.setAttribute(c, d)), (o == null ? void 0 : o.position) === \"head\" ? document.head.appendChild(t) : document.body.appendChild(t);\n  });\n}\nasync function L(r, o, n) {\n  var e;\n  if (!((e = window.Nosto) != null && e.addSkuToCart))\n    throw new Error(\"Nosto addSkuToCart function is not available\");\n  await window.Nosto.addSkuToCart(r, o, n);\n}\ntypeof window < \"u\" && b();\nexport {\n  L as addSkuToCart,\n  N as getNostoWindow,\n  T as getSettings,\n  v as init,\n  b as initNostoStub,\n  C as isNostoLoaded,\n  U 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 t() {\n  window.nostojs = window.nostojs ?? function(o) {\n    (window.nostojs.q = window.nostojs.q ?? []).push(o);\n  };\n}\nasync function u(o) {\n  return window.nostojs(o);\n}\nlet i = null;\ntypeof window < \"u\" && (t(), u((o) => {\n  i = o.internal.getSettings();\n}));\nfunction a() {\n  return i;\n}\nasync function d(o, w, s) {\n  var n;\n  if (!((n = window.Nosto) != null && n.addSkuToCart))\n    throw new Error(\"Nosto addSkuToCart function is not available\");\n  await window.Nosto.addSkuToCart(o, w, s);\n}\ntypeof window < \"u\" && t();\nexport {\n  d as L,\n  a as i,\n  u as s\n};\n","import { s as u } from \"./index.es-B8mbAxS4.js\";\nconst i = (r) => String(r) === \"[object Object]\";\nfunction s(r) {\n  if (!i(r))\n    return !1;\n  const e = r.constructor;\n  if (e === void 0)\n    return !0;\n  const t = e.prototype;\n  return !(!i(t) || !t.hasOwnProperty(\"isPrototypeOf\"));\n}\nfunction f(r, e) {\n  if (r === e)\n    return !0;\n  if (r instanceof Date && e instanceof Date)\n    return r.getTime() === e.getTime();\n  if (Array.isArray(r) && Array.isArray(e))\n    return r.length !== e.length ? !1 : r.every((t, n) => f(t, e[n]));\n  if (s(r) && s(e)) {\n    const t = Object.entries(r);\n    return t.length !== Object.keys(e).length ? !1 : t.every(([n, c]) => f(c, e[n]));\n  }\n  return !1;\n}\nfunction o(r) {\n  return (...e) => {\n    u((t) => {\n      (t.internal.context.mode.isPreview() ? console[r] : t.internal.logger[r])(...e);\n    });\n  };\n}\nconst a = {\n  debug: o(\"debug\"),\n  info: o(\"info\"),\n  warn: o(\"warn\"),\n  error: o(\"error\")\n};\nexport {\n  s as a,\n  f as i,\n  a as l\n};\n","import { s as N } from \"./index.es-B8mbAxS4.js\";\nimport { l, i as R } from \"./logger-DVwg4Wor.js\";\nasync function T(t, { hitDecorators: e, ...n }, s) {\n  var o, i;\n  const r = await s(t, n);\n  if (!((i = (o = r.products) == null ? void 0 : o.hits) != null && i.length) || !(e != null && e.length))\n    return r;\n  const c = (a) => e.reduce((u, f) => f(u), a);\n  return {\n    ...r,\n    products: {\n      ...r.products,\n      hits: r.products.hits.map(c)\n    }\n  };\n}\nfunction z(t, e, n) {\n  const s = JSON.stringify(e);\n  try {\n    n.setItem(t, s);\n  } catch (r) {\n    l.warn(r);\n  }\n}\nfunction O(t, e) {\n  try {\n    const n = e.getItem(t);\n    if (n)\n      return JSON.parse(n);\n  } catch (n) {\n    l.warn(n);\n  }\n}\nfunction E(t, e) {\n  z(t, e, sessionStorage);\n}\nfunction J(t) {\n  return O(t, sessionStorage);\n}\nconst b = \"nosto:search-js:cache\", k = 60 * 1e3;\nfunction I(t, e) {\n  E(b, { query: t, result: e, created: Date.now() });\n}\nfunction M(t) {\n  const e = J(b);\n  if (!e || !V(e))\n    return null;\n  const n = C(e.query);\n  return !R(C(t), n) || Date.now() - e.created > k ? null : e.result;\n}\nfunction C(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 V(t) {\n  return typeof t == \"object\" && t !== null && \"query\" in t && \"result\" in t && \"created\" in t;\n}\nasync function W(t, { usePersistentCache: e, ...n }, s) {\n  if (!e)\n    return s(t, n);\n  const r = await j(t, n, s);\n  return I(t, r), r;\n}\nasync function j(t, e, n) {\n  var h, g, m, S, w, y;\n  const { from: s = 0, size: r = 0 } = t.products || {}, c = M(t);\n  if (!c)\n    return await n(t, e);\n  const o = ((h = c == null ? void 0 : c.products) == null ? void 0 : h.size) ?? 0, i = ((g = c == null ? void 0 : c.products) == null ? void 0 : g.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: ((m = c.products) == null ? void 0 : m.total) || 0\n      }\n    };\n  const a = r - i.length, u = s > 0 ? s + 1 : r - a, f = {\n    ...t,\n    products: {\n      ...t.products,\n      from: u,\n      size: a\n    }\n  }, p = await n(f, e);\n  return {\n    ...c,\n    products: {\n      ...c.products,\n      size: r,\n      hits: [...((S = c.products) == null ? void 0 : S.hits) || [], ...((w = p.products) == null ? void 0 : w.hits) || []],\n      total: ((y = p.products) == null ? void 0 : y.total) || 0\n    }\n  };\n}\nconst x = 3e4, d = /* @__PURE__ */ new Map();\nfunction A(t, e) {\n  const n = d.get(t);\n  if (!n) return;\n  const s = Date.now() - n.created > x, r = R(e, n.query);\n  if (s || !r) {\n    d.delete(t);\n    return;\n  }\n  return n.result;\n}\nfunction K(t, e, n) {\n  d.set(t, {\n    query: e,\n    result: n,\n    created: Date.now()\n  });\n}\nasync function L(t, e, n) {\n  if (!e.useMemoryCache)\n    return n(t, e);\n  const s = JSON.stringify(t), r = A(s, t);\n  if (r) return r;\n  const c = await n(t, e);\n  return K(s, t, c), c;\n}\nfunction P(t) {\n  return new Promise((e) => setTimeout(e, t));\n}\nasync function _(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 (!F(o))\n        throw l.info(\"Skipping retry logic for\", o), o;\n      c++, await P(n);\n    }\n}\nfunction F(t) {\n  return !t || typeof t != \"object\" ? !1 : !(\"status\" in t) || G(t.status);\n}\nfunction G(t) {\n  return typeof t == \"number\" && (t < 400 || t >= 500);\n}\nasync function v(t, e = {}) {\n  const n = await new Promise(N);\n  return H(n.search, _, L, W, T)(t, e);\n}\nfunction H(t, ...e) {\n  return e.reduce((n, s) => (r, c) => s(r, c, n), t);\n}\nexport {\n  v 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?: (\n    query: string,\n    config: AutocompleteConfig<State>,\n    options?: SearchAutocompleteOptions\n  ) => 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 (\n        query.length >=\n        (config.minQueryLength ?? getDefaultConfig<State>().minQueryLength)\n      ) {\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","import { d as A } from \"../deepMerge-CZwCJzEe.js\";\nimport { i as y, a as L, m as h, u as t } from \"../unique-m1TIDWdl.js\";\nimport { i as b, a as j, l as B } from \"../logger-DVwg4Wor.js\";\nimport { p as O } from \"../parseNumber-QA48nJLp.js\";\nimport { p as U } from \"../pick-DReBictn.js\";\nfunction k(s) {\n  s.setAttribute(\"autocomplete\", \"off\");\n}\nfunction E(s, { onClick: a, onFocus: c, onInput: o, onKeyDown: i, onSubmit: f }, { form: u = s.form ?? void 0, nativeSubmit: p } = {}) {\n  const d = [];\n  function r(e, l, v) {\n    e.addEventListener(l, v), d.push(() => e.removeEventListener(l, v));\n  }\n  return (i || f) && r(s, \"keydown\", (e) => {\n    i == null || i(s.value, e.key), i && (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") ? e.preventDefault() : f && e.key === \"Enter\" && (s.value !== \"\" && !e.repeat && f(s.value), p || e.preventDefault());\n  }), f && u && (r(u, \"submit\", (e) => {\n    p || e.preventDefault(), f(s.value);\n  }), u.querySelectorAll(\"[type=submit]\").forEach((e) => {\n    r(e, \"click\", (l) => {\n      p || l.preventDefault(), f(s.value);\n    });\n  })), a && r(s, \"click\", () => a(s.value)), c && r(s, \"focus\", () => c(s.value)), o && r(s, \"input\", () => o(s.value)), {\n    destroy() {\n      d.forEach((e) => e());\n    }\n  };\n}\nexport {\n  E as bindInput,\n  A as deepMerge,\n  k as disableNativeAutocomplete,\n  y as isBot,\n  b as isEqual,\n  j as isPlainObject,\n  B as logger,\n  L as measure,\n  h as mergeArrays,\n  O as parseNumber,\n  U as pick,\n  t as unique\n};\n","import { logger } from \"@nosto/search-js/utils\"\nimport { SearchAutocompleteOptions } from \"./autocomplete\"\n\ntype OnClickBindings<State> = {\n  [key: string]: (obj: {\n    data: string | undefined\n    el: HTMLElement\n    update: (state: State) => void\n  }) => 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\t\troutingHandler(parsedHit.url)\n      }\n    }\n  }\n\n  function loadElements() {\n    isEmpty = !container.innerHTML.trim()\n\n    if (!isEmpty) {\n      elements = Array.from<HTMLElement>(\n        container.querySelectorAll(\"[data-ns-hit]\")\n      ).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\n        .replace(/([A-Z])/g, \"-$1\")\n        .toLowerCase()}]`\n\n      Array.from<HTMLElement>(container.querySelectorAll(dataKey)).map(el => {\n        const data =\n          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 =>\n        hasCanceled_\n          ? reject(new CancellableError(\"cancelled promise\"))\n          : resolve(val),\n      error =>\n        hasCanceled_\n          ? reject(new CancellableError(\"cancelled promise\"))\n          : 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  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(\n    inputValue?: string,\n    options?: SearchAutocompleteOptions\n  ): 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>(\n  selector: Selector,\n  filterType?: { new (): T }\n): T[] {\n  const elements =\n    typeof selector === \"string\"\n      ? Array.from(document.querySelectorAll(selector))\n      : [selector]\n  return elements.filter((v): v is T =>\n    filterType ? v instanceof filterType : true\n  )\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(\n    element => selector === undefined || matches(element, selector)\n  )\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(\n  [element, input]: Array<HTMLElement>,\n  callback: () => void\n) {\n  const onClick = (event: MouseEvent) => {\n    const target = event.target\n\n    if (target instanceof HTMLElement && element) {\n      if (\n        target !== element &&\n        target !== input &&\n        !parents(target).includes(element)\n      ) {\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?: {\n  delay?: boolean\n  title?: string\n  location?: string\n}) {\n  const {\n    delay = false,\n    title = document.title,\n    location = window.location.href,\n  } = 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 &&\n        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\" &&\n      config.googleAnalytics.enabled\n\nexport const getGaTrackUrl = <State>(\n  value: string | undefined,\n  config: AutocompleteConfig<State>\n) => {\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(\n      (items = [{ item }, ...(items?.filter(v => v.item !== item) || [])].slice(\n        0,\n        size\n      ))\n    )\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<\n  SearchOptions,\n  \"isKeyword\" | \"redirect\"\n>\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>(\n  config: AutocompleteConfig<State>\n): AutocompleteInstance {\n  const fullConfig = {\n    ...getDefaultConfig<State>(),\n    ...config,\n  } satisfies AutocompleteConfig<State>\n\n  const history = fullConfig.historyEnabled\n    ? createHistory(fullConfig.historySize)\n    : 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(\n    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(inputElement, {\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        nativeSubmit: fullConfig.nativeSubmit,\n      })\n\n      const clickOutside = bindClickOutside(\n        [dropdown.container, inputElement],\n        () => {\n          dropdown.hide()\n        }\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\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(\n      `Multiple dropdown elements found for input ${input}, using the first element`\n    )\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: {\n  config: AutocompleteConfig<State>\n  actions: StateActions<State>\n}) {\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-B8mbAxS4.js\";\nconst p = {\n  defaultCurrency: \"EUR\",\n  defaultLocale: \"en-US\",\n  /** @hidden  */\n  currencySettings: {}\n}, d = {\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 g(i = {}) {\n  const o = {\n    ...p,\n    ...i\n  };\n  i.currencySettings || y((c) => {\n    o.currencySettings = c.internal.getSettings().currencySettings ?? {};\n  });\n  function a(c, n) {\n    const { defaultCurrency: t, currencySettings: r, defaultLocale: u } = o, s = n ?? t, f = d[s] ?? u;\n    if (s in r) {\n      const e = r[s], l = new Intl.NumberFormat(f, {\n        useGrouping: !!e.groupingSeparator,\n        minimumFractionDigits: e.decimalPlaces,\n        maximumFractionDigits: e.decimalPlaces\n      }).formatToParts(c).map((m) => m.type === \"group\" ? e.groupingSeparator : m.type === \"decimal\" ? e.decimalCharacter : m.value).join(\"\");\n      return e != null && e.currencyBeforeAmount ? `${e.currencyToken}${l}` : `${l}${e == null ? void 0 : e.currencyToken}`;\n    }\n    return new Intl.NumberFormat(f, {\n      style: \"currency\",\n      currency: s\n    }).format(c);\n  }\n  return {\n    formatCurrency: a\n  };\n}\nfunction S(i) {\n  const { formatCurrency: o } = g(i);\n  function a(n, t) {\n    const r = {};\n    return n.price !== void 0 && (r.priceText = o(n.price, t)), n.listPrice !== void 0 && (r.listPriceText = o(n.listPrice, t)), Object.assign({}, n, r);\n  }\n  function c(n) {\n    return n.price !== void 0 || n.listPrice !== void 0;\n  }\n  return function(t) {\n    if (!c(t))\n      return t;\n    const r = a(t, t.priceCurrencyCode);\n    return r.skus && r.skus.some(c) && (r.skus = r.skus.map((u) => c(u) ? a(u, t.priceCurrencyCode) : u)), r;\n  };\n}\nexport {\n  g 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(\n  element: HTMLElement,\n  { handler, defaultTemplate }: TemplateProps\n) {\n  const templateContent = element.querySelector<HTMLScriptElement>(\n    \"script[autocomplete-template]\"\n  )?.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 {\n  fromMustacheTemplate,\n  defaultMustacheTemplate,\n} 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","b","recordSearchClick","hit","nostojs","api","recordSearchSubmit","query","t","u","r","e","f","c","a","T","z","l","O","E","J","k","I","M","V","C","R","W","h","g","m","S","w","y","p","x","d","A","K","L","P","_","F","G","v","N","H","defaultProductFields","search","fields","facets","size","from","response","searchFn","defaultGaConfig","getDefaultConfig","url","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]}