@algolia/autocomplete-core 1.2.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/esm/createAutocomplete.d.ts +8 -2
  2. package/dist/esm/createAutocomplete.js +9 -1
  3. package/dist/esm/createStore.js +1 -1
  4. package/dist/esm/getAutocompleteSetters.js +2 -2
  5. package/dist/esm/getDefaultProps.js +14 -10
  6. package/dist/esm/getPropGetters.js +16 -10
  7. package/dist/esm/index.d.ts +0 -1
  8. package/dist/esm/index.js +1 -2
  9. package/dist/esm/metadata.d.ts +33 -0
  10. package/dist/esm/metadata.js +44 -0
  11. package/dist/esm/onInput.js +59 -37
  12. package/dist/esm/onKeyDown.js +4 -2
  13. package/dist/esm/reshape.d.ts +11 -0
  14. package/dist/esm/reshape.js +34 -0
  15. package/dist/esm/resolve.js +7 -5
  16. package/dist/esm/stateReducer.js +1 -1
  17. package/dist/esm/types/AutocompleteApi.js +1 -0
  18. package/dist/esm/types/AutocompleteCollection.js +1 -0
  19. package/dist/esm/types/AutocompleteContext.js +1 -0
  20. package/dist/esm/types/AutocompleteEnvironment.d.ts +1 -0
  21. package/dist/esm/types/AutocompleteEnvironment.js +1 -0
  22. package/dist/esm/types/AutocompleteNavigator.js +1 -0
  23. package/dist/esm/types/AutocompleteOptions.d.ts +12 -0
  24. package/dist/esm/types/AutocompleteOptions.js +1 -0
  25. package/dist/esm/types/AutocompletePlugin.d.ts +10 -0
  26. package/dist/esm/types/AutocompletePlugin.js +1 -0
  27. package/dist/esm/types/AutocompletePropGetters.js +1 -0
  28. package/dist/esm/types/AutocompleteReshape.d.ts +23 -0
  29. package/dist/esm/types/AutocompleteReshape.js +1 -0
  30. package/dist/esm/types/AutocompleteSetters.js +1 -0
  31. package/dist/esm/types/AutocompleteSource.js +1 -0
  32. package/dist/esm/types/AutocompleteState.js +1 -0
  33. package/dist/esm/types/AutocompleteStore.js +1 -0
  34. package/dist/esm/types/AutocompleteSubscribers.js +1 -0
  35. package/dist/esm/types/index.d.ts +1 -0
  36. package/dist/esm/types/index.js +1 -0
  37. package/dist/esm/utils/createConcurrentSafePromise.d.ts +1 -1
  38. package/dist/esm/utils/getNormalizedSources.js +5 -4
  39. package/dist/esm/utils/index.d.ts +0 -2
  40. package/dist/esm/utils/index.js +1 -3
  41. package/dist/esm/utils/mapToAlgoliaResponse.js +1 -1
  42. package/dist/umd/index.development.js +411 -148
  43. package/dist/umd/index.development.js.map +1 -1
  44. package/dist/umd/index.production.js +2 -2
  45. package/dist/umd/index.production.js.map +1 -1
  46. package/package.json +3 -3
  47. package/dist/esm/utils/flatten.d.ts +0 -1
  48. package/dist/esm/utils/flatten.js +0 -5
  49. package/dist/esm/utils/noop.d.ts +0 -1
  50. package/dist/esm/utils/noop.js +0 -1
  51. package/dist/esm/version.d.ts +0 -1
  52. package/dist/esm/version.js +0 -1
