@nosto/search-js 1.6.0 → 1.7.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.
- package/dist/preact/preact.cjs.js +1 -1
- package/dist/preact/preact.d.ts +2 -0
- package/dist/preact/preact.es.js +546 -463
- package/dist/preact/src/components/InfiniteScroll/InfiniteScroll.d.ts +51 -0
- package/dist/preact/src/components/InfiniteScroll/InfiniteScrollWithLink.d.ts +6 -0
- package/dist/preact/src/components/InfiniteScroll/InfiniteScrollWithObserver.d.ts +7 -0
- package/dist/preact/src/components/InfiniteScroll/LoadMoreLink.d.ts +7 -0
- package/dist/preact/src/components/InfiniteScroll/utils.d.ts +9 -0
- package/dist/preact/src/hooks/useLoadMore/getNextPageQuery.d.ts +18 -0
- package/dist/preact/src/hooks/useLoadMore/useLoadMore.d.ts +24 -0
- package/dist/utils/src/isBot.d.ts +4 -0
- package/dist/utils/src/pick.d.ts +6 -0
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("preact"),q=require("../index.es-DlUp67LT.cjs"),p=require("preact/hooks"),W=require("../search-BVJZK90N.cjs");function X(e){return e.type==="input"}function Z(e){return!!e&&typeof e=="object"&&"type"in e&&"props"in e}function z(e,t={depth:0}){const{children:r}=e;return A.toChildArray(r).map(n=>{if(!Z(n))return n;const o=e.updateElement(n,t);return o===null?null:(o.props={...o.props,children:z({...e,children:o.props.children},{depth:t.depth+1})},o)})}function ee({children:e,onSearchInput:t}){return z({children:e,updateElement:r=>(!X(r)||r.props.type!=="search"||(r.props={...r.props,onInput:n=>{n.target instanceof HTMLInputElement&&t(n.target)}}),r)})}const N=A.createContext(null),B=()=>{const e=p.useContext(N);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},te="nosto:search:scrollPos";function re(){window.sessionStorage.setItem(te,window.scrollY.toString())}function ne({children:e,hit:t,onClick:r}){const{pageType:n}=B(),o=n==="autocomplete"?void 0:n;return z({children:e,updateElement:(a,c)=>(c.depth>0||(a.props={...a.props,onClick:s=>{t&&o&&q.s(l=>l.recordSearchClick(o,t)),re(),typeof r=="function"&&r(s)}}),a)})}var oe=0;function F(e,t,r,n,o,a){t||(t={});var c,s,l=t;if("ref"in l)for(s in l={},t)s=="ref"?c=t[s]:l[s]=t[s];var i={type:e,props:l,key:r,ref:c,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--oe,__i:-1,__u:0,__source:o,__self:a};if(typeof e=="function"&&(c=e.defaultProps))for(s in c)l[s]===void 0&&(l[s]=c[s]);return A.options.vnode&&A.options.vnode(i),i}function E(){p.useEffect(()=>{const e=window.setTimeout(()=>{console.error("Nosto client script has not loaded after 3 seconds.")},3e3);q.s(()=>{window.clearTimeout(e)})},[])}const $=e=>String(e)==="[object Object]";function w(e){if(!$(e))return!1;const t=e.constructor;if(t===void 0)return!0;const r=t.prototype;return!(!$(r)||!r.hasOwnProperty("isPrototypeOf"))}function x(...e){return e.reduce((t,r)=>O(t,r))}function D(...e){return e.reduce((t,r)=>O(t,r))}function O(e,t){return w(e)&&w(t)?Object.entries(t).reduce((r,[n,o])=>(r[n]=O(r[n],o),r),{...e}):w(e)?e:t}function M(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((r,n)=>M(r,t[n]));if(w(e)&&w(t)){const r=Object.entries(e);return r.length!==Object.keys(t).length?!1:r.every(([n,o])=>M(o,t[n]))}return!1}function K(e,t={}){const r=new Map;let n=D(e,t??{});const o=D(e,t);function a(u){n=u(n);for(const d of r.values())d(n)}function c(u){a(d=>({...d,...u}))}function s(){return n}function l(){return structuredClone(o)}function i(u,d){let h;r.set(d,g=>{const y=u(g);M(y,h)||(h=y,d(y))})}function f(u){r.delete(u)}return{updateState:c,getState:s,getInitialState:l,onChange:i,clearOnChange:f}}const Q={loading:!0,query:{query:""},response:{query:""},initialized:!1};function R(e={}){return K(Q,e)}const b=A.createContext(R()),j={defaultCurrency:"EUR",queryModifications:e=>e},se={...j};function ce(e){return{pageType:"autocomplete",...se,...e}}function ie({config:e,store:t,children:r}){const n=t??R();return E(),F(N,{value:ce(e),children:F(b,{value:n,children:r})})}const ae={...j,persistentSearchCache:!1,preservePageScroll:!1};function ue(e){return{pageType:"category",...ae,...e}}function le({config:e,store:t,children:r}){const n=t??R();return E(),F(N,{value:ue(e),children:F(b,{value:n,children:r})})}const fe={...j,persistentSearchCache:!1,preservePageScroll:!1};function de(e={}){return{pageType:"serp",...fe,...e}}function ge({config:e,store:t,children:r}){const n=t??R();return E(),F(N,{value:de(e),children:F(b,{value:n,children:r})})}function pe(e){return Array.from(new Set(e))}function me(e,t){return{...t,products:{facets:e==="autocomplete"?void 0:["*"],fields:he,...t.products},...t.keywords?{keywords:{...t.keywords,fields:pe([...ye,...t.keywords.fields??[]]),highlight:t.keywords.highlight??{preTag:"<strong>",postTag:"</strong>"}}}:{}}}const he=["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"],ye=["keyword","_redirect"];function Se(...e){if(!e.every(t=>t==null))return e.filter(t=>Array.isArray(t)).reduce((t,r)=>t.concat(r),[])}const H="nosto.search.";function ve(e){var r;const t=`${H}${e}`;(r=window.performance)==null||r.mark(`${t}.start`)}function Ce(e){var r,n;const t=`${H}${e}`;(r=window.performance)==null||r.mark(`${t}.end`),(n=window.performance)==null||n.measure(t,`${t}.start`,`${t}.end`)}function I(e){return ve(e),()=>Ce(e)}function Pe(e,t,r){const n=JSON.stringify(t);try{console.info("Setting storage",e,n),r.setItem(e,n)}catch(o){console.warn(o)}}function ke(e,t){try{const r=t.getItem(e);if(r)return JSON.parse(r)}catch(r){console.warn(r)}}function we(e,t){Pe(e,t,sessionStorage)}function Fe(e){return ke(e,sessionStorage)}const L="nosto:search:searchResult";function be(e,t,r){if(!e)return;we(L,{query:t,result:r})}function Ae(e,t){if(!e)return null;const r=Fe(L);if(!r||!Me(r))return null;const n=U(r.query);return M(U(t),n)?r.result:null}function U(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 Me(e){return typeof e=="object"&&e!==null&&"query"in e&&"result"in e}async function G(e,t,r){var i,f,u;const n=I("newSearch"),o=e.config.pageType,a=x(e.store.getInitialState().query,t),c=x(e.config.search,r,{track:o,redirect:o!=="autocomplete",isKeyword:!!(r!=null&&r.isKeyword)});e.store.updateState({query:a,loading:!0,initialized:!0});const s=o!=="autocomplete"&&e.config.persistentSearchCache,l=e.config.queryModifications({...a,products:{...a.products,filter:Se((f=(i=e.store.getInitialState().query)==null?void 0:i.products)==null?void 0:f.filter,(u=t.products)==null?void 0:u.filter)}},o);try{let d;const h=Ae(s,l);if(h)d=h;else{const g=me(o,l);d=await W.search(g,c),be(s,l,d)}e.store.updateState({response:d,loading:!1})}catch(d){console.error("Search action failed",d)}n()}async function V(e,t,r){const n=I("updateSearch"),o=x(e.store.getState().query,{products:{from:0}},t);await G(e,o,r),n()}async function Re(e,t,r){var c;const n=I("replaceFilter"),o=(c=e.store.getState().query.products)==null?void 0:c.filter,a=r!==void 0?[{field:t,[typeof r=="object"?"range":"value"]:[r]}]:[];await V(e,{products:{filter:[...(o==null?void 0:o.filter(s=>s.field!==t))??[],...a]}}),n()}async function _e(e,t,r,n){var l,i;const o=I("toggleProductFilter"),a=(l=e.store.getState().query.products)==null?void 0:l.filter,c=a==null?void 0:a.find(f=>f.value instanceof Array&&f.field===t),s=c!=null&&c.value?{...c,value:[...c.value.filter(f=>!M(f,r)),...n?[r]:[]]}:n?{field:t,value:[r]}:void 0;await V(e,{products:{filter:[...(a==null?void 0:a.filter(f=>f!==c))??[],...(i=s==null?void 0:s.value)!=null&&i.length?[s]:[]]}}),o()}function k(){const e=B(),t=p.useContext(b),r=p.useMemo(()=>({config:e,store:t}),[e,t]),n=p.useCallback((s,l)=>G(r,s,l),[r]),o=p.useCallback((s,l)=>V(r,s,l),[r]),a=p.useCallback((s,l,i)=>_e(r,s,l,i),[r]),c=p.useCallback((s,l)=>Re(r,s,l),[r]);return{newSearch:n,updateSearch:o,toggleProductFilter:a,replaceFilter:c}}function C(e=Ne){const t=p.useContext(b),[r,n]=p.useState(e(t.getState()));return t.onChange(e,n),p.useEffect(()=>()=>t.clearOnChange(n),[t]),r}const Ne=e=>e;function Ie(e){const t=C(r=>r.response);return e&&Array.isArray(e)||e&&w(e)?e:t}function Te(e){var c;const t=((c=e.data)==null?void 0:c.filter(s=>s.selected).length)??0,[r,n]=p.useState(t>0),{toggleProductFilter:o}=k();return{active:r,selectedFiltersCount:t,toggleActive:()=>{n(!r)},toggleProductFilter:o}}function xe(){const{loading:e,facets:t}=C(r=>{var n,o;return{loading:r.loading,facets:((o=(n=r.response)==null?void 0:n.products)==null?void 0:o.facets)??[]}});return{loading:e,facets:t}}function qe(e,t){const r=t-e;return!isNaN(r)&&r>0?new Array(t-e).fill(void 0).map((n,o)=>o+e):[]}function ze(e){const{query:t,products:r}=C(n=>({query:n.query,products:n.response.products}));return p.useMemo(()=>{var P;if(!r)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const n=((P=t.products)==null?void 0:P.from)??0,o=(e==null?void 0:e.width)??1/0,a=Math.max(Math.floor(o-1)/2,1),c=r.size>0?Math.floor(n/r.size)+1:1,s=r.size>0?Math.ceil(r.total/r.size):0,l=v=>v>=c-a&&v<=c+a,i=n+1,f=Math.min(n+r.total,r.total),u={from:n,page:c,current:!0},d=v=>({from:(v-1)*r.size,page:v,current:v===c}),h=c>1?d(c-1):void 0,g=c<s?d(c+1):void 0,y=a===1/0||c-a-1>1?d(1):void 0,m=a===1/0||c+a+1<s?d(s):void 0,S=qe(1,s+1).filter(l).map(d);return{totalPages:s,resultsFrom:i,resultsTo:f,current:u,prev:h,next:g,first:y,last:m,pages:S}},[t,r,e==null?void 0:e.width])}function Ee(){const[e,t]=p.useState([]),[r,n]=p.useState([]);return p.useEffect(()=>{q.s(async o=>{const{products:a,segments:c}=await o.getSearchSessionParams();t(c??[]),n((a==null?void 0:a.personalizationBoost)??[])})},[]),{segments:e,boost:r}}function Oe(){const{facets:e}=C(i=>{var f;return{facets:((f=i.response.products)==null?void 0:f.facets)??[]}}),{replaceFilter:t,toggleProductFilter:r}=k(),n=p.useCallback(i=>{const f=e==null?void 0:e.find(u=>u.type==="stats"&&u.field===i);if(f&&"min"in f&&"max"in f)return f},[e]),o=p.useCallback(i=>{var f;return((f=e==null?void 0:e.find(u=>u.field===i))==null?void 0:f.name)??i},[e]),a=p.useCallback(i=>"field"in i&&(i.value instanceof Array||i.range instanceof Array),[]),c=p.useCallback(i=>{var f;return{...i,range:(f=i.range)==null?void 0:f.map(u=>({gt:u.gt?Number(u.gt):u.gt,gte:u.gte?Number(u.gte):u.gte,lt:u.lt?Number(u.lt):u.lt,lte:u.lte?Number(u.lte):u.lte}))}},[]),s=p.useCallback(i=>(i.value??[]).map(u=>({value:u,field:i.field,name:o(i.field),filter:c(i),remove:()=>{r(i.field,u,!1)}})),[c,o,r]),l=p.useCallback(i=>(i.range??[]).map(u=>{var g,y;const d=u.gte??u.gt??((g=n(i.field))==null?void 0:g.min),h=u.lte??u.lt??((y=n(i.field))==null?void 0:y.max);if(d!==void 0&&h!==void 0)return{value:`${d} - ${h}`,field:i.field,name:o(i.field),filter:c(i),remove:()=>{t(i.field,void 0)}}}).filter(Boolean),[c,n,o,t]);return{selectFilters:a,toValueFilter:s,toRangeFilter:l}}function J(){const{filter:e}=C(s=>{var l;return{filter:((l=s.query.products)==null?void 0:l.filter)??[]}}),{updateSearch:t}=k(),{selectFilters:r,toValueFilter:n,toRangeFilter:o}=Oe(),a=p.useMemo(()=>e?e.filter(r).flatMap(s=>"value"in s?n(s):"range"in s?o(s):[]).filter(Boolean):[],[e,r,o,n]),c=p.useCallback(()=>{t({products:{filter:[]}})},[t]);return{filters:a,removeAll:c}}function _(e){if(typeof e=="number")return e;if(typeof e!="string")return;const t=Number(e);return isNaN(t)?void 0:t}function Y(e){var u,d,h;const{replaceFilter:t}=k(),{query:r,products:n}=C(g=>({query:g.query,products:g.response.products})),o=(u=n==null?void 0:n.facets)==null?void 0:u.find(g=>g.id===e);if(!o)return{min:0,max:0,range:[0,0],updateRange:()=>{}};const a=(h=(d=r.products)==null?void 0:d.filter)==null?void 0:h.find(g=>g.field===o.field),c=a!=null&&a.range?a.range[0]:void 0,s=typeof c=="object"&&("gte"in c||"lte"in c)?[_(c.gte),_(c.lte)]:[void 0,void 0],l="min"in o?Math.floor(o.min):0,i="max"in o?Math.ceil(o.max):0,f=([g,y])=>{const m=g!==void 0?Math.floor(g):void 0,S=y!==void 0?Math.ceil(y):void 0,P=m!==void 0,v=S!==void 0;(l===m||!P)&&(i===S||!v)?t(o.field,void 0):(l===m||!P)&&v?t(o.field,{lte:S.toString()}):(i===S||!v)&&P?t(o.field,{gte:m.toString()}):P&&v&&t(o.field,{gte:m.toString(),lte:S.toString()})};return{min:l,max:i,range:[s[0]??l,s[1]??i],updateRange:f}}function je(e,t){const{min:r,max:n,range:o,updateRange:a}=Y(e),{filters:c}=J(),s=p.useMemo(()=>{var y;const u=c.find(m=>{var S;return(S=m==null?void 0:m.filter)==null?void 0:S.range});let d=null;if(u){const m=(y=u.filter.range)==null?void 0:y[0];d=[_(m==null?void 0:m.gte),_(m==null?void 0:m.lte)]}const h=[];let g=Math.floor(r/t)*t;for(;g<n;){const m=g+t,S=d&&d[0]===g&&d[1]===m;h.push({min:g,max:m,selected:S}),g=m}return h},[c,r,n,t]),l=u=>{a([u,o[1]])},i=u=>{a([o[0],u])},f=r!==o[0]||n!==o[1];return{min:r,max:n,range:o,updateRange:a,ranges:s,handleMinChange:l,handleMaxChange:i,isSelected:f}}function Ve(){const{products:e,keywords:t}=C(r=>r.response);return{products:e??{hits:[],total:0},keywords:t??{hits:[],total:0}}}function $e(){const e=C(r=>{var n;return(n=r.query.products)==null?void 0:n.filter});return p.useMemo(()=>e?e.reduce((r,n)=>r+(Array.isArray(n.value)?n.value.length:1),0):0,[e])}function T(e){return e&&!Number.isNaN(e)?e:0}function De(e,t){const{from:r,size:n,total:o}=C(i=>{var f,u,d,h,g;return{from:T(((f=i.query.products)==null?void 0:f.from)??0),size:T(((d=(u=i.response)==null?void 0:u.products)==null?void 0:d.size)??0),total:T(((g=(h=i.response)==null?void 0:h.products)==null?void 0:g.total)??0)}}),{updateSearch:a}=k(),c=r+n,s=[...e].reverse().filter(i=>i+t<o);return{from:r,to:c,total:o,size:n,sizeOptions:s,handleSizeChange:i=>{a({products:{size:i}})}}}function Ue(e,t){return e.length!==t.length?!1:e.every(r=>t.find(n=>r.field===n.field&&r.order===n.order))}function Be(e){var a,c;const t=C(s=>s.query),{updateSearch:r}=k();return{activeSort:((a=e.find(s=>{var l;return Ue(s.value.sort,((l=t.products)==null?void 0:l.sort)||[])}))==null?void 0:a.id)??((c=e[0])==null?void 0:c.id),setSort:s=>{const l=e.find(i=>i.id===s);l&&r({products:{sort:l.value.sort}})}}}exports.AutocompletePageProvider=ie;exports.CategoryPageProvider=le;exports.SearchInput=ee;exports.SearchPageProvider=ge;exports.SerpElement=ne;exports.StoreContext=b;exports.createExtendableStore=K;exports.createStore=R;exports.defaultState=Q;exports.useActions=k;exports.useDecoratedSearchResults=Ie;exports.useFacet=Te;exports.useFacets=xe;exports.useNostoAppState=C;exports.usePagination=ze;exports.usePersonalization=Ee;exports.useProductFilters=J;exports.useRange=Y;exports.useRangeSelector=je;exports.useResponse=Ve;exports.useSelectedFiltersCount=$e;exports.useSizeOptions=De;exports.useSort=Be;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("preact"),p=require("preact/hooks"),re=require("../search-BVJZK90N.cjs"),q=require("../index.es-DlUp67LT.cjs");var ne=" 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|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",oe=/bot|crawl|http|lighthouse|scan|search|spider/i,z;function se(){if(z instanceof RegExp)return z;try{z=new RegExp(ne,"i")}catch{z=oe}return z}function ae(e){return!!e&&se().test(e)}function Q(){return ae(navigator.userAgent)}var ce=0;function w(e,r,t,n,o,c){r||(r={});var s,a,l=r;if("ref"in l)for(a in l={},r)a=="ref"?s=r[a]:l[a]=r[a];var i={type:e,props:l,key:t,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--ce,__i:-1,__u:0,__source:o,__self:c};if(typeof e=="function"&&(s=e.defaultProps))for(a in s)l[a]===void 0&&(l[a]=s[a]);return P.options.vnode&&P.options.vnode(i),i}const L=e=>String(e)==="[object Object]";function F(e){if(!L(e))return!1;const r=e.constructor;if(r===void 0)return!0;const t=r.prototype;return!(!L(t)||!t.hasOwnProperty("isPrototypeOf"))}function T(...e){return e.reduce((r,t)=>E(r,t))}function B(...e){return e.reduce((r,t)=>E(r,t))}function E(e,r){return F(e)&&F(r)?Object.entries(r).reduce((t,[n,o])=>(t[n]=E(t[n],o),t),{...e}):F(e)?e:r}function R(e,r){if(e===r)return!0;if(e instanceof Date&&r instanceof Date)return e.getTime()===r.getTime();if(Array.isArray(e)&&Array.isArray(r))return e.length!==r.length?!1:e.every((t,n)=>R(t,r[n]));if(F(e)&&F(r)){const t=Object.entries(e);return t.length!==Object.keys(r).length?!1:t.every(([n,o])=>R(o,r[n]))}return!1}function K(e,r={}){const t=new Map;let n=B(e,r??{});const o=B(e,r);function c(u){n=u(n);for(const f of t.values())f(n)}function s(u){c(f=>({...f,...u}))}function a(){return n}function l(){return structuredClone(o)}function i(u,f){let m;t.set(f,g=>{const y=u(g);R(y,m)||(m=y,f(y))})}function d(u){t.delete(u)}return{updateState:s,getState:a,getInitialState:l,onChange:i,clearOnChange:d}}const H={loading:!0,query:{query:""},response:{query:""},initialized:!1};function A(e={}){return K(H,e)}const M=P.createContext(A());function v(e=ie){const r=p.useContext(M),[t,n]=p.useState(e(r.getState()));return r.onChange(e,n),p.useEffect(()=>()=>r.clearOnChange(n),[r]),t}const ie=e=>e;function W(e,...r){return r.reduce((t,n)=>(t[n]=e[n],t),{})}const I=P.createContext(null),G=()=>{const e=p.useContext(I);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e};function ue(e){return Array.from(new Set(e))}function le(e,r){return{...r,products:{facets:e==="autocomplete"?void 0:["*"],fields:de,...r.products},...r.keywords?{keywords:{...r.keywords,fields:ue([...fe,...r.keywords.fields??[]]),highlight:r.keywords.highlight??{preTag:"<strong>",postTag:"</strong>"}}}:{}}}const de=["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"],fe=["keyword","_redirect"];function pe(...e){if(!e.every(r=>r==null))return e.filter(r=>Array.isArray(r)).reduce((r,t)=>r.concat(t),[])}const J="nosto.search.";function ge(e){var t;const r=`${J}${e}`;(t=window.performance)==null||t.mark(`${r}.start`)}function he(e){var t,n;const r=`${J}${e}`;(t=window.performance)==null||t.mark(`${r}.end`),(n=window.performance)==null||n.measure(r,`${r}.start`,`${r}.end`)}function _(e){return ge(e),()=>he(e)}function me(e,r,t){const n=JSON.stringify(r);try{console.info("Setting storage",e,n),t.setItem(e,n)}catch(o){console.warn(o)}}function ye(e,r){try{const t=r.getItem(e);if(t)return JSON.parse(t)}catch(t){console.warn(t)}}function ve(e,r){me(e,r,sessionStorage)}function Se(e){return ye(e,sessionStorage)}const Y="nosto:search:searchResult";function we(e,r,t){if(!e)return;ve(Y,{query:r,result:t})}function be(e,r){if(!e)return null;const t=Se(Y);if(!t||!ke(t))return null;const n=U(t.query);return R(U(r),n)?t.result:null}function U(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 ke(e){return typeof e=="object"&&e!==null&&"query"in e&&"result"in e}async function X(e,r,t){var i,d,u;const n=_("newSearch"),o=e.config.pageType,c=T(e.store.getInitialState().query,r),s=T(e.config.search,t,{track:o,redirect:o!=="autocomplete",isKeyword:!!(t!=null&&t.isKeyword)});e.store.updateState({query:c,loading:!0,initialized:!0});const a=o!=="autocomplete"&&e.config.persistentSearchCache,l=e.config.queryModifications({...c,products:{...c.products,filter:pe((d=(i=e.store.getInitialState().query)==null?void 0:i.products)==null?void 0:d.filter,(u=r.products)==null?void 0:u.filter)}},o);try{let f;const m=be(a,l);if(m)f=m;else{const g=le(o,l);f=await re.search(g,s),we(a,l,f)}e.store.updateState({response:f,loading:!1})}catch(f){console.error("Search action failed",f)}n()}async function O(e,r,t){const n=_("updateSearch"),o=T(e.store.getState().query,{products:{from:0}},r);await X(e,o,t),n()}async function Ce(e,r,t){var s;const n=_("replaceFilter"),o=(s=e.store.getState().query.products)==null?void 0:s.filter,c=t!==void 0?[{field:r,[typeof t=="object"?"range":"value"]:[t]}]:[];await O(e,{products:{filter:[...(o==null?void 0:o.filter(a=>a.field!==r))??[],...c]}}),n()}async function Pe(e,r,t,n){var l,i;const o=_("toggleProductFilter"),c=(l=e.store.getState().query.products)==null?void 0:l.filter,s=c==null?void 0:c.find(d=>d.value instanceof Array&&d.field===r),a=s!=null&&s.value?{...s,value:[...s.value.filter(d=>!R(d,t)),...n?[t]:[]]}:n?{field:r,value:[t]}:void 0;await O(e,{products:{filter:[...(c==null?void 0:c.filter(d=>d!==s))??[],...(i=a==null?void 0:a.value)!=null&&i.length?[a]:[]]}}),o()}function k(){const e=G(),r=p.useContext(M),t=p.useMemo(()=>({config:e,store:r}),[e,r]),n=p.useCallback((a,l)=>X(t,a,l),[t]),o=p.useCallback((a,l)=>O(t,a,l),[t]),c=p.useCallback((a,l,i)=>Pe(t,a,l,i),[t]),s=p.useCallback((a,l)=>Ce(t,a,l),[t]);return{newSearch:n,updateSearch:o,toggleProductFilter:c,replaceFilter:s}}function Fe({from:e,size:r,pageSize:t}){return Q()?{products:{from:e+t}}:{products:{size:r+t}}}function j(e=24){const{from:r,size:t}=v(c=>{var s,a;return{from:((s=c.query.products)==null?void 0:s.from)??0,size:((a=c.query.products)==null?void 0:a.size)??0}}),{updateSearch:n}=k();return{loadMore:p.useCallback(async()=>{await n(Fe({from:r,size:t,pageSize:e}))},[r,t,e,n])}}function Me({pageSize:e}){const{loadMore:r}=j(e);return w("button",{onClick:r,children:"More results"})}function Z(e,r){var c,s,a;const t=((c=r.products)==null?void 0:c.total)??0,n=((s=e.products)==null?void 0:s.from)??0,o=((a=e.products)==null?void 0:a.size)??0;return t>0&&t>n+o}function ze(){return!!(window.IntersectionObserver&&window.IntersectionObserverEntry&&"intersectionRatio"in window.IntersectionObserverEntry.prototype)}function Re({children:e,loadMoreComponent:r,pageSize:t}){const{loading:n,query:o,response:c}=v(a=>W(a,"loading","query","response")),s=!n&&Z(o,c);return w(P.Fragment,{children:[e,s&&(r?w(r,{pageSize:t}):w(Me,{pageSize:t}))]})}function Ae({children:e,pageSize:r}){const t=p.useRef(null),{query:n,response:o}=v(s=>W(s,"query","response")),{loadMore:c}=j(r);return p.useEffect(()=>{let s,a;return Z(n,o)&&(s=t.current,a=new IntersectionObserver(l=>{const i=l[0];i!=null&&i.isIntersecting&&c()}),s&&a.observe(s)),()=>{s&&a.unobserve(s)}},[o]),w(P.Fragment,{children:[e,w("div",{ref:t,style:{height:"1px"}})]})}const xe=!Q()&&ze()?Ae:Re;function Ie(e){return e.type==="input"}function _e(e){return!!e&&typeof e=="object"&&"type"in e&&"props"in e}function $(e,r={depth:0}){const{children:t}=e;return P.toChildArray(t).map(n=>{if(!_e(n))return n;const o=e.updateElement(n,r);return o===null?null:(o.props={...o.props,children:$({...e,children:o.props.children},{depth:r.depth+1})},o)})}function Ne({children:e,onSearchInput:r}){return $({children:e,updateElement:t=>(!Ie(t)||t.props.type!=="search"||(t.props={...t.props,onInput:n=>{n.target instanceof HTMLInputElement&&r(n.target)}}),t)})}const Te="nosto:search:scrollPos";function qe(){window.sessionStorage.setItem(Te,window.scrollY.toString())}function Ee({children:e,hit:r,onClick:t}){const{pageType:n}=G(),o=n==="autocomplete"?void 0:n;return $({children:e,updateElement:(c,s)=>(s.depth>0||(c.props={...c.props,onClick:a=>{r&&o&&q.s(l=>l.recordSearchClick(o,r)),qe(),typeof t=="function"&&t(a)}}),c)})}function V(){p.useEffect(()=>{const e=window.setTimeout(()=>{console.error("Nosto client script has not loaded after 3 seconds.")},3e3);q.s(()=>{window.clearTimeout(e)})},[])}const D={defaultCurrency:"EUR",queryModifications:e=>e},Oe={...D};function je(e){return{pageType:"autocomplete",...Oe,...e}}function $e({config:e,store:r,children:t}){const n=r??A();return V(),w(I,{value:je(e),children:w(M,{value:n,children:t})})}const Ve={...D,persistentSearchCache:!1,preservePageScroll:!1};function De(e){return{pageType:"category",...Ve,...e}}function Le({config:e,store:r,children:t}){const n=r??A();return V(),w(I,{value:De(e),children:w(M,{value:n,children:t})})}const Be={...D,persistentSearchCache:!1,preservePageScroll:!1};function Ue(e={}){return{pageType:"serp",...Be,...e}}function Qe({config:e,store:r,children:t}){const n=r??A();return V(),w(I,{value:Ue(e),children:w(M,{value:n,children:t})})}function Ke(e){const r=v(t=>t.response);return e&&Array.isArray(e)||e&&F(e)?e:r}function He(e){var s;const r=((s=e.data)==null?void 0:s.filter(a=>a.selected).length)??0,[t,n]=p.useState(r>0),{toggleProductFilter:o}=k();return{active:t,selectedFiltersCount:r,toggleActive:()=>{n(!t)},toggleProductFilter:o}}function We(){const{loading:e,facets:r}=v(t=>{var n,o;return{loading:t.loading,facets:((o=(n=t.response)==null?void 0:n.products)==null?void 0:o.facets)??[]}});return{loading:e,facets:r}}function Ge(e,r){const t=r-e;return!isNaN(t)&&t>0?new Array(r-e).fill(void 0).map((n,o)=>o+e):[]}function Je(e){const{query:r,products:t}=v(n=>({query:n.query,products:n.response.products}));return p.useMemo(()=>{var C;if(!t)return{totalPages:0,resultsFrom:0,resultsTo:0,pages:[]};const n=((C=r.products)==null?void 0:C.from)??0,o=(e==null?void 0:e.width)??1/0,c=Math.max(Math.floor(o-1)/2,1),s=t.size>0?Math.floor(n/t.size)+1:1,a=t.size>0?Math.ceil(t.total/t.size):0,l=b=>b>=s-c&&b<=s+c,i=n+1,d=Math.min(n+t.total,t.total),u={from:n,page:s,current:!0},f=b=>({from:(b-1)*t.size,page:b,current:b===s}),m=s>1?f(s-1):void 0,g=s<a?f(s+1):void 0,y=c===1/0||s-c-1>1?f(1):void 0,h=c===1/0||s+c+1<a?f(a):void 0,S=Ge(1,a+1).filter(l).map(f);return{totalPages:a,resultsFrom:i,resultsTo:d,current:u,prev:m,next:g,first:y,last:h,pages:S}},[r,t,e==null?void 0:e.width])}function Ye(){const[e,r]=p.useState([]),[t,n]=p.useState([]);return p.useEffect(()=>{q.s(async o=>{const{products:c,segments:s}=await o.getSearchSessionParams();r(s??[]),n((c==null?void 0:c.personalizationBoost)??[])})},[]),{segments:e,boost:t}}function Xe(){const{facets:e}=v(i=>{var d;return{facets:((d=i.response.products)==null?void 0:d.facets)??[]}}),{replaceFilter:r,toggleProductFilter:t}=k(),n=p.useCallback(i=>{const d=e==null?void 0:e.find(u=>u.type==="stats"&&u.field===i);if(d&&"min"in d&&"max"in d)return d},[e]),o=p.useCallback(i=>{var d;return((d=e==null?void 0:e.find(u=>u.field===i))==null?void 0:d.name)??i},[e]),c=p.useCallback(i=>"field"in i&&(i.value instanceof Array||i.range instanceof Array),[]),s=p.useCallback(i=>{var d;return{...i,range:(d=i.range)==null?void 0:d.map(u=>({gt:u.gt?Number(u.gt):u.gt,gte:u.gte?Number(u.gte):u.gte,lt:u.lt?Number(u.lt):u.lt,lte:u.lte?Number(u.lte):u.lte}))}},[]),a=p.useCallback(i=>(i.value??[]).map(u=>({value:u,field:i.field,name:o(i.field),filter:s(i),remove:()=>{t(i.field,u,!1)}})),[s,o,t]),l=p.useCallback(i=>(i.range??[]).map(u=>{var g,y;const f=u.gte??u.gt??((g=n(i.field))==null?void 0:g.min),m=u.lte??u.lt??((y=n(i.field))==null?void 0:y.max);if(f!==void 0&&m!==void 0)return{value:`${f} - ${m}`,field:i.field,name:o(i.field),filter:s(i),remove:()=>{r(i.field,void 0)}}}).filter(Boolean),[s,n,o,r]);return{selectFilters:c,toValueFilter:a,toRangeFilter:l}}function ee(){const{filter:e}=v(a=>{var l;return{filter:((l=a.query.products)==null?void 0:l.filter)??[]}}),{updateSearch:r}=k(),{selectFilters:t,toValueFilter:n,toRangeFilter:o}=Xe(),c=p.useMemo(()=>e?e.filter(t).flatMap(a=>"value"in a?n(a):"range"in a?o(a):[]).filter(Boolean):[],[e,t,o,n]),s=p.useCallback(()=>{r({products:{filter:[]}})},[r]);return{filters:c,removeAll:s}}function x(e){if(typeof e=="number")return e;if(typeof e!="string")return;const r=Number(e);return isNaN(r)?void 0:r}function te(e){var u,f,m;const{replaceFilter:r}=k(),{query:t,products:n}=v(g=>({query:g.query,products:g.response.products})),o=(u=n==null?void 0:n.facets)==null?void 0:u.find(g=>g.id===e);if(!o)return{min:0,max:0,range:[0,0],updateRange:()=>{}};const c=(m=(f=t.products)==null?void 0:f.filter)==null?void 0:m.find(g=>g.field===o.field),s=c!=null&&c.range?c.range[0]:void 0,a=typeof s=="object"&&("gte"in s||"lte"in s)?[x(s.gte),x(s.lte)]:[void 0,void 0],l="min"in o?Math.floor(o.min):0,i="max"in o?Math.ceil(o.max):0,d=([g,y])=>{const h=g!==void 0?Math.floor(g):void 0,S=y!==void 0?Math.ceil(y):void 0,C=h!==void 0,b=S!==void 0;(l===h||!C)&&(i===S||!b)?r(o.field,void 0):(l===h||!C)&&b?r(o.field,{lte:S.toString()}):(i===S||!b)&&C?r(o.field,{gte:h.toString()}):C&&b&&r(o.field,{gte:h.toString(),lte:S.toString()})};return{min:l,max:i,range:[a[0]??l,a[1]??i],updateRange:d}}function Ze(e,r){const{min:t,max:n,range:o,updateRange:c}=te(e),{filters:s}=ee(),a=p.useMemo(()=>{var y;const u=s.find(h=>{var S;return(S=h==null?void 0:h.filter)==null?void 0:S.range});let f=null;if(u){const h=(y=u.filter.range)==null?void 0:y[0];f=[x(h==null?void 0:h.gte),x(h==null?void 0:h.lte)]}const m=[];let g=Math.floor(t/r)*r;for(;g<n;){const h=g+r,S=f&&f[0]===g&&f[1]===h;m.push({min:g,max:h,selected:S}),g=h}return m},[s,t,n,r]),l=u=>{c([u,o[1]])},i=u=>{c([o[0],u])},d=t!==o[0]||n!==o[1];return{min:t,max:n,range:o,updateRange:c,ranges:a,handleMinChange:l,handleMaxChange:i,isSelected:d}}function et(){const{products:e,keywords:r}=v(t=>t.response);return{products:e??{hits:[],total:0},keywords:r??{hits:[],total:0}}}function tt(){const e=v(t=>{var n;return(n=t.query.products)==null?void 0:n.filter});return p.useMemo(()=>e?e.reduce((t,n)=>t+(Array.isArray(n.value)?n.value.length:1),0):0,[e])}function N(e){return e&&!Number.isNaN(e)?e:0}function rt(e,r){const{from:t,size:n,total:o}=v(i=>{var d,u,f,m,g;return{from:N(((d=i.query.products)==null?void 0:d.from)??0),size:N(((f=(u=i.response)==null?void 0:u.products)==null?void 0:f.size)??0),total:N(((g=(m=i.response)==null?void 0:m.products)==null?void 0:g.total)??0)}}),{updateSearch:c}=k(),s=t+n,a=[...e].reverse().filter(i=>i+r<o);return{from:t,to:s,total:o,size:n,sizeOptions:a,handleSizeChange:i=>{c({products:{size:i}})}}}function nt(e,r){return e.length!==r.length?!1:e.every(t=>r.find(n=>t.field===n.field&&t.order===n.order))}function ot(e){var c,s;const r=v(a=>a.query),{updateSearch:t}=k();return{activeSort:((c=e.find(a=>{var l;return nt(a.value.sort,((l=r.products)==null?void 0:l.sort)||[])}))==null?void 0:c.id)??((s=e[0])==null?void 0:s.id),setSort:a=>{const l=e.find(i=>i.id===a);l&&t({products:{sort:l.value.sort}})}}}exports.AutocompletePageProvider=$e;exports.CategoryPageProvider=Le;exports.InfiniteScroll=xe;exports.SearchInput=Ne;exports.SearchPageProvider=Qe;exports.SerpElement=Ee;exports.StoreContext=M;exports.createExtendableStore=K;exports.createStore=A;exports.defaultState=H;exports.useActions=k;exports.useDecoratedSearchResults=Ke;exports.useFacet=He;exports.useFacets=We;exports.useLoadMore=j;exports.useNostoAppState=v;exports.usePagination=Je;exports.usePersonalization=Ye;exports.useProductFilters=ee;exports.useRange=te;exports.useRangeSelector=Ze;exports.useResponse=et;exports.useSelectedFiltersCount=tt;exports.useSizeOptions=rt;exports.useSort=ot;
|
package/dist/preact/preact.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/** @module preact */
|
|
2
|
+
export { InfiniteScroll } from './src/components/InfiniteScroll/InfiniteScroll';
|
|
2
3
|
export { SearchInput } from './src/components/SearchInput';
|
|
3
4
|
export { SerpElement } from './src/components/SerpElement';
|
|
4
5
|
export type { PublicAutocompleteConfig as AutocompleteConfig } from './src/config/pages/autocomplete/config';
|
|
@@ -11,6 +12,7 @@ export { useActions } from './src/hooks/useActions';
|
|
|
11
12
|
export { useDecoratedSearchResults } from './src/hooks/useDecoratedSearchResults';
|
|
12
13
|
export { useFacet } from './src/hooks/useFacet';
|
|
13
14
|
export { useFacets } from './src/hooks/useFacets';
|
|
15
|
+
export { useLoadMore } from './src/hooks/useLoadMore/useLoadMore';
|
|
14
16
|
export { useNostoAppState } from './src/hooks/useNostoAppState';
|
|
15
17
|
export { type Page, usePagination } from './src/hooks/usePagination';
|
|
16
18
|
export { usePersonalization } from './src/hooks/usePersonalization';
|