@nosto/search-js 1.8.0 → 2.1.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 (51) hide show
  1. package/README.md +50 -8
  2. package/dist/InfiniteScrollWithObserver-BoKdnFuB.cjs +1 -0
  3. package/dist/InfiniteScrollWithObserver-CkdVKocm.js +39 -0
  4. package/dist/baseConfig-C_tlTx1w.js +20 -0
  5. package/dist/baseConfig-DEAGSRSp.cjs +1 -0
  6. package/dist/core/core.d.ts +1 -1
  7. package/dist/core/src/search.d.ts +2 -2
  8. package/dist/core/src/searchWithRetries.d.ts +2 -2
  9. package/dist/core/src/types.d.ts +2 -2
  10. package/dist/jsxRuntime.module-B3sGoTIU.cjs +1 -0
  11. package/dist/jsxRuntime.module-Bzuv3cXw.js +13 -0
  12. package/dist/preact/autocomplete.cjs.js +1 -0
  13. package/dist/preact/autocomplete.d.ts +5 -0
  14. package/dist/preact/autocomplete.es.js +52 -0
  15. package/dist/preact/category.cjs.js +1 -0
  16. package/dist/preact/category.d.ts +3 -0
  17. package/dist/preact/category.es.js +22 -0
  18. package/dist/preact/common.cjs.js +1 -0
  19. package/dist/preact/common.d.ts +6 -0
  20. package/dist/preact/common.es.js +26 -0
  21. package/dist/preact/hooks.cjs.js +1 -0
  22. package/dist/preact/hooks.d.ts +16 -0
  23. package/dist/preact/hooks.es.js +356 -0
  24. package/dist/preact/legacy.cjs.js +1 -0
  25. package/dist/preact/legacy.d.ts +4 -0
  26. package/dist/preact/legacy.es.js +7 -0
  27. package/dist/preact/serp.cjs.js +1 -0
  28. package/dist/preact/serp.d.ts +4 -0
  29. package/dist/preact/serp.es.js +41 -0
  30. package/dist/preact/src/actions/newSearch.d.ts +2 -2
  31. package/dist/preact/src/actions/updateSearch.d.ts +2 -2
  32. package/dist/preact/src/config/base/baseConfig.d.ts +2 -2
  33. package/dist/preact/src/config/pages/autocomplete/config.d.ts +1 -1
  34. package/dist/preact/src/config/pages/category/config.d.ts +1 -1
  35. package/dist/preact/src/config/pages/serp/config.d.ts +1 -1
  36. package/dist/renderHeadless-BteGML1G.js +23 -0
  37. package/dist/renderHeadless-xhkLegO4.cjs +1 -0
  38. package/dist/storeContext-12dN1l9r.cjs +1 -0
  39. package/dist/storeContext-CBqmmTUC.js +99 -0
  40. package/dist/useLoadMore-BBrbOkyq.cjs +1 -0
  41. package/dist/useLoadMore-DnvHCsYl.js +281 -0
  42. package/dist/utils/utils.cjs.js +1 -1
  43. package/dist/utils/utils.es.js +1 -1
  44. package/package.json +42 -20
  45. package/dist/InfiniteScrollWithObserver-DbErxedF.cjs +0 -1
  46. package/dist/InfiniteScrollWithObserver-kuSGeBWr.js +0 -418
  47. package/dist/preact/preact.cjs.js +0 -1
  48. package/dist/preact/preact.es.js +0 -501
  49. package/dist/preact-legacy/preact-legacy.cjs.js +0 -1
  50. package/dist/preact-legacy/preact-legacy.d.ts +0 -4
  51. package/dist/preact-legacy/preact-legacy.es.js +0 -6
@@ -1,418 +0,0 @@
1
- import { options as _, createContext as F, Fragment as $ } from "preact";
2
- import { useContext as v, useState as x, useEffect as M, useMemo as z, useCallback as p, useRef as Q } from "preact/hooks";
3
- import { s as V } from "./search-B0-bVNMy.js";
4
- import { isBot as D } from "./utils/utils.es.js";
5
- var U = 0;
6
- function I(e, t, r, n, i, c) {
7
- t || (t = {});
8
- var s, o, u = t;
9
- if ("ref" in u) for (o in u = {}, t) o == "ref" ? s = t[o] : u[o] = t[o];
10
- var a = { type: e, props: u, key: r, ref: s, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --U, __i: -1, __u: 0, __source: i, __self: c };
11
- if (typeof e == "function" && (s = e.defaultProps)) for (o in s) u[o] === void 0 && (u[o] = s[o]);
12
- return _.vnode && _.vnode(a), a;
13
- }
14
- const P = (e) => String(e) === "[object Object]";
15
- function y(e) {
16
- if (!P(e))
17
- return !1;
18
- const t = e.constructor;
19
- if (t === void 0)
20
- return !0;
21
- const r = t.prototype;
22
- return !(!P(r) || !r.hasOwnProperty("isPrototypeOf"));
23
- }
24
- function k(...e) {
25
- return e.reduce((t, r) => C(t, r));
26
- }
27
- function O(...e) {
28
- return e.reduce((t, r) => C(t, r));
29
- }
30
- function C(e, t) {
31
- return y(e) && y(t) ? Object.entries(t).reduce(
32
- (r, [n, i]) => (r[n] = C(r[n], i), r),
33
- { ...e }
34
- ) : y(e) ? e : t;
35
- }
36
- function h(e, t) {
37
- if (e === t)
38
- return !0;
39
- if (e instanceof Date && t instanceof Date)
40
- return e.getTime() === t.getTime();
41
- if (Array.isArray(e) && Array.isArray(t))
42
- return e.length !== t.length ? !1 : e.every((r, n) => h(r, t[n]));
43
- if (y(e) && y(t)) {
44
- const r = Object.entries(e);
45
- return r.length !== Object.keys(t).length ? !1 : r.every(([n, i]) => h(i, t[n]));
46
- }
47
- return !1;
48
- }
49
- function K(e, t = {}) {
50
- const r = /* @__PURE__ */ new Map();
51
- let n = O(e, t ?? {});
52
- const i = O(e, t);
53
- function c(d) {
54
- n = d(n);
55
- for (const l of r.values())
56
- l(n);
57
- }
58
- function s(d) {
59
- c((l) => ({ ...l, ...d }));
60
- }
61
- function o() {
62
- return n;
63
- }
64
- function u() {
65
- return structuredClone(i);
66
- }
67
- function a(d, l) {
68
- let g;
69
- r.set(l, (S) => {
70
- const w = d(S);
71
- h(w, g) || (g = w, l(w));
72
- });
73
- }
74
- function f(d) {
75
- r.delete(d);
76
- }
77
- return {
78
- updateState: s,
79
- getState: o,
80
- getInitialState: u,
81
- onChange: a,
82
- clearOnChange: f
83
- };
84
- }
85
- const q = {
86
- loading: !0,
87
- query: {},
88
- response: {},
89
- initialized: !1
90
- };
91
- function L(e = {}) {
92
- return K(q, e);
93
- }
94
- const R = F(L());
95
- function T(e = B) {
96
- const t = v(R), [r, n] = x(e(t.getState()));
97
- return t.onChange(e, n), M(() => () => t.clearOnChange(n), [t]), r;
98
- }
99
- const B = (e) => e;
100
- function G(e, ...t) {
101
- return t.reduce(
102
- (r, n) => (r[n] = e[n], r),
103
- {}
104
- );
105
- }
106
- const J = F(null), W = () => {
107
- const e = v(J);
108
- if (!e)
109
- throw new Error("useConfig must be used within a ConfigProvider");
110
- return e;
111
- };
112
- function H(e) {
113
- return Array.from(new Set(e));
114
- }
115
- function Y(e, t) {
116
- return {
117
- ...t,
118
- products: {
119
- facets: e === "autocomplete" ? void 0 : ["*"],
120
- fields: X,
121
- ...t.products
122
- },
123
- ...t.keywords ? {
124
- keywords: {
125
- ...t.keywords,
126
- fields: H([...Z, ...t.keywords.fields ?? []]),
127
- highlight: t.keywords.highlight ?? {
128
- preTag: "<strong>",
129
- postTag: "</strong>"
130
- }
131
- }
132
- } : {}
133
- };
134
- }
135
- const X = [
136
- "productId",
137
- "url",
138
- "name",
139
- "imageUrl",
140
- "imageHash",
141
- "thumbUrl",
142
- "description",
143
- "brand",
144
- "variantId",
145
- "availability",
146
- "price",
147
- "priceText",
148
- "categoryIds",
149
- "categories",
150
- "customFields.key",
151
- "customFields.value",
152
- "priceCurrencyCode",
153
- "datePublished",
154
- "listPrice",
155
- "unitPricingBaseMeasure",
156
- "unitPricingUnit",
157
- "unitPricingMeasure",
158
- "googleCategory",
159
- "gtin",
160
- "ageGroup",
161
- "gender",
162
- "condition",
163
- "alternateImageUrls",
164
- "ratingValue",
165
- "reviewCount",
166
- "inventoryLevel",
167
- "skus.id",
168
- "skus.name",
169
- "skus.price",
170
- "skus.listPrice",
171
- "skus.priceText",
172
- "skus.url",
173
- "skus.imageUrl",
174
- "skus.inventoryLevel",
175
- "skus.customFields.key",
176
- "skus.customFields.value",
177
- "skus.availability",
178
- "pid",
179
- "onDiscount",
180
- "extra.key",
181
- "extra.value",
182
- "saleable",
183
- "available",
184
- "tags1",
185
- "tags2",
186
- "tags3"
187
- ], Z = ["keyword", "_redirect"];
188
- function ee(...e) {
189
- if (!e.every((t) => t == null))
190
- return e.filter((t) => Array.isArray(t)).reduce((t, r) => t.concat(r), []);
191
- }
192
- const E = "nosto.search.";
193
- function te(e) {
194
- var r;
195
- const t = `${E}${e}`;
196
- (r = window.performance) == null || r.mark(`${t}.start`);
197
- }
198
- function re(e) {
199
- var r, n;
200
- const t = `${E}${e}`;
201
- (r = window.performance) == null || r.mark(`${t}.end`), (n = window.performance) == null || n.measure(t, `${t}.start`, `${t}.end`);
202
- }
203
- function m(e) {
204
- return te(e), () => re(e);
205
- }
206
- function ne(e, t, r) {
207
- const n = JSON.stringify(t);
208
- try {
209
- console.info("Setting storage", e, n), r.setItem(e, n);
210
- } catch (i) {
211
- console.warn(i);
212
- }
213
- }
214
- function oe(e, t) {
215
- try {
216
- const r = t.getItem(e);
217
- if (r)
218
- return JSON.parse(r);
219
- } catch (r) {
220
- console.warn(r);
221
- }
222
- }
223
- function se(e, t) {
224
- ne(e, t, sessionStorage);
225
- }
226
- function ie(e) {
227
- return oe(e, sessionStorage);
228
- }
229
- const j = "nosto:search:searchResult";
230
- function ce(e, t, r) {
231
- if (!e)
232
- return;
233
- se(j, { query: t, result: r });
234
- }
235
- function ue(e, t) {
236
- if (!e)
237
- return null;
238
- const r = ie(j);
239
- if (!r || !ae(r))
240
- return null;
241
- const n = A(r.query);
242
- return h(A(t), n) ? r.result : null;
243
- }
244
- function A(e) {
245
- return {
246
- accountId: e.accountId,
247
- customRules: e.customRules,
248
- explain: e.explain,
249
- keywords: e.keywords,
250
- products: e.products,
251
- query: e.query,
252
- redirect: e.redirect,
253
- rules: e.rules,
254
- segments: e.segments,
255
- sessionParams: e.sessionParams
256
- };
257
- }
258
- function ae(e) {
259
- return typeof e == "object" && e !== null && "query" in e && "result" in e;
260
- }
261
- async function N(e, t, r) {
262
- var a, f, d;
263
- const n = m("newSearch"), i = e.config.pageType, c = k(e.store.getInitialState().query, t), s = k(e.config.search, r, {
264
- track: i,
265
- redirect: i !== "autocomplete",
266
- isKeyword: !!(r != null && r.isKeyword)
267
- });
268
- e.store.updateState({
269
- query: c,
270
- loading: !0,
271
- initialized: !0
272
- });
273
- const o = i !== "autocomplete" && e.config.persistentSearchCache, u = e.config.queryModifications(
274
- {
275
- ...c,
276
- products: {
277
- ...c.products,
278
- // Apply filter merging to avoid overwriting base filters
279
- filter: ee((f = (a = e.store.getInitialState().query) == null ? void 0 : a.products) == null ? void 0 : f.filter, (d = t.products) == null ? void 0 : d.filter)
280
- }
281
- },
282
- i
283
- );
284
- try {
285
- let l;
286
- const g = ue(o, u);
287
- if (g)
288
- l = g;
289
- else {
290
- const S = Y(i, u);
291
- l = await V(S, s), ce(o, u, l);
292
- }
293
- e.store.updateState({
294
- response: l,
295
- loading: !1
296
- });
297
- } catch (l) {
298
- console.error("Search action failed", l);
299
- }
300
- n();
301
- }
302
- async function b(e, t, r) {
303
- const n = m("updateSearch"), i = k(e.store.getState().query, { products: { from: 0 } }, t);
304
- await N(e, i, r), n();
305
- }
306
- async function le(e, t, r) {
307
- var s;
308
- const n = m("replaceFilter"), i = (s = e.store.getState().query.products) == null ? void 0 : s.filter, c = r !== void 0 ? [{ field: t, [typeof r == "object" ? "range" : "value"]: [r] }] : [];
309
- await b(e, {
310
- products: {
311
- filter: [...(i == null ? void 0 : i.filter((o) => o.field !== t)) ?? [], ...c]
312
- }
313
- }), n();
314
- }
315
- async function fe(e, t, r, n) {
316
- var u, a;
317
- const i = m("toggleProductFilter"), c = (u = e.store.getState().query.products) == null ? void 0 : u.filter, s = c == null ? void 0 : c.find((f) => f.value instanceof Array && f.field === t), o = s != null && s.value ? {
318
- ...s,
319
- value: [...s.value.filter((f) => !h(f, r)), ...n ? [r] : []]
320
- } : n ? {
321
- field: t,
322
- value: [r]
323
- } : void 0;
324
- await b(e, {
325
- products: {
326
- filter: [...(c == null ? void 0 : c.filter((f) => f !== s)) ?? [], ...(a = o == null ? void 0 : o.value) != null && a.length ? [o] : []]
327
- }
328
- }), i();
329
- }
330
- function de() {
331
- const e = W(), t = v(R), r = z(
332
- () => ({
333
- config: e,
334
- store: t
335
- }),
336
- [e, t]
337
- ), n = p(
338
- (o, u) => N(r, o, u),
339
- [r]
340
- ), i = p(
341
- (o, u) => b(r, o, u),
342
- [r]
343
- ), c = p(
344
- (o, u, a) => fe(r, o, u, a),
345
- [r]
346
- ), s = p(
347
- (o, u) => le(r, o, u),
348
- [r]
349
- );
350
- return {
351
- newSearch: n,
352
- updateSearch: i,
353
- toggleProductFilter: c,
354
- replaceFilter: s
355
- };
356
- }
357
- function ge({ from: e, size: t, pageSize: r }) {
358
- return D() ? {
359
- products: { from: e + r }
360
- } : {
361
- products: { size: t + r }
362
- };
363
- }
364
- function pe(e = 24) {
365
- const { from: t, size: r } = T((c) => {
366
- var s, o;
367
- return {
368
- from: ((s = c.query.products) == null ? void 0 : s.from) ?? 0,
369
- size: ((o = c.query.products) == null ? void 0 : o.size) ?? 0
370
- };
371
- }), { updateSearch: n } = de();
372
- return {
373
- loadMore: p(async () => {
374
- await n(ge({ from: t, size: r, pageSize: e }));
375
- }, [t, r, e, n])
376
- };
377
- }
378
- function ye(e, t) {
379
- var c, s, o;
380
- const r = ((c = t.products) == null ? void 0 : c.total) ?? 0, n = ((s = e.products) == null ? void 0 : s.from) ?? 0, i = ((o = e.products) == null ? void 0 : o.size) ?? 0;
381
- return r > 0 && r > n + i;
382
- }
383
- function ke() {
384
- return !!(window.IntersectionObserver && window.IntersectionObserverEntry && "intersectionRatio" in window.IntersectionObserverEntry.prototype);
385
- }
386
- function ve({ children: e, pageSize: t }) {
387
- const r = Q(null), { query: n, response: i } = T((s) => G(s, "query", "response")), { loadMore: c } = pe(t);
388
- return M(() => {
389
- let s, o;
390
- return ye(n, i) && (s = r.current, o = new IntersectionObserver((u) => {
391
- const a = u[0];
392
- a != null && a.isIntersecting && c();
393
- }), s && o.observe(s)), () => {
394
- s && o.unobserve(s);
395
- };
396
- }, [i]), /* @__PURE__ */ I($, { children: [
397
- e,
398
- /* @__PURE__ */ I("div", { ref: r, style: { height: "1px" } })
399
- ] });
400
- }
401
- export {
402
- J as C,
403
- ve as I,
404
- R as S,
405
- I as a,
406
- T as b,
407
- W as c,
408
- L as d,
409
- y as e,
410
- de as f,
411
- ge as g,
412
- ye as h,
413
- ke as i,
414
- q as j,
415
- K as k,
416
- G as p,
417
- pe as u
418
- };
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const M=require("../index.es-DlUp67LT.cjs"),N=require("preact"),E=require("../utils/utils.cjs.js"),s=require("../InfiniteScrollWithObserver-DbErxedF.cjs"),S=require("preact/hooks");function I(e){return e!==null&&typeof e=="object"&&"props"in e&&typeof e.type=="string"}function T({children:e,hit:n}){var o;if(!I(e))throw new Error("AutocompleteElement expects a single valid HTML element as its child (e.g., <div>, <a>). Custom components are not supported.");const t=(o=e.props)==null?void 0:o.onClick;return N.cloneElement(e,{onClick:r=>{n&&M.s(a=>a.recordSearchClick("autocomplete",n)),typeof t=="function"&&t(r)}})}function z({pageSize:e}){const{loadMore:n}=s.useLoadMore(e);return s.u("button",{onClick:n,children:"More results"})}function w({children:e,loadMoreComponent:n,pageSize:t}){const{loading:o,query:r,response:a}=s.useNostoAppState(l=>s.pick(l,"loading","query","response")),i=!o&&s.hasMoreResults(r,a);return s.u(N.Fragment,{children:[e,i&&(n?s.u(n,{pageSize:t}):s.u(z,{pageSize:t}))]})}const L=!E.isBot()&&s.intersectionObserverSupported()?s.InfiniteScrollWithObserver:w;function O(e){return e.type==="input"}function B(e){return!!e&&typeof e=="object"&&"type"in e&&"props"in e}function b(e,n={depth:0}){const{children:t}=e;return N.toChildArray(t).map(o=>{if(!B(o))return o;const r=e.updateElement(o,n);return r===null?null:(r.props={...r.props,children:b({...e,children:r.props.children},{depth:n.depth+1})},r)})}function j({children:e,onSearchInput:n}){return b({children:e,updateElement:t=>(!O(t)||t.props.type!=="search"||(t.props={...t.props,onInput:o=>{o.target instanceof HTMLInputElement&&n(o.target)}}),t)})}const H="nosto:search:scrollPos";function V(){window.sessionStorage.setItem(H,window.scrollY.toString())}function D({children:e,hit:n,onClick:t}){const{pageType:o}=s.useConfig(),r=o==="autocomplete"?void 0:o;return b({children:e,updateElement:(a,i)=>(i.depth>0||(a.props={...a.props,onClick:l=>{n&&r&&M.s(p=>p.recordSearchClick(r,n)),V(),typeof t=="function"&&t(l)}}),a)})}function k(){S.useEffect(()=>{const e=window.setTimeout(()=>{console.error("Nosto client script has not loaded after 3 seconds.")},3e3);M.s(()=>{window.clearTimeout(e)})},[])}const x={defaultCurrency:"EUR",queryModifications:e=>e},W={...x};function U(e){return{pageType:"autocomplete",...W,...e}}function _({config:e,store:n,children:t}){const o=n??s.createStore();return k(),s.u(s.ConfigContext,{value:U(e),children:s.u(s.StoreContext,{value:o,children:t})})}const $={...x,persistentSearchCache:!1,preservePageScroll:!1};function K(e){return{pageType:"category",...$,...e}}function Y({config:e,store:n,children:t}){const o=n??s.createStore();return k(),s.u(s.ConfigContext,{value:K(e),children:s.u(s.StoreContext,{value:o,children:t})})}const G={...x,persistentSearchCache:!1,preservePageScroll:!1};function J(e={}){return{pageType:"serp",...G,...e}}function Q({config:e,store:n,children:t}){const o=n??s.createStore();return k(),s.u(s.ConfigContext,{value:J(e),children:s.u(s.StoreContext,{value:o,children:t})})}function X(e){const n=s.useNostoAppState(t=>t.response);return e&&Array.isArray(e)||e&&s.isPlainObject(e)?e:n}function Z(e){var i;const n=((i=e.data)==null?void 0:i.filter(l=>l.selected).length)??0,[t,o]=S.useState(n>0),{toggleProductFilter:r}=s.useActions();return{active:t,selectedFiltersCount:n,toggleActive:()=>{o(!t)},toggleProductFilter:r}}function ee(){const{loading:e,facets:n}=s.useNostoAppState(t=>{var o,r;return{loading:t.loading,facets:((r=(o=t.response)==null?void 0:o.products)==null?void 0:r.facets)??[]}});return{loading:e,facets:n}}function te(e,n){const t=n-e;return!isNaN(t)&&t>0?new Array(n-e).fill(void 0).map((o,r)=>r+e):[]}function ne(e){const{query:n,products:t}=s.useNostoAppState(o=>({query:o.query,products:o.response.products}));return S.useMemo(()=>{var A;if(!t)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const o=((A=n.products)==null?void 0:A.from)??0,r=(e==null?void 0:e.width)??1/0,a=Math.max(Math.floor(r-1)/2,1),i=t.size>0?Math.floor(o/t.size)+1:1,l=t.size>0?Math.ceil(t.total/t.size):0,p=y=>y>=i-a&&y<=i+a,u=o+1,d=Math.min(o+t.total,t.total),c={from:o,page:i,current:!0},m=y=>({from:(y-1)*t.size,page:y,current:y===i}),h=i>1?m(i-1):void 0,f=i<l?m(i+1):void 0,C=a===1/0||i-a-1>1?m(1):void 0,g=a===1/0||i+a+1<l?m(l):void 0,v=te(1,l+1).filter(p).map(m);return{totalPages:l,resultsFrom:u,resultsTo:d,current:c,prev:h,next:f,first:C,last:g,pages:v}},[n,t,e==null?void 0:e.width])}function oe(){const[e,n]=S.useState([]),[t,o]=S.useState([]);return S.useEffect(()=>{M.s(async r=>{const{products:a,segments:i}=await r.getSearchSessionParams();n(i??[]),o((a==null?void 0:a.personalizationBoost)??[])})},[]),{segments:e,boost:t}}function re(){const{facets:e}=s.useNostoAppState(u=>{var d;return{facets:((d=u.response.products)==null?void 0:d.facets)??[]}}),{replaceFilter:n,toggleProductFilter:t}=s.useActions(),o=S.useCallback(u=>{const d=e==null?void 0:e.find(c=>c.type==="stats"&&c.field===u);if(d&&"min"in d&&"max"in d)return d},[e]),r=S.useCallback(u=>{var d;return((d=e==null?void 0:e.find(c=>c.field===u))==null?void 0:d.name)??u},[e]),a=S.useCallback(u=>"field"in u&&(u.value instanceof Array||u.range instanceof Array),[]),i=S.useCallback(u=>{var d;return{...u,range:(d=u.range)==null?void 0:d.map(c=>({gt:c.gt?Number(c.gt):c.gt,gte:c.gte?Number(c.gte):c.gte,lt:c.lt?Number(c.lt):c.lt,lte:c.lte?Number(c.lte):c.lte}))}},[]),l=S.useCallback(u=>(u.value??[]).map(c=>({value:c,field:u.field,name:r(u.field),filter:i(u),remove:()=>{t(u.field,c,!1)}})),[i,r,t]),p=S.useCallback(u=>(u.range??[]).map(c=>{var f,C;const m=c.gte??c.gt??((f=o(u.field))==null?void 0:f.min),h=c.lte??c.lt??((C=o(u.field))==null?void 0:C.max);if(m!==void 0&&h!==void 0)return{value:`${m} - ${h}`,field:u.field,name:r(u.field),filter:i(u),remove:()=>{n(u.field,void 0)}}}).filter(Boolean),[i,o,r,n]);return{selectFilters:a,toValueFilter:l,toRangeFilter:p}}function R(){const{filter:e}=s.useNostoAppState(l=>{var p;return{filter:((p=l.query.products)==null?void 0:p.filter)??[]}}),{updateSearch:n}=s.useActions(),{selectFilters:t,toValueFilter:o,toRangeFilter:r}=re(),a=S.useMemo(()=>e?e.filter(t).flatMap(l=>"value"in l?o(l):"range"in l?r(l):[]).filter(Boolean):[],[e,t,r,o]),i=S.useCallback(()=>{n({products:{filter:[]}})},[n]);return{filters:a,removeAll:i}}function P(e){if(typeof e=="number")return e;if(typeof e!="string")return;const n=Number(e);return isNaN(n)?void 0:n}function q(e){var c,m,h;const{replaceFilter:n}=s.useActions(),{query:t,products:o}=s.useNostoAppState(f=>({query:f.query,products:f.response.products})),r=(c=o==null?void 0:o.facets)==null?void 0:c.find(f=>f.id===e);if(!r)return{min:0,max:0,range:[0,0],updateRange:()=>{}};const a=(h=(m=t.products)==null?void 0:m.filter)==null?void 0:h.find(f=>f.field===r.field),i=a!=null&&a.range?a.range[0]:void 0,l=typeof i=="object"&&("gte"in i||"lte"in i)?[P(i.gte),P(i.lte)]:[void 0,void 0],p="min"in r?Math.floor(r.min):0,u="max"in r?Math.ceil(r.max):0,d=([f,C])=>{const g=f!==void 0?Math.floor(f):void 0,v=C!==void 0?Math.ceil(C):void 0,A=g!==void 0,y=v!==void 0;(p===g||!A)&&(u===v||!y)?n(r.field,void 0):(p===g||!A)&&y?n(r.field,{lte:v.toString()}):(u===v||!y)&&A?n(r.field,{gte:g.toString()}):A&&y&&n(r.field,{gte:g.toString(),lte:v.toString()})};return{min:p,max:u,range:[l[0]??p,l[1]??u],updateRange:d}}function se(e,n){const{min:t,max:o,range:r,updateRange:a}=q(e),{filters:i}=R(),l=S.useMemo(()=>{var C;const c=i.find(g=>{var v;return(v=g==null?void 0:g.filter)==null?void 0:v.range});let m=null;if(c){const g=(C=c.filter.range)==null?void 0:C[0];m=[P(g==null?void 0:g.gte),P(g==null?void 0:g.lte)]}const h=[];let f=Math.floor(t/n)*n;for(;f<o;){const g=f+n,v=m&&m[0]===f&&m[1]===g;h.push({min:f,max:g,selected:v}),f=g}return h},[i,t,o,n]),p=c=>{a([c,r[1]])},u=c=>{a([r[0],c])},d=t!==r[0]||o!==r[1];return{min:t,max:o,range:r,updateRange:a,ranges:l,handleMinChange:p,handleMaxChange:u,isSelected:d}}function ue(){const{products:e,keywords:n}=s.useNostoAppState(t=>t.response);return{products:e??{hits:[],total:0},keywords:n??{hits:[],total:0}}}function ie(){const e=s.useNostoAppState(t=>{var o;return(o=t.query.products)==null?void 0:o.filter});return S.useMemo(()=>e?e.reduce((t,o)=>t+(Array.isArray(o.value)?o.value.length:1),0):0,[e])}function F(e){return e&&!Number.isNaN(e)?e:0}function ce(e,n){const{from:t,size:o,total:r}=s.useNostoAppState(u=>{var d,c,m,h,f;return{from:F(((d=u.query.products)==null?void 0:d.from)??0),size:F(((m=(c=u.response)==null?void 0:c.products)==null?void 0:m.size)??0),total:F(((f=(h=u.response)==null?void 0:h.products)==null?void 0:f.total)??0)}}),{updateSearch:a}=s.useActions(),i=t+o,l=[...e].reverse().filter(u=>u+n<r);return{from:t,to:i,total:r,size:o,sizeOptions:l,handleSizeChange:u=>{a({products:{size:u}})}}}function ae(e,n){return e.length!==n.length?!1:e.every(t=>n.find(o=>t.field===o.field&&t.order===o.order))}function le(e){var a,i;const n=s.useNostoAppState(l=>l.query),{updateSearch:t}=s.useActions();return{activeSort:((a=e.find(l=>{var p;return ae(l.value.sort,((p=n.products)==null?void 0:p.sort)||[])}))==null?void 0:a.id)??((i=e[0])==null?void 0:i.id),setSort:l=>{const p=e.find(u=>u.id===l);p&&t({products:{sort:p.value.sort}})}}}exports.StoreContext=s.StoreContext;exports.createExtendableStore=s.createExtendableStore;exports.createStore=s.createStore;exports.defaultState=s.defaultState;exports.useActions=s.useActions;exports.useLoadMore=s.useLoadMore;exports.useNostoAppState=s.useNostoAppState;exports.AutocompleteElement=T;exports.AutocompletePageProvider=_;exports.CategoryPageProvider=Y;exports.InfiniteScroll=L;exports.InfiniteScrollWithLink=w;exports.SearchInput=j;exports.SearchPageProvider=Q;exports.SerpElement=D;exports.useDecoratedSearchResults=X;exports.useFacet=Z;exports.useFacets=ee;exports.usePagination=ne;exports.usePersonalization=oe;exports.useProductFilters=R;exports.useRange=q;exports.useRangeSelector=se;exports.useResponse=ue;exports.useSelectedFiltersCount=ie;exports.useSizeOptions=ce;exports.useSort=le;