@nosto/search-js 2.1.0 → 2.1.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.
Files changed (43) hide show
  1. package/dist/InfiniteScrollWithObserver-BC15p357.cjs +1 -0
  2. package/dist/InfiniteScrollWithObserver-DcV-Ny_9.js +33 -0
  3. package/dist/isEqual-BzZ3d1JM.js +41 -0
  4. package/dist/isEqual-DQXR__da.cjs +1 -0
  5. package/dist/parseNumber-FsZ8w61u.cjs +1 -0
  6. package/dist/parseNumber-QA48nJLp.js +11 -0
  7. package/dist/pick-DReBictn.js +9 -0
  8. package/dist/pick-rYi1lc2m.cjs +1 -0
  9. package/dist/preact/autocomplete.cjs.js +1 -1
  10. package/dist/preact/autocomplete.es.js +1 -1
  11. package/dist/preact/category.cjs.js +1 -1
  12. package/dist/preact/category.es.js +1 -1
  13. package/dist/preact/common.cjs.js +1 -1
  14. package/dist/preact/common.es.js +20 -19
  15. package/dist/preact/hooks.cjs.js +1 -1
  16. package/dist/preact/hooks.es.js +45 -52
  17. package/dist/preact/legacy.cjs.js +1 -1
  18. package/dist/preact/legacy.es.js +2 -2
  19. package/dist/preact/serp.cjs.js +1 -1
  20. package/dist/preact/serp.es.js +1 -1
  21. package/dist/storeContext-DVs7r6Qm.cjs +1 -0
  22. package/dist/storeContext-jWZFJ8Kf.js +63 -0
  23. package/dist/unique-CGVAnKZy.cjs +1 -0
  24. package/dist/unique-Dwtu7vXB.js +44 -0
  25. package/dist/useLoadMore-1PzDu__A.js +261 -0
  26. package/dist/useLoadMore-wwYzUkxk.cjs +1 -0
  27. package/dist/utils/src/deepMerge.d.ts +4 -1
  28. package/dist/utils/src/isEqual.d.ts +3 -0
  29. package/dist/utils/src/isPlainObject.d.ts +3 -0
  30. package/dist/utils/src/mergeArrays.d.ts +3 -0
  31. package/dist/utils/src/parseNumber.d.ts +3 -0
  32. package/dist/utils/src/performance.d.ts +3 -0
  33. package/dist/utils/src/unique.d.ts +3 -0
  34. package/dist/utils/utils.cjs.js +1 -1
  35. package/dist/utils/utils.d.ts +9 -0
  36. package/dist/utils/utils.es.js +13 -18
  37. package/package.json +1 -1
  38. package/dist/InfiniteScrollWithObserver-BoKdnFuB.cjs +0 -1
  39. package/dist/InfiniteScrollWithObserver-CkdVKocm.js +0 -39
  40. package/dist/storeContext-12dN1l9r.cjs +0 -1
  41. package/dist/storeContext-CBqmmTUC.js +0 -99
  42. package/dist/useLoadMore-BBrbOkyq.cjs +0 -1
  43. package/dist/useLoadMore-DnvHCsYl.js +0 -281
