@dropins/storefront-product-discovery 3.0.0-alpha21 → 3.0.0-alpha23

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.
@@ -7,6 +7,6 @@
7
7
  * accompanying it.
8
8
  *******************************************************************/
9
9
  declare const Facet = "\n fragment Facet on Aggregation {\n title\n attribute\n buckets {\n title\n __typename\n ... on CategoryView {\n name\n count\n path\n }\n ... on ScalarBucket {\n count\n }\n ... on RangeBucket {\n from\n to\n count\n }\n ... on StatsBucket {\n min\n max\n }\n }\n }\n";
10
- declare const ProductView = "\n fragment ProductView on ProductSearchItem {\n productView {\n __typename\n sku\n name\n inStock\n url\n urlKey\n attributes(roles: []) {\n name\n label\n value\n roles\n }\n images {\n label\n url\n roles\n }\n ... on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n options {\n id\n title\n values {\n title\n ... on ProductViewOptionValueSwatch {\n id\n inStock\n type\n value\n }\n }\n }\n }\n ... on SimpleProductView {\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n }\n highlights {\n attribute\n value\n matched_words\n }\n }\n";
10
+ declare const ProductView = "\n fragment ProductView on ProductSearchItem {\n productView {\n __typename\n sku\n name\n inStock\n url\n urlKey\n images {\n label\n url\n roles\n }\n ... on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n options {\n id\n title\n values {\n title\n ... on ProductViewOptionValueSwatch {\n id\n inStock\n type\n value\n }\n }\n }\n }\n ... on SimpleProductView {\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n }\n highlights {\n attribute\n value\n matched_words\n }\n }\n";
11
11
  export { Facet, ProductView };
12
12
  //# sourceMappingURL=fragments.graphql.d.ts.map
@@ -2,6 +2,7 @@ import { ProductSearchResult, Scope, SearchVariables } from '../../data/models';
2
2
 
3
3
  type SearchOptions = {
4
4
  scope?: Scope;
5
+ searchPathname?: string;
5
6
  };
6
7
  export declare const search: (request: SearchVariables | null, options?: SearchOptions) => Promise<ProductSearchResult>;
7
8
  export {};
package/chunks/search.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{merge as ne}from"@dropins/tools/lib.js";import{c as ie}from"./initialize.js";import{events as F}from"@dropins/tools/event-bus.js";import{ProductView as oe,Facet as te}from"../fragments.js";import{S as se,P as le,u as ue,s as ce,a as me,b as pe}from"./acdlEvents.js";import{FetchGraphQL as fe}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:xe,setFetchGraphQlHeader:Fe,removeFetchGraphQlHeader:$e,setFetchGraphQlHeaders:De,getFetchGraphQlHeader:Ue,fetchGraphQl:ge,getConfig:Ne}=new fe().getMethods(),$=e=>!e||!Intl.supportedValuesOf("currency").includes(e)?"USD":e,he=e=>{var r,s,i,u,c,R,f,I,g,l,m,h,S,_,v,A,T,E,z,D,x,o,n,p,b,P,Q,y,C,G,U,N,H,K,M,k,L,B,j,W,Y,J,X,Z,V,q,a,d,O,ee;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],attributes:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const t={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],attributes:((r=e==null?void 0:e.attributes)==null?void 0:r.map(w=>({label:w.label||"",name:w.name||"",roles:w.roles||[],value:w.value??null})))||[],images:((s=e==null?void 0:e.images)==null?void 0:s.map(w=>{var re;return{label:w.label||"",roles:w.roles||[],url:((re=w.url)==null?void 0:re.replace(/^https?:\/\//,"//"))||""}}))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((c=(u=(i=e==null?void 0:e.price)==null?void 0:i.final)==null?void 0:u.amount)==null?void 0:c.value)||0,currency:$((I=(f=(R=e==null?void 0:e.price)==null?void 0:R.final)==null?void 0:f.amount)==null?void 0:I.currency)}},regular:{amount:{value:((m=(l=(g=e==null?void 0:e.price)==null?void 0:g.regular)==null?void 0:l.amount)==null?void 0:m.value)||0,currency:$((_=(S=(h=e==null?void 0:e.price)==null?void 0:h.regular)==null?void 0:S.amount)==null?void 0:_.currency)}},roles:((v=e==null?void 0:e.price)==null?void 0:v.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((z=(E=(T=(A=e==null?void 0:e.priceRange)==null?void 0:A.minimum)==null?void 0:T.final)==null?void 0:E.amount)==null?void 0:z.value)||0,currency:$((n=(o=(x=(D=e==null?void 0:e.priceRange)==null?void 0:D.minimum)==null?void 0:x.final)==null?void 0:o.amount)==null?void 0:n.currency)}},regular:{amount:{value:((Q=(P=(b=(p=e==null?void 0:e.priceRange)==null?void 0:p.minimum)==null?void 0:b.regular)==null?void 0:P.amount)==null?void 0:Q.value)||0,currency:$((U=(G=(C=(y=e==null?void 0:e.priceRange)==null?void 0:y.minimum)==null?void 0:C.regular)==null?void 0:G.amount)==null?void 0:U.currency)}}},maximum:{final:{amount:{value:((M=(K=(H=(N=e==null?void 0:e.priceRange)==null?void 0:N.maximum)==null?void 0:H.final)==null?void 0:K.amount)==null?void 0:M.value)||0,currency:$((j=(B=(L=(k=e==null?void 0:e.priceRange)==null?void 0:k.maximum)==null?void 0:L.final)==null?void 0:B.amount)==null?void 0:j.currency)}},regular:{amount:{value:((X=(J=(Y=(W=e==null?void 0:e.priceRange)==null?void 0:W.maximum)==null?void 0:Y.regular)==null?void 0:J.amount)==null?void 0:X.value)||0,currency:$((a=(q=(V=(Z=e==null?void 0:e.priceRange)==null?void 0:Z.maximum)==null?void 0:V.regular)==null?void 0:q.amount)==null?void 0:a.currency)}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return ne(t,(ee=(O=(d=ie.getConfig().models)==null?void 0:d.Product)==null?void 0:O.transformer)==null?void 0:ee.call(O,e))};function ye(e,t){var i,u,c,R,f,I,g,l,m;const r=e==null?void 0:e.productSearch,s={facets:Pe((r==null?void 0:r.facets)||[],t),items:(r==null?void 0:r.items.map(h=>he(h==null?void 0:h.productView)))||[],pageInfo:{currentPage:((i=r==null?void 0:r.page_info)==null?void 0:i.current_page)||1,totalPages:((u=r==null?void 0:r.page_info)==null?void 0:u.total_pages)||1,totalItems:((c=r==null?void 0:r.page_info)==null?void 0:c.total_items)||0,pageSize:((R=r==null?void 0:r.page_info)==null?void 0:R.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0,metadata:{filterableAttributes:((f=e==null?void 0:e.attributeMetadata)==null?void 0:f.filterableInSearch)||[],sortableAttributes:be(((I=e==null?void 0:e.attributeMetadata)==null?void 0:I.sortable)||[],t)}};return ne(s,(m=(l=(g=ie.getConfig().models)==null?void 0:g.ProductSearchResult)==null?void 0:l.transformer)==null?void 0:m.call(l,e))}function be(e=[],t){return!e||e.length===0?[]:e.filter(r=>{var s;return r.attribute==="position"?(s=t==null?void 0:t.filter)==null?void 0:s.some(u=>u.attribute==="categoryPath"):!0}).map(r=>({...r,bidirectional:r.attribute==="price"}))}function Pe(e=[],t){var s;return!e||e.length===0?[]:((s=t==null?void 0:t.filter)==null?void 0:s.some(i=>i.attribute==="categoryPath"))?e.filter(i=>i.attribute!=="categories"):e}const Ce=`
3
+ import{merge as re}from"@dropins/tools/lib.js";import{c as ne}from"./initialize.js";import{events as v}from"@dropins/tools/event-bus.js";import{ProductView as ie,Facet as te}from"../fragments.js";import{S as oe,P as se,u as le,s as ce,a as ue,b as me}from"./acdlEvents.js";import{FetchGraphQL as pe}from"@dropins/tools/fetch-graphql.js";const{setEndpoint:Fe,setFetchGraphQlHeader:$e,removeFetchGraphQlHeader:Ae,setFetchGraphQlHeaders:De,getFetchGraphQlHeader:Ne,fetchGraphQl:fe,getConfig:Ue}=new pe().getMethods(),ge="search",x=e=>!e||!Intl.supportedValuesOf("currency").includes(e)?"USD":e,he=e=>{var r,l,s,o,y,m,R,g,w,c,p,u,F,S,_,N,U,E,T,$,I,t,n,f,P,C,z,h,b,H,A,D,O,K,M,k,L,B,j,Y,J,W,X,Z,V,q,a,Q,d;if(!e)return{id:"",name:"",sku:"",shortDescription:"",url:"",urlKey:"",metaTitle:"",metaKeywords:"",metaDescription:"",lowStock:!1,links:[],images:[],description:"",externalId:"",inputOptions:[],addToCartAllowed:!1,price:void 0,priceRange:void 0,inStock:!1,typename:""};const i={id:(e==null?void 0:e.id)||"",name:(e==null?void 0:e.name)||"",sku:(e==null?void 0:e.sku)||"",shortDescription:(e==null?void 0:e.shortDescription)||"",url:(e==null?void 0:e.url)||"",urlKey:(e==null?void 0:e.urlKey)||"",metaTitle:(e==null?void 0:e.metaTitle)||"",metaKeywords:(e==null?void 0:e.metaKeywords)||"",metaDescription:(e==null?void 0:e.metaDescription)||"",lowStock:(e==null?void 0:e.lowStock)||!1,links:(e==null?void 0:e.links)||[],images:((r=e==null?void 0:e.images)==null?void 0:r.map(G=>{var ee;return{label:G.label||"",roles:G.roles||[],url:((ee=G.url)==null?void 0:ee.replace(/^https?:\/\//,"//"))||""}}))||[],description:(e==null?void 0:e.description)||"",externalId:(e==null?void 0:e.externalId)||"",inputOptions:(e==null?void 0:e.inputOptions)||[],addToCartAllowed:(e==null?void 0:e.addToCartAllowed)||!1,price:e.price?{final:{amount:{value:((o=(s=(l=e==null?void 0:e.price)==null?void 0:l.final)==null?void 0:s.amount)==null?void 0:o.value)||0,currency:x((R=(m=(y=e==null?void 0:e.price)==null?void 0:y.final)==null?void 0:m.amount)==null?void 0:R.currency)}},regular:{amount:{value:((c=(w=(g=e==null?void 0:e.price)==null?void 0:g.regular)==null?void 0:w.amount)==null?void 0:c.value)||0,currency:x((F=(u=(p=e==null?void 0:e.price)==null?void 0:p.regular)==null?void 0:u.amount)==null?void 0:F.currency)}},roles:((S=e==null?void 0:e.price)==null?void 0:S.roles)||[]}:void 0,priceRange:e!=null&&e.priceRange?{minimum:{final:{amount:{value:((E=(U=(N=(_=e==null?void 0:e.priceRange)==null?void 0:_.minimum)==null?void 0:N.final)==null?void 0:U.amount)==null?void 0:E.value)||0,currency:x((t=(I=($=(T=e==null?void 0:e.priceRange)==null?void 0:T.minimum)==null?void 0:$.final)==null?void 0:I.amount)==null?void 0:t.currency)}},regular:{amount:{value:((C=(P=(f=(n=e==null?void 0:e.priceRange)==null?void 0:n.minimum)==null?void 0:f.regular)==null?void 0:P.amount)==null?void 0:C.value)||0,currency:x((H=(b=(h=(z=e==null?void 0:e.priceRange)==null?void 0:z.minimum)==null?void 0:h.regular)==null?void 0:b.amount)==null?void 0:H.currency)}}},maximum:{final:{amount:{value:((K=(O=(D=(A=e==null?void 0:e.priceRange)==null?void 0:A.maximum)==null?void 0:D.final)==null?void 0:O.amount)==null?void 0:K.value)||0,currency:x((B=(L=(k=(M=e==null?void 0:e.priceRange)==null?void 0:M.maximum)==null?void 0:k.final)==null?void 0:L.amount)==null?void 0:B.currency)}},regular:{amount:{value:((W=(J=(Y=(j=e==null?void 0:e.priceRange)==null?void 0:j.maximum)==null?void 0:Y.regular)==null?void 0:J.amount)==null?void 0:W.value)||0,currency:x((q=(V=(Z=(X=e==null?void 0:e.priceRange)==null?void 0:X.maximum)==null?void 0:Z.regular)==null?void 0:V.amount)==null?void 0:q.currency)}}}}:void 0,inStock:(e==null?void 0:e.inStock)||!1,typename:(e==null?void 0:e.__typename)||""};return re(i,(d=(Q=(a=ne.getConfig().models)==null?void 0:a.Product)==null?void 0:Q.transformer)==null?void 0:d.call(Q,e))};function ye(e,i){var s,o,y,m,R,g,w,c,p;const r=e==null?void 0:e.productSearch,l={facets:Ce((r==null?void 0:r.facets)||[],i),items:(r==null?void 0:r.items.map(u=>he(u==null?void 0:u.productView)))||[],pageInfo:{currentPage:((s=r==null?void 0:r.page_info)==null?void 0:s.current_page)||1,totalPages:((o=r==null?void 0:r.page_info)==null?void 0:o.total_pages)||1,totalItems:((y=r==null?void 0:r.page_info)==null?void 0:y.total_items)||0,pageSize:((m=r==null?void 0:r.page_info)==null?void 0:m.page_size)||10},totalCount:(r==null?void 0:r.total_count)||0,metadata:{filterableAttributes:((R=e==null?void 0:e.attributeMetadata)==null?void 0:R.filterableInSearch)||[],sortableAttributes:Pe(((g=e==null?void 0:e.attributeMetadata)==null?void 0:g.sortable)||[],i)}};return re(l,(p=(c=(w=ne.getConfig().models)==null?void 0:w.ProductSearchResult)==null?void 0:c.transformer)==null?void 0:p.call(c,e))}function Pe(e=[],i){return!e||e.length===0?[]:e.filter(r=>{var l;return r.attribute==="position"?(l=i==null?void 0:i.filter)==null?void 0:l.some(o=>o.attribute==="categoryPath"):!0}).map(r=>({...r,bidirectional:r.attribute==="price"}))}function Ce(e=[],i){var l;return!e||e.length===0?[]:((l=i==null?void 0:i.filter)==null?void 0:l.some(s=>s.attribute==="categoryPath"))?e.filter(s=>s.attribute!=="categories"):e}const be=`
4
4
  query productSearch(
5
5
  $phrase: String!
6
6
  $pageSize: Int
@@ -44,7 +44,7 @@ import{merge as ne}from"@dropins/tools/lib.js";import{c as ie}from"./initialize.
44
44
  }
45
45
  }
46
46
  }
47
- ${oe}
47
+ ${ie}
48
48
  ${te}
49
- `,Ae=async(e,t={})=>{const r=t.scope==="search"?void 0:t.scope,s={request:e||{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[],metadata:{filterableAttributes:[],sortableAttributes:[]}}};if(e===null)return F.emit("search/result",s,{scope:r}),s.result;F.emit("search/loading",!0,{scope:r});try{const i=r==="popover"?se:le,u=window.crypto.randomUUID(),c=new URLSearchParams(window.location.search),R=Number(c.get("page"))||1,f=c.get("q"),I=(e==null?void 0:e.phrase)||f!==null&&f.trim().length>0&&f||"",g=r!=="undefined"?null:c.get("sort"),l=g&&g.trim().length>0?g.split(",").map(o=>{if(o=o.trim(),!o)return null;let n="",p="ASC";if(o.includes(":"))[n,p]=o.split(":");else if(o.includes("_")){const b=o.lastIndexOf("_");n=o.slice(0,b),p=o.slice(b+1).toUpperCase()==="DESC"?"DESC":"ASC"}else n=o;return n==="position"?null:{attribute:n,direction:p}}).filter(Boolean):[],m=r!=="undefined"?null:c.get("filter"),h=m&&m.trim()?decodeURIComponent(m.replace(/\+/g,"%20")).split(/\||;/).reduce((n,p)=>{const b=p.trim();if(!b.includes(":"))return n;const[P,...Q]=b.split(":"),y=Q.join(":").trim();if(!P||!y)return n;if(P==="price"&&y.includes("-")){const[C,G]=y.split("-"),U=Number(C),N=Number(G);return!Number.isNaN(U)&&!Number.isNaN(N)&&n.push({attribute:"price",range:{from:U,to:N}}),n}if(P==="visibility"){const C=y.indexOf(",");return n.push({attribute:P,in:C===-1?[y.trim()]:["Catalog, Search"]}),n}return n.push({attribute:P,in:y.split(/[|,]/).map(C=>C.trim()).filter(Boolean)}),n},[]):e==null?void 0:e.filter,S=h?[...h]:[],_=window.location.pathname.replace(/^\/|\/$/g,""),v=!r&&_&&!_.startsWith("search")?_.split("/").pop():null;if(v){let o=S.find(p=>p.attribute==="categoryPath");const n={attribute:"categoryPath",in:[v]};o?o=n:S.unshift(n)}const A=I||e.phrase,T=l!=null&&l.length?l:e.sort,E=m!==null||v?S:e.filter;e={...e,phrase:A,sort:T,filter:E,currentPage:R},ue(i,u,e.phrase||"",e.filter||[],e.pageSize||0,e.currentPage||0,e.sort||[]),ce(i);const{errors:z,data:D}=await ge(Ce,{method:"GET",variables:{...e}});if(z&&!D)throw new Error("Error fetching product search");const x=ye(D,e);return me(i,u,x),pe(i),F.emit("search/result",{request:e,result:x},{scope:r}),x}catch(i){throw F.emit("search/error",i.message,{scope:r}),F.emit("search/result",s,{scope:r}),i}finally{F.emit("search/loading",!1,{scope:r})}};export{Fe as a,De as b,Ne as c,Ae as d,ge as f,Ue as g,$e as r,xe as s};
49
+ `,Re=(e,i)=>{const r=window.location.pathname.replace(/^\/|\/$/g,"");return!e&&r&&r.split("/").pop()!==i?r.split("/").pop():null},Ee=async(e,i={})=>{const r=i.scope==="search"?void 0:i.scope,l=i.searchPathname??ge,s={request:e||{},result:{facets:[],pageInfo:{currentPage:0,totalPages:0,totalItems:0,pageSize:0},items:[],totalCount:0,suggestions:[],metadata:{filterableAttributes:[],sortableAttributes:[]}}};if(e===null)return v.emit("search/result",s,{scope:r}),s.result;v.emit("search/loading",!0,{scope:r});try{const o=r==="popover"?oe:se,y=window.crypto.randomUUID(),m=new URLSearchParams(window.location.search),R=Number(m.get("page"))||1,g=m.get("q"),w=(e==null?void 0:e.phrase)||g!==null&&g.trim().length>0&&g||"",c=r!=="undefined"?null:m.get("sort"),p=c&&c.trim().length>0?c.split(",").map(t=>{if(t=t.trim(),!t)return null;let n="",f="ASC";if(t.includes(":"))[n,f]=t.split(":");else if(t.includes("_")){const P=t.lastIndexOf("_");n=t.slice(0,P),f=t.slice(P+1).toUpperCase()==="DESC"?"DESC":"ASC"}else n=t;return n==="position"?null:{attribute:n,direction:f}}).filter(Boolean):[],u=r!=="undefined"?null:m.get("filter"),F=u&&u.trim()?decodeURIComponent(u.replace(/\+/g,"%20")).split(/\||;/).reduce((n,f)=>{const P=f.trim();if(!P.includes(":"))return n;const[C,...z]=P.split(":"),h=z.join(":").trim();if(!C||!h)return n;if(C==="price"&&h.includes("-")){const[b,H]=h.split("-"),A=Number(b),D=Number(H);return!Number.isNaN(A)&&!Number.isNaN(D)&&n.push({attribute:"price",range:{from:A,to:D}}),n}if(C==="visibility"){const b=h.indexOf(",");return n.push({attribute:C,in:b===-1?[h.trim()]:["Catalog, Search"]}),n}return n.push({attribute:C,in:h.split(/[|,]/).map(b=>b.trim()).filter(Boolean)}),n},[]):e==null?void 0:e.filter,S=F?[...F]:[],_=Re(r,l);if(_){let t=S.find(f=>f.attribute==="categoryPath");const n={attribute:"categoryPath",in:[_]};t?t=n:S.unshift(n)}const N=w||e.phrase,U=p!=null&&p.length?p:e.sort,E=u!==null||_?S:e.filter;e={...e,phrase:N,sort:U,filter:E,currentPage:R},le(o,y,e.phrase||"",e.filter||[],e.pageSize||0,e.currentPage||0,e.sort||[]),ce(o);const{errors:T,data:$}=await fe(be,{method:"GET",variables:{...e}});if(T&&!$)throw new Error("Error fetching product search");const I=ye($,e);return ue(o,y,I),me(o),v.emit("search/result",{request:e,result:I},{scope:r}),I}catch(o){throw v.emit("search/error",o.message,{scope:r}),v.emit("search/result",s,{scope:r}),o}finally{v.emit("search/loading",!1,{scope:r})}};export{$e as a,De as b,Ue as c,Ee as d,fe as f,Ne as g,Ae as r,Fe as s};
50
50
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nconst getCurrency = (currency?: string) => {\n if (!currency || !Intl.supportedValuesOf(\"currency\").includes(currency)) {\n return 'USD';\n }\n return currency;\n};\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n attributes: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n attributes:\n data?.attributes?.map((attr: any) => ({\n label: attr.label || '',\n name: attr.name || '',\n roles: attr.roles || [],\n value: attr.value ?? null,\n })) || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: getCurrency(data?.price?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: getCurrency(data?.price?.regular?.amount?.currency),\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.regular?.amount?.currency),\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.regular?.amount?.currency),\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n return facets;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { ProductSearchResult, Scope, SearchVariables, SortOrder, SearchFilter } from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n}\n\nexport const search = async (request: SearchVariables | null, options: SearchOptions = {}): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n const params = new URLSearchParams(window.location.search);\n \n const currentPage = Number(params.get('page')) || 1;\n const qParam = params.get('q');\n // if we are passed a phrase, use it, otherwise use the q param\n const phrase = request?.phrase || (qParam !== null && qParam.trim().length > 0 && qParam) || '';\n \n const sortParam = scope !== 'undefined' ? null : params.get('sort');\n const sort: SortOrder[] = sortParam && sortParam.trim().length > 0\n ? sortParam.split(',').map(token => {\n token = token.trim();\n if (!token) return null;\n\n let attribute = '';\n let direction: 'ASC' | 'DESC' = 'ASC';\n\n if (token.includes(':')) {\n [attribute, direction] = token.split(':') as [string, 'ASC' | 'DESC'];\n } \n else if (token.includes('_')) {\n const lastUnderscore = token.lastIndexOf('_');\n attribute = token.slice(0, lastUnderscore); \n direction = token.slice(lastUnderscore + 1).toUpperCase() === 'DESC' ? 'DESC' : 'ASC';\n } \n else {\n attribute = token;\n }\n \n if (attribute === 'position') {\n return null;\n }\n \n return { attribute, direction };\n }).filter(Boolean) as SortOrder[]\n : [];\n \n // if we are passed a scope, don't use the filter param\n const filterParam = scope !== 'undefined' ? null : params.get('filter');\n const filter: SearchFilter[] | undefined =\n filterParam && filterParam.trim()\n ? (() => {\n \n const decoded = decodeURIComponent(\n filterParam.replace(/\\+/g, '%20')\n );\n \n return decoded.split(/\\||;/).reduce<SearchFilter[]>((acc, part) => {\n const trimmed = part.trim();\n if (!trimmed.includes(':')) return acc;\n const [attribute, ...rest] = trimmed.split(':');\n const rawValue = rest.join(':').trim();\n if (!attribute || !rawValue) return acc;\n if (attribute === 'price' && rawValue.includes('-')) {\n const [fromRaw, toRaw] = rawValue.split('-');\n \n const from = Number(fromRaw);\n const to = Number(toRaw);\n \n if (!Number.isNaN(from) && !Number.isNaN(to)) {\n acc.push({\n attribute: 'price',\n range: {\n from,\n to,\n },\n });\n }\n \n return acc;\n }\n \n if (attribute === 'visibility') {\n const firstCommaIndex = rawValue.indexOf(',');\n acc.push({\n attribute,\n in:\n firstCommaIndex === -1\n ? [rawValue.trim()]\n : [\n `Catalog, Search`\n ],\n });\n return acc;\n }\n \n acc.push({\n attribute,\n in: rawValue\n .split(/[|,]/)\n .map(v => v.trim())\n .filter(Boolean),\n });\n \n return acc;\n }, []);\n })()\n : request?.filter;\n\n const finalFilters: SearchFilter[] = filter ? [...filter] : [];\n\n const pathname = window.location.pathname.replace(/^\\/|\\/$/g, '');\n // if we are passed a scope or on the search page, don't add the categoryPath filter\n const categoryFromPath =\n !scope && pathname && !pathname.startsWith('search')\n ? pathname.split('/').pop()\n : null;\n\n // cagetoryFromPath overrides any other categoryPath filters\n if (categoryFromPath) {\n let existingCategoryPathFilter = finalFilters.find(f => f.attribute === 'categoryPath');\n const newCategoryPathFilter = {\n attribute: 'categoryPath',\n in: [categoryFromPath],\n };\n\n if (existingCategoryPathFilter) {\n existingCategoryPathFilter = newCategoryPathFilter;\n } else {\n finalFilters.unshift(newCategoryPathFilter);\n }\n }\n\n const phraseSearch = phrase || request.phrase;\n const sortSearch = sort?.length ? sort : request.sort;\n const filterSearch = filterParam !== null || categoryFromPath ? finalFilters : request.filter;\n\n request = {\n ...request,\n phrase: phraseSearch,\n sort: sortSearch,\n filter: filterSearch,\n currentPage,\n };\n\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n request.phrase || '',\n request.filter || [],\n request.pageSize || 0,\n request.currentPage || 0,\n request.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...request },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, request);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId)\n\n // Emit single event with result and metadata\n events.emit('search/result', { request, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","getCurrency","currency","transformProduct","data","transformedProduct","_a","attr","_b","image","_e","_d","_c","_h","_g","_f","_k","_j","_i","_n","_m","_l","_o","_s","_r","_q","_p","_w","_v","_u","_t","_A","_z","_y","_x","_E","_D","_C","_B","_I","_H","_G","_F","_M","_L","_K","_J","_Q","_P","_O","_N","_U","_T","_S","_R","merge","_X","_W","_V","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","PRODUCT_SEARCH_QUERY","ProductView","Facet","search","request","options","scope","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","params","currentPage","qParam","phrase","sortParam","sort","token","attribute","direction","lastUnderscore","filterParam","acc","part","trimmed","rest","rawValue","fromRaw","toRaw","from","to","firstCommaIndex","v","finalFilters","pathname","categoryFromPath","existingCategoryPathFilter","f","newCategoryPathFilter","phraseSearch","sortSearch","filterSearch","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sources":["/@dropins/storefront-product-discovery/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-product-discovery/src/data/models/api.ts","/@dropins/storefront-product-discovery/src/data/transforms/product.ts","/@dropins/storefront-product-discovery/src/data/transforms/api.ts","/@dropins/storefront-product-discovery/src/api/search/graphql/search.graphql.ts","/@dropins/storefront-product-discovery/src/api/search/search.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","import { Product } from './product';\n\nexport type Scope = 'search' | 'popover' | string;\n\nexport const SEARCH_PATHNAME = 'search';\n\nexport interface SearchVariables {\n scope?: Scope;\n phrase?: string;\n filter?: SearchFilter[];\n sort?: SortOrder[];\n currentPage?: number;\n pageSize?: number;\n context?: SearchContext;\n}\n\nexport interface SearchContext {\n customerGroup?: string;\n userViewHistory?: ViewHistoryRecord[];\n}\n\nexport interface ViewHistoryRecord {\n sku: string;\n dateTime: string;\n}\n\nexport interface SearchFilter {\n attribute: string;\n contains?: string;\n in?: string[];\n eq?: string;\n range?: {\n from: number;\n to: number;\n };\n startsWith?: string;\n}\n\nexport interface SortOrder {\n attribute: string;\n direction: 'ASC' | 'DESC';\n}\n\nexport interface RefineOption {\n label: string;\n attribute: string;\n numeric: boolean;\n bidirectional: boolean;\n}\n\nexport interface ProductSearchResponse {\n productSearch: ProductSearchResult;\n}\n\nexport interface ProductSearchResult {\n facets: SearchFacet[];\n items: Product[];\n pageInfo: {\n currentPage: number;\n totalPages: number;\n totalItems: number;\n pageSize: number;\n };\n suggestions?: string[];\n totalCount: number;\n metadata?: {\n filterableAttributes: RefineOption[];\n sortableAttributes: RefineOption[];\n };\n}\n\nexport interface SearchFacet {\n title: string;\n attribute: string;\n buckets: FacetBucket[];\n}\n\nexport interface FacetBucket {\n title: string;\n count: number;\n __typename: string;\n from?: number;\n to?: number;\n selected?: boolean;\n}\n\nexport interface AttributeMetadataResponse {\n attributeMetadata: AttributeMetadata;\n}\n\nexport interface AttributeMetadata {\n sortable: RefineOption[];\n filterableInSearch: RefineOption[];\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { Product } from '../models/product';\n\nconst getCurrency = (currency?: string) => {\n if (!currency || !Intl.supportedValuesOf(\"currency\").includes(currency)) {\n return 'USD';\n }\n return currency;\n};\n\nexport const transformProduct = (data: any): Product | null => {\n // check if data is null or undefined, and if so return an empty object\n if (!data) {\n return {\n id: '',\n name: '',\n sku: '',\n shortDescription: '',\n url: '',\n urlKey: '',\n metaTitle: '',\n metaKeywords: '',\n metaDescription: '',\n lowStock: false,\n links: [],\n images: [],\n description: '',\n externalId: '',\n inputOptions: [],\n addToCartAllowed: false,\n price: undefined,\n priceRange: undefined,\n inStock: false,\n typename: '',\n };\n }\n\n const transformedProduct = {\n id: data?.id || '',\n name: data?.name || '',\n sku: data?.sku || '',\n shortDescription: data?.shortDescription || '',\n url: data?.url || '',\n urlKey: data?.urlKey || '',\n metaTitle: data?.metaTitle || '',\n metaKeywords: data?.metaKeywords || '',\n metaDescription: data?.metaDescription || '',\n lowStock: data?.lowStock || false,\n links: data?.links || [],\n images:\n data?.images?.map((image: any) => ({\n label: image.label || '',\n roles: image.roles || [],\n url: image.url?.replace(/^https?:\\/\\//, '//') || '',\n })) || [],\n description: data?.description || '',\n externalId: data?.externalId || '',\n inputOptions: data?.inputOptions || [],\n addToCartAllowed: data?.addToCartAllowed || false,\n price: data.price\n ? {\n final: {\n amount: {\n value: data?.price?.final?.amount?.value || 0,\n currency: getCurrency(data?.price?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.price?.regular?.amount?.value || 0,\n currency: getCurrency(data?.price?.regular?.amount?.currency),\n },\n },\n roles: data?.price?.roles || [],\n }\n : undefined,\n priceRange: data?.priceRange\n ? {\n minimum: {\n final: {\n amount: {\n value: data?.priceRange?.minimum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.minimum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.minimum?.regular?.amount?.currency),\n },\n },\n },\n maximum: {\n final: {\n amount: {\n value: data?.priceRange?.maximum?.final?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.final?.amount?.currency),\n },\n },\n regular: {\n amount: {\n value: data?.priceRange?.maximum?.regular?.amount?.value || 0,\n currency: getCurrency(data?.priceRange?.maximum?.regular?.amount?.currency),\n },\n },\n },\n }\n : undefined,\n inStock: data?.inStock || false,\n typename: data?.__typename || '',\n };\n\n return merge(\n transformedProduct, // default transformer\n config.getConfig().models?.Product?.transformer?.(data), // custom transformer\n )\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/plp/api/initialize/initialize';\nimport { ProductSearchResult, SearchVariables } from '@/plp/data/models';\nimport { Product } from '@/plp/data/models/product';\n\nimport { transformProduct } from './product';\n\n\nexport function transformProductSearchResponse(data: any, searchVariables?: SearchVariables): ProductSearchResult {\n const productSearch = data?.productSearch;\n\n const transformedResponse: ProductSearchResult = {\n facets: transformFacets(productSearch?.facets || [], searchVariables),\n items: productSearch?.items.map((product: any) => transformProduct(product?.productView)) || [],\n pageInfo: {\n currentPage: productSearch?.page_info?.current_page || 1,\n totalPages: productSearch?.page_info?.total_pages || 1,\n totalItems: productSearch?.page_info?.total_items || 0,\n pageSize: productSearch?.page_info?.page_size || 10, //replace with default constant\n },\n totalCount: productSearch?.total_count || 0,\n metadata: {\n filterableAttributes: data?.attributeMetadata?.filterableInSearch || [],\n sortableAttributes: transformSortAttributes(data?.attributeMetadata?.sortable || [], searchVariables),\n }\n };\n return merge(\n transformedResponse, // default transformer\n config.getConfig().models?.ProductSearchResult?.transformer?.(data), // custom transformer\n );\n}\n\nexport const transformSearchResultProducts = (searchResponse: { productSearch: { items: any[] } }): Product[] =>\n searchResponse?.productSearch?.items?.reduce<Product[]>((returnedProductList, productItem) => {\n if (!productItem?.productView) return returnedProductList; // Skip if no productView and product is null\n\n const transformed = transformProduct(productItem.productView);\n if (transformed) {\n returnedProductList.push(transformed);\n }\n\n return returnedProductList;\n }, []) || [];\n\nfunction transformSortAttributes(sortableAttributes: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!sortableAttributes || sortableAttributes.length === 0) {\n return [];\n }\n\n return sortableAttributes\n .filter((option) => {\n // Only include position attribute if there's a category filter\n if (option.attribute === 'position') {\n const hasCategoryFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n return hasCategoryFilter;\n }\n\n // Include all other attributes\n return true;\n })\n .map((option) => ({\n ...option,\n bidirectional: option.attribute === 'price',\n }));\n}\n\nfunction transformFacets(facets: any[] = [], searchVariables?: SearchVariables): any[] {\n if (!facets || facets.length === 0) {\n return [];\n }\n\n const hasCategoryPathFilter = searchVariables?.filter?.some(\n (filter) => filter.attribute === 'categoryPath'\n );\n\n // if hasCategoryPathFilter, then we need to remove facets with attribute 'categories'\n if (hasCategoryPathFilter) {\n return facets.filter((facet) => facet.attribute !== 'categories');\n }\n\n return facets;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Facet, ProductView } from '../../graphql/fragments.graphql';\n\nconst PRODUCT_SEARCH_QUERY = /* GraphQL */ `\n query productSearch(\n $phrase: String!\n $pageSize: Int\n $currentPage: Int = 1\n $filter: [SearchClauseInput!]\n $sort: [ProductSearchSortInput!]\n $context: QueryContextInput\n ) {\n attributeMetadata {\n sortable {\n label\n attribute\n numeric\n }\n filterableInSearch {\n label\n attribute\n numeric\n }\n }\n\n productSearch(\n phrase: $phrase\n page_size: $pageSize\n current_page: $currentPage\n filter: $filter\n sort: $sort\n context: $context\n ) {\n total_count\n items {\n ...ProductView\n }\n facets {\n ...Facet\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n }\n }\n ${ProductView}\n ${Facet}\n`;\n\nexport { PRODUCT_SEARCH_QUERY };\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport {\n ProductSearchResult,\n Scope,\n SearchVariables,\n SortOrder,\n SearchFilter,\n SEARCH_PATHNAME,\n} from '@/plp/data/models';\nimport { fetchGraphQl } from '@/plp/api';\nimport { transformProductSearchResponse } from '@/plp/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { PRODUCT_SEARCH_QUERY } from './graphql/search.graphql';\nimport { \n searchRequestSent, \n searchResponseReceived, \n updateSearchInputCtx,\n updateSearchResultsCtx,\n SEARCH_UNIT_ID, \n PLP_UNIT_ID,\n} from '@/plp/utils/acdlEvents';\n\ntype SearchOptions = {\n scope?: Scope;\n searchPathname?: string,\n}\n\n// Returns the last path segment as category name, or null if pathname ends with the search path\nconst getCategoryFromPath = (\n scope: string | undefined,\n searchPath: string,\n): string | null | undefined => {\n const pathname = window.location.pathname.replace(/^\\/|\\/$/g, '');\n return !scope && pathname && !(pathname.split('/').pop() === searchPath)\n ? pathname.split('/').pop()\n : null;\n};\n\nexport const search = async (\n request: SearchVariables | null,\n options: SearchOptions = {},\n): Promise<ProductSearchResult> => {\n const scope = options.scope === 'search' ? undefined : options.scope;\n const searchPath = options.searchPathname ?? SEARCH_PATHNAME;\n // empty result\n const emptyResult = {\n request: request || {} ,\n result: {\n facets: [],\n pageInfo: { currentPage: 0, totalPages: 0, totalItems: 0, pageSize: 0 },\n items: [],\n totalCount: 0,\n suggestions: [],\n metadata: {\n filterableAttributes: [],\n sortableAttributes: []\n }\n }\n };\n\n // clear search results if no request are provided\n if (request === null) {\n events.emit('search/result', emptyResult, { scope });\n return emptyResult.result;\n }\n\n\n // Emit loading state\n events.emit('search/loading', true, { scope });\n\n try {\n const acdlUnitId = scope === 'popover' ? SEARCH_UNIT_ID : PLP_UNIT_ID;\n const searchRequestId = window.crypto.randomUUID();\n const params = new URLSearchParams(window.location.search);\n \n const currentPage = Number(params.get('page')) || 1;\n const qParam = params.get('q');\n // if we are passed a phrase, use it, otherwise use the q param\n const phrase = request?.phrase || (qParam !== null && qParam.trim().length > 0 && qParam) || '';\n \n const sortParam = scope !== 'undefined' ? null : params.get('sort');\n const sort: SortOrder[] = sortParam && sortParam.trim().length > 0\n ? sortParam.split(',').map(token => {\n token = token.trim();\n if (!token) return null;\n\n let attribute = '';\n let direction: 'ASC' | 'DESC' = 'ASC';\n\n if (token.includes(':')) {\n [attribute, direction] = token.split(':') as [string, 'ASC' | 'DESC'];\n } \n else if (token.includes('_')) {\n const lastUnderscore = token.lastIndexOf('_');\n attribute = token.slice(0, lastUnderscore); \n direction = token.slice(lastUnderscore + 1).toUpperCase() === 'DESC' ? 'DESC' : 'ASC';\n } \n else {\n attribute = token;\n }\n \n if (attribute === 'position') {\n return null;\n }\n \n return { attribute, direction };\n }).filter(Boolean) as SortOrder[]\n : [];\n \n // if we are passed a scope, don't use the filter param\n const filterParam = scope !== 'undefined' ? null : params.get('filter');\n const filter: SearchFilter[] | undefined =\n filterParam && filterParam.trim()\n ? (() => {\n \n const decoded = decodeURIComponent(\n filterParam.replace(/\\+/g, '%20')\n );\n \n return decoded.split(/\\||;/).reduce<SearchFilter[]>((acc, part) => {\n const trimmed = part.trim();\n if (!trimmed.includes(':')) return acc;\n const [attribute, ...rest] = trimmed.split(':');\n const rawValue = rest.join(':').trim();\n if (!attribute || !rawValue) return acc;\n if (attribute === 'price' && rawValue.includes('-')) {\n const [fromRaw, toRaw] = rawValue.split('-');\n \n const from = Number(fromRaw);\n const to = Number(toRaw);\n \n if (!Number.isNaN(from) && !Number.isNaN(to)) {\n acc.push({\n attribute: 'price',\n range: {\n from,\n to,\n },\n });\n }\n \n return acc;\n }\n \n if (attribute === 'visibility') {\n const firstCommaIndex = rawValue.indexOf(',');\n acc.push({\n attribute,\n in:\n firstCommaIndex === -1\n ? [rawValue.trim()]\n : [\n `Catalog, Search`\n ],\n });\n return acc;\n }\n \n acc.push({\n attribute,\n in: rawValue\n .split(/[|,]/)\n .map(v => v.trim())\n .filter(Boolean),\n });\n \n return acc;\n }, []);\n })()\n : request?.filter;\n\n const finalFilters: SearchFilter[] = filter ? [...filter] : [];\n\n // if we are passed a scope or on the search page, don't add the categoryPath filter\n const categoryFromPath = getCategoryFromPath(scope, searchPath);\n\n // categoryFromPath overrides any other categoryPath filters\n if (categoryFromPath) {\n let existingCategoryPathFilter = finalFilters.find(f => f.attribute === 'categoryPath');\n const newCategoryPathFilter = {\n attribute: 'categoryPath',\n in: [categoryFromPath],\n };\n\n if (existingCategoryPathFilter) {\n existingCategoryPathFilter = newCategoryPathFilter;\n } else {\n finalFilters.unshift(newCategoryPathFilter);\n }\n }\n\n const phraseSearch = phrase || request.phrase;\n const sortSearch = sort?.length ? sort : request.sort;\n const filterSearch = filterParam !== null || categoryFromPath ? finalFilters : request.filter;\n\n request = {\n ...request,\n phrase: phraseSearch,\n sort: sortSearch,\n filter: filterSearch,\n currentPage,\n };\n\n updateSearchInputCtx(\n acdlUnitId,\n searchRequestId,\n request.phrase || '',\n request.filter || [],\n request.pageSize || 0,\n request.currentPage || 0,\n request.sort || [],\n );\n\n // Publish search request event to ACDL\n searchRequestSent(acdlUnitId);\n\n // Execute search with validated request\n const { errors, data } = await fetchGraphQl(PRODUCT_SEARCH_QUERY, {\n method: 'GET',\n variables: { ...request },\n });\n\n if (errors && !data) {\n throw new Error('Error fetching product search');\n }\n\n const result = transformProductSearchResponse(data, request);\n\n // Update search results context in ACDL\n updateSearchResultsCtx(acdlUnitId, searchRequestId, result);\n\n // Publish search response event to ACDL\n searchResponseReceived(acdlUnitId);\n\n // Emit single event with result and metadata\n events.emit('search/result', { request, result }, { scope });\n\n return result;\n\n } catch (error) {\n // Emit error event\n events.emit('search/error', (error as Error).message, { scope });\n\n // Emit result event with empty result\n events.emit('search/result', emptyResult, { scope });\n\n throw error;\n } finally {\n // Reset loading state\n events.emit('search/loading', false, { scope });\n }\n};"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","SEARCH_PATHNAME","getCurrency","currency","transformProduct","data","transformedProduct","_a","image","_d","_c","_b","_g","_f","_e","_j","_i","_h","_m","_l","_k","_n","_r","_q","_p","_o","_v","_u","_t","_s","_z","_y","_x","_w","_D","_C","_B","_A","_H","_G","_F","_E","_L","_K","_J","_I","_P","_O","_N","_M","_T","_S","_R","_Q","merge","_W","_V","_U","config","transformProductSearchResponse","searchVariables","productSearch","transformedResponse","transformFacets","product","transformSortAttributes","sortableAttributes","option","filter","facets","facet","PRODUCT_SEARCH_QUERY","ProductView","Facet","getCategoryFromPath","scope","searchPath","pathname","search","request","options","emptyResult","events","acdlUnitId","SEARCH_UNIT_ID","PLP_UNIT_ID","searchRequestId","params","currentPage","qParam","phrase","sortParam","sort","token","attribute","direction","lastUnderscore","filterParam","acc","part","trimmed","rest","rawValue","fromRaw","toRaw","from","to","firstCommaIndex","v","finalFilters","categoryFromPath","existingCategoryPathFilter","newCategoryPathFilter","phraseSearch","sortSearch","filterSearch","updateSearchInputCtx","searchRequestSent","errors","result","updateSearchResultsCtx","searchResponseReceived","error"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Product } from './product';
2
2
 
3
3
  export type Scope = 'search' | 'popover' | string;
4
+ export declare const SEARCH_PATHNAME = "search";
4
5
  export interface SearchVariables {
5
6
  scope?: Scope;
6
7
  phrase?: string;
@@ -12,7 +12,6 @@ export interface Product {
12
12
  metaDescription: string;
13
13
  lowStock: boolean;
14
14
  links: any[];
15
- attributes: ProductViewAttribute[];
16
15
  images: ProductImage[];
17
16
  description: string;
18
17
  externalId: string;
@@ -38,12 +37,6 @@ export interface ProductPrice {
38
37
  currency: string;
39
38
  };
40
39
  }
41
- export interface ProductViewAttribute {
42
- label?: string;
43
- name: string;
44
- roles?: string[];
45
- value?: any;
46
- }
47
40
  export interface ProductImage {
48
41
  label: string;
49
42
  roles: string[];
package/fragments.js CHANGED
@@ -35,12 +35,6 @@ const e=`
35
35
  inStock
36
36
  url
37
37
  urlKey
38
- attributes(roles: []) {
39
- name
40
- label
41
- value
42
- roles
43
- }
44
38
  images {
45
39
  label
46
40
  url
package/fragments.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fragments.js","sources":["/@dropins/storefront-product-discovery/src/api/graphql/fragments.graphql.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst Facet = /* GraphQL */ `\n fragment Facet on Aggregation {\n title\n attribute\n buckets {\n title\n __typename\n ... on CategoryView {\n name\n count\n path\n }\n ... on ScalarBucket {\n count\n }\n ... on RangeBucket {\n from\n to\n count\n }\n ... on StatsBucket {\n min\n max\n }\n }\n }\n`;\n\nconst ProductView = /* GraphQL */ `\n fragment ProductView on ProductSearchItem {\n productView {\n __typename\n sku\n name\n inStock\n url\n urlKey\n attributes(roles: []) {\n name\n label\n value\n roles\n }\n images {\n label\n url\n roles\n }\n ... on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n options {\n id\n title\n values {\n title\n ... on ProductViewOptionValueSwatch {\n id\n inStock\n type\n value\n }\n }\n }\n }\n ... on SimpleProductView {\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n }\n highlights {\n attribute\n value\n matched_words\n }\n }\n`;\n\nexport { Facet, ProductView };\n"],"names":["Facet","ProductView"],"mappings":"AASA,MAAMA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BtBC,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
1
+ {"version":3,"file":"fragments.js","sources":["/@dropins/storefront-product-discovery/src/api/graphql/fragments.graphql.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nconst Facet = /* GraphQL */ `\n fragment Facet on Aggregation {\n title\n attribute\n buckets {\n title\n __typename\n ... on CategoryView {\n name\n count\n path\n }\n ... on ScalarBucket {\n count\n }\n ... on RangeBucket {\n from\n to\n count\n }\n ... on StatsBucket {\n min\n max\n }\n }\n }\n`;\n\nconst ProductView = /* GraphQL */ `\n fragment ProductView on ProductSearchItem {\n productView {\n __typename\n sku\n name\n inStock\n url\n urlKey\n images {\n label\n url\n roles\n }\n ... on ComplexProductView {\n priceRange {\n maximum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n minimum {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n options {\n id\n title\n values {\n title\n ... on ProductViewOptionValueSwatch {\n id\n inStock\n type\n value\n }\n }\n }\n }\n ... on SimpleProductView {\n price {\n final {\n amount {\n value\n currency\n }\n }\n regular {\n amount {\n value\n currency\n }\n }\n }\n }\n }\n highlights {\n attribute\n value\n matched_words\n }\n }\n`;\n\nexport { Facet, ProductView };\n"],"names":["Facet","ProductView"],"mappings":"AASA,MAAMA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BtBC,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-product-discovery", "version": "3.0.0-alpha21", "@dropins/tools": "^1.6.0", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-product-discovery", "version": "3.0.0-alpha23", "@dropins/tools": "^1.6.0", "license": "SEE LICENSE IN LICENSE.md"}