@@ -1,2 +1,8 @@
1
- import { AutocompleteApi, AutocompleteOptions, BaseItem } from './types';
2
- export declare function createAutocomplete<TItem extends BaseItem, TEvent = Event, TMouseEvent = MouseEvent, TKeyboardEvent = KeyboardEvent>(options: AutocompleteOptions<TItem>): AutocompleteApi<TItem, TEvent, TMouseEvent, TKeyboardEvent>;
1
+ import { AutocompleteApi, AutocompleteOptions as AutocompleteCoreOptions, BaseItem } from './types';
2
+ export interface AutocompleteOptionsWithMetadata<TItem extends BaseItem> extends AutocompleteCoreOptions<TItem> {
3
+ /**
4
+ * @internal
5
+ */
6
+ __autocomplete_metadata?: Record<string, unknown>;
7
+ }
8
+ export declare function createAutocomplete<TItem extends BaseItem, TEvent = Event, TMouseEvent = MouseEvent, TKeyboardEvent = KeyboardEvent>(options: AutocompleteOptionsWithMetadata<TItem>): AutocompleteApi<TItem, TEvent, TMouseEvent, TKeyboardEvent>;
@@ -1,4 +1,4 @@
1
- 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; }
1
+ 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; }
2
2
 
3
3
  function _objectSpread(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; }
4
4
 
@@ -9,6 +9,7 @@ import { createStore } from './createStore';
9
9
  import { getAutocompleteSetters } from './getAutocompleteSetters';
10
10
  import { getDefaultProps } from './getDefaultProps';
11
11
  import { getPropGetters } from './getPropGetters';
12
+ import { getMetadata, injectMetadata } from './metadata';
12
13
  import { onInput } from './onInput';
13
14
  import { stateReducer } from './stateReducer';
14
15
  export function createAutocomplete(options) {
@@ -65,6 +66,13 @@ export function createAutocomplete(options) {
65
66
  }
66
67
  }));
67
68
  });
69
+ injectMetadata({
70
+ metadata: getMetadata({
71
+ plugins: props.plugins,
72
+ options: options
73
+ }),
74
+ environment: props.environment
75
+ });
68
76
  return _objectSpread(_objectSpread({
69
77
  refresh: refresh
70
78
  }, propGetters), setters);
@@ -1,4 +1,4 @@
1
- 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; }
1
+ 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; }
2
2
 
3
3
  function _objectSpread(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; }
4
4
 
@@ -1,10 +1,10 @@
1
- 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; }
1
+ 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; }
2
2
 
3
3
  function _objectSpread(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; }
4
4
 
5
5
  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; }
6
6
 
7
- import { flatten } from './utils';
7
+ import { flatten } from '@algolia/autocomplete-shared';
8
8
  export function getAutocompleteSetters(_ref) {
9
9
  var store = _ref.store;
10
10
 
@@ -4,20 +4,20 @@ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread n
4
4
 
5
5
  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); }
6
6
 
7
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
7
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8
8
 
9
9
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
10
10
 
11
11
  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; }
12
12
 
13
- 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; }
13
+ 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; }
14
14
 
15
15
  function _objectSpread(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; }
16
16
 
17
17
  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; }
18
18
 
19
- import { getItemsCount, generateAutocompleteId } from '@algolia/autocomplete-shared';
20
- import { getNormalizedSources, flatten } from './utils';
19
+ import { getItemsCount, generateAutocompleteId, flatten } from '@algolia/autocomplete-shared';
20
+ import { getNormalizedSources } from './utils';
21
21
  export function getDefaultProps(props, pluginSubscribers) {
22
22
  var _props$id;
23
23
 
@@ -37,6 +37,10 @@ export function getDefaultProps(props, pluginSubscribers) {
37
37
  shouldPanelOpen: function shouldPanelOpen(_ref) {
38
38
  var state = _ref.state;
39
39
  return getItemsCount(state) > 0;
40
+ },
41
+ reshape: function reshape(_ref2) {
42
+ var sources = _ref2.sources;
43
+ return sources;
40
44
  }
41
45
  }, props), {}, {
42
46
  // Since `generateAutocompleteId` triggers a side effect (it increments
@@ -114,17 +118,17 @@ export function getDefaultProps(props, pluginSubscribers) {
114
118
  });
115
119
  },
116
120
  navigator: _objectSpread({
117
- navigate: function navigate(_ref2) {
118
- var itemUrl = _ref2.itemUrl;
121
+ navigate: function navigate(_ref3) {
122
+ var itemUrl = _ref3.itemUrl;
119
123
  environment.location.assign(itemUrl);
120
124
  },
121
- navigateNewTab: function navigateNewTab(_ref3) {
122
- var itemUrl = _ref3.itemUrl;
125
+ navigateNewTab: function navigateNewTab(_ref4) {
126
+ var itemUrl = _ref4.itemUrl;
123
127
  var windowReference = environment.open(itemUrl, '_blank', 'noopener');
124
128
  windowReference === null || windowReference === void 0 ? void 0 : windowReference.focus();
125
129
  },
126
- navigateNewWindow: function navigateNewWindow(_ref4) {
127
- var itemUrl = _ref4.itemUrl;
130
+ navigateNewWindow: function navigateNewWindow(_ref5) {
131
+ var itemUrl = _ref5.itemUrl;
128
132
  environment.open(itemUrl, '_blank', 'noopener');
129
133
  }
130
134
  }, props.navigator)
@@ -1,4 +1,10 @@
1
- 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; }
1
+ var _excluded = ["props", "refresh", "store"],
2
+ _excluded2 = ["inputElement", "formElement", "panelElement"],
3
+ _excluded3 = ["inputElement"],
4
+ _excluded4 = ["inputElement", "maxLength"],
5
+ _excluded5 = ["item", "source"];
6
+
7
+ 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; }
2
8
 
3
9
  function _objectSpread(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; }
4
10
 
@@ -15,13 +21,13 @@ export function getPropGetters(_ref) {
15
21
  var props = _ref.props,
16
22
  refresh = _ref.refresh,
17
23
  store = _ref.store,
18
- setters = _objectWithoutProperties(_ref, ["props", "refresh", "store"]);
24
+ setters = _objectWithoutProperties(_ref, _excluded);
19
25
 
20
26
  var getEnvironmentProps = function getEnvironmentProps(providedProps) {
21
27
  var inputElement = providedProps.inputElement,
22
28
  formElement = providedProps.formElement,
23
29
  panelElement = providedProps.panelElement,
24
- rest = _objectWithoutProperties(providedProps, ["inputElement", "formElement", "panelElement"]);
30
+ rest = _objectWithoutProperties(providedProps, _excluded2);
25
31
 
26
32
  return _objectSpread({
27
33
  // On touch devices, we do not rely on the native `blur` event of the
@@ -29,15 +35,15 @@ export function getPropGetters(_ref) {
29
35
  // outside of the autocomplete elements.
30
36
  // This ensures a working experience on mobile because we blur the input
31
37
  // on touch devices when the user starts scrolling (`touchmove`).
38
+ // @TODO: support cases where there are multiple Autocomplete instances.
39
+ // Right now, a second instance makes this computation return false.
32
40
  onTouchStart: function onTouchStart(event) {
33
41
  if (store.getState().isOpen === false || event.target === inputElement) {
34
42
  return;
35
- } // @TODO: support cases where there are multiple Autocomplete instances.
36
- // Right now, a second instance makes this computation return false.
37
-
43
+ }
38
44
 
39
45
  var isTargetWithinAutocomplete = [formElement, panelElement].some(function (contextNode) {
40
- return isOrContainsNode(contextNode, event.target) || isOrContainsNode(contextNode, props.environment.document.activeElement);
46
+ return isOrContainsNode(contextNode, event.target);
41
47
  });
42
48
 
43
49
  if (isTargetWithinAutocomplete === false) {
@@ -70,7 +76,7 @@ export function getPropGetters(_ref) {
70
76
 
71
77
  var getFormProps = function getFormProps(providedProps) {
72
78
  var inputElement = providedProps.inputElement,
73
- rest = _objectWithoutProperties(providedProps, ["inputElement"]);
79
+ rest = _objectWithoutProperties(providedProps, _excluded3);
74
80
 
75
81
  return _objectSpread({
76
82
  action: '',
@@ -126,7 +132,7 @@ export function getPropGetters(_ref) {
126
132
  inputElement = _ref2.inputElement,
127
133
  _ref2$maxLength = _ref2.maxLength,
128
134
  maxLength = _ref2$maxLength === void 0 ? 512 : _ref2$maxLength,
129
- rest = _objectWithoutProperties(_ref2, ["inputElement", "maxLength"]);
135
+ rest = _objectWithoutProperties(_ref2, _excluded4);
130
136
 
131
137
  var activeItem = getActiveItem(store.getState());
132
138
  return _objectSpread({
@@ -217,7 +223,7 @@ export function getPropGetters(_ref) {
217
223
  var getItemProps = function getItemProps(providedProps) {
218
224
  var item = providedProps.item,
219
225
  source = providedProps.source,
220
- rest = _objectWithoutProperties(providedProps, ["item", "source"]);
226
+ rest = _objectWithoutProperties(providedProps, _excluded5);
221
227
 
222
228
  return _objectSpread({
223
229
  id: "".concat(props.id, "-item-").concat(item.__autocomplete_id),
@@ -1,4 +1,3 @@
1
1
  export * from './createAutocomplete';
2
2
  export * from './getDefaultProps';
3
3
  export * from './types';
4
- export * from './version';
package/dist/esm/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  export * from './createAutocomplete';
2
2
  export * from './getDefaultProps';
3
- export * from './types';
4
- export * from './version';
3
+ export * from './types';
@@ -0,0 +1,33 @@
1
+ import { UserAgent } from '@algolia/autocomplete-shared';
2
+ import { AutocompleteEnvironment, AutocompleteOptionsWithMetadata, AutocompletePlugin, BaseItem } from '.';
3
+ declare type AutocompleteMetadata = {
4
+ plugins: Array<{
5
+ name: string | undefined;
6
+ options: string[];
7
+ }>;
8
+ options: Record<string, string[]>;
9
+ ua: UserAgent[];
10
+ };
11
+ declare type GetMetadataParams<TItem extends BaseItem, TData = unknown> = {
12
+ plugins: Array<AutocompletePlugin<TItem, TData>>;
13
+ options: AutocompleteOptionsWithMetadata<TItem>;
14
+ };
15
+ export declare function getMetadata<TItem extends BaseItem, TData = unknown>({ plugins, options, }: GetMetadataParams<TItem, TData>): {
16
+ plugins: {
17
+ name: string | undefined;
18
+ options: string[];
19
+ }[];
20
+ options: {
21
+ 'autocomplete-core': string[];
22
+ };
23
+ ua: {
24
+ segment: string;
25
+ version: string;
26
+ }[];
27
+ };
28
+ declare type InlineMetadataParams = {
29
+ metadata: AutocompleteMetadata;
30
+ environment: AutocompleteEnvironment;
31
+ };
32
+ export declare function injectMetadata({ metadata, environment, }: InlineMetadataParams): void;
33
+ export {};
@@ -0,0 +1,44 @@
1
+ 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; }
2
+
3
+ function _objectSpread(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; }
4
+
5
+ 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; }
6
+
7
+ import { userAgents } from '@algolia/autocomplete-shared';
8
+ export function getMetadata(_ref) {
9
+ var _, _options$__autocomple, _options$__autocomple2, _options$__autocomple3;
10
+
11
+ var plugins = _ref.plugins,
12
+ options = _ref.options;
13
+ var optionsKey = (_ = (((_options$__autocomple = options.__autocomplete_metadata) === null || _options$__autocomple === void 0 ? void 0 : _options$__autocomple.userAgents) || [])[0]) === null || _ === void 0 ? void 0 : _.segment;
14
+ var extraOptions = optionsKey ? _defineProperty({}, optionsKey, Object.keys(((_options$__autocomple2 = options.__autocomplete_metadata) === null || _options$__autocomple2 === void 0 ? void 0 : _options$__autocomple2.options) || {})) : {};
15
+ return {
16
+ plugins: plugins.map(function (plugin) {
17
+ return {
18
+ name: plugin.name,
19
+ options: Object.keys(plugin.__autocomplete_pluginOptions || [])
20
+ };
21
+ }),
22
+ options: _objectSpread({
23
+ 'autocomplete-core': Object.keys(options)
24
+ }, extraOptions),
25
+ ua: userAgents.concat(((_options$__autocomple3 = options.__autocomplete_metadata) === null || _options$__autocomple3 === void 0 ? void 0 : _options$__autocomple3.userAgents) || [])
26
+ };
27
+ }
28
+ export function injectMetadata(_ref3) {
29
+ var _environment$navigato;
30
+
31
+ var metadata = _ref3.metadata,
32
+ environment = _ref3.environment;
33
+ var isMetadataEnabled = (_environment$navigato = environment.navigator) === null || _environment$navigato === void 0 ? void 0 : _environment$navigato.userAgent.includes('Algolia Crawler');
34
+
35
+ if (isMetadataEnabled) {
36
+ var metadataContainer = environment.document.createElement('meta');
37
+ var headRef = environment.document.querySelector('head');
38
+ metadataContainer.name = 'algolia:metadata';
39
+ setTimeout(function () {
40
+ metadataContainer.content = JSON.stringify(metadata);
41
+ headRef.appendChild(metadataContainer);
42
+ }, 0);
43
+ }
44
+ }
@@ -1,4 +1,6 @@
1
- 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; }
1
+ var _excluded = ["event", "nextState", "props", "query", "refresh", "store"];
2
+
3
+ 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; }
2
4
 
3
5
  function _objectSpread(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; }
4
6
 
@@ -8,9 +10,11 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
8
10
 
9
11
  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; }
10
12
 
13
+ import { reshape } from './reshape';
11
14
  import { preResolve, resolve, postResolve } from './resolve';
12
- import { getActiveItem } from './utils';
15
+ import { createConcurrentSafePromise, getActiveItem } from './utils';
13
16
  var lastStalledId = null;
17
+ var runConcurrentSafePromise = createConcurrentSafePromise();
14
18
  export function onInput(_ref) {
15
19
  var event = _ref.event,
16
20
  _ref$nextState = _ref.nextState,
@@ -19,7 +23,7 @@ export function onInput(_ref) {
19
23
  query = _ref.query,
20
24
  refresh = _ref.refresh,
21
25
  store = _ref.store,
22
- setters = _objectWithoutProperties(_ref, ["event", "nextState", "props", "query", "refresh", "store"]);
26
+ setters = _objectWithoutProperties(_ref, _excluded);
23
27
 
24
28
  if (lastStalledId) {
25
29
  props.environment.clearTimeout(lastStalledId);
@@ -36,28 +40,40 @@ export function onInput(_ref) {
36
40
  if (!query && props.openOnFocus === false) {
37
41
  var _nextState$isOpen;
38
42
 
39
- setStatus('idle');
40
- setCollections(store.getState().collections.map(function (collection) {
43
+ var collections = store.getState().collections.map(function (collection) {
41
44
  return _objectSpread(_objectSpread({}, collection), {}, {
42
45
  items: []
43
46
  });
44
- }));
47
+ });
48
+ setStatus('idle');
49
+ setCollections(collections);
45
50
  setIsOpen((_nextState$isOpen = nextState.isOpen) !== null && _nextState$isOpen !== void 0 ? _nextState$isOpen : props.shouldPanelOpen({
46
51
  state: store.getState()
47
- }));
48
- return Promise.resolve();
52
+ })); // We make sure to update the latest resolved value of the tracked
53
+ // promises to keep late resolving promises from "cancelling" the state
54
+ // updates performed in this code path.
55
+ // We chain with a void promise to respect `onInput`'s expected return type.
56
+
57
+ return runConcurrentSafePromise(collections).then(function () {
58
+ return Promise.resolve();
59
+ });
49
60
  }
50
61
 
51
62
  setStatus('loading');
52
63
  lastStalledId = props.environment.setTimeout(function () {
53
64
  setStatus('stalled');
54
- }, props.stallThreshold);
55
- return props.getSources(_objectSpread({
65
+ }, props.stallThreshold); // We track the entire promise chain triggered by `onInput` before mutating
66
+ // the Autocomplete state to make sure that any state manipulation is based on
67
+ // fresh data regardless of when promises individually resolve.
68
+ // We don't track nested promises and only rely on the full chain resolution,
69
+ // meaning we should only ever manipulate the state once this concurrent-safe
70
+ // promise is resolved.
71
+
72
+ return runConcurrentSafePromise(props.getSources(_objectSpread({
56
73
  query: query,
57
74
  refresh: refresh,
58
75
  state: store.getState()
59
76
  }, setters)).then(function (sources) {
60
- setStatus('loading');
61
77
  return Promise.all(sources.map(function (source) {
62
78
  return Promise.resolve(source.getItems(_objectSpread({
63
79
  query: query,
@@ -69,35 +85,41 @@ export function onInput(_ref) {
69
85
  })).then(resolve).then(function (responses) {
70
86
  return postResolve(responses, sources);
71
87
  }).then(function (collections) {
72
- var _nextState$isOpen2;
73
-
74
- setStatus('idle');
75
- setCollections(collections);
76
- var isPanelOpen = props.shouldPanelOpen({
88
+ return reshape({
89
+ collections: collections,
90
+ props: props,
77
91
  state: store.getState()
78
92
  });
79
- setIsOpen((_nextState$isOpen2 = nextState.isOpen) !== null && _nextState$isOpen2 !== void 0 ? _nextState$isOpen2 : props.openOnFocus && !query && isPanelOpen || isPanelOpen);
80
- var highlightedItem = getActiveItem(store.getState());
93
+ });
94
+ })).then(function (collections) {
95
+ var _nextState$isOpen2;
81
96
 
82
- if (store.getState().activeItemId !== null && highlightedItem) {
83
- var item = highlightedItem.item,
84
- itemInputValue = highlightedItem.itemInputValue,
85
- itemUrl = highlightedItem.itemUrl,
86
- source = highlightedItem.source;
87
- source.onActive(_objectSpread({
88
- event: event,
89
- item: item,
90
- itemInputValue: itemInputValue,
91
- itemUrl: itemUrl,
92
- refresh: refresh,
93
- source: source,
94
- state: store.getState()
95
- }, setters));
96
- }
97
- }).finally(function () {
98
- if (lastStalledId) {
99
- props.environment.clearTimeout(lastStalledId);
100
- }
97
+ setStatus('idle');
98
+ setCollections(collections);
99
+ var isPanelOpen = props.shouldPanelOpen({
100
+ state: store.getState()
101
101
  });
102
+ setIsOpen((_nextState$isOpen2 = nextState.isOpen) !== null && _nextState$isOpen2 !== void 0 ? _nextState$isOpen2 : props.openOnFocus && !query && isPanelOpen || isPanelOpen);
103
+ var highlightedItem = getActiveItem(store.getState());
104
+
105
+ if (store.getState().activeItemId !== null && highlightedItem) {
106
+ var item = highlightedItem.item,
107
+ itemInputValue = highlightedItem.itemInputValue,
108
+ itemUrl = highlightedItem.itemUrl,
109
+ source = highlightedItem.source;
110
+ source.onActive(_objectSpread({
111
+ event: event,
112
+ item: item,
113
+ itemInputValue: itemInputValue,
114
+ itemUrl: itemUrl,
115
+ refresh: refresh,
116
+ source: source,
117
+ state: store.getState()
118
+ }, setters));
119
+ }
120
+ }).finally(function () {
121
+ if (lastStalledId) {
122
+ props.environment.clearTimeout(lastStalledId);
123
+ }
102
124
  });
103
125
  }
@@ -1,4 +1,6 @@
1
- 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; }
1
+ var _excluded = ["event", "props", "refresh", "store"];
2
+
3
+ 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; }
2
4
 
3
5
  function _objectSpread(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; }
4
6
 
@@ -15,7 +17,7 @@ export function onKeyDown(_ref) {
15
17
  props = _ref.props,
16
18
  refresh = _ref.refresh,
17
19
  store = _ref.store,
18
- setters = _objectWithoutProperties(_ref, ["event", "props", "refresh", "store"]);
20
+ setters = _objectWithoutProperties(_ref, _excluded);
19
21
 
20
22
  if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
21
23
  // eslint-disable-next-line no-inner-declarations
@@ -0,0 +1,11 @@
1
+ import { AutocompleteCollection, AutocompleteState, BaseItem, InternalAutocompleteOptions } from './types';
2
+ declare type ReshapeParams<TItem extends BaseItem> = {
3
+ collections: Array<AutocompleteCollection<any>>;
4
+ props: InternalAutocompleteOptions<TItem>;
5
+ state: AutocompleteState<TItem>;
6
+ };
7
+ export declare function reshape<TItem extends BaseItem>({ collections, props, state, }: ReshapeParams<TItem>): {
8
+ source: import("./types").AutocompleteReshapeSource<TItem>;
9
+ items: TItem[];
10
+ }[];
11
+ export {};
@@ -0,0 +1,34 @@
1
+ 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; }
2
+
3
+ function _objectSpread(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; }
4
+
5
+ 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; }
6
+
7
+ import { flatten } from '@algolia/autocomplete-shared';
8
+ export function reshape(_ref) {
9
+ var collections = _ref.collections,
10
+ props = _ref.props,
11
+ state = _ref.state;
12
+ // Sources are grouped by `sourceId` to conveniently pick them via destructuring.
13
+ // Example: `const { recentSearchesPlugin } = sourcesBySourceId`
14
+ var sourcesBySourceId = collections.reduce(function (acc, collection) {
15
+ return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, collection.source.sourceId, _objectSpread(_objectSpread({}, collection.source), {}, {
16
+ getItems: function getItems() {
17
+ // We provide the resolved items from the collection to the `reshape` prop.
18
+ return flatten(collection.items);
19
+ }
20
+ })));
21
+ }, {});
22
+ var reshapeSources = props.reshape({
23
+ sources: Object.values(sourcesBySourceId),
24
+ sourcesBySourceId: sourcesBySourceId,
25
+ state: state
26
+ }); // We reconstruct the collections with the items modified by the `reshape` prop.
27
+
28
+ return flatten(reshapeSources).filter(Boolean).map(function (source) {
29
+ return {
30
+ source: source,
31
+ items: source.getItems()
32
+ };
33
+ });
34
+ }
@@ -6,20 +6,20 @@ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread n
6
6
 
7
7
  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); }
8
8
 
9
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
9
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
10
10
 
11
11
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
12
 
13
13
  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; }
14
14
 
15
- 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; }
15
+ 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; }
16
16
 
17
17
  function _objectSpread(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; }
18
18
 
19
19
  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; }
20
20
 
21
- import { invariant } from '@algolia/autocomplete-shared';
22
- import { flatten, mapToAlgoliaResponse } from './utils';
21
+ import { decycle, flatten, invariant } from '@algolia/autocomplete-shared';
22
+ import { mapToAlgoliaResponse } from './utils';
23
23
 
24
24
  function isDescription(item) {
25
25
  return Boolean(item.execute);
@@ -105,7 +105,9 @@ export function postResolve(responses, sources) {
105
105
  });
106
106
  var transform = matches[0].transformResponse;
107
107
  var items = transform ? transform(mapToAlgoliaResponse(results)) : results;
108
- invariant(Array.isArray(items), "The `getItems` function from source \"".concat(source.sourceId, "\" must return an array of items but returned type ").concat(JSON.stringify(_typeof(items)), ":\n\n").concat(JSON.stringify(items, null, 2), ".\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"));
108
+ invariant(Array.isArray(items), function () {
109
+ return "The `getItems` function from source \"".concat(source.sourceId, "\" must return an array of items but returned type ").concat(JSON.stringify(_typeof(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");
110
+ });
109
111
  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"));
110
112
  return {
111
113
  source: source,
@@ -1,4 +1,4 @@
1
- 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; }
1
+ 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; }
2
2
 
3
3
  function _objectSpread(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; }
4
4
 
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -9,4 +9,5 @@ export declare type AutocompleteEnvironment = Window | {
9
9
  assign: Location['assign'];
10
10
  };
11
11
  open: Window['open'];
12
+ navigator: Window['navigator'];
12
13
  };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -3,6 +3,7 @@ import { AutocompleteScopeApi, BaseItem } from './AutocompleteApi';
3
3
  import { AutocompleteEnvironment } from './AutocompleteEnvironment';
4
4
  import { AutocompleteNavigator } from './AutocompleteNavigator';
5
5
  import { AutocompletePlugin } from './AutocompletePlugin';
6
+ import { Reshape } from './AutocompleteReshape';
6
7
  import { AutocompleteSource, InternalAutocompleteSource } from './AutocompleteSource';
7
8
  import { AutocompleteState } from './AutocompleteState';
8
9
  export interface OnSubmitParams<TItem extends BaseItem> extends AutocompleteScopeApi<TItem> {
@@ -149,6 +150,16 @@ export interface AutocompleteOptions<TItem extends BaseItem> {
149
150
  * @link https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-plugins
150
151
  */
151
152
  plugins?: Array<AutocompletePlugin<any, any>>;
153
+ /**
154
+ * The function called to reshape the sources after they're resolved.
155
+ *
156
+ * This is useful to transform sources before rendering them. You can group sources by attribute, remove duplicates, create shared limits between sources, etc.
157
+ *
158
+ * See [**Reshaping sources**](https://www.algolia.com/doc/ui-libraries/autocomplete/guides/reshaping-sources/) for more information.
159
+ *
160
+ * @link https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-reshape
161
+ */
162
+ reshape?: Reshape<TItem>;
152
163
  }
153
164
  export interface InternalAutocompleteOptions<TItem extends BaseItem> extends AutocompleteOptions<TItem> {
154
165
  debug: boolean;
@@ -169,5 +180,6 @@ export interface InternalAutocompleteOptions<TItem extends BaseItem> extends Aut
169
180
  }): boolean;
170
181
  onSubmit(params: OnSubmitParams<TItem>): void;
171
182
  onReset(params: OnResetParams<TItem>): void;
183
+ reshape: Reshape<TItem>;
172
184
  }
173
185
  export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -21,5 +21,15 @@ export declare type AutocompletePlugin<TItem extends BaseItem, TData = unknown>
21
21
  * @link https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/plugins/#param-data
22
22
  */
23
23
  data?: TData;
24
+ /**
25
+ * A name to identify the plugin.
26
+ *
27
+ * @link https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/plugins/#param-name
28
+ */
29
+ name?: string;
30
+ /**
31
+ * @internal
32
+ */
33
+ __autocomplete_pluginOptions?: Record<string, any>;
24
34
  };
25
35
  export {};