@@ -0,0 +1,261 @@
1
+ import { u as I, S as k } from "./storeContext-jWZFJ8Kf.js";
2
+ import { useContext as w, useMemo as v, useCallback as g, useState as M, useEffect as T } from "preact/hooks";
3
+ import { s as A } from "./search-B0-bVNMy.js";
4
+ import { u as R, a as f, m as N, i as Q } from "./unique-Dwtu7vXB.js";
5
+ import { i as C, d as p } from "./isEqual-BzZ3d1JM.js";
6
+ function E(e, r) {
7
+ return {
8
+ ...r,
9
+ products: {
10
+ facets: e === "autocomplete" ? void 0 : ["*"],
11
+ fields: U,
12
+ ...r.products
13
+ },
14
+ ...r.keywords ? {
15
+ keywords: {
16
+ ...r.keywords,
17
+ fields: R([...V, ...r.keywords.fields ?? []]),
18
+ highlight: r.keywords.highlight ?? {
19
+ preTag: "<strong>",
20
+ postTag: "</strong>"
21
+ }
22
+ }
23
+ } : {}
24
+ };
25
+ }
26
+ const U = [
27
+ "productId",
28
+ "url",
29
+ "name",
30
+ "imageUrl",
31
+ "imageHash",
32
+ "thumbUrl",
33
+ "description",
34
+ "brand",
35
+ "variantId",
36
+ "availability",
37
+ "price",
38
+ "priceText",
39
+ "categoryIds",
40
+ "categories",
41
+ "customFields.key",
42
+ "customFields.value",
43
+ "priceCurrencyCode",
44
+ "datePublished",
45
+ "listPrice",
46
+ "unitPricingBaseMeasure",
47
+ "unitPricingUnit",
48
+ "unitPricingMeasure",
49
+ "googleCategory",
50
+ "gtin",
51
+ "ageGroup",
52
+ "gender",
53
+ "condition",
54
+ "alternateImageUrls",
55
+ "ratingValue",
56
+ "reviewCount",
57
+ "inventoryLevel",
58
+ "skus.id",
59
+ "skus.name",
60
+ "skus.price",
61
+ "skus.listPrice",
62
+ "skus.priceText",
63
+ "skus.url",
64
+ "skus.imageUrl",
65
+ "skus.inventoryLevel",
66
+ "skus.customFields.key",
67
+ "skus.customFields.value",
68
+ "skus.availability",
69
+ "pid",
70
+ "onDiscount",
71
+ "extra.key",
72
+ "extra.value",
73
+ "saleable",
74
+ "available",
75
+ "tags1",
76
+ "tags2",
77
+ "tags3"
78
+ ], V = ["keyword", "_redirect"];
79
+ function K(e, r, t) {
80
+ const s = JSON.stringify(r);
81
+ try {
82
+ console.info("Setting storage", e, s), t.setItem(e, s);
83
+ } catch (a) {
84
+ console.warn(a);
85
+ }
86
+ }
87
+ function O(e, r) {
88
+ try {
89
+ const t = r.getItem(e);
90
+ if (t)
91
+ return JSON.parse(t);
92
+ } catch (t) {
93
+ console.warn(t);
94
+ }
95
+ }
96
+ function z(e, r) {
97
+ K(e, r, sessionStorage);
98
+ }
99
+ function D(e) {
100
+ return O(e, sessionStorage);
101
+ }
102
+ const b = "nosto:search:searchResult";
103
+ function L(e, r, t) {
104
+ if (!e)
105
+ return;
106
+ z(b, { query: r, result: t });
107
+ }
108
+ function _(e, r) {
109
+ if (!e)
110
+ return null;
111
+ const t = D(b);
112
+ if (!t || !j(t))
113
+ return null;
114
+ const s = S(t.query);
115
+ return C(S(r), s) ? t.result : null;
116
+ }
117
+ function S(e) {
118
+ return {
119
+ accountId: e.accountId,
120
+ customRules: e.customRules,
121
+ explain: e.explain,
122
+ keywords: e.keywords,
123
+ products: e.products,
124
+ query: e.query,
125
+ redirect: e.redirect,
126
+ rules: e.rules,
127
+ segments: e.segments,
128
+ sessionParams: e.sessionParams
129
+ };
130
+ }
131
+ function j(e) {
132
+ return typeof e == "object" && e !== null && "query" in e && "result" in e;
133
+ }
134
+ async function P(e, r, t) {
135
+ var l, u, y;
136
+ const s = f("newSearch"), a = e.config.pageType, n = p(e.store.getInitialState().query, r), c = p(e.config.search, t, {
137
+ track: a,
138
+ redirect: a !== "autocomplete",
139
+ isKeyword: !!(t != null && t.isKeyword)
140
+ });
141
+ e.store.updateState({
142
+ query: n,
143
+ loading: !0,
144
+ initialized: !0
145
+ });
146
+ const o = a !== "autocomplete" && e.config.persistentSearchCache, i = e.config.queryModifications(
147
+ {
148
+ ...n,
149
+ products: {
150
+ ...n.products,
151
+ // Apply filter merging to avoid overwriting base filters
152
+ filter: N((u = (l = e.store.getInitialState().query) == null ? void 0 : l.products) == null ? void 0 : u.filter, (y = r.products) == null ? void 0 : y.filter)
153
+ }
154
+ },
155
+ a
156
+ );
157
+ try {
158
+ let d;
159
+ const h = _(o, i);
160
+ if (h)
161
+ d = h;
162
+ else {
163
+ const F = E(a, i);
164
+ d = await A(F, c), L(o, i, d);
165
+ }
166
+ e.store.updateState({
167
+ response: d,
168
+ loading: !1
169
+ });
170
+ } catch (d) {
171
+ console.error("Search action failed", d);
172
+ }
173
+ s();
174
+ }
175
+ async function m(e, r, t) {
176
+ const s = f("updateSearch"), a = p(e.store.getState().query, { products: { from: 0 } }, r);
177
+ await P(e, a, t), s();
178
+ }
179
+ async function B(e, r, t) {
180
+ var c;
181
+ const s = f("replaceFilter"), a = (c = e.store.getState().query.products) == null ? void 0 : c.filter, n = t !== void 0 ? [{ field: r, [typeof t == "object" ? "range" : "value"]: [t] }] : [];
182
+ await m(e, {
183
+ products: {
184
+ filter: [...(a == null ? void 0 : a.filter((o) => o.field !== r)) ?? [], ...n]
185
+ }
186
+ }), s();
187
+ }
188
+ async function G(e, r, t, s) {
189
+ var i, l;
190
+ const a = f("toggleProductFilter"), n = (i = e.store.getState().query.products) == null ? void 0 : i.filter, c = n == null ? void 0 : n.find((u) => u.value instanceof Array && u.field === r), o = c != null && c.value ? {
191
+ ...c,
192
+ value: [...c.value.filter((u) => !C(u, t)), ...s ? [t] : []]
193
+ } : s ? {
194
+ field: r,
195
+ value: [t]
196
+ } : void 0;
197
+ await m(e, {
198
+ products: {
199
+ filter: [...(n == null ? void 0 : n.filter((u) => u !== c)) ?? [], ...(l = o == null ? void 0 : o.value) != null && l.length ? [o] : []]
200
+ }
201
+ }), a();
202
+ }
203
+ function J() {
204
+ const e = I(), r = w(k), t = v(
205
+ () => ({
206
+ config: e,
207
+ store: r
208
+ }),
209
+ [e, r]
210
+ ), s = g(
211
+ (o, i) => P(t, o, i),
212
+ [t]
213
+ ), a = g(
214
+ (o, i) => m(t, o, i),
215
+ [t]
216
+ ), n = g(
217
+ (o, i, l) => G(t, o, i, l),
218
+ [t]
219
+ ), c = g(
220
+ (o, i) => B(t, o, i),
221
+ [t]
222
+ );
223
+ return {
224
+ newSearch: s,
225
+ updateSearch: a,
226
+ toggleProductFilter: n,
227
+ replaceFilter: c
228
+ };
229
+ }
230
+ function q(e = x) {
231
+ const r = w(k), [t, s] = M(e(r.getState()));
232
+ return r.onChange(e, s), T(() => () => r.clearOnChange(s), [r]), t;
233
+ }
234
+ const x = (e) => e;
235
+ function H({ from: e, size: r, pageSize: t }) {
236
+ return Q() ? {
237
+ products: { from: e + t }
238
+ } : {
239
+ products: { size: r + t }
240
+ };
241
+ }
242
+ function ee(e = 24) {
243
+ const { from: r, size: t } = q((n) => {
244
+ var c, o;
245
+ return {
246
+ from: ((c = n.query.products) == null ? void 0 : c.from) ?? 0,
247
+ size: ((o = n.query.products) == null ? void 0 : o.size) ?? 0
248
+ };
249
+ }), { updateSearch: s } = J();
250
+ return {
251
+ loadMore: g(async () => {
252
+ await s(H({ from: r, size: t, pageSize: e }));
253
+ }, [r, t, e, s])
254
+ };
255
+ }
256
+ export {
257
+ ee as a,
258
+ J as b,
259
+ H as g,
260
+ q as u
261
+ };
@@ -0,0 +1 @@
1
+ "use strict";const y=require("./storeContext-DVs7r6Qm.cjs"),i=require("preact/hooks"),v=require("./search-BVJZK90N.cjs"),g=require("./unique-CGVAnKZy.cjs"),p=require("./isEqual-DQXR__da.cjs");function M(e,r){return{...r,products:{facets:e==="autocomplete"?void 0:["*"],fields:q,...r.products},...r.keywords?{keywords:{...r.keywords,fields:g.unique([...A,...r.keywords.fields??[]]),highlight:r.keywords.highlight??{preTag:"<strong>",postTag:"</strong>"}}}:{}}}const q=["productId","url","name","imageUrl","imageHash","thumbUrl","description","brand","variantId","availability","price","priceText","categoryIds","categories","customFields.key","customFields.value","priceCurrencyCode","datePublished","listPrice","unitPricingBaseMeasure","unitPricingUnit","unitPricingMeasure","googleCategory","gtin","ageGroup","gender","condition","alternateImageUrls","ratingValue","reviewCount","inventoryLevel","skus.id","skus.name","skus.price","skus.listPrice","skus.priceText","skus.url","skus.imageUrl","skus.inventoryLevel","skus.customFields.key","skus.customFields.value","skus.availability","pid","onDiscount","extra.key","extra.value","saleable","available","tags1","tags2","tags3"],A=["keyword","_redirect"];function N(e,r,t){const s=JSON.stringify(r);try{console.info("Setting storage",e,s),t.setItem(e,s)}catch(a){console.warn(a)}}function T(e,r){try{const t=r.getItem(e);if(t)return JSON.parse(t)}catch(t){console.warn(t)}}function E(e,r){N(e,r,sessionStorage)}function Q(e){return T(e,sessionStorage)}const C="nosto:search:searchResult";function R(e,r,t){if(!e)return;E(C,{query:r,result:t})}function U(e,r){if(!e)return null;const t=Q(C);if(!t||!V(t))return null;const s=k(t.query);return p.isEqual(k(r),s)?t.result:null}function k(e){return{accountId:e.accountId,customRules:e.customRules,explain:e.explain,keywords:e.keywords,products:e.products,query:e.query,redirect:e.redirect,rules:e.rules,segments:e.segments,sessionParams:e.sessionParams}}function V(e){return typeof e=="object"&&e!==null&&"query"in e&&"result"in e}async function w(e,r,t){var d,l,S;const s=g.measure("newSearch"),a=e.config.pageType,n=p.deepMerge(e.store.getInitialState().query,r),c=p.deepMerge(e.config.search,t,{track:a,redirect:a!=="autocomplete",isKeyword:!!(t!=null&&t.isKeyword)});e.store.updateState({query:n,loading:!0,initialized:!0});const o=a!=="autocomplete"&&e.config.persistentSearchCache,u=e.config.queryModifications({...n,products:{...n.products,filter:g.mergeArrays((l=(d=e.store.getInitialState().query)==null?void 0:d.products)==null?void 0:l.filter,(S=r.products)==null?void 0:S.filter)}},a);try{let f;const m=U(o,u);if(m)f=m;else{const I=M(a,u);f=await v.search(I,c),R(o,u,f)}e.store.updateState({response:f,loading:!1})}catch(f){console.error("Search action failed",f)}s()}async function h(e,r,t){const s=g.measure("updateSearch"),a=p.deepMerge(e.store.getState().query,{products:{from:0}},r);await w(e,a,t),s()}async function x(e,r,t){var c;const s=g.measure("replaceFilter"),a=(c=e.store.getState().query.products)==null?void 0:c.filter,n=t!==void 0?[{field:r,[typeof t=="object"?"range":"value"]:[t]}]:[];await h(e,{products:{filter:[...(a==null?void 0:a.filter(o=>o.field!==r))??[],...n]}}),s()}async function K(e,r,t,s){var u,d;const a=g.measure("toggleProductFilter"),n=(u=e.store.getState().query.products)==null?void 0:u.filter,c=n==null?void 0:n.find(l=>l.value instanceof Array&&l.field===r),o=c!=null&&c.value?{...c,value:[...c.value.filter(l=>!p.isEqual(l,t)),...s?[t]:[]]}:s?{field:r,value:[t]}:void 0;await h(e,{products:{filter:[...(n==null?void 0:n.filter(l=>l!==c))??[],...(d=o==null?void 0:o.value)!=null&&d.length?[o]:[]]}}),a()}function b(){const e=y.useConfig(),r=i.useContext(y.StoreContext),t=i.useMemo(()=>({config:e,store:r}),[e,r]),s=i.useCallback((o,u)=>w(t,o,u),[t]),a=i.useCallback((o,u)=>h(t,o,u),[t]),n=i.useCallback((o,u,d)=>K(t,o,u,d),[t]),c=i.useCallback((o,u)=>x(t,o,u),[t]);return{newSearch:s,updateSearch:a,toggleProductFilter:n,replaceFilter:c}}function P(e=L){const r=i.useContext(y.StoreContext),[t,s]=i.useState(e(r.getState()));return r.onChange(e,s),i.useEffect(()=>()=>r.clearOnChange(s),[r]),t}const L=e=>e;function F({from:e,size:r,pageSize:t}){return g.isBot()?{products:{from:e+t}}:{products:{size:r+t}}}function O(e=24){const{from:r,size:t}=P(n=>{var c,o;return{from:((c=n.query.products)==null?void 0:c.from)??0,size:((o=n.query.products)==null?void 0:o.size)??0}}),{updateSearch:s}=b();return{loadMore:i.useCallback(async()=>{await s(F({from:r,size:t,pageSize:e}))},[r,t,e,s])}}exports.getNextPageQuery=F;exports.useActions=b;exports.useLoadMore=O;exports.useNostoAppState=P;
@@ -1,8 +1,11 @@
1
1
  import { Simplify } from './simplify';
