UNPKG

@algolia/autocomplete-js

Version:

Fast and fully-featured autocomplete JavaScript library.

1,613 lines (1,360 loc) 146 kB
/*! @algolia/autocomplete-js 1.3.0 | MIT License | © Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['@algolia/autocomplete-js'] = {})); }(this, (function (exports) { 'use strict'; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function createRef(initialValue) { return { current: initialValue }; } function debounce(fn, time) { var timerId = undefined; return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (timerId) { clearTimeout(timerId); } timerId = setTimeout(function () { return fn.apply(void 0, args); }, time); }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _typeof$1(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$1 = function _typeof(obj) { return typeof obj; }; } else { _typeof$1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$1(obj); } /** * Decycles objects with circular references. * This is used to print cyclic structures in development environment only. */ function decycle(obj) { var seen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); if ( !obj || _typeof$1(obj) !== 'object') { return obj; } if (seen.has(obj)) { return '[Circular]'; } var newSeen = seen.add(obj); if (Array.isArray(obj)) { return obj.map(function (x) { return decycle(x, newSeen); }); } return Object.fromEntries(Object.entries(obj).map(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], value = _ref2[1]; return [key, decycle(value, newSeen)]; })); } function flatten(values) { return values.reduce(function (a, b) { return a.concat(b); }, []); } var autocompleteId = 0; function generateAutocompleteId() { return "autocomplete-".concat(autocompleteId++); } function getAttributeValueByPath(record, path) { return path.reduce(function (current, key) { return current && current[key]; }, record); } function getItemsCount(state) { if (state.collections.length === 0) { return 0; } return state.collections.reduce(function (sum, collection) { return sum + collection.items.length; }, 0); } /** * Throws an error if the condition is not met in development mode. * This is used to make development a better experience to provide guidance as * to where the error comes from. */ function invariant(condition, message) { if (!condition) { throw new Error("[Autocomplete] ".concat(typeof message === 'function' ? message() : message)); } } var warnCache = { current: {} }; /** * Logs a warning if the condition is not met. * This is used to log issues in development environment only. */ function warn(condition, message) { if (condition) { return; } var sanitizedMessage = message.trim(); var hasAlreadyPrinted = warnCache.current[sanitizedMessage]; if (!hasAlreadyPrinted) { warnCache.current[sanitizedMessage] = true; // eslint-disable-next-line no-console console.warn("[Autocomplete] ".concat(sanitizedMessage)); } } function checkOptions(options) { "development" !== 'production' ? warn(!options.debug, 'The `debug` option is meant for development debugging and should not be used in production.') : void 0 ; } function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function createStore(reducer, props, onStoreStateChange) { var state = props.initialState; return { getState: function getState() { return state; }, dispatch: function dispatch(action, payload) { var prevState = _objectSpread({}, state); state = reducer(state, { type: action, props: props, payload: payload }); onStoreStateChange({ state: state, prevState: prevState }); } }; } function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty$2(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function getAutocompleteSetters(_ref) { var store = _ref.store; var setActiveItemId = function setActiveItemId(value) { store.dispatch('setActiveItemId', value); }; var setQuery = function setQuery(value) { store.dispatch('setQuery', value); }; var setCollections = function setCollections(rawValue) { var baseItemId = 0; var value = rawValue.map(function (collection) { return _objectSpread$1(_objectSpread$1({}, collection), {}, { // We flatten the stored items to support calling `getAlgoliaResults` // from the source itself. items: flatten(collection.items).map(function (item) { return _objectSpread$1(_objectSpread$1({}, item), {}, { __autocomplete_id: baseItemId++ }); }) }); }); store.dispatch('setCollections', value); }; var setIsOpen = function setIsOpen(value) { store.dispatch('setIsOpen', value); }; var setStatus = function setStatus(value) { store.dispatch('setStatus', value); }; var setContext = function setContext(value) { store.dispatch('setContext', value); }; return { setActiveItemId: setActiveItemId, setQuery: setQuery, setCollections: setCollections, setIsOpen: setIsOpen, setStatus: setStatus, setContext: setContext }; } /** * Returns the next active item ID from the current state. * * We allow circular keyboard navigation from the base index. * The base index can either be `null` (nothing is highlighted) or `0` * (the first item is highlighted). * The base index is allowed to get assigned `null` only if * `props.defaultActiveItemId` is `null`. This pattern allows to "stop" * by the actual query before navigating to other suggestions as seen on * Google or Amazon. * * @param moveAmount The offset to increment (or decrement) the last index * @param baseIndex The current index to compute the next index from * @param itemCount The number of items * @param defaultActiveItemId The default active index to fallback to */ function getNextActiveItemId(moveAmount, baseIndex, itemCount, defaultActiveItemId) { if (!itemCount) { return null; } if (moveAmount < 0 && (baseIndex === null || defaultActiveItemId !== null && baseIndex === 0)) { return itemCount + moveAmount; } var numericIndex = (baseIndex === null ? -1 : baseIndex) + moveAmount; if (numericIndex <= -1 || numericIndex >= itemCount) { return defaultActiveItemId === null ? null : 0; } return numericIndex; } var noop = function noop() {}; function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$3(Object(source), true).forEach(function (key) { _defineProperty$3(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$3(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _typeof$2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$2 = function _typeof(obj) { return typeof obj; }; } else { _typeof$2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$2(obj); } function getNormalizedSources(getSources, params) { var seenSourceIds = []; return Promise.resolve(getSources(params)).then(function (sources) { invariant(Array.isArray(sources), function () { return "The `getSources` function must return an array of sources but returned type ".concat(JSON.stringify(_typeof$2(sources)), ":\n\n").concat(JSON.stringify(decycle(sources), null, 2)); }); return Promise.all(sources // We allow `undefined` and `false` sources to allow users to use // `Boolean(query) && source` (=> `false`). // We need to remove these values at this point. .filter(function (maybeSource) { return Boolean(maybeSource); }).map(function (source) { invariant(typeof source.sourceId === 'string', 'A source must provide a `sourceId` string.'); if (seenSourceIds.includes(source.sourceId)) { throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(source.sourceId), " is not unique.")); } seenSourceIds.push(source.sourceId); var normalizedSource = _objectSpread$2({ getItemInputValue: function getItemInputValue(_ref) { var state = _ref.state; return state.query; }, getItemUrl: function getItemUrl() { return undefined; }, onSelect: function onSelect(_ref2) { var setIsOpen = _ref2.setIsOpen; setIsOpen(false); }, onActive: noop }, source); return Promise.resolve(normalizedSource); })); }); } // We don't have access to the autocomplete source when we call `onKeyDown` // or `onClick` because those are native browser events. // However, we can get the source from the suggestion index. function getCollectionFromActiveItemId(state) { // Given 3 sources with respectively 1, 2 and 3 suggestions: [1, 2, 3] // We want to get the accumulated counts: // [1, 1 + 2, 1 + 2 + 3] = [1, 3, 3 + 3] = [1, 3, 6] var accumulatedCollectionsCount = state.collections.map(function (collections) { return collections.items.length; }).reduce(function (acc, collectionsCount, index) { var previousValue = acc[index - 1] || 0; var nextValue = previousValue + collectionsCount; acc.push(nextValue); return acc; }, []); // Based on the accumulated counts, we can infer the index of the suggestion. var collectionIndex = accumulatedCollectionsCount.reduce(function (acc, current) { if (current <= state.activeItemId) { return acc + 1; } return acc; }, 0); return state.collections[collectionIndex]; } /** * Gets the highlighted index relative to a suggestion object (not the absolute * highlighted index). * * Example: * [['a', 'b'], ['c', 'd', 'e'], ['f']] * ↑ * (absolute: 3, relative: 1) */ function getRelativeActiveItemId(_ref) { var state = _ref.state, collection = _ref.collection; var isOffsetFound = false; var counter = 0; var previousItemsOffset = 0; while (isOffsetFound === false) { var currentCollection = state.collections[counter]; if (currentCollection === collection) { isOffsetFound = true; break; } previousItemsOffset += currentCollection.items.length; counter++; } return state.activeItemId - previousItemsOffset; } function getActiveItem(state) { var collection = getCollectionFromActiveItemId(state); if (!collection) { return null; } var item = collection.items[getRelativeActiveItemId({ state: state, collection: collection })]; var source = collection.source; var itemInputValue = source.getItemInputValue({ item: item, state: state }); var itemUrl = source.getItemUrl({ item: item, state: state }); return { item: item, itemInputValue: itemInputValue, itemUrl: itemUrl, source: source }; } function isOrContainsNode(parent, child) { return parent === child || parent.contains(child); } function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$4(Object(source), true).forEach(function (key) { _defineProperty$4(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$4(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function mapToAlgoliaResponse(rawResults) { var results = rawResults.map(function (result) { var _hits; return _objectSpread$3(_objectSpread$3({}, result), {}, { hits: (_hits = result.hits) === null || _hits === void 0 ? void 0 : _hits.map(function (hit) { // Bring support for the Insights plugin. return _objectSpread$3(_objectSpread$3({}, hit), {}, { __autocomplete_indexName: result.index, __autocomplete_queryID: result.queryID }); }) }); }); return { results: results, hits: results.map(function (result) { return result.hits; }).filter(Boolean), facetHits: results.map(function (result) { var _facetHits; return (_facetHits = result.facetHits) === null || _facetHits === void 0 ? void 0 : _facetHits.map(function (facetHit) { // Bring support for the highlighting components. return { label: facetHit.value, count: facetHit.count, _highlightResult: { label: { value: facetHit.highlighted } } }; }); }).filter(Boolean) }; } function _toConsumableArray$1(arr) { return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$2(arr) || _nonIterableSpread$1(); } function _nonIterableSpread$1() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); } function _iterableToArray$1(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles$1(arr) { if (Array.isArray(arr)) return _arrayLikeToArray$2(arr); } function _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function ownKeys$5(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$5(Object(source), true).forEach(function (key) { _defineProperty$5(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$5(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function getDefaultProps(props, pluginSubscribers) { var _props$id; /* eslint-disable no-restricted-globals */ var environment = typeof window !== 'undefined' ? window : {}; /* eslint-enable no-restricted-globals */ var plugins = props.plugins || []; return _objectSpread$4(_objectSpread$4({ debug: false, openOnFocus: false, placeholder: '', autoFocus: false, defaultActiveItemId: null, stallThreshold: 300, environment: environment, shouldPanelOpen: function shouldPanelOpen(_ref) { var state = _ref.state; return getItemsCount(state) > 0; }, reshape: function reshape(_ref2) { var sources = _ref2.sources; return sources; } }, props), {}, { // Since `generateAutocompleteId` triggers a side effect (it increments // an internal counter), we don't want to execute it if unnecessary. id: (_props$id = props.id) !== null && _props$id !== void 0 ? _props$id : generateAutocompleteId(), plugins: plugins, // The following props need to be deeply defaulted. initialState: _objectSpread$4({ activeItemId: null, query: '', completion: null, collections: [], isOpen: false, status: 'idle', context: {} }, props.initialState), onStateChange: function onStateChange(params) { var _props$onStateChange; (_props$onStateChange = props.onStateChange) === null || _props$onStateChange === void 0 ? void 0 : _props$onStateChange.call(props, params); plugins.forEach(function (x) { var _x$onStateChange; return (_x$onStateChange = x.onStateChange) === null || _x$onStateChange === void 0 ? void 0 : _x$onStateChange.call(x, params); }); }, onSubmit: function onSubmit(params) { var _props$onSubmit; (_props$onSubmit = props.onSubmit) === null || _props$onSubmit === void 0 ? void 0 : _props$onSubmit.call(props, params); plugins.forEach(function (x) { var _x$onSubmit; return (_x$onSubmit = x.onSubmit) === null || _x$onSubmit === void 0 ? void 0 : _x$onSubmit.call(x, params); }); }, onReset: function onReset(params) { var _props$onReset; (_props$onReset = props.onReset) === null || _props$onReset === void 0 ? void 0 : _props$onReset.call(props, params); plugins.forEach(function (x) { var _x$onReset; return (_x$onReset = x.onReset) === null || _x$onReset === void 0 ? void 0 : _x$onReset.call(x, params); }); }, getSources: function getSources(params) { return Promise.all([].concat(_toConsumableArray$1(plugins.map(function (plugin) { return plugin.getSources; })), [props.getSources]).filter(Boolean).map(function (getSources) { return getNormalizedSources(getSources, params); })).then(function (nested) { return flatten(nested); }).then(function (sources) { return sources.map(function (source) { return _objectSpread$4(_objectSpread$4({}, source), {}, { onSelect: function onSelect(params) { source.onSelect(params); pluginSubscribers.forEach(function (x) { var _x$onSelect; return (_x$onSelect = x.onSelect) === null || _x$onSelect === void 0 ? void 0 : _x$onSelect.call(x, params); }); }, onActive: function onActive(params) { source.onActive(params); pluginSubscribers.forEach(function (x) { var _x$onActive; return (_x$onActive = x.onActive) === null || _x$onActive === void 0 ? void 0 : _x$onActive.call(x, params); }); } }); }); }); }, navigator: _objectSpread$4({ navigate: function navigate(_ref3) { var itemUrl = _ref3.itemUrl; environment.location.assign(itemUrl); }, navigateNewTab: function navigateNewTab(_ref4) { var itemUrl = _ref4.itemUrl; var windowReference = environment.open(itemUrl, '_blank', 'noopener'); windowReference === null || windowReference === void 0 ? void 0 : windowReference.focus(); }, navigateNewWindow: function navigateNewWindow(_ref5) { var itemUrl = _ref5.itemUrl; environment.open(itemUrl, '_blank', 'noopener'); } }, props.navigator) }); } function ownKeys$6(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$6(Object(source), true).forEach(function (key) { _defineProperty$6(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$6(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function reshape(_ref) { var collections = _ref.collections, props = _ref.props, state = _ref.state; // Sources are grouped by `sourceId` to conveniently pick them via destructuring. // Example: `const { recentSearchesPlugin } = sourcesBySourceId` var sourcesBySourceId = collections.reduce(function (acc, collection) { return _objectSpread$5(_objectSpread$5({}, acc), {}, _defineProperty$6({}, collection.source.sourceId, _objectSpread$5(_objectSpread$5({}, collection.source), {}, { getItems: function getItems() { // We provide the resolved items from the collection to the `reshape` prop. return flatten(collection.items); } }))); }, {}); var reshapeSources = props.reshape({ sources: Object.values(sourcesBySourceId), sourcesBySourceId: sourcesBySourceId, state: state }); // We reconstruct the collections with the items modified by the `reshape` prop. return flatten(reshapeSources).filter(Boolean).map(function (source) { return { source: source, items: source.getItems() }; }); } function _typeof$3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$3 = function _typeof(obj) { return typeof obj; }; } else { _typeof$3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$3(obj); } function _toConsumableArray$2(arr) { return _arrayWithoutHoles$2(arr) || _iterableToArray$2(arr) || _unsupportedIterableToArray$3(arr) || _nonIterableSpread$2(); } function _nonIterableSpread$2() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$3(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$3(o, minLen); } function _iterableToArray$2(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles$2(arr) { if (Array.isArray(arr)) return _arrayLikeToArray$3(arr); } function _arrayLikeToArray$3(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function ownKeys$7(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$7(Object(source), true).forEach(function (key) { _defineProperty$7(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$7(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$7(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function isDescription(item) { return Boolean(item.execute); } function isRequesterDescription(description) { return Boolean(description === null || description === void 0 ? void 0 : description.execute); } function preResolve(itemsOrDescription, sourceId) { if (isRequesterDescription(itemsOrDescription)) { return _objectSpread$6(_objectSpread$6({}, itemsOrDescription), {}, { requests: itemsOrDescription.queries.map(function (query) { return { query: query, sourceId: sourceId, transformResponse: itemsOrDescription.transformResponse }; }) }); } return { items: itemsOrDescription, sourceId: sourceId }; } function resolve(items) { var packed = items.reduce(function (acc, current) { if (!isDescription(current)) { acc.push(current); return acc; } var searchClient = current.searchClient, execute = current.execute, requests = current.requests; var container = acc.find(function (item) { return isDescription(current) && isDescription(item) && item.searchClient === searchClient && item.execute === execute; }); if (container) { var _container$items; (_container$items = container.items).push.apply(_container$items, _toConsumableArray$2(requests)); } else { var request = { execute: execute, items: requests, searchClient: searchClient }; acc.push(request); } return acc; }, []); var values = packed.map(function (maybeDescription) { if (!isDescription(maybeDescription)) { return Promise.resolve(maybeDescription); } var _ref = maybeDescription, execute = _ref.execute, items = _ref.items, searchClient = _ref.searchClient; return execute({ searchClient: searchClient, requests: items }); }); return Promise.all(values).then(function (responses) { return flatten(responses); }); } function postResolve(responses, sources) { return sources.map(function (source) { var matches = responses.filter(function (response) { return response.sourceId === source.sourceId; }); var results = matches.map(function (_ref2) { var items = _ref2.items; return items; }); var transform = matches[0].transformResponse; var items = transform ? transform(mapToAlgoliaResponse(results)) : results; invariant(Array.isArray(items), function () { return "The `getItems` function from source \"".concat(source.sourceId, "\" must return an array of items but returned type ").concat(JSON.stringify(_typeof$3(items)), ":\n\n").concat(JSON.stringify(decycle(items), null, 2), ".\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"); }); invariant(items.every(Boolean), "The `getItems` function from source \"".concat(source.sourceId, "\" must return an array of items but returned ").concat(JSON.stringify(undefined), ".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems")); return { source: source, items: items }; }); } function ownKeys$8(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$7(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$8(Object(source), true).forEach(function (key) { _defineProperty$8(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$8(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$8(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectWithoutProperties$1(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose$1(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose$1(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } var lastStalledId = null; function onInput(_ref) { var event = _ref.event, _ref$nextState = _ref.nextState, nextState = _ref$nextState === void 0 ? {} : _ref$nextState, props = _ref.props, query = _ref.query, refresh = _ref.refresh, store = _ref.store, setters = _objectWithoutProperties$1(_ref, ["event", "nextState", "props", "query", "refresh", "store"]); if (lastStalledId) { props.environment.clearTimeout(lastStalledId); } var setCollections = setters.setCollections, setIsOpen = setters.setIsOpen, setQuery = setters.setQuery, setActiveItemId = setters.setActiveItemId, setStatus = setters.setStatus; setQuery(query); setActiveItemId(props.defaultActiveItemId); if (!query && props.openOnFocus === false) { var _nextState$isOpen; setStatus('idle'); setCollections(store.getState().collections.map(function (collection) { return _objectSpread$7(_objectSpread$7({}, collection), {}, { items: [] }); })); setIsOpen((_nextState$isOpen = nextState.isOpen) !== null && _nextState$isOpen !== void 0 ? _nextState$isOpen : props.shouldPanelOpen({ state: store.getState() })); return Promise.resolve(); } setStatus('loading'); lastStalledId = props.environment.setTimeout(function () { setStatus('stalled'); }, props.stallThreshold); return props.getSources(_objectSpread$7({ query: query, refresh: refresh, state: store.getState() }, setters)).then(function (sources) { setStatus('loading'); return Promise.all(sources.map(function (source) { return Promise.resolve(source.getItems(_objectSpread$7({ query: query, refresh: refresh, state: store.getState() }, setters))).then(function (itemsOrDescription) { return preResolve(itemsOrDescription, source.sourceId); }); })).then(resolve).then(function (responses) { return postResolve(responses, sources); }).then(function (collections) { return reshape({ collections: collections, props: props, state: store.getState() }); }).then(function (collections) { var _nextState$isOpen2; setStatus('idle'); setCollections(collections); var isPanelOpen = props.shouldPanelOpen({ state: store.getState() }); setIsOpen((_nextState$isOpen2 = nextState.isOpen) !== null && _nextState$isOpen2 !== void 0 ? _nextState$isOpen2 : props.openOnFocus && !query && isPanelOpen || isPanelOpen); var highlightedItem = getActiveItem(store.getState()); if (store.getState().activeItemId !== null && highlightedItem) { var item = highlightedItem.item, itemInputValue = highlightedItem.itemInputValue, itemUrl = highlightedItem.itemUrl, source = highlightedItem.source; source.onActive(_objectSpread$7({ event: event, item: item, itemInputValue: itemInputValue, itemUrl: itemUrl, refresh: refresh, source: source, state: store.getState() }, setters)); } }).finally(function () { if (lastStalledId) { props.environment.clearTimeout(lastStalledId); } }); }); } function ownKeys$9(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread$8(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$9(Object(source), true).forEach(function (key) { _defineProperty$9(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$9(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty$9(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectWithoutProperties$2(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose$2(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose$2(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function onKeyDown(_ref) { var event = _ref.event, props = _ref.props, refresh = _ref.refresh, store = _ref.store, setters = _objectWithoutProperties$2(_ref, ["event", "props", "refresh", "store"]); if (event.key === 'ArrowUp' || event.key === 'ArrowDown') { // eslint-disable-next-line no-inner-declarations var triggerScrollIntoView = function triggerScrollIntoView() { var nodeItem = props.environment.document.getElementById("".concat(props.id, "-item-").concat(store.getState().activeItemId)); if (nodeItem) { if (nodeItem.scrollIntoViewIfNeeded) { nodeItem.scrollIntoViewIfNeeded(false); } else { nodeItem.scrollIntoView(false); } } }; // eslint-disable-next-line no-inner-declarations var triggerOnActive = function triggerOnActive() { var highlightedItem = getActiveItem(store.getState()); if (store.getState().activeItemId !== null && highlightedItem) { var item = highlightedItem.item, itemInputValue = highlightedItem.itemInputValue, itemUrl = highlightedItem.itemUrl, source = highlightedItem.source; source.onActive(_objectSpread$8({ event: event, item: item, itemInputValue: