@algolia/autocomplete-js 1.5.7 → 1.6.2

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.
@@ -1,3 +1,9 @@
1
+ var _excluded = ["components"];
2
+
3
+ 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; }
4
+
5
+ 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; }
6
+
1
7
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -6,6 +12,7 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
6
12
 
7
13
  import { createAutocomplete } from '@algolia/autocomplete-core';
8
14
  import { createRef, debounce, getItemsCount } from '@algolia/autocomplete-shared';
15
+ import htm from 'htm';
9
16
  import { createAutocompleteDom } from './createAutocompleteDom';
10
17
  import { createEffectWrapper } from './createEffectWrapper';
11
18
  import { createReactiveWrapper } from './createReactiveWrapper';
@@ -13,7 +20,7 @@ import { getDefaultOptions } from './getDefaultOptions';
13
20
  import { getPanelPlacementStyle } from './getPanelPlacementStyle';
14
21
  import { renderPanel, renderSearchBox } from './render';
15
22
  import { userAgents } from './userAgents';
16
- import { mergeDeep, setProperties } from './utils';
23
+ import { mergeDeep, pickBy, setProperties } from './utils';
17
24
  export function autocomplete(options) {
18
25
  var _createEffectWrapper = createEffectWrapper(),
19
26
  runEffect = _createEffectWrapper.runEffect,
@@ -94,6 +101,9 @@ export function autocomplete(options) {
94
101
  setContext: autocomplete.value.setContext,
95
102
  refresh: autocomplete.value.refresh
96
103
  };
104
+ var html = reactive(function () {
105
+ return htm.bind(props.value.renderer.renderer.createElement);
106
+ });
97
107
  var dom = reactive(function () {
98
108
  return createAutocompleteDom({
99
109
  autocomplete: autocomplete.value,
@@ -128,12 +138,12 @@ export function autocomplete(options) {
128
138
  classNames: props.value.renderer.classNames,
129
139
  components: props.value.renderer.components,
130
140
  container: props.value.renderer.container,
131
- createElement: props.value.renderer.renderer.createElement,
141
+ html: html.value,
132
142
  dom: dom.value,
133
- Fragment: props.value.renderer.renderer.Fragment,
134
143
  panelContainer: isDetached.value ? dom.value.detachedContainer : props.value.renderer.panelContainer,
135
144
  propGetters: propGetters,
136
- state: lastStateRef.current
145
+ state: lastStateRef.current,
146
+ renderer: props.value.renderer.renderer
137
147
  };
138
148
  var render = !getItemsCount(state) && !hasNoResultsSourceTemplateRef.current && props.value.renderer.renderNoResults || props.value.renderer.render;
139
149
  renderSearchBox(renderProps);
@@ -269,7 +279,21 @@ export function autocomplete(options) {
269
279
  function update() {
270
280
  var updatedOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
271
281
  cleanupEffects();
272
- optionsRef.current = mergeDeep(props.value.renderer, props.value.core, {
282
+
283
+ var _props$value$renderer = props.value.renderer,
284
+ components = _props$value$renderer.components,
285
+ rendererProps = _objectWithoutProperties(_props$value$renderer, _excluded);
286
+
287
+ optionsRef.current = mergeDeep(rendererProps, props.value.core, {
288
+ // We need to filter out default components so they can be replaced with
289
+ // a new `renderer`, without getting rid of user components.
290
+ // @MAJOR Deal with registering components with the same name as the
291
+ // default ones. If we disallow overriding default components, we'd just
292
+ // need to pass all `components` here.
293
+ components: pickBy(components, function (_ref4) {
294
+ var value = _ref4.value;
295
+ return !value.hasOwnProperty('__autocomplete_componentName');
296
+ }),
273
297
  initialState: lastStateRef.current
274
298
  }, updatedOptions);
275
299
  runReactives();
@@ -1,3 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { AutocompleteRenderer, HighlightHitParams } from '../types';
3
- export declare function createHighlightComponent({ createElement, Fragment, }: AutocompleteRenderer): <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>) => JSX.Element;
3
+ export declare function createHighlightComponent({ createElement, Fragment, }: AutocompleteRenderer): {
4
+ <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>): JSX.Element;
5
+ __autocomplete_componentName: string;
6
+ };
@@ -2,7 +2,8 @@ import { parseAlgoliaHitHighlight } from '@algolia/autocomplete-preset-algolia';
2
2
  export function createHighlightComponent(_ref) {
3
3
  var createElement = _ref.createElement,
4
4
  Fragment = _ref.Fragment;
5
- return function Highlight(_ref2) {
5
+
6
+ function Highlight(_ref2) {
6
7
  var hit = _ref2.hit,
7
8
  attribute = _ref2.attribute,
8
9
  _ref2$tagName = _ref2.tagName,
@@ -15,5 +16,8 @@ export function createHighlightComponent(_ref) {
15
16
  key: index
16
17
  }, x.value) : x.value;
17
18
  }));
18
- };
19
+ }
20
+
21
+ Highlight.__autocomplete_componentName = 'Highlight';
22
+ return Highlight;
19
23
  }
@@ -1,3 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { AutocompleteRenderer, HighlightHitParams } from '../types';
3
- export declare function createReverseHighlightComponent({ createElement, Fragment, }: AutocompleteRenderer): <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>) => JSX.Element;
3
+ export declare function createReverseHighlightComponent({ createElement, Fragment, }: AutocompleteRenderer): {
4
+ <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>): JSX.Element;
5
+ __autocomplete_componentName: string;
6
+ };
@@ -2,7 +2,8 @@ import { parseAlgoliaHitReverseHighlight } from '@algolia/autocomplete-preset-al
2
2
  export function createReverseHighlightComponent(_ref) {
3
3
  var createElement = _ref.createElement,
4
4
  Fragment = _ref.Fragment;
5
- return function ReverseHighlight(_ref2) {
5
+
6
+ function ReverseHighlight(_ref2) {
6
7
  var hit = _ref2.hit,
7
8
  attribute = _ref2.attribute,
8
9
  _ref2$tagName = _ref2.tagName,
@@ -15,5 +16,8 @@ export function createReverseHighlightComponent(_ref) {
15
16
  key: index
16
17
  }, x.value) : x.value;
17
18
  }));
18
- };
19
+ }
20
+
21
+ ReverseHighlight.__autocomplete_componentName = 'ReverseHighlight';
22
+ return ReverseHighlight;
19
23
  }
@@ -1,3 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { AutocompleteRenderer, HighlightHitParams } from '../types';
3
- export declare function createReverseSnippetComponent({ createElement, Fragment, }: AutocompleteRenderer): <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>) => JSX.Element;
3
+ export declare function createReverseSnippetComponent({ createElement, Fragment, }: AutocompleteRenderer): {
4
+ <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>): JSX.Element;
5
+ __autocomplete_componentName: string;
6
+ };
@@ -2,7 +2,8 @@ import { parseAlgoliaHitReverseSnippet } from '@algolia/autocomplete-preset-algo
2
2
  export function createReverseSnippetComponent(_ref) {
3
3
  var createElement = _ref.createElement,
4
4
  Fragment = _ref.Fragment;
5
- return function ReverseSnippet(_ref2) {
5
+
6
+ function ReverseSnippet(_ref2) {
6
7
  var hit = _ref2.hit,
7
8
  attribute = _ref2.attribute,
8
9
  _ref2$tagName = _ref2.tagName,
@@ -15,5 +16,8 @@ export function createReverseSnippetComponent(_ref) {
15
16
  key: index
16
17
  }, x.value) : x.value;
17
18
  }));
18
- };
19
+ }
20
+
21
+ ReverseSnippet.__autocomplete_componentName = 'ReverseSnippet';
22
+ return ReverseSnippet;
19
23
  }
@@ -1,3 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { AutocompleteRenderer, HighlightHitParams } from '../types';
3
- export declare function createSnippetComponent({ createElement, Fragment, }: AutocompleteRenderer): <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>) => JSX.Element;
3
+ export declare function createSnippetComponent({ createElement, Fragment, }: AutocompleteRenderer): {
4
+ <THit>({ hit, attribute, tagName, }: HighlightHitParams<THit>): JSX.Element;
5
+ __autocomplete_componentName: string;
6
+ };
@@ -2,7 +2,8 @@ import { parseAlgoliaHitSnippet } from '@algolia/autocomplete-preset-algolia';
2
2
  export function createSnippetComponent(_ref) {
3
3
  var createElement = _ref.createElement,
4
4
  Fragment = _ref.Fragment;
5
- return function Snippet(_ref2) {
5
+
6
+ function Snippet(_ref2) {
6
7
  var hit = _ref2.hit,
7
8
  attribute = _ref2.attribute,
8
9
  _ref2$tagName = _ref2.tagName,
@@ -15,5 +16,8 @@ export function createSnippetComponent(_ref) {
15
16
  key: index
16
17
  }, x.value) : x.value;
17
18
  }));
18
- };
19
+ }
20
+
21
+ Snippet.__autocomplete_componentName = 'Snippet';
22
+ return Snippet;
19
23
  }
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { BaseItem } from '@algolia/autocomplete-core';
3
- import { AutocompleteClassNames, AutocompleteOptions, AutocompleteRender, AutocompleteRenderer } from './types';
3
+ import { AutocompleteClassNames, AutocompleteOptions, AutocompleteRender } from './types';
4
4
  export declare function getDefaultOptions<TItem extends BaseItem>(options: AutocompleteOptions<TItem>): {
5
5
  renderer: {
6
6
  classNames: AutocompleteClassNames;
@@ -156,7 +156,11 @@ export declare function getDefaultOptions<TItem extends BaseItem>(options: Autoc
156
156
  panelPlacement: "start" | "end" | "full-width" | "input-wrapper-width";
157
157
  render: AutocompleteRender<any> | AutocompleteRender<TItem>;
158
158
  renderNoResults: AutocompleteRender<TItem> | undefined;
159
- renderer: AutocompleteRenderer;
159
+ renderer: {
160
+ createElement: import("./types").Pragma;
161
+ Fragment: any;
162
+ render: import("./types").Render;
163
+ };
160
164
  detachedMediaQuery: string;
161
165
  components: {
162
166
  [x: string]: (props: any) => JSX.Element;
@@ -10,7 +10,7 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
10
10
 
11
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; }
12
12
 
13
- import { generateAutocompleteId, invariant } from '@algolia/autocomplete-shared';
13
+ import { generateAutocompleteId, invariant, warn } from '@algolia/autocomplete-shared';
14
14
  import { createElement as preactCreateElement, Fragment as PreactFragment, render } from 'preact';
15
15
  import { createHighlightComponent, createReverseHighlightComponent, createReverseSnippetComponent, createSnippetComponent } from './components';
16
16
  import { getHTMLElement, mergeClassNames } from './utils';
@@ -43,13 +43,15 @@ var defaultClassNames = {
43
43
  };
44
44
 
45
45
  var defaultRender = function defaultRender(_ref, root) {
46
- var children = _ref.children;
46
+ var children = _ref.children,
47
+ render = _ref.render;
47
48
  render(children, root);
48
49
  };
49
50
 
50
51
  var defaultRenderer = {
51
52
  createElement: preactCreateElement,
52
- Fragment: PreactFragment
53
+ Fragment: PreactFragment,
54
+ render: render
53
55
  };
54
56
  export function getDefaultOptions(options) {
55
57
  var _core$id;
@@ -81,7 +83,11 @@ export function getDefaultOptions(options) {
81
83
 
82
84
  var containerElement = getHTMLElement(environment, container);
83
85
  invariant(containerElement.tagName !== 'INPUT', 'The `container` option does not support `input` elements. You need to change the container to a `div`.');
84
- var defaultedRenderer = renderer !== null && renderer !== void 0 ? renderer : defaultRenderer;
86
+ process.env.NODE_ENV !== 'production' ? warn(!(render && renderer && !(renderer !== null && renderer !== void 0 && renderer.render)), "You provided the `render` option but did not provide a `renderer.render`. Since v1.6.0, you can provide a `render` function directly in `renderer`." + "\nTo get rid of this warning, do any of the following depending on your use case." + "\n- If you are using the `render` option only to override Autocomplete's default `render` function, pass the `render` function into `renderer` and remove the `render` option." + '\n- If you are using the `render` option to customize the layout, pass your `render` function into `renderer` and use it from the provided parameters of the `render` option.' + '\nSee https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-render') : void 0;
87
+ process.env.NODE_ENV !== 'production' ? warn(!renderer || render || renderer.Fragment && renderer.createElement && renderer.render, "You provided an incomplete `renderer` (missing: ".concat([!(renderer !== null && renderer !== void 0 && renderer.createElement) && '`renderer.createElement`', !(renderer !== null && renderer !== void 0 && renderer.Fragment) && '`renderer.Fragment`', !(renderer !== null && renderer !== void 0 && renderer.render) && '`renderer.render`'].filter(Boolean).join(', '), "). This can cause rendering issues.") + '\nSee https://www.algolia.com/doc/ui-libraries/autocomplete/api-reference/autocomplete-js/autocomplete/#param-renderer') : void 0;
88
+
89
+ var defaultedRenderer = _objectSpread(_objectSpread({}, defaultRenderer), renderer);
90
+
85
91
  var defaultComponents = {
86
92
  Highlight: createHighlightComponent(defaultedRenderer),
87
93
  ReverseHighlight: createReverseHighlightComponent(defaultedRenderer),
@@ -1,19 +1,18 @@
1
- /** @jsx createElement */
2
- import { AutocompleteApi as AutocompleteCoreApi, AutocompleteScopeApi } from '@algolia/autocomplete-core';
3
- import { BaseItem } from '@algolia/autocomplete-core/src';
4
- import { AutocompleteClassNames, AutocompleteComponents, AutocompleteDom, AutocompletePropGetters, AutocompleteRender, AutocompleteState, Pragma, PragmaFrag } from './types';
1
+ /** @jsx renderer.createElement */
2
+ import { AutocompleteApi as AutocompleteCoreApi, AutocompleteScopeApi, BaseItem } from '@algolia/autocomplete-core';
3
+ import { AutocompleteClassNames, AutocompleteComponents, AutocompleteDom, AutocompletePropGetters, AutocompleteRender, AutocompleteRenderer, AutocompleteState, HTMLTemplate } from './types';
5
4
  declare type RenderProps<TItem extends BaseItem> = {
6
5
  autocomplete: AutocompleteCoreApi<TItem>;
7
6
  autocompleteScopeApi: AutocompleteScopeApi<TItem>;
8
7
  classNames: AutocompleteClassNames;
9
8
  components: AutocompleteComponents;
10
- createElement: Pragma;
9
+ html: HTMLTemplate;
11
10
  dom: AutocompleteDom;
12
- Fragment: PragmaFrag;
13
11
  panelContainer: HTMLElement;
14
12
  propGetters: AutocompletePropGetters<TItem>;
15
13
  state: AutocompleteState<TItem>;
14
+ renderer: Required<AutocompleteRenderer>;
16
15
  };
17
16
  export declare function renderSearchBox<TItem extends BaseItem>({ autocomplete, autocompleteScopeApi, dom, propGetters, state, }: RenderProps<TItem>): void;
18
- export declare function renderPanel<TItem extends BaseItem>(render: AutocompleteRender<TItem>, { autocomplete, autocompleteScopeApi, classNames, createElement, dom, Fragment, panelContainer, propGetters, state, components, }: RenderProps<TItem>): void;
17
+ export declare function renderPanel<TItem extends BaseItem>(render: AutocompleteRender<TItem>, { autocomplete, autocompleteScopeApi, classNames, html, dom, panelContainer, propGetters, state, components, renderer, }: RenderProps<TItem>): void;
19
18
  export {};
@@ -6,7 +6,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
6
6
 
7
7
  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; }
8
8
 
9
- /** @jsx createElement */
9
+ /** @jsx renderer.createElement */
10
10
  import { setProperties, setPropertiesWithoutEvents } from './utils';
11
11
  export function renderSearchBox(_ref) {
12
12
  var autocomplete = _ref.autocomplete,
@@ -39,13 +39,13 @@ export function renderPanel(render, _ref2) {
39
39
  var autocomplete = _ref2.autocomplete,
40
40
  autocompleteScopeApi = _ref2.autocompleteScopeApi,
41
41
  classNames = _ref2.classNames,
42
- createElement = _ref2.createElement,
42
+ html = _ref2.html,
43
43
  dom = _ref2.dom,
44
- Fragment = _ref2.Fragment,
45
44
  panelContainer = _ref2.panelContainer,
46
45
  propGetters = _ref2.propGetters,
47
46
  state = _ref2.state,
48
- components = _ref2.components;
47
+ components = _ref2.components,
48
+ renderer = _ref2.renderer;
49
49
 
50
50
  if (!state.isOpen) {
51
51
  if (panelContainer.contains(dom.panel)) {
@@ -69,28 +69,30 @@ export function renderPanel(render, _ref2) {
69
69
  }).map(function (_ref4, sourceIndex) {
70
70
  var source = _ref4.source,
71
71
  items = _ref4.items;
72
- return createElement("section", {
72
+ return renderer.createElement("section", {
73
73
  key: sourceIndex,
74
74
  className: classNames.source,
75
75
  "data-autocomplete-source-id": source.sourceId
76
- }, source.templates.header && createElement("div", {
76
+ }, source.templates.header && renderer.createElement("div", {
77
77
  className: classNames.sourceHeader
78
78
  }, source.templates.header({
79
79
  components: components,
80
- createElement: createElement,
81
- Fragment: Fragment,
80
+ createElement: renderer.createElement,
81
+ Fragment: renderer.Fragment,
82
82
  items: items,
83
83
  source: source,
84
- state: state
85
- })), source.templates.noResults && items.length === 0 ? createElement("div", {
84
+ state: state,
85
+ html: html
86
+ })), source.templates.noResults && items.length === 0 ? renderer.createElement("div", {
86
87
  className: classNames.sourceNoResults
87
88
  }, source.templates.noResults({
88
89
  components: components,
89
- createElement: createElement,
90
- Fragment: Fragment,
90
+ createElement: renderer.createElement,
91
+ Fragment: renderer.Fragment,
91
92
  source: source,
92
- state: state
93
- })) : createElement("ul", _extends({
93
+ state: state,
94
+ html: html
95
+ })) : renderer.createElement("ul", _extends({
94
96
  className: classNames.list
95
97
  }, propGetters.getListProps(_objectSpread({
96
98
  state: state,
@@ -100,7 +102,7 @@ export function renderPanel(render, _ref2) {
100
102
  item: item,
101
103
  source: source
102
104
  });
103
- return createElement("li", _extends({
105
+ return renderer.createElement("li", _extends({
104
106
  key: itemProps.id,
105
107
  className: classNames.item
106
108
  }, propGetters.getItemProps(_objectSpread({
@@ -108,38 +110,40 @@ export function renderPanel(render, _ref2) {
108
110
  props: itemProps
109
111
  }, autocompleteScopeApi))), source.templates.item({
110
112
  components: components,
111
- createElement: createElement,
112
- Fragment: Fragment,
113
+ createElement: renderer.createElement,
114
+ Fragment: renderer.Fragment,
113
115
  item: item,
114
- state: state
116
+ state: state,
117
+ html: html
115
118
  }));
116
- })), source.templates.footer && createElement("div", {
119
+ })), source.templates.footer && renderer.createElement("div", {
117
120
  className: classNames.sourceFooter
118
121
  }, source.templates.footer({
119
122
  components: components,
120
- createElement: createElement,
121
- Fragment: Fragment,
123
+ createElement: renderer.createElement,
124
+ Fragment: renderer.Fragment,
122
125
  items: items,
123
126
  source: source,
124
- state: state
127
+ state: state,
128
+ html: html
125
129
  })));
126
130
  });
127
- var children = createElement(Fragment, null, createElement("div", {
131
+ var children = renderer.createElement(renderer.Fragment, null, renderer.createElement("div", {
128
132
  className: classNames.panelLayout
129
- }, sections), createElement("div", {
133
+ }, sections), renderer.createElement("div", {
130
134
  className: "aa-GradientBottom"
131
135
  }));
132
136
  var elements = sections.reduce(function (acc, current) {
133
137
  acc[current.props['data-autocomplete-source-id']] = current;
134
138
  return acc;
135
139
  }, {});
136
- render(_objectSpread({
140
+ render(_objectSpread(_objectSpread({
137
141
  children: children,
138
142
  state: state,
139
143
  sections: sections,
140
- elements: elements,
141
- createElement: createElement,
142
- Fragment: Fragment,
143
- components: components
144
+ elements: elements
145
+ }, renderer), {}, {
146
+ components: components,
147
+ html: html
144
148
  }, autocompleteScopeApi), dom.panel);
145
149
  }
@@ -1,6 +1,6 @@
1
1
  import { AutocompleteScopeApi, BaseItem } from '@algolia/autocomplete-core';
2
2
  import { AutocompleteComponents } from './AutocompleteComponents';
3
- import { Pragma, PragmaFrag, VNode } from './AutocompleteRenderer';
3
+ import { HTMLTemplate, Pragma, PragmaFrag, Render, VNode } from './AutocompleteRenderer';
4
4
  import { AutocompleteState } from './AutocompleteState';
5
5
  export declare type AutocompleteRender<TItem extends BaseItem> = (params: AutocompleteScopeApi<TItem> & {
6
6
  children: VNode;
@@ -10,4 +10,6 @@ export declare type AutocompleteRender<TItem extends BaseItem> = (params: Autoco
10
10
  components: AutocompleteComponents;
11
11
  createElement: Pragma;
12
12
  Fragment: PragmaFrag;
13
+ html: HTMLTemplate;
14
+ render: Render;
13
15
  }, root: HTMLElement) => void;
@@ -10,6 +10,7 @@ export declare type VNode<TProps = any> = {
10
10
  key?: any;
11
11
  };
12
12
  };
13
+ export declare type Render = (vnode: ComponentChild, parent: Element | Document | ShadowRoot | DocumentFragment, replaceNode?: Element | Text | undefined) => void;
13
14
  export declare type AutocompleteRenderer = {
14
15
  /**
15
16
  * The function to create virtual nodes.
@@ -23,5 +24,10 @@ export declare type AutocompleteRenderer = {
23
24
  * @default preact.Fragment
24
25
  */
25
26
  Fragment: PragmaFrag;
27
+ /**
28
+ * The function to render children to an element.
29
+ */
30
+ render?: Render;
26
31
  };
32
+ export declare type HTMLTemplate = (strings: TemplateStringsArray, ...values: any[]) => VNode | VNode[];
27
33
  export {};
@@ -1,10 +1,11 @@
1
1
  import { AutocompleteSource as AutocompleteCoreSource, InternalAutocompleteSource as InternalAutocompleteCoreSource, BaseItem } from '@algolia/autocomplete-core';
2
2
  import { AutocompleteComponents } from './AutocompleteComponents';
3
- import { AutocompleteRenderer, VNode } from './AutocompleteRenderer';
3
+ import { AutocompleteRenderer, HTMLTemplate, VNode } from './AutocompleteRenderer';
4
4
  import { AutocompleteState } from './AutocompleteState';
5
5
  declare type Template<TParams> = (params: TParams & AutocompleteRenderer & {
6
6
  components: AutocompleteComponents;
7
- }) => VNode | string;
7
+ html: HTMLTemplate;
8
+ }) => VNode | VNode[] | string;
8
9
  /**
9
10
  * Templates to display in the autocomplete panel.
10
11
  *
@@ -1,4 +1,5 @@
1
1
  export * from './getHTMLElement';
2
2
  export * from './mergeClassNames';
3
3
  export * from './mergeDeep';
4
+ export * from './pickBy';
4
5
  export * from './setProperties';
@@ -1,4 +1,5 @@
1
1
  export * from './getHTMLElement';
2
2
  export * from './mergeClassNames';
3
3
  export * from './mergeDeep';
4
+ export * from './pickBy';
4
5
  export * from './setProperties';
@@ -0,0 +1,4 @@
1
+ export declare function pickBy<TValue = unknown>(obj: Record<string, TValue>, predicate: (value: {
2
+ key: string;
3
+ value: TValue;
4
+ }) => boolean): Record<string, TValue>;
@@ -0,0 +1,34 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : 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
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+
9
+ 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."); }
10
+
11
+ 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); }
12
+
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
+
15
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_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; }
16
+
17
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+
19
+ export function pickBy(obj, predicate) {
20
+ return Object.entries(obj).reduce(function (acc, _ref) {
21
+ var _ref2 = _slicedToArray(_ref, 2),
22
+ key = _ref2[0],
23
+ value = _ref2[1];
24
+
25
+ if (predicate({
26
+ key: key,
27
+ value: value
28
+ })) {
29
+ return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, value));
30
+ }
31
+
32
+ return acc;
33
+ }, {});
34
+ }