2
2
  import { Equals, Expect } from './types';
3
+ /**
4
+ * Merges multiple objects into one object.
5
+ */
3
6
  export declare function deepMerge<T extends unknown[]>(...objects: T): Merge<T>;
4
7
  export declare function deepMergePlain<T extends unknown[]>(...objects: T): PlainMerge<T>;
5
- type Merge<T, U = unknown> = T extends [infer First, ...infer Rest] ? Merge<Rest, U & First> : Simplify<U>;
8
+ type Merge<T, U = unknown> = Simplify<PlainMerge<T, U>>;
6
9
  type PlainMerge<T, U = unknown> = T extends [infer First, ...infer Rest] ? PlainMerge<Rest, U & First> : U;
7
10
  export type MergeTests = [
8
11
  Expect<Equals<Merge<[{
@@ -1 +1,4 @@
1
+ /**
2
+ * Compares two values for equality.
3
+ */
1
4
  export declare function isEqual(a: unknown, b: unknown): boolean;
@@ -1 +1,4 @@
1
+ /**
2
+ * Checks if a value is a plain object.
3
+ */
1
4
  export declare function isPlainObject<T = Record<string, unknown>>(value: unknown): value is T;
@@ -1,2 +1,5 @@
1
1
  import { Unfreeze } from './types';
2
+ /**
3
+ * Merges multiple arrays into one array.
4
+ */
2
5
  export declare function mergeArrays<T extends (unknown[] | readonly unknown[] | undefined | null)[]>(...objects: T): Unfreeze<T>[number];
@@ -1 +1,4 @@
1
+ /**
2
+ * Takes a value and returns it as a number if possible.
3
+ */
1
4
  export declare function parseNumber(value: unknown): number | undefined;
@@ -1 +1,4 @@
1
+ /**
2
+ * Measure the performance of a function.
3
+ */
1
4
  export declare function measure(name: string): () => void;
@@ -1 +1,4 @@
1
+ /**
2
+ * This function takes an array and returns a new array with only unique values.
3
+ */
1
4
  export declare function unique<T>(arr: T[]): T[];
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var r=" daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com\\b|\\btime/|\\||^<|^[\\w \\.\\-\\(?:\\):%]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w*search\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^email|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^igetter/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d\\s[\\w\\.-]+$|^mozilla/\\d\\.\\d\\s\\(compatible;?(?:\\s\\w+\\/\\d+\\.\\d+)?\\)$|^navermailapp|^netsurf|^offline|^openai/|^owler|^php|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|adscanner/|analyzer|archive|ask jeeves/teoma|audit|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check\\b|checker|chrome-lighthouse|chromeframe|classifier|cloudflare|convertify|cookiehubscan|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|exaleadcloudview|feed|firephp|functionize|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|infrawatch|insight|inspect|iplabel|ips-agent|java(?!;)|jsjcw_scanner|library|linkcheck|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|onetrust|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|retriever|rexx;|rigor|rss\\b|scanner\\.|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|supercleaner|synapse|synthetic|tools|torrent|transcoder|url|validator|virtuoso|wappalyzer|webglance|webkit2png|whatcms/|zgrab",t=/bot|crawl|http|lighthouse|scan|search|spider/i,e;function o(){if(e instanceof RegExp)return e;try{e=new RegExp(r,"i")}catch{e=t}return e}function s(a){return!!a&&o().test(a)}function c(){return s(navigator.userAgent)}exports.isBot=c;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../isEqual-DQXR__da.cjs"),e=require("../unique-CGVAnKZy.cjs"),i=require("../parseNumber-FsZ8w61u.cjs"),u=require("../pick-rYi1lc2m.cjs");exports.deepMerge=r.deepMerge;exports.isEqual=r.isEqual;exports.isPlainObject=r.isPlainObject;exports.isBot=e.isBot;exports.measure=e.measure;exports.mergeArrays=e.mergeArrays;exports.unique=e.unique;exports.parseNumber=i.parseNumber;exports.pick=u.pick;
@@ -1,2 +1,11 @@
1
1
  /** @module utils */
2
+ export { deepMerge, type MergeTests } from './src/deepMerge';
2
3
  export { isBot } from './src/isBot';
4
+ export { isEqual } from './src/isEqual';
5
+ export { isPlainObject } from './src/isPlainObject';
6
+ export { mergeArrays } from './src/mergeArrays';
7
+ export { parseNumber } from './src/parseNumber';
8
+ export { measure } from './src/performance';
9
+ export { pick } from './src/pick';
10
+ export type { Simplify, simplifyTests } from './src/simplify';
11
+ export { unique } from './src/unique';
@@ -1,20 +1,15 @@
1
- var r = " daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com\\b|\\btime/|\\||^<|^[\\w \\.\\-\\(?:\\):%]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w*search\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^email|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^igetter/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d\\s[\\w\\.-]+$|^mozilla/\\d\\.\\d\\s\\(compatible;?(?:\\s\\w+\\/\\d+\\.\\d+)?\\)$|^navermailapp|^netsurf|^offline|^openai/|^owler|^php|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|adscanner/|analyzer|archive|ask jeeves/teoma|audit|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check\\b|checker|chrome-lighthouse|chromeframe|classifier|cloudflare|convertify|cookiehubscan|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|exaleadcloudview|feed|firephp|functionize|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|infrawatch|insight|inspect|iplabel|ips-agent|java(?!;)|jsjcw_scanner|library|linkcheck|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|onetrust|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|retriever|rexx;|rigor|rss\\b|scanner\\.|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|supercleaner|synapse|synthetic|tools|torrent|transcoder|url|validator|virtuoso|wappalyzer|webglance|webkit2png|whatcms/|zgrab", t = /bot|crawl|http|lighthouse|scan|search|spider/i, e;
2
- function o() {
3
- if (e instanceof RegExp)
4
- return e;
5
- try {
6
- e = new RegExp(r, "i");
7
- } catch {
8
- e = t;
9
- }
10
- return e;
11
- }
12
- function s(a) {
13
- return !!a && o().test(a);
14
- }
15
- function c() {
16
- return s(navigator.userAgent);
17
- }
1
+ import { d as r, i as s, a as o } from "../isEqual-BzZ3d1JM.js";
2
+ import { i, a as m, m as t, u } from "../unique-Dwtu7vXB.js";
3
+ import { p as x } from "../parseNumber-QA48nJLp.js";
4
+ import { p as c } from "../pick-DReBictn.js";
18
5
  export {
19
- c as isBot
6
+ r as deepMerge,
7
+ i as isBot,
8
+ s as isEqual,
9
+ o as isPlainObject,
10
+ m as measure,
11
+ t as mergeArrays,
12
+ x as parseNumber,
13
+ c as pick,
14
+ u as unique
20
15
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nosto/search-js",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "files": [
@@ -1 +0,0 @@
1
- "use strict";const d=require("./jsxRuntime.module-B3sGoTIU.cjs"),f=require("./useLoadMore-BBrbOkyq.cjs"),l=require("preact/hooks"),b=require("preact");function p(t,...o){return o.reduce((r,n)=>(r[n]=t[n],r),{})}function v(t,o){var c,e,s;const r=((c=o.products)==null?void 0:c.total)??0,n=((e=t.products)==null?void 0:e.from)??0,i=((s=t.products)==null?void 0:s.size)??0;return r>0&&r>n+i}function h(){return!!(window.IntersectionObserver&&window.IntersectionObserverEntry&&"intersectionRatio"in window.IntersectionObserverEntry.prototype)}function O({children:t,pageSize:o}){const r=l.useRef(null),{query:n,response:i}=f.useNostoAppState(e=>p(e,"query","response")),{loadMore:c}=f.useLoadMore(o);return l.useEffect(()=>{let e,s;return v(n,i)&&(e=r.current,s=new IntersectionObserver(a=>{const u=a[0];u!=null&&u.isIntersecting&&c()}),e&&s.observe(e)),()=>{e&&s.unobserve(e)}},[i]),d.u(b.Fragment,{children:[t,d.u("div",{ref:r,style:{height:"1px"}})]})}exports.InfiniteScrollWithObserver=O;exports.hasMoreResults=v;exports.intersectionObserverSupported=h;exports.pick=p;
@@ -1,39 +0,0 @@
1
- import { u as f } from "./jsxRuntime.module-Bzuv3cXw.js";
2
- import { a, u as d } from "./useLoadMore-DnvHCsYl.js";
3
- import { useRef as l, useEffect as m } from "preact/hooks";
4
- import { Fragment as v } from "preact";
5
- function b(t, ...s) {
6
- return s.reduce(
7
- (r, o) => (r[o] = t[o], r),
8
- {}
9
- );
10
- }
11
- function w(t, s) {
12
- var c, e, n;
13
- const r = ((c = s.products) == null ? void 0 : c.total) ?? 0, o = ((e = t.products) == null ? void 0 : e.from) ?? 0, i = ((n = t.products) == null ? void 0 : n.size) ?? 0;
14
- return r > 0 && r > o + i;
15
- }
16
- function R() {
17
- return !!(window.IntersectionObserver && window.IntersectionObserverEntry && "intersectionRatio" in window.IntersectionObserverEntry.prototype);
18
- }
19
- function E({ children: t, pageSize: s }) {
20
- const r = l(null), { query: o, response: i } = a((e) => b(e, "query", "response")), { loadMore: c } = d(s);
21
- return m(() => {
22
- let e, n;
23
- return w(o, i) && (e = r.current, n = new IntersectionObserver((p) => {
24
- const u = p[0];
25
- u != null && u.isIntersecting && c();
26
- }), e && n.observe(e)), () => {
27
- e && n.unobserve(e);
28
- };
29
- }, [i]), /* @__PURE__ */ f(v, { children: [
30
- t,
31
- /* @__PURE__ */ f("div", { ref: r, style: { height: "1px" } })
32
- ] });
33
- }
34
- export {
35
- E as I,
36
- w as h,
37
- R as i,
38
- b as p
39
- };
@@ -1 +0,0 @@
1
- "use strict";const d=require("preact"),E=require("preact/hooks"),S=d.createContext(null),b=()=>{const e=E.useContext(S);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},g=e=>String(e)==="[object Object]";function u(e){if(!g(e))return!1;const t=e.constructor;if(t===void 0)return!0;const n=t.prototype;return!(!g(n)||!n.hasOwnProperty("isPrototypeOf"))}function m(...e){return e.reduce((t,n)=>a(t,n))}function C(...e){return e.reduce((t,n)=>a(t,n))}function a(e,t){return u(e)&&u(t)?Object.entries(t).reduce((n,[r,c])=>(n[r]=a(n[r],c),n),{...e}):u(e)?e:t}function s(e,t){if(e===t)return!0;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)&&Array.isArray(t))return e.length!==t.length?!1:e.every((n,r)=>s(n,t[r]));if(u(e)&&u(t)){const n=Object.entries(e);return n.length!==Object.keys(t).length?!1:n.every(([r,c])=>s(c,t[r]))}return!1}function p(e,t={}){const n=new Map;let r=C(e,t??{});const c=C(e,t);function x(o){r=o(r);for(const i of n.values())i(r)}function O(o){x(i=>({...i,...o}))}function j(){return r}function P(){return structuredClone(c)}function q(o,i){let l;n.set(i,A=>{const f=o(A);s(f,l)||(l=f,i(f))})}function w(o){n.delete(o)}return{updateState:O,getState:j,getInitialState:P,onChange:q,clearOnChange:w}}const h={loading:!0,query:{},response:{},initialized:!1};function y(e={}){return p(h,e)}const M=d.createContext(y());exports.ConfigContext=S;exports.StoreContext=M;exports.createExtendableStore=p;exports.createStore=y;exports.deepMerge=m;exports.defaultState=h;exports.isEqual=s;exports.isPlainObject=u;exports.useConfig=b;
@@ -1,99 +0,0 @@
1
- import { createContext as C } from "preact";
2
- import { useContext as x } from "preact/hooks";
3
- const w = C(null), q = () => {
4
- const e = x(w);
5
- if (!e)
6
- throw new Error("useConfig must be used within a ConfigProvider");
7
- return e;
8
- }, g = (e) => String(e) === "[object Object]";
9
- function s(e) {
10
- if (!g(e))
11
- return !1;
12
- const t = e.constructor;
13
- if (t === void 0)
14
- return !0;
15
- const n = t.prototype;
16
- return !(!g(n) || !n.hasOwnProperty("isPrototypeOf"));
17
- }
18
- function D(...e) {
19
- return e.reduce((t, n) => a(t, n));
20
- }
21
- function p(...e) {
22
- return e.reduce((t, n) => a(t, n));
23
- }
24
- function a(e, t) {
25
- return s(e) && s(t) ? Object.entries(t).reduce(
26
- (n, [r, u]) => (n[r] = a(n[r], u), n),
27
- { ...e }
28
- ) : s(e) ? e : t;
29
- }
30
- function f(e, t) {
31
- if (e === t)
32
- return !0;
33
- if (e instanceof Date && t instanceof Date)
34
- return e.getTime() === t.getTime();
35
- if (Array.isArray(e) && Array.isArray(t))
36
- return e.length !== t.length ? !1 : e.every((n, r) => f(n, t[r]));
37
- if (s(e) && s(t)) {
38
- const n = Object.entries(e);
39
- return n.length !== Object.keys(t).length ? !1 : n.every(([r, u]) => f(u, t[r]));
40
- }
41
- return !1;
42
- }
43
- function A(e, t = {}) {
44
- const n = /* @__PURE__ */ new Map();
45
- let r = p(e, t ?? {});
46
- const u = p(e, t);
47
- function d(o) {
48
- r = o(r);
49
- for (const i of n.values())
50
- i(r);
51
- }
52
- function y(o) {
53
- d((i) => ({ ...i, ...o }));
54
- }
55
- function h() {
56
- return r;
57
- }
58
- function S() {
59
- return structuredClone(u);
60
- }
61
- function O(o, i) {
62
- let l;
63
- n.set(i, (j) => {
64
- const c = o(j);
65
- f(c, l) || (l = c, i(c));
66
- });
67
- }
68
- function m(o) {
69
- n.delete(o);
70
- }
71
- return {
72
- updateState: y,
73
- getState: h,
74
- getInitialState: S,
75
- onChange: O,
76
- clearOnChange: m
77
- };
78
- }
79
- const P = {
80
- loading: !0,
81
- query: {},
82
- response: {},
83
- initialized: !1
84
- };
85
- function b(e = {}) {
86
- return A(P, e);
87
- }
88
- const T = C(b());
89
- export {
90
- w as C,
91
- T as S,
92
- A as a,
93
- D as b,
94
- b as c,
95
- P as d,
96
- s as e,
97
- f as i,
98
- q as u
99
- };
@@ -1 +0,0 @@
1
- "use strict";const d=require("./storeContext-12dN1l9r.cjs"),i=require("preact/hooks"),I=require("./search-BVJZK90N.cjs"),A=require("./utils/utils.cjs.js");function M(e){return Array.from(new Set(e))}function N(e,t){return{...t,products:{facets:e==="autocomplete"?void 0:["*"],fields:T,...t.products},...t.keywords?{keywords:{...t.keywords,fields:M([...$,...t.keywords.fields??[]]),highlight:t.keywords.highlight??{preTag:"<strong>",postTag:"</strong>"}}}:{}}}const T=["productId","url","name","imageUrl","imageHash","thumbUrl","description","brand","variantId","availability","price","priceText","categoryIds","categories","customFields.key","customFields.value","priceCurrencyCode","datePublished","listPrice","unitPricingBaseMeasure","unitPricingUnit","unitPricingMeasure","googleCategory","gtin","ageGroup","gender","condition","alternateImageUrls","ratingValue","reviewCount","inventoryLevel","skus.id","skus.name","skus.price","skus.listPrice","skus.priceText","skus.url","skus.imageUrl","skus.inventoryLevel","skus.customFields.key","skus.customFields.value","skus.availability","pid","onDiscount","extra.key","extra.value","saleable","available","tags1","tags2","tags3"],$=["keyword","_redirect"];function Q(...e){if(!e.every(t=>t==null))return e.filter(t=>Array.isArray(t)).reduce((t,r)=>t.concat(r),[])}const k="nosto.search.";function R(e){var r;const t=`${k}${e}`;(r=window.performance)==null||r.mark(`${t}.start`)}function q(e){var r,s;const t=`${k}${e}`;(r=window.performance)==null||r.mark(`${t}.end`),(s=window.performance)==null||s.measure(t,`${t}.start`,`${t}.end`)}function p(e){return R(e),()=>q(e)}function E(e,t,r){const s=JSON.stringify(t);try{console.info("Setting storage",e,s),r.setItem(e,s)}catch(n){console.warn(n)}}function x(e,t){try{const r=t.getItem(e);if(r)return JSON.parse(r)}catch(r){console.warn(r)}}function U(e,t){E(e,t,sessionStorage)}function V(e){return x(e,sessionStorage)}const w="nosto:search:searchResult";function K(e,t,r){if(!e)return;U(w,{query:t,result:r})}function L(e,t){if(!e)return null;const r=V(w);if(!r||!O(r))return null;const s=S(r.query);return d.isEqual(S(t),s)?r.result:null}function S(e){return{accountId:e.accountId,customRules:e.customRules,explain:e.explain,keywords:e.keywords,products:e.products,query:e.query,redirect:e.redirect,rules:e.rules,segments:e.segments,sessionParams:e.sessionParams}}function O(e){return typeof e=="object"&&e!==null&&"query"in e&&"result"in e}async function C(e,t,r){var g,l,h;const s=p("newSearch"),n=e.config.pageType,a=d.deepMerge(e.store.getInitialState().query,t),c=d.deepMerge(e.config.search,r,{track:n,redirect:n!=="autocomplete",isKeyword:!!(r!=null&&r.isKeyword)});e.store.updateState({query:a,loading:!0,initialized:!0});const o=n!=="autocomplete"&&e.config.persistentSearchCache,u=e.config.queryModifications({...a,products:{...a.products,filter:Q((l=(g=e.store.getInitialState().query)==null?void 0:g.products)==null?void 0:l.filter,(h=t.products)==null?void 0:h.filter)}},n);try{let f;const m=L(o,u);if(m)f=m;else{const F=N(n,u);f=await I.search(F,c),K(o,u,f)}e.store.updateState({response:f,loading:!1})}catch(f){console.error("Search action failed",f)}s()}async function y(e,t,r){const s=p("updateSearch"),n=d.deepMerge(e.store.getState().query,{products:{from:0}},t);await C(e,n,r),s()}async function z(e,t,r){var c;const s=p("replaceFilter"),n=(c=e.store.getState().query.products)==null?void 0:c.filter,a=r!==void 0?[{field:t,[typeof r=="object"?"range":"value"]:[r]}]:[];await y(e,{products:{filter:[...(n==null?void 0:n.filter(o=>o.field!==t))??[],...a]}}),s()}async function D(e,t,r,s){var u,g;const n=p("toggleProductFilter"),a=(u=e.store.getState().query.products)==null?void 0:u.filter,c=a==null?void 0:a.find(l=>l.value instanceof Array&&l.field===t),o=c!=null&&c.value?{...c,value:[...c.value.filter(l=>!d.isEqual(l,r)),...s?[r]:[]]}:s?{field:t,value:[r]}:void 0;await y(e,{products:{filter:[...(a==null?void 0:a.filter(l=>l!==c))??[],...(g=o==null?void 0:o.value)!=null&&g.length?[o]:[]]}}),n()}function b(){const e=d.useConfig(),t=i.useContext(d.StoreContext),r=i.useMemo(()=>({config:e,store:t}),[e,t]),s=i.useCallback((o,u)=>C(r,o,u),[r]),n=i.useCallback((o,u)=>y(r,o,u),[r]),a=i.useCallback((o,u,g)=>D(r,o,u,g),[r]),c=i.useCallback((o,u)=>z(r,o,u),[r]);return{newSearch:s,updateSearch:n,toggleProductFilter:a,replaceFilter:c}}function P(e=_){const t=i.useContext(d.StoreContext),[r,s]=i.useState(e(t.getState()));return t.onChange(e,s),i.useEffect(()=>()=>t.clearOnChange(s),[t]),r}const _=e=>e;function v({from:e,size:t,pageSize:r}){return A.isBot()?{products:{from:e+r}}:{products:{size:t+r}}}function B(e=24){const{from:t,size:r}=P(a=>{var c,o;return{from:((c=a.query.products)==null?void 0:c.from)??0,size:((o=a.query.products)==null?void 0:o.size)??0}}),{updateSearch:s}=b();return{loadMore:i.useCallback(async()=>{await s(v({from:t,size:r,pageSize:e}))},[t,r,e,s])}}exports.getNextPageQuery=v;exports.useActions=b;exports.useLoadMore=B;exports.useNostoAppState=P;