@nosto/search-js 3.4.0 → 3.4.1
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 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("../../useActions-CDUotElR.cjs"),x=require("../../logger-Boh_C6Bz.cjs"),h=require("../../useLoadMore-D0TMnfNk.cjs"),d=require("preact/hooks"),L=require("../../index.es-Dp6Iaxz3.cjs"),y=require("../../parseNumber-FsZ8w61u.cjs");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("../../useActions-CDUotElR.cjs"),x=require("../../logger-Boh_C6Bz.cjs"),h=require("../../useLoadMore-D0TMnfNk.cjs"),d=require("preact/hooks"),L=require("../../index.es-Dp6Iaxz3.cjs"),y=require("../../parseNumber-FsZ8w61u.cjs");function P(t){const n=h.useNostoAppState(e=>e.response);return t&&Array.isArray(t)||t&&x.isPlainObject(t)?t:n}function T(t,n){const e=t.data?.filter(f=>f.selected).length??0,{active:o}={active:e>0,...n},[r,c]=d.useState(o),{toggleProductFilter:u}=b.useActions(),l=d.useCallback(()=>{c(!r)},[r]);return{active:r,selectedFiltersCount:e,toggleActive:l,toggleProductFilter:u}}function q(){const{loading:t,facets:n}=h.useNostoAppState(e=>({loading:e.loading,facets:e.response?.products?.facets??[]}));return{loading:t,facets:n}}function z(t,n){const e=n-t;return!isNaN(e)&&e>0?new Array(n-t).fill(void 0).map((o,r)=>r+t):[]}function X(t){const{query:n,products:e}=h.useNostoAppState(o=>({query:o.query,products:o.response.products}));return d.useMemo(()=>{if(!e)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const o=n.products?.from??0,r=t?.width??1/0,c=Math.max(Math.floor(r-1)/2,1),u=e.size>0?Math.floor(o/e.size)+1:1,l=e.size>0?Math.ceil(e.total/e.size):0,f=A=>A>=u-c&&A<=u+c,s=o+1,i=Math.min(o+e.total,e.total),a={from:o,page:u,current:!0},p=A=>({from:(A-1)*e.size,page:A,current:A===u}),S=u>1?p(u-1):void 0,m=u<l?p(u+1):void 0,g=u-c-1>1?p(1):void 0,v=u+c+1<l?p(l):void 0,F=z(1,l+1).filter(f).map(p);return!g&&F[0]?.page===2&&F.unshift(p(1)),!v&&F[F.length-1]?.page===l-1&&F.push(p(l)),{totalPages:l,resultsFrom:s,resultsTo:i,current:a,prev:S,next:m,first:g,last:v,pages:F}},[n,e,t?.width])}function O(){const[t,n]=d.useState([]),[e,o]=d.useState([]);return d.useEffect(()=>{L.s(async r=>{const{products:c,segments:u}=await r.getSearchSessionParams();n(u??[]),o(c?.personalizationBoost??[])})},[]),{segments:t,boost:e}}function j(){const{facets:t}=h.useNostoAppState(s=>({facets:s.response.products?.facets??[]})),{replaceFilter:n,toggleProductFilter:e}=b.useActions(),o=d.useCallback(s=>{const i=t?.find(a=>a.type==="stats"&&a.field===s);if(i&&"min"in i&&"max"in i)return i},[t]),r=d.useCallback(s=>t?.find(i=>i.field===s)?.name??s,[t]),c=d.useCallback(s=>"field"in s&&(s.value instanceof Array||s.range instanceof Array),[]),u=d.useCallback(s=>({...s,range:s.range?.map(i=>({gt:i.gt?Number(i.gt):i.gt,gte:i.gte?Number(i.gte):i.gte,lt:i.lt?Number(i.lt):i.lt,lte:i.lte?Number(i.lte):i.lte}))}),[]),l=d.useCallback(s=>(s.value??[]).map(a=>({value:a,field:s.field,name:r(s.field),filter:u(s),remove:()=>{e(s.field,a,!1)}})),[u,r,e]),f=d.useCallback(s=>(s.range??[]).map(a=>{const p=a.gte??a.gt??o(s.field)?.min,S=a.lte??a.lt??o(s.field)?.max;if(p!==void 0&&S!==void 0)return{value:`${p} - ${S}`,field:s.field,name:r(s.field),filter:u(s),remove:()=>{n(s.field,void 0)}}}).filter(Boolean),[u,o,r,n]);return{selectFilters:c,toValueFilter:l,toRangeFilter:f}}function R(){const{filter:t}=h.useNostoAppState(l=>({filter:l.query.products?.filter??[]})),{updateSearch:n}=b.useActions(),{selectFilters:e,toValueFilter:o,toRangeFilter:r}=j(),c=d.useMemo(()=>t?t.filter(e).flatMap(l=>"value"in l?o(l):"range"in l?r(l):[]).filter(Boolean):[],[t,e,r,o]),u=d.useCallback(()=>{n({products:{filter:[]}})},[n]);return{filters:c,removeAll:u}}function k(t){const{replaceFilter:n}=b.useActions(),{query:e,products:o}=h.useNostoAppState(a=>({query:a.query,products:a.response.products})),r=o?.facets?.find(a=>a.id===t);if(!r)return{min:0,max:0,range:[0,0],updateRange:()=>{}};const c=e.products?.filter?.find(a=>a.field===r.field),u=c?.range?c.range[0]:void 0,l=typeof u=="object"&&("gte"in u||"lte"in u)?[y.parseNumber(u.gte),y.parseNumber(u.lte)]:[void 0,void 0],f="min"in r?Math.floor(r.min):0,s="max"in r?Math.ceil(r.max):0,i=([a,p])=>{const S=a!==void 0?Math.floor(a):void 0,m=p!==void 0?Math.ceil(p):void 0,g=S!==void 0,v=m!==void 0;(f===S||!g)&&(s===m||!v)?n(r.field,void 0):(f===S||!g)&&v?n(r.field,{lte:m.toString()}):(s===m||!v)&&g?n(r.field,{gte:S.toString()}):g&&v&&n(r.field,{gte:S.toString(),lte:m.toString()})};return{min:f,max:s,range:[l[0]??f,l[1]??s],updateRange:i}}function V(t,n){const{min:e,max:o,range:r,updateRange:c}=k(t),{filters:u}=R(),l=d.useMemo(()=>{const a=u.find(g=>g?.filter?.range);let p=null;if(a){const g=a.filter.range?.[0];p=[y.parseNumber(g?.gte),y.parseNumber(g?.lte)]}const S=[];let m=Math.floor(e/n)*n;for(;m<o;){const g=m+n,v=p&&p[0]===m&&p[1]===g;S.push({min:m,max:g,selected:v}),m=g}return S},[u,e,o,n]),f=a=>{c([a,r[1]])},s=a=>{c([r[0],a])},i=e!==r[0]||o!==r[1];return{min:e,max:o,range:r,updateRange:c,ranges:l,handleMinChange:f,handleMaxChange:s,isSelected:i}}function D(){const{products:t,keywords:n}=h.useNostoAppState(e=>e.response);return{products:t??{hits:[],total:0},keywords:n??{hits:[],total:0}}}function B(){const t=h.useNostoAppState(e=>e.query.products?.filter);return d.useMemo(()=>t?t.reduce((e,o)=>e+(Array.isArray(o.value)?o.value.length:1),0):0,[t])}function N(t){return t&&!Number.isNaN(t)?t:0}function _(t,n){const{from:e,size:o,total:r}=h.useNostoAppState(s=>({from:N(s.query.products?.from??0),size:N(s.response?.products?.size??n),total:N(s.response?.products?.total??0)})),{updateSearch:c}=b.useActions(),u=e+o,l=d.useMemo(()=>[...t].reverse().filter(s=>s<r),[t,r]),f=d.useCallback(s=>{c({products:{size:y.parseNumber(s)}})},[c]);return{from:e,to:u,total:r,size:o,sizeOptions:l,handleSizeChange:f}}function E(t,n){return t.length!==n.length?!1:t.every(e=>n.find(o=>e.field===o.field&&e.order===o.order))}function U(t){const n=h.useNostoAppState(c=>c.query),{updateSearch:e}=b.useActions();return{activeSort:t.find(c=>E(c.value.sort,n.products?.sort||[]))?.id??t[0]?.id,setSort:c=>{const u=t.find(l=>l.id===c);u&&e({products:{sort:u.value.sort}})}}}const M=window.SpeechRecognition||window.webkitSpeechRecognition,C=!!(M&&typeof M=="function");function $(){return{listening:!1,startListening:()=>{},stopListening:()=>{}}}function I({language:t="en-US",interimResults:n=!1,onResult:e,onError:o}={}){const[r,c]=d.useState(!1),u=d.useRef(null),l=d.useCallback(()=>{const s=new M;s.lang=t,s.interimResults=n,s.onstart=()=>c(!0),e&&(s.onresult=i=>{const{transcript:a}=i.results?.[0]?.[0];e(a)}),o&&(s.onerror=i=>o(i.error)),s.onend=()=>c(!1),u.current=s,s.start()},[t,n,o,e]),f=d.useCallback(()=>{u.current?.stop()},[u]);return{listening:r,startListening:l,stopListening:f}}const Z=C?I:$;function G(t,n){if(!t.length||!n.length)return[];const e=n.reduce((o,r)=>(o[r]={},o),{});return t.forEach(o=>{o.customFields?.forEach(({key:r,value:c})=>{const u=r.toLowerCase();n.includes(u)&&(e[u][c]=e[u][c]||[],e[u][c].push(o))})}),Object.entries(e).filter(o=>Object.keys(o[1]).length).map(([o,r])=>({field:o,options:Object.entries(r).map(([c,u])=>({value:c,skus:u,unavailable:!1,selected:!1}))}))}function H(t,n){return t.length?t.map(({field:e,options:o})=>({field:e,options:o.map(r=>{const c=!r.skus?.some(l=>Object.entries(n).every(([f,s])=>f===e?!0:l.customFields?.find(a=>a.key.toLowerCase()===f)?.value===s)),u=n[e]===r.value;return{...r,unavailable:c,selected:u}})})):[]}const w=["4XS","3XS","2XS","XXS","XS","S","M","L","XL","XXL","2XL","XXXL","3XL","4XL"];function J(t){if(w.includes(t))return 1e3+w.indexOf(t);const n=parseFloat(t);return isNaN(n)?t:n}function K(t,n){return[...n].sort((e,o)=>{const[r,c]=[e.value,o.value].map(J);return r<c?-1:1})}function Q(t=[],n=[]){const[e,o]=d.useState({}),r=d.useMemo(()=>G(t,n).map(({field:s,options:i})=>({field:s,options:K(s,i)})),[t,n]),c=d.useMemo(()=>H(r,e),[r,e]),u=d.useCallback((f,s)=>{o(i=>{const a={...i};return a[f]===s?delete a[f]:a[f]=s,a})},[]),l=d.useMemo(()=>Object.keys(e).filter(i=>e[i]).length===0?[]:c.filter(({field:i})=>e[i]).map(({field:i,options:a})=>{const p=e[i];return a.find(m=>m.value===p)?.skus??[]}).reduce((i,a)=>i.filter(p=>a.includes(p))),[c,e]);return{swatches:c,toggleOption:u,matchedSkus:l}}exports.useActions=b.useActions;exports.useLoadMore=h.useLoadMore;exports.useNostoAppState=h.useNostoAppState;exports.speechToTextSupported=C;exports.useDecoratedSearchResults=P;exports.useFacet=T;exports.useFacets=q;exports.usePagination=X;exports.usePersonalization=O;exports.useProductFilters=R;exports.useRange=k;exports.useRangeSelector=V;exports.useResponse=D;exports.useSelectedFiltersCount=B;exports.useSizeOptions=_;exports.useSort=U;exports.useSpeechToText=Z;exports.useSwatches=Q;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { b } from "../../useActions-BOhorGOy.js";
|
|
2
|
-
import { a as
|
|
2
|
+
import { a as z } from "../../logger-_fg_Za9y.js";
|
|
3
3
|
import { a as v } from "../../useLoadMore-DGGR76Vv.js";
|
|
4
4
|
import { u as le } from "../../useLoadMore-DGGR76Vv.js";
|
|
5
5
|
import { useState as R, useCallback as h, useMemo as y, useEffect as A, useRef as N } from "preact/hooks";
|
|
@@ -7,7 +7,7 @@ import { s as P } from "../../index.es-XNBESE3P.js";
|
|
|
7
7
|
import { p as x } from "../../parseNumber-QA48nJLp.js";
|
|
8
8
|
function K(t) {
|
|
9
9
|
const r = v((e) => e.response);
|
|
10
|
-
return t && Array.isArray(t) || t &&
|
|
10
|
+
return t && Array.isArray(t) || t && z(t) ? t : r;
|
|
11
11
|
}
|
|
12
12
|
function Q(t, r) {
|
|
13
13
|
const e = t.data?.filter((d) => d.selected).length ?? 0, { active: o } = {
|
|
@@ -144,7 +144,7 @@ function T() {
|
|
|
144
144
|
toRangeFilter: d
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
|
-
function
|
|
147
|
+
function k() {
|
|
148
148
|
const { filter: t } = v((l) => ({
|
|
149
149
|
filter: l.query.products?.filter ?? []
|
|
150
150
|
})), { updateSearch: r } = b(), { selectFilters: e, toValueFilter: o, toRangeFilter: s } = T(), c = y(() => t ? t.filter(e).flatMap((l) => "value" in l ? o(l) : "range" in l ? s(l) : []).filter(Boolean) : [], [t, e, s, o]), i = h(() => {
|
|
@@ -161,7 +161,7 @@ function C() {
|
|
|
161
161
|
removeAll: i
|
|
162
162
|
};
|
|
163
163
|
}
|
|
164
|
-
function
|
|
164
|
+
function q(t) {
|
|
165
165
|
const { replaceFilter: r } = b(), { query: e, products: o } = v((u) => ({
|
|
166
166
|
query: u.query,
|
|
167
167
|
products: u.response.products
|
|
@@ -197,7 +197,7 @@ function k(t) {
|
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
199
|
function te(t, r) {
|
|
200
|
-
const { min: e, max: o, range: s, updateRange: c } =
|
|
200
|
+
const { min: e, max: o, range: s, updateRange: c } = q(t), { filters: i } = k(), l = y(() => {
|
|
201
201
|
const u = i.find((g) => g?.filter?.range);
|
|
202
202
|
let f = null;
|
|
203
203
|
if (u) {
|
|
@@ -260,7 +260,16 @@ function oe(t, r) {
|
|
|
260
260
|
from: L(n.query.products?.from ?? 0),
|
|
261
261
|
size: L(n.response?.products?.size ?? r),
|
|
262
262
|
total: L(n.response?.products?.total ?? 0)
|
|
263
|
-
})), { updateSearch: c } = b(), i = e + o, l = [...t].reverse().filter((n) => n
|
|
263
|
+
})), { updateSearch: c } = b(), i = e + o, l = y(() => [...t].reverse().filter((n) => n < s), [t, s]), d = h(
|
|
264
|
+
(n) => {
|
|
265
|
+
c({
|
|
266
|
+
products: {
|
|
267
|
+
size: x(n)
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
},
|
|
271
|
+
[c]
|
|
272
|
+
);
|
|
264
273
|
return {
|
|
265
274
|
/** from value */
|
|
266
275
|
from: e,
|
|
@@ -273,23 +282,17 @@ function oe(t, r) {
|
|
|
273
282
|
/** Array of size options */
|
|
274
283
|
sizeOptions: l,
|
|
275
284
|
/** Should be called when size is changed */
|
|
276
|
-
handleSizeChange:
|
|
277
|
-
c({
|
|
278
|
-
products: {
|
|
279
|
-
size: x(n)
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
}
|
|
285
|
+
handleSizeChange: d
|
|
283
286
|
};
|
|
284
287
|
}
|
|
285
|
-
function
|
|
288
|
+
function C(t, r) {
|
|
286
289
|
return t.length !== r.length ? !1 : t.every((e) => r.find((o) => e.field === o.field && e.order === o.order));
|
|
287
290
|
}
|
|
288
291
|
function se(t) {
|
|
289
292
|
const r = v((c) => c.query), { updateSearch: e } = b();
|
|
290
293
|
return {
|
|
291
294
|
/** Active sort */
|
|
292
|
-
activeSort: t.find((c) =>
|
|
295
|
+
activeSort: t.find((c) => C(c.value.sort, r.products?.sort || []))?.id ?? t[0]?.id,
|
|
293
296
|
/** Set sort function */
|
|
294
297
|
setSort: (c) => {
|
|
295
298
|
const i = t.find((l) => l.id === c);
|
|
@@ -364,10 +367,10 @@ function E(t, r) {
|
|
|
364
367
|
})
|
|
365
368
|
})) : [];
|
|
366
369
|
}
|
|
367
|
-
const
|
|
370
|
+
const X = ["4XS", "3XS", "2XS", "XXS", "XS", "S", "M", "L", "XL", "XXL", "2XL", "XXXL", "3XL", "4XL"];
|
|
368
371
|
function U(t) {
|
|
369
|
-
if (
|
|
370
|
-
return 1e3 +
|
|
372
|
+
if (X.includes(t))
|
|
373
|
+
return 1e3 + X.indexOf(t);
|
|
371
374
|
const r = parseFloat(t);
|
|
372
375
|
return isNaN(r) ? t : r;
|
|
373
376
|
}
|
|
@@ -402,8 +405,8 @@ export {
|
|
|
402
405
|
v as useNostoAppState,
|
|
403
406
|
Y as usePagination,
|
|
404
407
|
ee as usePersonalization,
|
|
405
|
-
|
|
406
|
-
|
|
408
|
+
k as useProductFilters,
|
|
409
|
+
q as useRange,
|
|
407
410
|
te as useRangeSelector,
|
|
408
411
|
ne as useResponse,
|
|
409
412
|
re as useSelectedFiltersCount,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nosto/search-js",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.1",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"devDependencies": {
|
|
93
93
|
"@commitlint/cli": "^19.8.1",
|
|
94
94
|
"@commitlint/config-conventional": "^19.8.1",
|
|
95
|
-
"@nosto/nosto-js": "^2.
|
|
95
|
+
"@nosto/nosto-js": "^2.6.0",
|
|
96
96
|
"@testing-library/dom": "^10.4.1",
|
|
97
97
|
"@types/dom-speech-recognition": "^0.0.6",
|
|
98
98
|
"@types/eslint-config-prettier": "^6.11.3",
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"typedoc": "^0.28.10",
|
|
116
116
|
"typescript": "^5.9.2",
|
|
117
117
|
"typescript-eslint": "^8.39.1",
|
|
118
|
-
"vite": "^7.1.
|
|
118
|
+
"vite": "^7.1.2",
|
|
119
119
|
"vite-plugin-dts": "^4.5.4",
|
|
120
120
|
"vitest": "^3.1.3"
|
|
121
121
|
},
|