@iheartjane/dm-sdk 2.24.1-edge.fd78782 → 2.25.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.
@@ -0,0 +1 @@
1
+ var Q=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var Z=(u,i,c,t)=>{for(var o=t>1?void 0:t?U(i,c):i,a=u.length-1,p;a>=0;a--)(p=u[a])&&(o=(t?p(i,c,o):p(o))||o);return t&&o&&Q(i,c,o),o};var m=(t=>(t.All="all",t.Default="default",t.Off="off",t))(m||{}),d=(s=>(s.Bloom="bloom",s.Default="default",s.Embedded="embedded",s.FramelessEmbed="framelessEmbed",s.Headless="headless",s.Kiosk="kiosk",s.OperatorEmbed="operatorEmbed",s.WhiteLabel="whiteLabel",s))(d||{}),l=(t=>(t.Desktop="desktop",t.Kiosk="kiosk",t.Mobile="mobile",t))(l||{}),g=(i=>(i.UserOptOut="user-opt-out",i))(g||{});var _=(c=>(c.Featured="featured",c.Midgrid="midgrid",c))(_||{}),P=(r=>(r.BestSelling="best_selling",r.BrandSpecials="brand_specials",r.BuyAgainRow="buy_again_row",r.CartToppers="cart_toppers",r.CustomImageRow="custom_image_row",r.FeaturedRow="featured_row",r.MenuDynamicRow="menu_dynamic_row",r.MenuInline="menu_inline",r.MenuInlineTable="menu_inline_table",r.MenuTopRow="menu_top_row",r.PdpRow="pdp_row",r.Sale="sale",r.Specials="specials",r))(P||{}),R=(n=>(n.Edible="edible",n.Extract="extract",n.Flower="flower",n.Gear="gear",n.Grow="grow",n.Merch="merch",n.PreRoll="pre-roll",n.Tincture="tincture",n.Topical="topical",n.Vape="vape",n))(R||{}),b=(t=>(t.Rating="rating",t.Recent="recent",t.Upvote="upvote",t))(b||{}),x=(e=>(e.BestSellerRank="best-seller-rank",e.CategoryAndNameAsc="category-and-name-asc",e.Default="default",e.PriceAsc="price-asc",e.PriceDesc="price-desc",e.PriceEighthOunceAsc="price-eighth-ounce-asc",e.PriceEighthOunceDesc="price-eighth-ounce-desc",e.PriceGramAsc="price-gram-asc",e.PriceGramDesc="price-gram-desc",e.PriceHalfGramAsc="price-half-gram-asc",e.PriceHalfGramDesc="price-half-gram-desc",e.PriceHalfOunceAsc="price-half-ounce-asc",e.PriceHalfOunceDesc="price-half-ounce-desc",e.PriceOunceAsc="price-ounce-asc",e.PriceOunceDesc="price-ounce-desc",e.PriceQuarterOunceAsc="price-quarter-ounce-asc",e.PriceQuarterOunceDesc="price-quarter-ounce-desc",e.PriceTwoGramAsc="price-two-gram-asc",e.PriceTwoGramDesc="price-two-gram-desc",e.Rating="rating",e.Recommendation="recommendation",e.ThcPotencyAsc="thc-potency-asc",e.ThcPotencyDesc="thc-potency-desc",e))(x||{});var z=50;var f="best-seller-rank",w="category-and-name-asc",v="default",y="price-asc",h="price-desc",C="price-eighth-ounce-asc",I="price-eighth-ounce-desc",q="price-gram-asc",D="price-gram-desc",S="price-half-gram-asc",A="price-half-gram-desc",O="price-half-ounce-asc",M="price-half-ounce-desc",T="price-ounce-asc",F="price-ounce-desc",k="price-quarter-ounce-asc",B="price-quarter-ounce-desc",G="price-two-gram-asc",E="price-two-gram-desc",j="rating",H="recommendation",N="thc-potency-asc",V="thc-potency-desc",J=[f,w,v,y,h,C,I,q,D,S,A,O,M,T,F,k,B,G,E,j,H,N,V];var L={click:"/v2/event/2",externalCheckout:"/v2/event/3e",facets:"/v2/facets",fingerprint:"/fp/token",impression:"/v2/event/1",multi:"/v2/multi",page:"/v2/smartpage",product:"/v2/product",productReviews:"/v2/product/reviews",sessionEvent:"/v2/event/session",smart:"/v2/smart"};export{Z as a,L as b,m as c,d,l as e,g as f,_ as g,P as h,R as i,b as j,x as k,z as l,f as m,w as n,v as o,y as p,h as q,C as r,I as s,q as t,D as u,S as v,A as w,O as x,M as y,T as z,F as A,k as B,B as C,G as D,E,j as F,H as G,N as H,V as I,J};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var et=Object.create;var ae=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var tt=Object.getOwnPropertyNames;var rt=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var it=(r,e)=>{for(var t in e)ae(r,t,{get:e[t],enumerable:!0})},Oe=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of tt(e))!st.call(r,i)&&i!==t&&ae(r,i,{get:()=>e[i],enumerable:!(s=Ae(e,i))||s.enumerable});return r};var nt=(r,e,t)=>(t=r!=null?et(rt(r)):{},Oe(e||!r||!r.__esModule?ae(t,"default",{value:r,enumerable:!0}):t,r)),ot=r=>Oe(ae({},"__esModule",{value:!0}),r),S=(r,e,t,s)=>{for(var i=s>1?void 0:s?Ae(e,t):e,a=r.length-1,o;a>=0;a--)(o=r[a])&&(i=(s?o(e,t,i):o(i))||i);return s&&i&&ae(e,t,i),i};var Tt={};it(Tt,{AdMode:()=>O,AppMode:()=>ce,BrandSpecials:()=>me,DEFAULT_PAGE_SIZE:()=>pe,IntendedDisplay:()=>ge,JaneDM:()=>R,JaneDeviceIdSentinel:()=>de,PageContextEnum:()=>he,Placement:()=>I,ProductKindEnum:()=>fe,ReviewSortEnum:()=>Re,SearchSortEnum:()=>ue,SmartSort:()=>A,SmartSortProduct:()=>k,Specials:()=>le,VirtualBudtenderProduct:()=>Pe,bestSellerRank:()=>M,categoryAndNameAsc:()=>B,defaultOrder:()=>E,priceAsc:()=>j,priceDesc:()=>U,priceEighthOunceAsc:()=>V,priceEighthOunceDesc:()=>N,priceGramAsc:()=>G,priceGramDesc:()=>Q,priceHalfGramAsc:()=>z,priceHalfGramDesc:()=>J,priceHalfOunceAsc:()=>L,priceHalfOunceDesc:()=>H,priceOunceAsc:()=>K,priceOunceDesc:()=>$,priceQuarterOunceAsc:()=>W,priceQuarterOunceDesc:()=>Z,priceTwoGramAsc:()=>X,priceTwoGramDesc:()=>Y,rating:()=>ee,recommendation:()=>te,searchSorts:()=>Ie,thcPotencyAsc:()=>re,thcPotencyDesc:()=>se});module.exports=ot(Tt);var P={click:"/v2/event/2",externalCheckout:"/v2/event/3e",facets:"/v2/facets",fingerprint:"/fp/token",impression:"/v2/event/1",multi:"/v2/multi",page:"/v2/smartpage",product:"/v2/product",productReviews:"/v2/product/reviews",sessionEvent:"/v2/event/session",smart:"/v2/smart",virtualBudtenderQueries:"/v2/virtual-budtender/queries",virtualBudtenderSearch:"/v2/virtual-budtender"};var O=(s=>(s.All="all",s.Default="default",s.Off="off",s))(O||{}),ce=(c=>(c.Bloom="bloom",c.Default="default",c.Embedded="embedded",c.FramelessEmbed="framelessEmbed",c.Headless="headless",c.Kiosk="kiosk",c.OperatorEmbed="operatorEmbed",c.WhiteLabel="whiteLabel",c))(ce||{}),ge=(s=>(s.Desktop="desktop",s.Kiosk="kiosk",s.Mobile="mobile",s))(ge||{}),de=(e=>(e.UserOptOut="user-opt-out",e))(de||{});var he=(t=>(t.Featured="featured",t.Midgrid="midgrid",t))(he||{}),I=(u=>(u.BestSelling="best_selling",u.BrandSpecials="brand_specials",u.BuyAgainRow="buy_again_row",u.CartToppers="cart_toppers",u.CustomImageRow="custom_image_row",u.FeaturedRow="featured_row",u.MenuDynamicRow="menu_dynamic_row",u.MenuInline="menu_inline",u.MenuInlineTable="menu_inline_table",u.MenuTopRow="menu_top_row",u.PdpRow="pdp_row",u.Sale="sale",u.Specials="specials",u.VirtualBudtenderSearch="virtual_budtender_search",u))(I||{}),fe=(d=>(d.Edible="edible",d.Extract="extract",d.Flower="flower",d.Gear="gear",d.Grow="grow",d.Merch="merch",d.PreRoll="pre-roll",d.Tincture="tincture",d.Topical="topical",d.Vape="vape",d))(fe||{}),Re=(s=>(s.Rating="rating",s.Recent="recent",s.Upvote="upvote",s))(Re||{}),ue=(h=>(h.BestSellerRank="best-seller-rank",h.CategoryAndNameAsc="category-and-name-asc",h.Default="default",h.PriceAsc="price-asc",h.PriceDesc="price-desc",h.PriceEighthOunceAsc="price-eighth-ounce-asc",h.PriceEighthOunceDesc="price-eighth-ounce-desc",h.PriceGramAsc="price-gram-asc",h.PriceGramDesc="price-gram-desc",h.PriceHalfGramAsc="price-half-gram-asc",h.PriceHalfGramDesc="price-half-gram-desc",h.PriceHalfOunceAsc="price-half-ounce-asc",h.PriceHalfOunceDesc="price-half-ounce-desc",h.PriceOunceAsc="price-ounce-asc",h.PriceOunceDesc="price-ounce-desc",h.PriceQuarterOunceAsc="price-quarter-ounce-asc",h.PriceQuarterOunceDesc="price-quarter-ounce-desc",h.PriceTwoGramAsc="price-two-gram-asc",h.PriceTwoGramDesc="price-two-gram-desc",h.Rating="rating",h.Recommendation="recommendation",h.ThcPotencyAsc="thc-potency-asc",h.ThcPotencyDesc="thc-potency-desc",h))(ue||{});var pe=50;var M="best-seller-rank",B="category-and-name-asc",E="default",j="price-asc",U="price-desc",V="price-eighth-ounce-asc",N="price-eighth-ounce-desc",G="price-gram-asc",Q="price-gram-desc",z="price-half-gram-asc",J="price-half-gram-desc",L="price-half-ounce-asc",H="price-half-ounce-desc",K="price-ounce-asc",$="price-ounce-desc",W="price-quarter-ounce-asc",Z="price-quarter-ounce-desc",X="price-two-gram-asc",Y="price-two-gram-desc",ee="rating",te="recommendation",re="thc-potency-asc",se="thc-potency-desc",Ie=[M,B,E,j,U,V,N,G,Q,z,J,L,H,K,$,W,Z,X,Y,ee,te,re,se];var Be="2.24.1-edge.fd78782";var ve=(r,e)=>{let{apiKey:t,source:s}=e,i=new URL(r);return i.searchParams.set("jdm_source",s),i.searchParams.set("jdm_version",Be),t&&i.searchParams.set("jdm_api_key",t),i.searchParams.sort(),i.toString()},f=(r,e,t)=>{let s=new URL(r+e);return ve(s.toString(),t)},v=(r,e)=>{let t=new URL(r+P.click),s=new URL(r+P.impression);return{clickEndpoint:ve(t.toString(),e),impressionEndpoint:ve(s.toString(),e)}},xe=class extends Error{response;constructor(e,t){super(e),this.response=t}},Ee=async r=>{if(r.ok){if(r.status===204)return null}else throw new xe("Api Request Failed",r);try{return await r.json()}catch{}},at=async(r,e)=>{let t=await fetch(r,{body:JSON.stringify(e),headers:{Accept:"application/json","Content-Type":"text/plain"},method:"POST"});return Ee(t)},ct=async(r,e={})=>{let{headers:t,...s}=e,i=await fetch(r,{...s,headers:{Accept:"application/json",...t},method:"GET"});return Ee(i)},g={get:ct,post:at};var ke=require("nanoid");var x=()=>typeof window<"u"&&typeof document<"u";var dt=(...r)=>{console.error("[JaneDmSDK]",...r)},ut=(...r)=>{console.info("[JaneDmSDK]",...r)},pt=(...r)=>{console.log("[JaneDmSDK]",...r)},C={error:dt,info:ut,log:pt};var mt=r=>{let e=localStorage.getItem(r);return e!==null?gt(e):e},lt=(r,e)=>localStorage.setItem(r,ht(e)),Pt=r=>localStorage.removeItem(r),q={get:mt,remove:Pt,set:lt},gt=r=>je(r)?r.substring(1,r.length-1):r,ht=r=>je(r)?r:`"${r}"`,je=r=>{let t=r.length-1;return r[0]==='"'&&r[t]==='"'};var De="j_fp_last_run",ft=1440*60*1e3,Rt=20,Ce=new Set,St=(r,e)=>`${r}:${e.apiKey}:${e.source}`;var _t=r=>typeof r=="object"&&r!==null&&typeof r.token=="string"&&typeof r.endpoint=="string"&&typeof r.scriptUrlPattern=="string",yt=async(r,e)=>{try{let t=f(r,P.fingerprint,e),s=await g.get(t);return _t(s)?s:null}catch(t){return C.error("Failed to fetch fingerprint token:",t),null}},bt=async(r,e,t,s)=>{try{let i=await import("@fingerprintjs/fingerprintjs-pro"),o=await i.load({apiKey:r,endpoint:[e,i.defaultEndpoint],region:"us",scriptUrlPattern:[t,i.defaultScriptUrlPattern],storageKey:"eyeD"}),n={tag:{isDmSdk:!0}};s?.linkedId&&(n.linkedId=s.linkedId);let c=await o.get(n);return!c||!c.visitorId?(C.error("Fingerprint JS did not return a valid visitorId"),null):{visitorId:c.visitorId}}catch(i){return C.error("Failed to run Fingerprint JS:",i),null}},Ue=async(r,e,t)=>{if(!x())return(0,ke.nanoid)();let s=q.get("jdid");if(!s)return await Ge(r,e,t)??(0,ke.nanoid)();if(s.length!==Rt)return await Fe(r,e,{linkedId:s}),s;let i=await Ne(r,e,t);if(i)return i;if(Ve()==="error")try{q.set(De,Date.now().toString())}catch{}return s},Ve=()=>{try{let r=q.get(De);if(!r)return"missing";let e=parseInt(r,10);return Number.isNaN(e)?"missing":Date.now()-e>=ft?"expired":"valid"}catch{return"error"}},Ne=async(r,e,t)=>{let s=Ve();return s==="valid"||s==="error"?null:Ge(r,e,t)},Ge=async(r,e,t)=>{let s=St(r,e);if(Ce.has(s))return null;Ce.add(s);try{let i=await yt(r,e);if(!i)return null;let a=await bt(i.token,i.endpoint,i.scriptUrlPattern,t);if(!a)return null;try{q.set(De,Date.now().toString())}catch{}return a.visitorId}catch(i){return C.error("Failed to run fingerprint:",i),null}finally{Ce.delete(s)}},Fe=async(r,e,t)=>{if(x()&&t?.linkedId!=="user-opt-out")try{await Ne(r,e,t)}catch(s){C.error("Failed to run SSR fingerprint:",s)}};var w=class r extends Error{constructor(e){super(`[Jane DM SDK]: ${e}`),this.name="SdkError",Object.setPrototypeOf(this,r.prototype)}};var Te=r=>{switch(r){case M:return"best-seller-rank";case B:return"category-and-name-asc";case j:return"price-asc";case U:return"price-desc";case V:return"price-eighth-ounce-asc";case N:return"price-eighth-ounce-desc";case G:return"price-gram-asc";case Q:return"price-gram-desc";case z:return"price-half-gram-asc";case J:return"price-half-gram-desc";case L:return"price-half-ounce-asc";case H:return"price-half-ounce-desc";case K:return"price-ounce-asc";case $:return"price-ounce-desc";case W:return"price-quarter-ounce-asc";case Z:return"price-quarter-ounce-desc";case X:return"price-two-gram-asc";case Y:return"price-two-gram-desc";case ee:return"rating";case te:return"recommendation";case re:return"thc-potency-asc";case se:return"thc-potency-desc";case E:default:return"default"}};var ie=r=>JSON.parse(r);var qe=class r{isSponsored;objectId;clickPayload;clickUrl;impressPayload;impressUrl;constructor(e){this.objectId=e.objectId,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored}static fromJSON(e){return new r(ie(e))}serialize(){return{clickPayload:this.clickPayload,clickUrl:this.clickUrl,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},k=class r{attributes;isSponsored;objectId;clickPayload;clickUrl;hasBeenImpressed;impressPayload;impressPromise;impressUrl;constructor(e){this.objectId=e.objectId,this.attributes=e.attributes,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored,this.hasBeenImpressed=e.hasBeenImpressed??!1}static fromJSON(e){return new r(ie(e))}click(e={isAddToCart:!1}){let{isAddToCart:t=!1}=e,s={...this.clickPayload,isAddToCart:t};return g.post(this.clickUrl,s)}impress(){return this.hasBeenImpressed?Promise.resolve():(this.impressPromise??=g.post(this.impressUrl,this.impressPayload).then(()=>{this.hasBeenImpressed=!0}).finally(()=>{this.impressPromise=void 0}),this.impressPromise)}serialize(){return{attributes:this.attributes,clickPayload:this.clickPayload,clickUrl:this.clickUrl,hasBeenImpressed:this.hasBeenImpressed,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},A=class r{customImages;placement;products;rowId;searchFacets;title;totalProducts;creativeIds;cachedProducts;config;loadPromise;nextPageProps;nextPageUrl;constructor(e){this.rowId=e.rowId,this.searchFacets=e.searchFacets,this.nextPageUrl=e.nextPageUrl,this.nextPageProps=e.nextPageProps,this.products=e.products.map(t=>new k(t)),this.cachedProducts=e.cachedProducts.map(t=>new qe(t)),this.totalProducts=e.totalProducts,this.title=e.title,this.creativeIds=e.creativeIds,this.config=e.config,this.customImages=e.customImages??[],this.placement=e.placement,x()&&!this.config.skipAutoSmartSortOnLoad&&this.onLoad().catch(t=>C.error("Failed to run onLoad:",t))}static fromJSON(e){return new r(ie(e))}hasNextPage(){return this.cachedProducts.length>0}async nextPage(){if(!this.hasNextPage())return;let e=this.cachedProducts.slice(0,this.nextPageProps.pageSize),t={app_mode:this.config.appMode,jane_device_id:this.config.identifier.jdid,object_ids:e.map(a=>a.objectId),search_attributes:this.nextPageProps.searchAttributes},s=await g.post(this.nextPageUrl,t),i=new Map(s.products?.map(a=>[a.object_id,a.search_attributes]));e.forEach(a=>{let o=i.get(a.objectId);o!==void 0&&this.products.push(new k({...a.serialize(),attributes:o}))}),this.cachedProducts=this.cachedProducts.slice(this.nextPageProps.pageSize)}async onLoad(){return this.loadPromise?this.loadPromise:(this.loadPromise=(async()=>{if(!x())return;let e={apiKey:this.config.apiKey,source:this.config.source};await Fe(this.config.eventsEndpoint,e,{linkedId:this.config.identifier.jdid})})(),this.loadPromise)}serialize(){return{cachedProducts:this.cachedProducts.map(e=>e.serialize()),config:this.config,creativeIds:this.creativeIds,customImages:this.customImages,nextPageProps:this.nextPageProps,nextPageUrl:this.nextPageUrl,placement:this.placement,products:this.products.map(e=>e.serialize()),rowId:this.rowId,searchFacets:this.searchFacets,title:this.title,totalProducts:this.totalProducts}}toJSON(){return JSON.stringify(this.serialize())}},ne=class{async createSmartSort(e){let t={apiKey:e.config.apiKey,source:e.config.source},s=f(e.config.endpoint,P.smart,t),i=f(e.config.pageEndpoint,P.page,t),a=this.buildSmartRequest(e),o=await g.post(s,a),{clickEndpoint:n,impressionEndpoint:c}=v(e.config.eventsEndpoint,t),{creative_ids:m,custom_images:d,products:l,row_id:p,search_facets:b,title:u}=o,{cachedProducts:D,products:F}=this.generateProducts({clickUrl:n,identifier:e.config.identifier,impressUrl:c,products:l}),T=(d??[]).map(oe=>this.massageCustomImageData(oe)).filter(oe=>oe!==void 0);return new A({cachedProducts:D,config:e.config,creativeIds:m,customImages:T,nextPageProps:{pageSize:"page_size"in a?a.page_size??60:60,searchAttributes:a.search_attributes??e.searchAttributes},nextPageUrl:i,placement:e.placement,products:F,rowId:p,searchFacets:b,title:u,totalProducts:o.nb_hits??0})}generateProducts(e){let{clickUrl:t,identifier:s,impressUrl:i,products:a}=e,o={cachedProducts:[],products:[]};return a?.forEach(n=>{let c={clickPayload:{adToken:n.ad_token,distinctId:s.mixpanelDistinctId??s.jdid,isAddToCart:!1,janeDeviceId:s.jdid,kevelToken:n.kevel_token,myHighD:n.my_high_d,productId:n.product_id,storeId:n.store_id},clickUrl:t,impressPayload:{distinctId:s.mixpanelDistinctId??s.jdid,engagements:[{adToken:n.ad_token,kevelToken:n.kevel_token,myHighD:n.my_high_d,productId:n.product_id}],janeDeviceId:s.jdid},impressUrl:i,isSponsored:!!n.flight_id,objectId:n.object_id};n.search_attributes!==void 0?o.products.push({...c,attributes:n.search_attributes}):o.cachedProducts.push(c)}),o}massageCustomImageData(e){if(e)return{headline:e.headline,imageUrl:e.image_url,intendedDisplay:e.intended_display,logoUrl:e.logo_url,overlayColor:e.overlay_color,positionX:e.position_x,positionY:e.position_y,scaleNumber:e.scale_number,textColor:e.text_color}}buildSmartRequest(e){let{config:t,searchAttributes:s,...i}=e,a={app_mode:t.appMode,distinct_id:t.identifier.mixpanelDistinctId,jane_device_id:t.identifier.jdid,pos_user_id:t.identifier.posUserId,search_attributes:s,user_id:t.identifier.userId};switch(i.placement){case"cart_toppers":{let{cartProductIds:o,posCartProductIds:n,storeId:c}=i;return{...a,cart_pos_product_ids:n,cart_product_ids:o,placement:"cart_toppers",store_id:c}}case"custom_image_row":{let{searchFilter:o,storeId:n}=i;return{...a,placement:"custom_image_row",search_filter:o,store_id:n}}case"menu_dynamic_row":{let{adMode:o,filterContext:n,pageContext:c,storeId:m}=i;return{...a,ad_mode:o??"default",filter_context:n,page_context:c,placement:"menu_dynamic_row",store_id:m}}case"menu_inline":{let{adMode:o,distinctByProduct:n,metadata:c,numColumns:m,searchFilter:d,searchQuery:l,searchSort:p,storeId:b,storeIds:u}=i;return{...a,ad_mode:o??"default",distinct_by_product:n,metadata:c,num_columns:m,placement:"menu_inline",search_filter:d,search_query:l,search_sort:Te(p),store_ids:u||[b]}}case"menu_inline_table":{let{disableAds:o,distinctByProduct:n,maxProducts:c,metadata:m,numColumns:d,pageSize:l,searchFacets:p,searchFilter:b,searchQuery:u,searchSort:D,storeId:F,storeIds:T}=i;return{...a,disable_ads:o,distinct_by_product:n,max_products:c,metadata:m,num_columns:d,page_size:l,placement:"menu_inline_table",search_attributes:s,search_facets:p,search_filter:b,search_query:u,search_sort:Te(D),store_ids:T||[F]}}case"menu_top_row":{let{searchFilter:o,storeId:n}=i,c=this.extractValidCreativeIds(e);return{...a,exclude_creative_ids:c,placement:"menu_top_row",search_filter:o,store_id:n}}case"pdp_row":{let{posProductId:o,productId:n,storeId:c}=i;return{...a,placement:"pdp_row",pos_product_id:o,product_id:n,store_id:c}}default:throw new w(`Invalid Smart Sort Placement: ${i.placement}`)}}extractValidCreativeIds(e){if(e.placement==="menu_top_row"&&"excludeCreativeIds"in e&&Array.isArray(e.excludeCreativeIds))return e.excludeCreativeIds.filter(t=>typeof t=="number")}};var wt=r=>r.placement==="specials",It=r=>r.placement==="brand_specials",me=class{placement;title;constructor(e){this.title=e,this.placement="brand_specials"}},le=class{placement;title;constructor(e){this.title=e,this.placement="specials"}},Se=class extends ne{async createMultiPlacement(e){let t={apiKey:e.config.apiKey,source:e.config.source},s=f(e.config.endpoint,P.multi,t),i=f(e.config.pageEndpoint,P.page,t),a=this.buildMultiRequest(e),o=await g.post(s,a),{clickEndpoint:n,impressionEndpoint:c}=v(e.config.eventsEndpoint,t),m=[];for(let[d,l]of(o.placements||[]).entries())if(wt(l))m.push(new le(l.title));else if(It(l))m.push(new me(l.title));else{let{creative_ids:p,custom_images:b,placement:u,products:D,row_id:F,search_facets:T,title:oe}=l,{cachedProducts:Ze,products:Xe}=this.generateProducts({clickUrl:n,identifier:e.config.identifier,impressUrl:c,products:D}),Ye=(b??[]).map(we=>this.massageCustomImageData(we)).filter(we=>we!==void 0);m.push(new A({cachedProducts:Ze,config:{...e.config,skipAutoSmartSortOnLoad:d===0?e.config.skipAutoSmartSortOnLoad:!0},creativeIds:p,customImages:Ye,nextPageProps:{pageSize:60,searchAttributes:a.search_attributes||[]},nextPageUrl:i,placement:u,products:Xe,rowId:F,searchFacets:T,title:oe,totalProducts:l.nb_hits??0}))}return m}buildMultiRequest(e){let{config:t,numColumns:s,searchAttributes:i,storeId:a,...o}=e,n={app_mode:t.appMode,distinct_id:t.identifier.mixpanelDistinctId,jane_device_id:t.identifier.jdid,num_columns:s,pos_user_id:t.identifier.posUserId,search_attributes:i,store_id:a,user_id:t.identifier.userId};switch(o.multiRequestType){case"custom":return{...n,placements:this.massageCustomPlacements(o.placements),type:"custom"};case"featured":return{...n,exclude_menu_top_row:o.excludeMenuTopRow??!1,type:"featured"};default:throw new w(`Invalid Multi Type: ${o.multiRequestType}`)}}massageCustomPlacements(e){let t=[];for(let s of e)switch(s.placement){case"best_selling":t.push({placement:"best_selling",title:s.title});break;case"brand_specials":t.push({placement:"brand_specials",title:s.title});break;case"buy_again_row":t.push({placement:"buy_again_row",title:s.title});break;case"custom_image_row":t.push({placement:"custom_image_row",search_filter:s.searchFilter});break;case"featured_row":t.push({placement:"featured_row",row_id:s.rowId});break;case"menu_dynamic_row":t.push({ad_mode:s.adMode??"default",filter_context:s.filterContext,page_context:s.pageContext,placement:"menu_dynamic_row"});break;case"menu_inline":t.push({ad_mode:s.adMode??"default",metadata:s.metadata,placement:"menu_inline",search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_inline_table":t.push({disable_ads:s.disableAds,max_products:s.maxProducts,metadata:s.metadata,page_size:s.pageSize,placement:"menu_inline_table",search_facets:s.searchFacets,search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_top_row":t.push({placement:"menu_top_row",search_filter:s.searchFilter});break;case"sale":t.push({placement:"sale",title:s.title});break;case"specials":t.push({placement:"specials",title:s.title});break;default:throw new w(`Invalid Custom Placement: ${s.placement}`)}return t}};var We=require("nanoid");var Qe=async r=>{let{apiKey:e,appMode:t,endpoint:s,identifier:i,searchFacets:a,searchFilter:o,searchQuery:n,source:c,storeId:m}=r,{jdid:d}=i||{},l=f(s,P.facets,{apiKey:e,source:c}),p={appMode:t,janeDeviceId:d,searchFacets:a,searchFilter:o,searchQuery:n,storeId:m};return(await g.post(l,p)).searchFacets??{}};var ze=async r=>{let{apiKey:e,endpoint:t,identifier:s,source:i,storeId:a,...o}=r,n=f(t,P.externalCheckout,{apiKey:e,source:i}),c={janeDeviceId:s.jdid,posOrderId:o.posOrderId,posUserId:o.posUserId||s.posUserId,products:o.products,storeId:a};return await g.post(n,c)};var _e=class{async create(e){let{config:t,searchAttributes:s,storeId:i,...a}=e,o={apiKey:t.apiKey,source:t.source},n=f(t.endpoint,P.product,o),{clickEndpoint:c,impressionEndpoint:m}=v(t.eventsEndpoint,o),d={app_mode:t.appMode,distinct_id:t.identifier.mixpanelDistinctId,jane_device_id:t.identifier.jdid,pos_user_id:t.identifier.posUserId,search_attributes:s,store_id:i,user_id:t.identifier.userId},l=a.productId!==void 0?{...d,product_id:a.productId}:{...d,pos_product_id:a.posProductId},p=await g.post(n,l);return new k({attributes:p.search_attributes,clickPayload:{adToken:p.ad_token,distinctId:t.identifier.mixpanelDistinctId,isAddToCart:!1,janeDeviceId:t.identifier.jdid,kevelToken:p.kevel_token,myHighD:p.my_high_d,productId:p.product_id,storeId:i},clickUrl:c,impressPayload:{distinctId:t.identifier.mixpanelDistinctId??t.identifier.jdid,engagements:[{adToken:p.ad_token,kevelToken:p.kevel_token,myHighD:p.my_high_d,productId:p.product_id}],janeDeviceId:t.identifier.jdid},impressUrl:m,isSponsored:!!p.flight_id,objectId:p.object_id})}};var vt=r=>({activities:r.activities,avatar:r.avatar,comment:r.comment,createdAt:r.created_at,feelings:r.feelings,hasComment:r.has_comment,id:r.id,nickname:r.nickname,productId:r.product_id,rating:r.rating,storeId:r.store_id,storeName:r.store_name,updatedAt:r.updated_at,upvoteCount:r.upvote_count}),xt=r=>({activitiesDistribution:r.activities_distribution,averageRating:r.average_rating,distribution:r.distribution,feelingsDistribution:r.feelings_distribution,reviewCount:r.review_count}),Ct=(r,e,t)=>{let s=r.total_count,i=Math.max(1,Math.ceil(s/t));return{aggregate:xt(r.aggregate),aiSummary:r.ai_summary,items:r.reviews.map(vt),pagination:{currentPage:e,hasNextPage:e<i,hasPreviousPage:e>1,pageSize:t,totalCount:s,totalPages:i},productId:r.product_id}},Je=async r=>{let{activities:e,config:t,feelings:s,hasComment:i,page:a,pageSize:o,productId:n,ratings:c,sort:m}=r,d=a??1,l=o??50,p=f(t.endpoint,P.productReviews,{apiKey:t.apiKey,source:t.source}),b={activities:e,feelings:s,has_comment:i||void 0,page:a,page_size:o,product_id:n,ratings:c,sort:m},u=await g.post(p,b);return Ct(u,d,l)},Le=r=>{let e={[Symbol.asyncIterator]:async function*(){let t=1;for(;;){let s=await r(t);if(yield s,!s.pagination.hasNextPage)return;t+=1}}};return{pages:e,[Symbol.asyncIterator]:async function*(){for await(let t of e)yield*t.items}}};var He=async r=>{let{apiKey:e,eventsEndpoint:t,identifier:s,source:i,...a}=r,o=f(t,P.sessionEvent,{apiKey:e,source:i}),n={distinctId:s.mixpanelDistinctId,events:a.events,janeDeviceId:s.jdid};return await g.post(o,n)};function _(r,e,t){let s=t.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return t.value=async function(...i){return await this.init(),s.apply(this,i)},t}function y(r,e,t){let s=t.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return t.value=async function(...i){if(!this.rateLimiter)throw new Error("throttle decorator can only be used on JaneDM class methods");return this.rateLimiter.schedule(async()=>s.apply(this,i))},t}var ye=class{burst;intervalMs;rate;tat=0;toleranceMs;constructor(e,t=1){if(e<=0)throw new w("rate must be > 0");if(t<1)throw new w("burst must be >= 1");this.rate=e,this.burst=Math.floor(t),this.intervalMs=1e3/this.rate,this.toleranceMs=(this.burst-1)*this.intervalMs}async schedule(e){let t=Date.now(),s=Math.max(0,this.tat-this.toleranceMs-t);this.tat=Math.max(this.tat,t)+this.intervalMs;let i=async()=>e();return s>0?new Promise((a,o)=>setTimeout(()=>i().then(a).catch(o),s)):i()}};var kt=/^https?:\/\//,Dt=/^(https?:\/\/)?(([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}|localhost)(:\d+)?(\/.*)?$/,be=(r,e)=>{let s=kt.test(r??e)?r??e:`https://${r}`,i=new URL(s);return Dt.test(i.toString())?i.protocol+"//"+i.host:e};var Ke=async r=>{let{apiKey:e,appMode:t,endpoint:s,identifier:i,source:a,storeId:o}=r,{jdid:n}=i;if(!n)throw new w("Jane Device ID (jdid) is required to fetch virtual budtender queries");let c=f(s,P.virtualBudtenderQueries,{apiKey:e,source:a}),m={appMode:t,janeDeviceId:n,storeId:o};return(await g.post(c,m)).queries??[]},$e=async r=>{let{apiKey:e,appMode:t,endpoint:s,eventsEndpoint:i,identifier:a,query:o,searchAttributes:n,source:c,storeId:m}=r,{jdid:d}=a;if(!d)throw new w("Jane Device ID (jdid) is required to perform virtual budtender search");let l={apiKey:e,source:c},p=f(s,P.virtualBudtenderSearch,l),b={app_mode:t,jane_device_id:d,placement:"virtual_budtender_search",query:o,search_attributes:n,store_id:m},u=await g.post(p,b),{clickEndpoint:D,impressionEndpoint:F}=v(i,l),T=Ft({clickUrl:D,identifier:a,impressUrl:F,products:u.products??[],storeId:m});return{htmlResponse:u.htmlResponse,markdownResponse:u.markdownResponse,products:T,query:u.query,totalResults:u.totalResults??0,unformattedResponse:u.unformattedResponse}},Pe=class r{attributes;isSponsored;objectId;reasoning;score;clickPayload;clickUrl;hasBeenImpressed;impressPayload;impressPromise;impressUrl;constructor(e){this.objectId=e.objectId,this.attributes=e.attributes,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored,this.hasBeenImpressed=e.hasBeenImpressed??!1,this.score=e.score,this.reasoning=e.reasoning}static fromJSON(e){return new r(ie(e))}click(e={isAddToCart:!1}){let{isAddToCart:t=!1}=e,s={...this.clickPayload,isAddToCart:t};return g.post(this.clickUrl,s)}impress(){return this.hasBeenImpressed?Promise.resolve():(this.impressPromise??=g.post(this.impressUrl,this.impressPayload).then(()=>{this.hasBeenImpressed=!0}).finally(()=>{this.impressPromise=void 0}),this.impressPromise)}serialize(){return{attributes:this.attributes,clickPayload:this.clickPayload,clickUrl:this.clickUrl,hasBeenImpressed:this.hasBeenImpressed,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId,reasoning:this.reasoning,score:this.score}}toJSON(){return JSON.stringify(this.serialize())}},Ft=r=>{let{clickUrl:e,identifier:t,impressUrl:s,products:i,storeId:a}=r,o=[];return i?.forEach(n=>{let c={attributes:n.search_attributes,clickPayload:{adToken:n.ad_token,distinctId:t.mixpanelDistinctId??t.jdid,isAddToCart:!1,janeDeviceId:t.jdid,kevelToken:n.kevel_token,myHighD:n.my_high_d,productId:n.product_id,storeId:a},clickUrl:e,impressPayload:{distinctId:t.mixpanelDistinctId??t.jdid,engagements:[{adToken:n.ad_token,kevelToken:n.kevel_token,myHighD:n.my_high_d,productId:n.product_id}],janeDeviceId:t.jdid},impressUrl:s,isSponsored:!!n.flight_id,objectId:n.object_id,reasoning:n.reasoning,score:n.score};o.push(new Pe(c))}),o};var R=class{config;rateLimiter;initialized=!1;multiClient;productClient;smartSortClient;userProvidedJdid=!1;constructor(e,t){let{apiKey:s,endpoint:i,identifier:a}=e,{appMode:o="headless",eventsEndpoint:n,pageEndpoint:c,skipAutoSmartSortOnLoad:m=!1,source:d="sdk"}=t??{},l=be(i,"https://dmerch.iheartjane.com"),p=be(n,l),b=be(c,l);this.userProvidedJdid=!!a?.jdid,this.config={apiKey:s,appMode:o,endpoint:l,eventsEndpoint:p,identifier:a??{jdid:""},pageEndpoint:b,skipAutoSmartSortOnLoad:m,source:d},this.smartSortClient=new ne,this.multiClient=new Se,this.productClient=new _e,this.rateLimiter=new ye(10,20)}static generateJaneDeviceId(){return(0,We.nanoid)()}async fetchCartTopperRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"cart_toppers"})}async fetchCustomImageRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"custom_image_row"})}async fetchCustomPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"custom",...e})}async fetchFacets(e){return Qe({...e,...this.config})}async fetchFeaturedPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"featured",...e})}async fetchMenuRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline"})}async fetchMenuTopRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_top_row"})}async fetchProduct(e){return this.productClient.create({config:this.config,...e})}async fetchProductReviews(e){return Je({config:this.config,...e})}async fetchRecommendedPDPRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"pdp_row"})}async fetchRecommendedRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_dynamic_row"})}async fetchRecommendedSort(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline_table"})}async fetchVirtualBudtenderQueries(e){return Ke({...e,...this.config})}async fetchVirtualBudtenderSearch(e){return $e({...e,...this.config})}getJaneDeviceId(){return this.config.identifier.jdid}async init(){this.initialized||(x()&&!this.userProvidedJdid&&await this.initializeClientSideJdid(),this.initialized=!0)}iterateProductReviews(e){return Le(t=>this.fetchProductReviews({...e,page:t}))}async sendPosCheckout(e){return ze({...e,...this.config})}async sendSessionEvent(e){return He({...e,...this.config})}async initializeClientSideJdid(){let e={apiKey:this.config.apiKey,source:this.config.source},t=await Ue(this.config.eventsEndpoint,e);q.set("jdid",t),this.config.identifier.jdid=t}};S([_,y],R.prototype,"fetchCartTopperRow",1),S([_,y],R.prototype,"fetchCustomImageRow",1),S([_,y],R.prototype,"fetchCustomPlacements",1),S([_,y],R.prototype,"fetchFacets",1),S([_,y],R.prototype,"fetchFeaturedPlacements",1),S([_,y],R.prototype,"fetchMenuRow",1),S([_,y],R.prototype,"fetchMenuTopRow",1),S([_,y],R.prototype,"fetchProduct",1),S([_,y],R.prototype,"fetchProductReviews",1),S([_,y],R.prototype,"fetchRecommendedPDPRow",1),S([_,y],R.prototype,"fetchRecommendedRow",1),S([_,y],R.prototype,"fetchRecommendedSort",1),S([_,y],R.prototype,"fetchVirtualBudtenderQueries",1),S([_,y],R.prototype,"fetchVirtualBudtenderSearch",1);0&&(module.exports={AdMode,AppMode,BrandSpecials,DEFAULT_PAGE_SIZE,IntendedDisplay,JaneDM,JaneDeviceIdSentinel,PageContextEnum,Placement,ProductKindEnum,ReviewSortEnum,SearchSortEnum,SmartSort,SmartSortProduct,Specials,VirtualBudtenderProduct,bestSellerRank,categoryAndNameAsc,defaultOrder,priceAsc,priceDesc,priceEighthOunceAsc,priceEighthOunceDesc,priceGramAsc,priceGramDesc,priceHalfGramAsc,priceHalfGramDesc,priceHalfOunceAsc,priceHalfOunceDesc,priceOunceAsc,priceOunceDesc,priceQuarterOunceAsc,priceQuarterOunceDesc,priceTwoGramAsc,priceTwoGramDesc,rating,recommendation,searchSorts,thcPotencyAsc,thcPotencyDesc});
1
+ "use strict";var Xe=Object.create;var ne=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var We=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,et=Object.prototype.hasOwnProperty;var tt=(t,e)=>{for(var r in e)ne(t,r,{get:e[r],enumerable:!0})},Me=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of We(e))!et.call(t,o)&&o!==r&&ne(t,o,{get:()=>e[o],enumerable:!(s=Ae(e,o))||s.enumerable});return t};var rt=(t,e,r)=>(r=t!=null?Xe(Ye(t)):{},Me(e||!t||!t.__esModule?ne(r,"default",{value:t,enumerable:!0}):r,t)),st=t=>Me(ne({},"__esModule",{value:!0}),t),_=(t,e,r,s)=>{for(var o=s>1?void 0:s?Ae(e,r):e,n=t.length-1,i;n>=0;n--)(i=t[n])&&(o=(s?i(e,r,o):i(o))||o);return s&&o&&ne(e,r,o),o};var Ct={};tt(Ct,{AdMode:()=>F,AppMode:()=>ae,BrandSpecials:()=>ue,DEFAULT_PAGE_SIZE:()=>de,IntendedDisplay:()=>le,JaneDM:()=>R,JaneDeviceIdSentinel:()=>ce,PageContextEnum:()=>Pe,Placement:()=>C,ProductKindEnum:()=>ge,ReviewSortEnum:()=>he,SearchSortEnum:()=>pe,SmartSort:()=>D,SmartSortProduct:()=>x,Specials:()=>me,bestSellerRank:()=>T,categoryAndNameAsc:()=>A,defaultOrder:()=>M,priceAsc:()=>O,priceDesc:()=>q,priceEighthOunceAsc:()=>E,priceEighthOunceDesc:()=>j,priceGramAsc:()=>U,priceGramDesc:()=>N,priceHalfGramAsc:()=>G,priceHalfGramDesc:()=>B,priceHalfOunceAsc:()=>z,priceHalfOunceDesc:()=>L,priceOunceAsc:()=>J,priceOunceDesc:()=>H,priceQuarterOunceAsc:()=>K,priceQuarterOunceDesc:()=>Q,priceTwoGramAsc:()=>V,priceTwoGramDesc:()=>$,rating:()=>Z,recommendation:()=>X,searchSorts:()=>we,thcPotencyAsc:()=>W,thcPotencyDesc:()=>Y});module.exports=st(Ct);var P={click:"/v2/event/2",externalCheckout:"/v2/event/3e",facets:"/v2/facets",fingerprint:"/fp/token",impression:"/v2/event/1",multi:"/v2/multi",page:"/v2/smartpage",product:"/v2/product",productReviews:"/v2/product/reviews",sessionEvent:"/v2/event/session",smart:"/v2/smart"};var F=(s=>(s.All="all",s.Default="default",s.Off="off",s))(F||{}),ae=(c=>(c.Bloom="bloom",c.Default="default",c.Embedded="embedded",c.FramelessEmbed="framelessEmbed",c.Headless="headless",c.Kiosk="kiosk",c.OperatorEmbed="operatorEmbed",c.WhiteLabel="whiteLabel",c))(ae||{}),le=(s=>(s.Desktop="desktop",s.Kiosk="kiosk",s.Mobile="mobile",s))(le||{}),ce=(e=>(e.UserOptOut="user-opt-out",e))(ce||{});var Pe=(r=>(r.Featured="featured",r.Midgrid="midgrid",r))(Pe||{}),C=(d=>(d.BestSelling="best_selling",d.BrandSpecials="brand_specials",d.BuyAgainRow="buy_again_row",d.CartToppers="cart_toppers",d.CustomImageRow="custom_image_row",d.FeaturedRow="featured_row",d.MenuDynamicRow="menu_dynamic_row",d.MenuInline="menu_inline",d.MenuInlineTable="menu_inline_table",d.MenuTopRow="menu_top_row",d.PdpRow="pdp_row",d.Sale="sale",d.Specials="specials",d))(C||{}),ge=(p=>(p.Edible="edible",p.Extract="extract",p.Flower="flower",p.Gear="gear",p.Grow="grow",p.Merch="merch",p.PreRoll="pre-roll",p.Tincture="tincture",p.Topical="topical",p.Vape="vape",p))(ge||{}),he=(s=>(s.Rating="rating",s.Recent="recent",s.Upvote="upvote",s))(he||{}),pe=(m=>(m.BestSellerRank="best-seller-rank",m.CategoryAndNameAsc="category-and-name-asc",m.Default="default",m.PriceAsc="price-asc",m.PriceDesc="price-desc",m.PriceEighthOunceAsc="price-eighth-ounce-asc",m.PriceEighthOunceDesc="price-eighth-ounce-desc",m.PriceGramAsc="price-gram-asc",m.PriceGramDesc="price-gram-desc",m.PriceHalfGramAsc="price-half-gram-asc",m.PriceHalfGramDesc="price-half-gram-desc",m.PriceHalfOunceAsc="price-half-ounce-asc",m.PriceHalfOunceDesc="price-half-ounce-desc",m.PriceOunceAsc="price-ounce-asc",m.PriceOunceDesc="price-ounce-desc",m.PriceQuarterOunceAsc="price-quarter-ounce-asc",m.PriceQuarterOunceDesc="price-quarter-ounce-desc",m.PriceTwoGramAsc="price-two-gram-asc",m.PriceTwoGramDesc="price-two-gram-desc",m.Rating="rating",m.Recommendation="recommendation",m.ThcPotencyAsc="thc-potency-asc",m.ThcPotencyDesc="thc-potency-desc",m))(pe||{});var de=50;var T="best-seller-rank",A="category-and-name-asc",M="default",O="price-asc",q="price-desc",E="price-eighth-ounce-asc",j="price-eighth-ounce-desc",U="price-gram-asc",N="price-gram-desc",G="price-half-gram-asc",B="price-half-gram-desc",z="price-half-ounce-asc",L="price-half-ounce-desc",J="price-ounce-asc",H="price-ounce-desc",K="price-quarter-ounce-asc",Q="price-quarter-ounce-desc",V="price-two-gram-asc",$="price-two-gram-desc",Z="rating",X="recommendation",W="thc-potency-asc",Y="thc-potency-desc",we=[T,A,M,O,q,E,j,U,N,G,B,z,L,J,H,K,Q,V,$,Z,X,W,Y];var qe="2.25.0";var Ie=(t,e)=>{let{apiKey:r,source:s}=e,o=new URL(t);return o.searchParams.set("jdm_source",s),o.searchParams.set("jdm_version",qe),r&&o.searchParams.set("jdm_api_key",r),o.searchParams.sort(),o.toString()},f=(t,e,r)=>{let s=new URL(t+e);return Ie(s.toString(),r)},ee=(t,e)=>{let r=new URL(t+P.click),s=new URL(t+P.impression);return{clickEndpoint:Ie(r.toString(),e),impressionEndpoint:Ie(s.toString(),e)}},ve=class extends Error{response;constructor(e,r){super(e),this.response=r}},Ee=async t=>{if(t.ok){if(t.status===204)return null}else throw new ve("Api Request Failed",t);try{return await t.json()}catch{}},ot=async(t,e)=>{let r=await fetch(t,{body:JSON.stringify(e),headers:{Accept:"application/json","Content-Type":"text/plain"},method:"POST"});return Ee(r)},it=async(t,e={})=>{let{headers:r,...s}=e,o=await fetch(t,{...s,headers:{Accept:"application/json",...r},method:"GET"});return Ee(o)},h={get:it,post:ot};var Ce=require("nanoid");var I=()=>typeof window<"u"&&typeof document<"u";var nt=(...t)=>{console.error("[JaneDmSDK]",...t)},at=(...t)=>{console.info("[JaneDmSDK]",...t)},ct=(...t)=>{console.log("[JaneDmSDK]",...t)},v={error:nt,info:at,log:ct};var pt=t=>{let e=localStorage.getItem(t);return e!==null?mt(e):e},dt=(t,e)=>localStorage.setItem(t,lt(e)),ut=t=>localStorage.removeItem(t),k={get:pt,remove:ut,set:dt},mt=t=>je(t)?t.substring(1,t.length-1):t,lt=t=>je(t)?t:`"${t}"`,je=t=>{let r=t.length-1;return t[0]==='"'&&t[r]==='"'};var ke="j_fp_last_run",Pt=1440*60*1e3,gt=20,xe=new Set,ht=(t,e)=>`${t}:${e.apiKey}:${e.source}`;var ft=t=>typeof t=="object"&&t!==null&&typeof t.token=="string"&&typeof t.endpoint=="string"&&typeof t.scriptUrlPattern=="string",Rt=async(t,e)=>{try{let r=f(t,P.fingerprint,e),s=await h.get(r);return ft(s)?s:null}catch(r){return v.error("Failed to fetch fingerprint token:",r),null}},_t=async(t,e,r,s)=>{try{let o=await import("@fingerprintjs/fingerprintjs-pro"),i=await o.load({apiKey:t,endpoint:[e,o.defaultEndpoint],region:"us",scriptUrlPattern:[r,o.defaultScriptUrlPattern],storageKey:"eyeD"}),a={tag:{isDmSdk:!0}};s?.linkedId&&(a.linkedId=s.linkedId);let c=await i.get(a);return!c||!c.visitorId?(v.error("Fingerprint JS did not return a valid visitorId"),null):{visitorId:c.visitorId}}catch(o){return v.error("Failed to run Fingerprint JS:",o),null}},Ue=async(t,e,r)=>{if(!I())return(0,Ce.nanoid)();let s=k.get("jdid");if(!s)return await Be(t,e,r)??(0,Ce.nanoid)();if(s.length!==gt)return await De(t,e,{linkedId:s}),s;let o=await Ge(t,e,r);if(o)return o;if(Ne()==="error")try{k.set(ke,Date.now().toString())}catch{}return s},Ne=()=>{try{let t=k.get(ke);if(!t)return"missing";let e=parseInt(t,10);return Number.isNaN(e)?"missing":Date.now()-e>=Pt?"expired":"valid"}catch{return"error"}},Ge=async(t,e,r)=>{let s=Ne();return s==="valid"||s==="error"?null:Be(t,e,r)},Be=async(t,e,r)=>{let s=ht(t,e);if(xe.has(s))return null;xe.add(s);try{let o=await Rt(t,e);if(!o)return null;let n=await _t(o.token,o.endpoint,o.scriptUrlPattern,r);if(!n)return null;try{k.set(ke,Date.now().toString())}catch{}return n.visitorId}catch(o){return v.error("Failed to run fingerprint:",o),null}finally{xe.delete(s)}},De=async(t,e,r)=>{if(I()&&r?.linkedId!=="user-opt-out")try{await Ge(t,e,r)}catch(s){v.error("Failed to run SSR fingerprint:",s)}};var b=class t extends Error{constructor(e){super(`[Jane DM SDK]: ${e}`),this.name="SdkError",Object.setPrototypeOf(this,t.prototype)}};var Fe=t=>{switch(t){case T:return"best-seller-rank";case A:return"category-and-name-asc";case O:return"price-asc";case q:return"price-desc";case E:return"price-eighth-ounce-asc";case j:return"price-eighth-ounce-desc";case U:return"price-gram-asc";case N:return"price-gram-desc";case G:return"price-half-gram-asc";case B:return"price-half-gram-desc";case z:return"price-half-ounce-asc";case L:return"price-half-ounce-desc";case J:return"price-ounce-asc";case H:return"price-ounce-desc";case K:return"price-quarter-ounce-asc";case Q:return"price-quarter-ounce-desc";case V:return"price-two-gram-asc";case $:return"price-two-gram-desc";case Z:return"rating";case X:return"recommendation";case W:return"thc-potency-asc";case Y:return"thc-potency-desc";case M:default:return"default"}};var fe=t=>JSON.parse(t);var Te=class t{isSponsored;objectId;clickPayload;clickUrl;impressPayload;impressUrl;constructor(e){this.objectId=e.objectId,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored}static fromJSON(e){return new t(fe(e))}serialize(){return{clickPayload:this.clickPayload,clickUrl:this.clickUrl,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},x=class t{attributes;isSponsored;objectId;clickPayload;clickUrl;hasBeenImpressed;impressPayload;impressPromise;impressUrl;constructor(e){this.objectId=e.objectId,this.attributes=e.attributes,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored,this.hasBeenImpressed=e.hasBeenImpressed??!1}static fromJSON(e){return new t(fe(e))}click(e={isAddToCart:!1}){let{isAddToCart:r=!1}=e,s={...this.clickPayload,isAddToCart:r};return h.post(this.clickUrl,s)}impress(){return this.hasBeenImpressed?Promise.resolve():(this.impressPromise??=h.post(this.impressUrl,this.impressPayload).then(()=>{this.hasBeenImpressed=!0}).finally(()=>{this.impressPromise=void 0}),this.impressPromise)}serialize(){return{attributes:this.attributes,clickPayload:this.clickPayload,clickUrl:this.clickUrl,hasBeenImpressed:this.hasBeenImpressed,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},D=class t{customImages;placement;products;rowId;searchFacets;title;totalProducts;creativeIds;cachedProducts;config;loadPromise;nextPageProps;nextPageUrl;constructor(e){this.rowId=e.rowId,this.searchFacets=e.searchFacets,this.nextPageUrl=e.nextPageUrl,this.nextPageProps=e.nextPageProps,this.products=e.products.map(r=>new x(r)),this.cachedProducts=e.cachedProducts.map(r=>new Te(r)),this.totalProducts=e.totalProducts,this.title=e.title,this.creativeIds=e.creativeIds,this.config=e.config,this.customImages=e.customImages??[],this.placement=e.placement,I()&&!this.config.skipAutoSmartSortOnLoad&&this.onLoad().catch(r=>v.error("Failed to run onLoad:",r))}static fromJSON(e){return new t(fe(e))}hasNextPage(){return this.cachedProducts.length>0}async nextPage(){if(!this.hasNextPage())return;let e=this.cachedProducts.slice(0,this.nextPageProps.pageSize),r={app_mode:this.config.appMode,jane_device_id:this.config.identifier.jdid,object_ids:e.map(n=>n.objectId),search_attributes:this.nextPageProps.searchAttributes},s=await h.post(this.nextPageUrl,r),o=new Map(s.products?.map(n=>[n.object_id,n.search_attributes]));e.forEach(n=>{let i=o.get(n.objectId);i!==void 0&&this.products.push(new x({...n.serialize(),attributes:i}))}),this.cachedProducts=this.cachedProducts.slice(this.nextPageProps.pageSize)}async onLoad(){return this.loadPromise?this.loadPromise:(this.loadPromise=(async()=>{if(!I())return;let e={apiKey:this.config.apiKey,source:this.config.source};await De(this.config.eventsEndpoint,e,{linkedId:this.config.identifier.jdid})})(),this.loadPromise)}serialize(){return{cachedProducts:this.cachedProducts.map(e=>e.serialize()),config:this.config,creativeIds:this.creativeIds,customImages:this.customImages,nextPageProps:this.nextPageProps,nextPageUrl:this.nextPageUrl,placement:this.placement,products:this.products.map(e=>e.serialize()),rowId:this.rowId,searchFacets:this.searchFacets,title:this.title,totalProducts:this.totalProducts}}toJSON(){return JSON.stringify(this.serialize())}},te=class{async createSmartSort(e){let r={apiKey:e.config.apiKey,source:e.config.source},s=f(e.config.endpoint,P.smart,r),o=f(e.config.pageEndpoint,P.page,r),n=this.buildSmartRequest(e),i=await h.post(s,n),{clickEndpoint:a,impressionEndpoint:c}=ee(e.config.eventsEndpoint,r),{creative_ids:g,custom_images:p,products:l,row_id:u,search_facets:d,title:w}=i,{cachedProducts:re,products:se}=this.generateProducts({clickUrl:a,identifier:e.config.identifier,impressUrl:c,products:l}),oe=(p??[]).map(ie=>this.massageCustomImageData(ie)).filter(ie=>ie!==void 0);return new D({cachedProducts:re,config:e.config,creativeIds:g,customImages:oe,nextPageProps:{pageSize:"page_size"in n?n.page_size??60:60,searchAttributes:n.search_attributes??e.searchAttributes},nextPageUrl:o,placement:e.placement,products:se,rowId:u,searchFacets:d,title:w,totalProducts:i.nb_hits??0})}generateProducts(e){let{clickUrl:r,identifier:s,impressUrl:o,products:n}=e,i={cachedProducts:[],products:[]};return n?.forEach(a=>{let c={clickPayload:{adToken:a.ad_token,distinctId:s.mixpanelDistinctId??s.jdid,isAddToCart:!1,janeDeviceId:s.jdid,kevelToken:a.kevel_token,myHighD:a.my_high_d,productId:a.product_id,storeId:a.store_id},clickUrl:r,impressPayload:{distinctId:s.mixpanelDistinctId??s.jdid,engagements:[{adToken:a.ad_token,kevelToken:a.kevel_token,myHighD:a.my_high_d,productId:a.product_id}],janeDeviceId:s.jdid},impressUrl:o,isSponsored:!!a.flight_id,objectId:a.object_id};a.search_attributes!==void 0?i.products.push({...c,attributes:a.search_attributes}):i.cachedProducts.push(c)}),i}massageCustomImageData(e){if(e)return{headline:e.headline,imageUrl:e.image_url,intendedDisplay:e.intended_display,logoUrl:e.logo_url,overlayColor:e.overlay_color,positionX:e.position_x,positionY:e.position_y,scaleNumber:e.scale_number,textColor:e.text_color}}buildSmartRequest(e){let{config:r,searchAttributes:s,...o}=e,n={app_mode:r.appMode,distinct_id:r.identifier.mixpanelDistinctId,jane_device_id:r.identifier.jdid,pos_user_id:r.identifier.posUserId,search_attributes:s,user_id:r.identifier.userId};switch(o.placement){case"cart_toppers":{let{cartProductIds:i,posCartProductIds:a,storeId:c}=o;return{...n,cart_pos_product_ids:a,cart_product_ids:i,placement:"cart_toppers",store_id:c}}case"custom_image_row":{let{searchFilter:i,storeId:a}=o;return{...n,placement:"custom_image_row",search_filter:i,store_id:a}}case"menu_dynamic_row":{let{adMode:i,filterContext:a,pageContext:c,storeId:g}=o;return{...n,ad_mode:i??"default",filter_context:a,page_context:c,placement:"menu_dynamic_row",store_id:g}}case"menu_inline":{let{adMode:i,distinctByProduct:a,metadata:c,numColumns:g,searchFilter:p,searchQuery:l,searchSort:u,storeId:d,storeIds:w}=o;return{...n,ad_mode:i??"default",distinct_by_product:a,metadata:c,num_columns:g,placement:"menu_inline",search_filter:p,search_query:l,search_sort:Fe(u),store_ids:w||[d]}}case"menu_inline_table":{let{disableAds:i,distinctByProduct:a,maxProducts:c,metadata:g,numColumns:p,pageSize:l,searchFacets:u,searchFilter:d,searchQuery:w,searchSort:re,storeId:se,storeIds:oe}=o;return{...n,disable_ads:i,distinct_by_product:a,max_products:c,metadata:g,num_columns:p,page_size:l,placement:"menu_inline_table",search_attributes:s,search_facets:u,search_filter:d,search_query:w,search_sort:Fe(re),store_ids:oe||[se]}}case"menu_top_row":{let{searchFilter:i,storeId:a}=o,c=this.extractValidCreativeIds(e);return{...n,exclude_creative_ids:c,placement:"menu_top_row",search_filter:i,store_id:a}}case"pdp_row":{let{posProductId:i,productId:a,storeId:c}=o;return{...n,placement:"pdp_row",pos_product_id:i,product_id:a,store_id:c}}default:throw new b(`Invalid Smart Sort Placement: ${o.placement}`)}}extractValidCreativeIds(e){if(e.placement==="menu_top_row"&&"excludeCreativeIds"in e&&Array.isArray(e.excludeCreativeIds))return e.excludeCreativeIds.filter(r=>typeof r=="number")}};var St=t=>t.placement==="specials",yt=t=>t.placement==="brand_specials",ue=class{placement;title;constructor(e){this.title=e,this.placement="brand_specials"}},me=class{placement;title;constructor(e){this.title=e,this.placement="specials"}},Re=class extends te{async createMultiPlacement(e){let r={apiKey:e.config.apiKey,source:e.config.source},s=f(e.config.endpoint,P.multi,r),o=f(e.config.pageEndpoint,P.page,r),n=this.buildMultiRequest(e),i=await h.post(s,n),{clickEndpoint:a,impressionEndpoint:c}=ee(e.config.eventsEndpoint,r),g=[];for(let[p,l]of(i.placements||[]).entries())if(St(l))g.push(new me(l.title));else if(yt(l))g.push(new ue(l.title));else{let{creative_ids:u,custom_images:d,placement:w,products:re,row_id:se,search_facets:oe,title:ie}=l,{cachedProducts:Ve,products:$e}=this.generateProducts({clickUrl:a,identifier:e.config.identifier,impressUrl:c,products:re}),Ze=(d??[]).map(be=>this.massageCustomImageData(be)).filter(be=>be!==void 0);g.push(new D({cachedProducts:Ve,config:{...e.config,skipAutoSmartSortOnLoad:p===0?e.config.skipAutoSmartSortOnLoad:!0},creativeIds:u,customImages:Ze,nextPageProps:{pageSize:60,searchAttributes:n.search_attributes||[]},nextPageUrl:o,placement:w,products:$e,rowId:se,searchFacets:oe,title:ie,totalProducts:l.nb_hits??0}))}return g}buildMultiRequest(e){let{config:r,numColumns:s,searchAttributes:o,storeId:n,...i}=e,a={app_mode:r.appMode,distinct_id:r.identifier.mixpanelDistinctId,jane_device_id:r.identifier.jdid,num_columns:s,pos_user_id:r.identifier.posUserId,search_attributes:o,store_id:n,user_id:r.identifier.userId};switch(i.multiRequestType){case"custom":return{...a,placements:this.massageCustomPlacements(i.placements),type:"custom"};case"featured":return{...a,exclude_menu_top_row:i.excludeMenuTopRow??!1,type:"featured"};default:throw new b(`Invalid Multi Type: ${i.multiRequestType}`)}}massageCustomPlacements(e){let r=[];for(let s of e)switch(s.placement){case"best_selling":r.push({placement:"best_selling",title:s.title});break;case"brand_specials":r.push({placement:"brand_specials",title:s.title});break;case"buy_again_row":r.push({placement:"buy_again_row",title:s.title});break;case"custom_image_row":r.push({placement:"custom_image_row",search_filter:s.searchFilter});break;case"featured_row":r.push({placement:"featured_row",row_id:s.rowId});break;case"menu_dynamic_row":r.push({ad_mode:s.adMode??"default",filter_context:s.filterContext,page_context:s.pageContext,placement:"menu_dynamic_row"});break;case"menu_inline":r.push({ad_mode:s.adMode??"default",metadata:s.metadata,placement:"menu_inline",search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_inline_table":r.push({disable_ads:s.disableAds,max_products:s.maxProducts,metadata:s.metadata,page_size:s.pageSize,placement:"menu_inline_table",search_facets:s.searchFacets,search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_top_row":r.push({placement:"menu_top_row",search_filter:s.searchFilter});break;case"sale":r.push({placement:"sale",title:s.title});break;case"specials":r.push({placement:"specials",title:s.title});break;default:throw new b(`Invalid Custom Placement: ${s.placement}`)}return r}};var Qe=require("nanoid");var ze=async t=>{let{apiKey:e,appMode:r,endpoint:s,identifier:o,searchFacets:n,searchFilter:i,searchQuery:a,source:c,storeId:g}=t,{jdid:p}=o||{},l=f(s,P.facets,{apiKey:e,source:c}),u={appMode:r,janeDeviceId:p,searchFacets:n,searchFilter:i,searchQuery:a,storeId:g};return(await h.post(l,u)).searchFacets??{}};var Le=async t=>{let{apiKey:e,endpoint:r,identifier:s,source:o,storeId:n,...i}=t,a=f(r,P.externalCheckout,{apiKey:e,source:o}),c={janeDeviceId:s.jdid,posOrderId:i.posOrderId,posUserId:i.posUserId||s.posUserId,products:i.products,storeId:n};return await h.post(a,c)};var _e=class{async create(e){let{config:r,searchAttributes:s,storeId:o,...n}=e,i={apiKey:r.apiKey,source:r.source},a=f(r.endpoint,P.product,i),{clickEndpoint:c,impressionEndpoint:g}=ee(r.eventsEndpoint,i),p={app_mode:r.appMode,distinct_id:r.identifier.mixpanelDistinctId,jane_device_id:r.identifier.jdid,pos_user_id:r.identifier.posUserId,search_attributes:s,store_id:o,user_id:r.identifier.userId},l=n.productId!==void 0?{...p,product_id:n.productId}:{...p,pos_product_id:n.posProductId},u=await h.post(a,l);return new x({attributes:u.search_attributes,clickPayload:{adToken:u.ad_token,distinctId:r.identifier.mixpanelDistinctId,isAddToCart:!1,janeDeviceId:r.identifier.jdid,kevelToken:u.kevel_token,myHighD:u.my_high_d,productId:u.product_id,storeId:o},clickUrl:c,impressPayload:{distinctId:r.identifier.mixpanelDistinctId??r.identifier.jdid,engagements:[{adToken:u.ad_token,kevelToken:u.kevel_token,myHighD:u.my_high_d,productId:u.product_id}],janeDeviceId:r.identifier.jdid},impressUrl:g,isSponsored:!!u.flight_id,objectId:u.object_id})}};var bt=t=>({activities:t.activities,avatar:t.avatar,comment:t.comment,createdAt:t.created_at,feelings:t.feelings,hasComment:t.has_comment,id:t.id,nickname:t.nickname,productId:t.product_id,rating:t.rating,storeId:t.store_id,storeName:t.store_name,updatedAt:t.updated_at,upvoteCount:t.upvote_count}),wt=t=>({activitiesDistribution:t.activities_distribution,averageRating:t.average_rating,distribution:t.distribution,feelingsDistribution:t.feelings_distribution,reviewCount:t.review_count}),It=(t,e,r)=>{let s=t.total_count,o=Math.max(1,Math.ceil(s/r));return{aggregate:wt(t.aggregate),aiSummary:t.ai_summary,items:t.reviews.map(bt),pagination:{currentPage:e,hasNextPage:e<o,hasPreviousPage:e>1,pageSize:r,totalCount:s,totalPages:o},productId:t.product_id}},Je=async t=>{let{activities:e,config:r,feelings:s,hasComment:o,page:n,pageSize:i,productId:a,ratings:c,sort:g}=t,p=n??1,l=i??50,u=f(r.endpoint,P.productReviews,{apiKey:r.apiKey,source:r.source}),d={activities:e,feelings:s,has_comment:o||void 0,page:n,page_size:i,product_id:a,ratings:c,sort:g},w=await h.post(u,d);return It(w,p,l)},He=t=>{let e={[Symbol.asyncIterator]:async function*(){let r=1;for(;;){let s=await t(r);if(yield s,!s.pagination.hasNextPage)return;r+=1}}};return{pages:e,[Symbol.asyncIterator]:async function*(){for await(let r of e)yield*r.items}}};var Ke=async t=>{let{apiKey:e,eventsEndpoint:r,identifier:s,source:o,...n}=t,i=f(r,P.sessionEvent,{apiKey:e,source:o}),a={distinctId:s.mixpanelDistinctId,events:n.events,janeDeviceId:s.jdid};return await h.post(i,a)};function S(t,e,r){let s=r.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return r.value=async function(...o){return await this.init(),s.apply(this,o)},r}function y(t,e,r){let s=r.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return r.value=async function(...o){if(!this.rateLimiter)throw new Error("throttle decorator can only be used on JaneDM class methods");return this.rateLimiter.schedule(async()=>s.apply(this,o))},r}var Se=class{burst;intervalMs;rate;tat=0;toleranceMs;constructor(e,r=1){if(e<=0)throw new b("rate must be > 0");if(r<1)throw new b("burst must be >= 1");this.rate=e,this.burst=Math.floor(r),this.intervalMs=1e3/this.rate,this.toleranceMs=(this.burst-1)*this.intervalMs}async schedule(e){let r=Date.now(),s=Math.max(0,this.tat-this.toleranceMs-r);this.tat=Math.max(this.tat,r)+this.intervalMs;let o=async()=>e();return s>0?new Promise((n,i)=>setTimeout(()=>o().then(n).catch(i),s)):o()}};var vt=/^https?:\/\//,xt=/^(https?:\/\/)?(([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}|localhost)(:\d+)?(\/.*)?$/,ye=(t,e)=>{let s=vt.test(t??e)?t??e:`https://${t}`,o=new URL(s);return xt.test(o.toString())?o.protocol+"//"+o.host:e};var R=class{config;rateLimiter;initialized=!1;multiClient;productClient;smartSortClient;userProvidedJdid=!1;constructor(e,r){let{apiKey:s,endpoint:o,identifier:n}=e,{appMode:i="headless",eventsEndpoint:a,pageEndpoint:c,skipAutoSmartSortOnLoad:g=!1,source:p="sdk"}=r??{},l=ye(o,"https://dmerch.iheartjane.com"),u=ye(a,l),d=ye(c,l);this.userProvidedJdid=!!n?.jdid,this.config={apiKey:s,appMode:i,endpoint:l,eventsEndpoint:u,identifier:n??{jdid:""},pageEndpoint:d,skipAutoSmartSortOnLoad:g,source:p},this.smartSortClient=new te,this.multiClient=new Re,this.productClient=new _e,this.rateLimiter=new Se(10,20)}static generateJaneDeviceId(){return(0,Qe.nanoid)()}async fetchCartTopperRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"cart_toppers"})}async fetchCustomImageRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"custom_image_row"})}async fetchCustomPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"custom",...e})}async fetchFacets(e){return ze({...e,...this.config})}async fetchFeaturedPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"featured",...e})}async fetchMenuRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline"})}async fetchMenuTopRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_top_row"})}async fetchProduct(e){return this.productClient.create({config:this.config,...e})}async fetchProductReviews(e){return Je({config:this.config,...e})}async fetchRecommendedPDPRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"pdp_row"})}async fetchRecommendedRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_dynamic_row"})}async fetchRecommendedSort(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline_table"})}getJaneDeviceId(){return this.config.identifier.jdid}async init(){this.initialized||(I()&&!this.userProvidedJdid&&await this.initializeClientSideJdid(),this.initialized=!0)}iterateProductReviews(e){return He(r=>this.fetchProductReviews({...e,page:r}))}async sendPosCheckout(e){return Le({...e,...this.config})}async sendSessionEvent(e){return Ke({...e,...this.config})}async initializeClientSideJdid(){let e={apiKey:this.config.apiKey,source:this.config.source},r=await Ue(this.config.eventsEndpoint,e);k.set("jdid",r),this.config.identifier.jdid=r}};_([S,y],R.prototype,"fetchCartTopperRow",1),_([S,y],R.prototype,"fetchCustomImageRow",1),_([S,y],R.prototype,"fetchCustomPlacements",1),_([S,y],R.prototype,"fetchFacets",1),_([S,y],R.prototype,"fetchFeaturedPlacements",1),_([S,y],R.prototype,"fetchMenuRow",1),_([S,y],R.prototype,"fetchMenuTopRow",1),_([S,y],R.prototype,"fetchProduct",1),_([S,y],R.prototype,"fetchProductReviews",1),_([S,y],R.prototype,"fetchRecommendedPDPRow",1),_([S,y],R.prototype,"fetchRecommendedRow",1),_([S,y],R.prototype,"fetchRecommendedSort",1);0&&(module.exports={AdMode,AppMode,BrandSpecials,DEFAULT_PAGE_SIZE,IntendedDisplay,JaneDM,JaneDeviceIdSentinel,PageContextEnum,Placement,ProductKindEnum,ReviewSortEnum,SearchSortEnum,SmartSort,SmartSortProduct,Specials,bestSellerRank,categoryAndNameAsc,defaultOrder,priceAsc,priceDesc,priceEighthOunceAsc,priceEighthOunceDesc,priceGramAsc,priceGramDesc,priceHalfGramAsc,priceHalfGramDesc,priceHalfOunceAsc,priceHalfOunceDesc,priceOunceAsc,priceOunceDesc,priceQuarterOunceAsc,priceQuarterOunceDesc,priceTwoGramAsc,priceTwoGramDesc,rating,recommendation,searchSorts,thcPotencyAsc,thcPotencyDesc});
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as Placement, A as AdMode, F as FilterContext, a as PageContextEnum, S as SearchSortEnum, C as Click, I as Impression, b as CustomImageData, c as SmartSortProductProps, d as SmartSortClickIntent, e as SmartSortProps, f as ConversionExternalProduct, g as SessionEvent, R as RequiredConfig, J as JaneDMPublicConfig, h as JaneDMInternalConfig, i as FetchCartTopperRowProps, j as FetchCustomImageRowProps, k as Facets, l as FetchMenuRowProps, m as FetchMenuTopRowProps, n as FetchProductReviewsProps, o as ProductReviewsResponse, p as FetchRecommendedPDPRowProps, q as FetchRecommendedRowProps, r as FetchRecommendedSortProps, V as VirtualBudtenderQuery, s as IterateProductReviewsProps, t as ProductReviewsIterable } from './smartSort-DpgTm3W4.cjs';
2
- export { u as AppMode, D as DEFAULT_PAGE_SIZE, v as FetchCartTopperRowByPosProductId, w as FetchCartTopperRowByProductProps, x as FetchRecommendedPDPRowByPosProductId, y as FetchRecommendedPDPRowByProductId, z as IntendedDisplay, B as JaneDMConfig, E as JaneDMIdentifiers, G as JaneDeviceIdSentinel, H as PaginationInfo, K as ProductKindEnum, L as ProductReview, M as ProductReviewsAggregate, N as ReviewSortEnum, O as SearchSort, Q as SmartSortNextPageProps, T as VirtualBudtenderSearchResponse, U as bestSellerRank, W as categoryAndNameAsc, X as defaultOrder, Y as priceAsc, Z as priceDesc, _ as priceEighthOunceAsc, $ as priceEighthOunceDesc, a0 as priceGramAsc, a1 as priceGramDesc, a2 as priceHalfGramAsc, a3 as priceHalfGramDesc, a4 as priceHalfOunceAsc, a5 as priceHalfOunceDesc, a6 as priceOunceAsc, a7 as priceOunceDesc, a8 as priceQuarterOunceAsc, a9 as priceQuarterOunceDesc, aa as priceTwoGramAsc, ab as priceTwoGramDesc, ac as rating, ad as recommendation, ae as searchSorts, af as thcPotencyAsc, ag as thcPotencyDesc } from './smartSort-DpgTm3W4.cjs';
1
+ import { P as Placement, A as AdMode, F as FilterContext, a as PageContextEnum, S as SearchSortEnum, C as CustomImageData, b as SmartSortProductProps, c as SmartSortClickIntent, d as SmartSortProps, e as ConversionExternalProduct, f as SessionEvent, R as RequiredConfig, J as JaneDMPublicConfig, g as JaneDMInternalConfig, h as FetchCartTopperRowProps, i as FetchCustomImageRowProps, j as Facets, k as FetchMenuRowProps, l as FetchMenuTopRowProps, m as FetchProductReviewsProps, n as ProductReviewsResponse, o as FetchRecommendedPDPRowProps, p as FetchRecommendedRowProps, q as FetchRecommendedSortProps, I as IterateProductReviewsProps, r as ProductReviewsIterable } from './smartSort-Bzn30738.cjs';
2
+ export { s as AppMode, D as DEFAULT_PAGE_SIZE, t as FetchCartTopperRowByPosProductId, u as FetchCartTopperRowByProductProps, v as FetchRecommendedPDPRowByPosProductId, w as FetchRecommendedPDPRowByProductId, x as IntendedDisplay, y as JaneDMConfig, z as JaneDMIdentifiers, B as JaneDeviceIdSentinel, E as PaginationInfo, G as ProductKindEnum, H as ProductReview, K as ProductReviewsAggregate, L as ReviewSortEnum, M as SearchSort, N as SmartSortNextPageProps, O as bestSellerRank, Q as categoryAndNameAsc, T as defaultOrder, U as priceAsc, V as priceDesc, W as priceEighthOunceAsc, X as priceEighthOunceDesc, Y as priceGramAsc, Z as priceGramDesc, _ as priceHalfGramAsc, $ as priceHalfGramDesc, a0 as priceHalfOunceAsc, a1 as priceHalfOunceDesc, a2 as priceOunceAsc, a3 as priceOunceDesc, a4 as priceQuarterOunceAsc, a5 as priceQuarterOunceDesc, a6 as priceTwoGramAsc, a7 as priceTwoGramDesc, a8 as rating, a9 as recommendation, aa as searchSorts, ab as thcPotencyAsc, ac as thcPotencyDesc } from './smartSort-Bzn30738.cjs';
3
3
 
4
4
  interface CustomBestSellingProps {
5
5
  placement: Placement.BestSelling;
@@ -98,92 +98,6 @@ interface ProductByPosProductId {
98
98
  productId?: never;
99
99
  }
100
100
 
101
- /**
102
- * The VirtualBudtenderClickIntent is used to determine if the click
103
- * event should be treated as an "add to cart" event.
104
- */
105
- interface VirtualBudtenderClickIntent {
106
- /**
107
- * When set to true, the click event will be treated as an "add to cart" event.
108
- * @default false
109
- */
110
- isAddToCart?: boolean;
111
- }
112
- /**
113
- * Properties to create a `VirtualBudtenderProduct` instance.
114
- * @internal
115
- */
116
- interface VirtualBudtenderProductProps<ProductAttributes extends object = Record<string, unknown>> {
117
- /**
118
- * The raw Virtual Budtender product data
119
- */
120
- attributes: ProductAttributes;
121
- /**
122
- * Click tracking payload
123
- */
124
- clickPayload: Click;
125
- /**
126
- * Click tracking URL
127
- */
128
- clickUrl: string;
129
- /**
130
- * Whether this product has been impressed yet
131
- */
132
- hasBeenImpressed?: boolean;
133
- /**
134
- * Impression tracking payload
135
- */
136
- impressPayload: Impression;
137
- /**
138
- * Impression tracking URL
139
- */
140
- impressUrl: string;
141
- /**
142
- * Boolean that indicates if a product is sponsored or not
143
- */
144
- isSponsored: boolean;
145
- /**
146
- * The primary identifier for this product
147
- */
148
- objectId: string;
149
- /**
150
- * The reasoning for the product
151
- */
152
- reasoning?: string;
153
- /**
154
- * The score of the product
155
- */
156
- score?: number;
157
- }
158
- /**
159
- * Parameters for fetching virtual budtender query suggestions.
160
- * @internal
161
- */
162
- interface VirtualBudtenderQueriesParams {
163
- /**
164
- * The store ID to get queries for
165
- */
166
- storeId: number;
167
- }
168
- /**
169
- * Parameters for virtual budtender search.
170
- * @internal
171
- */
172
- interface VirtualBudtenderSearchParams {
173
- /**
174
- * Natural language query for product search
175
- */
176
- query: string;
177
- /**
178
- * Optional search attributes to include in the results
179
- */
180
- searchAttributes?: string[];
181
- /**
182
- * Store ID to search products in
183
- */
184
- storeId: number;
185
- }
186
-
187
101
  /**
188
102
  * Parameters for fetching facets.
189
103
  */
@@ -514,112 +428,6 @@ interface SessionEventParams {
514
428
  events: SessionEvent[];
515
429
  }
516
430
 
517
- interface VirtualBudtenderSearchWithProductsResponse<ProductShape extends object = Record<string, unknown>> {
518
- htmlResponse: string;
519
- markdownResponse: string;
520
- products: VirtualBudtenderProduct<ProductShape>[];
521
- query: string;
522
- totalResults: number;
523
- unformattedResponse: string;
524
- }
525
- /**
526
- * Represents a product returned from Virtual Budtender search.
527
- * Provides tracking methods for click and impression events.
528
- *
529
- * @internal
530
- */
531
- declare class VirtualBudtenderProduct<ProductShape extends object = Record<string, unknown>> {
532
- /**
533
- * The raw Virtual Budtender product data including search attributes and reasoning.
534
- */
535
- attributes: ProductShape;
536
- /**
537
- * Boolean that indicates if a product is sponsored or not
538
- */
539
- isSponsored: boolean;
540
- /**
541
- * The primary identifier for this product.
542
- */
543
- objectId: string;
544
- /**
545
- * The reasoning for the product
546
- */
547
- reasoning?: string;
548
- /**
549
- * The score of the product
550
- */
551
- score?: number;
552
- private clickPayload;
553
- private clickUrl;
554
- private hasBeenImpressed;
555
- private impressPayload;
556
- private impressPromise?;
557
- private impressUrl;
558
- /**
559
- * Builds a new VirtualBudtenderProduct instance based on the provided properties.
560
- * This method should be used in conjunction with `serialize()` to recreate the instance.
561
- */
562
- constructor(props: VirtualBudtenderProductProps<ProductShape>);
563
- /**
564
- * Converts the previously-serialized object back to an instance of this class.
565
- * This method should be used in conjunction with `toJSON()` to recreate the instance.
566
- */
567
- static fromJSON<ProductShape extends object = Record<string, unknown>>(serialized: string): VirtualBudtenderProduct<ProductShape>;
568
- /**
569
- * Records attribution data for this product. This method
570
- * should be called when the product is clicked by the user.
571
- * If the click is associated with an add to cart action,
572
- * that intent should be passed to the click method.
573
- * @example
574
- * ```jsx
575
- * results.products.map((product) => {
576
- * return (<ProductCard
577
- * product={product}
578
- * onClick={() => product.click()}
579
- * key={product.objectId}
580
- * >
581
- * <Button
582
- * title="Add to Cart"
583
- * onClick={() => product.click({isAddToCart: true})}
584
- * />
585
- * </ProductCard>);
586
- * });
587
- * ```
588
- */
589
- click(props?: VirtualBudtenderClickIntent): Promise<void>;
590
- /**
591
- * Records attribution data for this product. This method
592
- * should be called when the product is visible by the user in
593
- * the viewport, as a visible DOM element.
594
- * See {@link https://www.npmjs.com/package/react-intersection-observer react-intersection-observer} for a React component that can be used to detect when an element is in the viewport.
595
- * @example
596
- * ```jsx
597
- * import { InView } from "react-intersection-observer";
598
- *
599
- * const Component = () => (
600
- * <InView onChange={(inView) => {
601
- * if(inView) {
602
- * product.impress();
603
- * }
604
- * }}>
605
- * <ProductCard />
606
- * </InView>
607
- * );
608
- * ```
609
- */
610
- impress(): Promise<void>;
611
- /**
612
- * Serializes the instance to a plain object for storage or transport.
613
- * This method should be used in conjunction with `fromJSON()` to recreate the instance.
614
- */
615
- serialize(): VirtualBudtenderProductProps<ProductShape>;
616
- /**
617
- * Converts the instance to a JSON string for storage or transport.
618
- * This method should be used in conjunction with `fromJSON()` to recreate the instance.
619
- */
620
- toJSON(): string;
621
- }
622
-
623
431
  type Func<T> = () => Promise<T>;
624
432
  /**
625
433
  * Generic Cell Rate Algorithm (GCRA) rate limiter implementation.
@@ -1035,43 +843,6 @@ declare class JaneDM {
1035
843
  * ```
1036
844
  */
1037
845
  fetchRecommendedSort<ProductShape extends object = Record<string, unknown>>(props: FetchRecommendedSortProps): Promise<SmartSort<ProductShape>>;
1038
- /**
1039
- * Fetches virtual budtender query suggestions from the Jane DM API.
1040
- * Returns curated queries optimized for natural language product search.
1041
- * @internal
1042
- * @example
1043
- * ```jsx
1044
- * const queries = await client.fetchVirtualBudtenderQueries({
1045
- * storeId: 420,
1046
- * });
1047
- *
1048
- * console.log(queries); // [{ query: "help me sleep", displayText: "Help me sleep" }, ...]
1049
- * ```
1050
- */
1051
- fetchVirtualBudtenderQueries(props: VirtualBudtenderQueriesParams): Promise<VirtualBudtenderQuery[]>;
1052
- /**
1053
- * Performs natural language product search using Virtual Budtender AI.
1054
- * Returns personalized product recommendations with AI-generated explanations
1055
- * and integrates sponsored products when relevant to the query.
1056
- * @internal
1057
- * @example
1058
- * ```jsx
1059
- * const result = await client.fetchVirtualBudtenderSearch({
1060
- * query: "help me sleep",
1061
- * storeId: 420,
1062
- * });
1063
- *
1064
- * console.log(result.markdownResponse); // AI-generated response
1065
- * console.log(result.products); // Array of VirtualBudtenderProduct instances
1066
- *
1067
- * // Each product has click and impression tracking
1068
- * result.products.forEach(product => {
1069
- * console.log(product.attributes.reasoning); // AI reasoning
1070
- * console.log(product.isSponsored); // Sponsored status
1071
- * });
1072
- * ```
1073
- */
1074
- fetchVirtualBudtenderSearch<ProductShape extends object = Record<string, unknown>>(props: VirtualBudtenderSearchParams): Promise<VirtualBudtenderSearchWithProductsResponse<ProductShape>>;
1075
846
  /**
1076
847
  * Retrieves the configured JDID for the client.
1077
848
  */
@@ -1178,4 +949,4 @@ declare class JaneDM {
1178
949
  private initializeClientSideJdid;
1179
950
  }
1180
951
 
1181
- export { AdMode, BrandSpecials, ConversionExternalProduct, CustomImageData, Facets, FetchCartTopperRowProps, FetchCustomImageRowProps, type FetchCustomPlacementsProps, type FetchFacetsParams, type FetchFeaturedPlacementProps, FetchMenuRowProps, FetchMenuTopRowProps, FetchProductReviewsProps, FetchRecommendedPDPRowProps, FetchRecommendedRowProps, FetchRecommendedSortProps, IterateProductReviewsProps, JaneDM, type MultiPlacementResponse, PageContextEnum, Placement, type PosCheckoutParams, ProductReviewsIterable, ProductReviewsResponse, SearchSortEnum, type SessionEventParams, SmartSort, SmartSortClickIntent, SmartSortProduct, SmartSortProductProps, SmartSortProps, Specials, type VirtualBudtenderClickIntent, VirtualBudtenderProduct, VirtualBudtenderQuery };
952
+ export { AdMode, BrandSpecials, ConversionExternalProduct, CustomImageData, Facets, FetchCartTopperRowProps, FetchCustomImageRowProps, type FetchCustomPlacementsProps, type FetchFacetsParams, type FetchFeaturedPlacementProps, FetchMenuRowProps, FetchMenuTopRowProps, FetchProductReviewsProps, FetchRecommendedPDPRowProps, FetchRecommendedRowProps, FetchRecommendedSortProps, IterateProductReviewsProps, JaneDM, type MultiPlacementResponse, PageContextEnum, Placement, type PosCheckoutParams, ProductReviewsIterable, ProductReviewsResponse, SearchSortEnum, type SessionEventParams, SmartSort, SmartSortClickIntent, SmartSortProduct, SmartSortProductProps, SmartSortProps, Specials };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as Placement, A as AdMode, F as FilterContext, a as PageContextEnum, S as SearchSortEnum, C as Click, I as Impression, b as CustomImageData, c as SmartSortProductProps, d as SmartSortClickIntent, e as SmartSortProps, f as ConversionExternalProduct, g as SessionEvent, R as RequiredConfig, J as JaneDMPublicConfig, h as JaneDMInternalConfig, i as FetchCartTopperRowProps, j as FetchCustomImageRowProps, k as Facets, l as FetchMenuRowProps, m as FetchMenuTopRowProps, n as FetchProductReviewsProps, o as ProductReviewsResponse, p as FetchRecommendedPDPRowProps, q as FetchRecommendedRowProps, r as FetchRecommendedSortProps, V as VirtualBudtenderQuery, s as IterateProductReviewsProps, t as ProductReviewsIterable } from './smartSort-DpgTm3W4.js';
2
- export { u as AppMode, D as DEFAULT_PAGE_SIZE, v as FetchCartTopperRowByPosProductId, w as FetchCartTopperRowByProductProps, x as FetchRecommendedPDPRowByPosProductId, y as FetchRecommendedPDPRowByProductId, z as IntendedDisplay, B as JaneDMConfig, E as JaneDMIdentifiers, G as JaneDeviceIdSentinel, H as PaginationInfo, K as ProductKindEnum, L as ProductReview, M as ProductReviewsAggregate, N as ReviewSortEnum, O as SearchSort, Q as SmartSortNextPageProps, T as VirtualBudtenderSearchResponse, U as bestSellerRank, W as categoryAndNameAsc, X as defaultOrder, Y as priceAsc, Z as priceDesc, _ as priceEighthOunceAsc, $ as priceEighthOunceDesc, a0 as priceGramAsc, a1 as priceGramDesc, a2 as priceHalfGramAsc, a3 as priceHalfGramDesc, a4 as priceHalfOunceAsc, a5 as priceHalfOunceDesc, a6 as priceOunceAsc, a7 as priceOunceDesc, a8 as priceQuarterOunceAsc, a9 as priceQuarterOunceDesc, aa as priceTwoGramAsc, ab as priceTwoGramDesc, ac as rating, ad as recommendation, ae as searchSorts, af as thcPotencyAsc, ag as thcPotencyDesc } from './smartSort-DpgTm3W4.js';
1
+ import { P as Placement, A as AdMode, F as FilterContext, a as PageContextEnum, S as SearchSortEnum, C as CustomImageData, b as SmartSortProductProps, c as SmartSortClickIntent, d as SmartSortProps, e as ConversionExternalProduct, f as SessionEvent, R as RequiredConfig, J as JaneDMPublicConfig, g as JaneDMInternalConfig, h as FetchCartTopperRowProps, i as FetchCustomImageRowProps, j as Facets, k as FetchMenuRowProps, l as FetchMenuTopRowProps, m as FetchProductReviewsProps, n as ProductReviewsResponse, o as FetchRecommendedPDPRowProps, p as FetchRecommendedRowProps, q as FetchRecommendedSortProps, I as IterateProductReviewsProps, r as ProductReviewsIterable } from './smartSort-Bzn30738.js';
2
+ export { s as AppMode, D as DEFAULT_PAGE_SIZE, t as FetchCartTopperRowByPosProductId, u as FetchCartTopperRowByProductProps, v as FetchRecommendedPDPRowByPosProductId, w as FetchRecommendedPDPRowByProductId, x as IntendedDisplay, y as JaneDMConfig, z as JaneDMIdentifiers, B as JaneDeviceIdSentinel, E as PaginationInfo, G as ProductKindEnum, H as ProductReview, K as ProductReviewsAggregate, L as ReviewSortEnum, M as SearchSort, N as SmartSortNextPageProps, O as bestSellerRank, Q as categoryAndNameAsc, T as defaultOrder, U as priceAsc, V as priceDesc, W as priceEighthOunceAsc, X as priceEighthOunceDesc, Y as priceGramAsc, Z as priceGramDesc, _ as priceHalfGramAsc, $ as priceHalfGramDesc, a0 as priceHalfOunceAsc, a1 as priceHalfOunceDesc, a2 as priceOunceAsc, a3 as priceOunceDesc, a4 as priceQuarterOunceAsc, a5 as priceQuarterOunceDesc, a6 as priceTwoGramAsc, a7 as priceTwoGramDesc, a8 as rating, a9 as recommendation, aa as searchSorts, ab as thcPotencyAsc, ac as thcPotencyDesc } from './smartSort-Bzn30738.js';
3
3
 
4
4
  interface CustomBestSellingProps {
5
5
  placement: Placement.BestSelling;
@@ -98,92 +98,6 @@ interface ProductByPosProductId {
98
98
  productId?: never;
99
99
  }
100
100
 
101
- /**
102
- * The VirtualBudtenderClickIntent is used to determine if the click
103
- * event should be treated as an "add to cart" event.
104
- */
105
- interface VirtualBudtenderClickIntent {
106
- /**
107
- * When set to true, the click event will be treated as an "add to cart" event.
108
- * @default false
109
- */
110
- isAddToCart?: boolean;
111
- }
112
- /**
113
- * Properties to create a `VirtualBudtenderProduct` instance.
114
- * @internal
115
- */
116
- interface VirtualBudtenderProductProps<ProductAttributes extends object = Record<string, unknown>> {
117
- /**
118
- * The raw Virtual Budtender product data
119
- */
120
- attributes: ProductAttributes;
121
- /**
122
- * Click tracking payload
123
- */
124
- clickPayload: Click;
125
- /**
126
- * Click tracking URL
127
- */
128
- clickUrl: string;
129
- /**
130
- * Whether this product has been impressed yet
131
- */
132
- hasBeenImpressed?: boolean;
133
- /**
134
- * Impression tracking payload
135
- */
136
- impressPayload: Impression;
137
- /**
138
- * Impression tracking URL
139
- */
140
- impressUrl: string;
141
- /**
142
- * Boolean that indicates if a product is sponsored or not
143
- */
144
- isSponsored: boolean;
145
- /**
146
- * The primary identifier for this product
147
- */
148
- objectId: string;
149
- /**
150
- * The reasoning for the product
151
- */
152
- reasoning?: string;
153
- /**
154
- * The score of the product
155
- */
156
- score?: number;
157
- }
158
- /**
159
- * Parameters for fetching virtual budtender query suggestions.
160
- * @internal
161
- */
162
- interface VirtualBudtenderQueriesParams {
163
- /**
164
- * The store ID to get queries for
165
- */
166
- storeId: number;
167
- }
168
- /**
169
- * Parameters for virtual budtender search.
170
- * @internal
171
- */
172
- interface VirtualBudtenderSearchParams {
173
- /**
174
- * Natural language query for product search
175
- */
176
- query: string;
177
- /**
178
- * Optional search attributes to include in the results
179
- */
180
- searchAttributes?: string[];
181
- /**
182
- * Store ID to search products in
183
- */
184
- storeId: number;
185
- }
186
-
187
101
  /**
188
102
  * Parameters for fetching facets.
189
103
  */
@@ -514,112 +428,6 @@ interface SessionEventParams {
514
428
  events: SessionEvent[];
515
429
  }
516
430
 
517
- interface VirtualBudtenderSearchWithProductsResponse<ProductShape extends object = Record<string, unknown>> {
518
- htmlResponse: string;
519
- markdownResponse: string;
520
- products: VirtualBudtenderProduct<ProductShape>[];
521
- query: string;
522
- totalResults: number;
523
- unformattedResponse: string;
524
- }
525
- /**
526
- * Represents a product returned from Virtual Budtender search.
527
- * Provides tracking methods for click and impression events.
528
- *
529
- * @internal
530
- */
531
- declare class VirtualBudtenderProduct<ProductShape extends object = Record<string, unknown>> {
532
- /**
533
- * The raw Virtual Budtender product data including search attributes and reasoning.
534
- */
535
- attributes: ProductShape;
536
- /**
537
- * Boolean that indicates if a product is sponsored or not
538
- */
539
- isSponsored: boolean;
540
- /**
541
- * The primary identifier for this product.
542
- */
543
- objectId: string;
544
- /**
545
- * The reasoning for the product
546
- */
547
- reasoning?: string;
548
- /**
549
- * The score of the product
550
- */
551
- score?: number;
552
- private clickPayload;
553
- private clickUrl;
554
- private hasBeenImpressed;
555
- private impressPayload;
556
- private impressPromise?;
557
- private impressUrl;
558
- /**
559
- * Builds a new VirtualBudtenderProduct instance based on the provided properties.
560
- * This method should be used in conjunction with `serialize()` to recreate the instance.
561
- */
562
- constructor(props: VirtualBudtenderProductProps<ProductShape>);
563
- /**
564
- * Converts the previously-serialized object back to an instance of this class.
565
- * This method should be used in conjunction with `toJSON()` to recreate the instance.
566
- */
567
- static fromJSON<ProductShape extends object = Record<string, unknown>>(serialized: string): VirtualBudtenderProduct<ProductShape>;
568
- /**
569
- * Records attribution data for this product. This method
570
- * should be called when the product is clicked by the user.
571
- * If the click is associated with an add to cart action,
572
- * that intent should be passed to the click method.
573
- * @example
574
- * ```jsx
575
- * results.products.map((product) => {
576
- * return (<ProductCard
577
- * product={product}
578
- * onClick={() => product.click()}
579
- * key={product.objectId}
580
- * >
581
- * <Button
582
- * title="Add to Cart"
583
- * onClick={() => product.click({isAddToCart: true})}
584
- * />
585
- * </ProductCard>);
586
- * });
587
- * ```
588
- */
589
- click(props?: VirtualBudtenderClickIntent): Promise<void>;
590
- /**
591
- * Records attribution data for this product. This method
592
- * should be called when the product is visible by the user in
593
- * the viewport, as a visible DOM element.
594
- * See {@link https://www.npmjs.com/package/react-intersection-observer react-intersection-observer} for a React component that can be used to detect when an element is in the viewport.
595
- * @example
596
- * ```jsx
597
- * import { InView } from "react-intersection-observer";
598
- *
599
- * const Component = () => (
600
- * <InView onChange={(inView) => {
601
- * if(inView) {
602
- * product.impress();
603
- * }
604
- * }}>
605
- * <ProductCard />
606
- * </InView>
607
- * );
608
- * ```
609
- */
610
- impress(): Promise<void>;
611
- /**
612
- * Serializes the instance to a plain object for storage or transport.
613
- * This method should be used in conjunction with `fromJSON()` to recreate the instance.
614
- */
615
- serialize(): VirtualBudtenderProductProps<ProductShape>;
616
- /**
617
- * Converts the instance to a JSON string for storage or transport.
618
- * This method should be used in conjunction with `fromJSON()` to recreate the instance.
619
- */
620
- toJSON(): string;
621
- }
622
-
623
431
  type Func<T> = () => Promise<T>;
624
432
  /**
625
433
  * Generic Cell Rate Algorithm (GCRA) rate limiter implementation.
@@ -1035,43 +843,6 @@ declare class JaneDM {
1035
843
  * ```
1036
844
  */
1037
845
  fetchRecommendedSort<ProductShape extends object = Record<string, unknown>>(props: FetchRecommendedSortProps): Promise<SmartSort<ProductShape>>;
1038
- /**
1039
- * Fetches virtual budtender query suggestions from the Jane DM API.
1040
- * Returns curated queries optimized for natural language product search.
1041
- * @internal
1042
- * @example
1043
- * ```jsx
1044
- * const queries = await client.fetchVirtualBudtenderQueries({
1045
- * storeId: 420,
1046
- * });
1047
- *
1048
- * console.log(queries); // [{ query: "help me sleep", displayText: "Help me sleep" }, ...]
1049
- * ```
1050
- */
1051
- fetchVirtualBudtenderQueries(props: VirtualBudtenderQueriesParams): Promise<VirtualBudtenderQuery[]>;
1052
- /**
1053
- * Performs natural language product search using Virtual Budtender AI.
1054
- * Returns personalized product recommendations with AI-generated explanations
1055
- * and integrates sponsored products when relevant to the query.
1056
- * @internal
1057
- * @example
1058
- * ```jsx
1059
- * const result = await client.fetchVirtualBudtenderSearch({
1060
- * query: "help me sleep",
1061
- * storeId: 420,
1062
- * });
1063
- *
1064
- * console.log(result.markdownResponse); // AI-generated response
1065
- * console.log(result.products); // Array of VirtualBudtenderProduct instances
1066
- *
1067
- * // Each product has click and impression tracking
1068
- * result.products.forEach(product => {
1069
- * console.log(product.attributes.reasoning); // AI reasoning
1070
- * console.log(product.isSponsored); // Sponsored status
1071
- * });
1072
- * ```
1073
- */
1074
- fetchVirtualBudtenderSearch<ProductShape extends object = Record<string, unknown>>(props: VirtualBudtenderSearchParams): Promise<VirtualBudtenderSearchWithProductsResponse<ProductShape>>;
1075
846
  /**
1076
847
  * Retrieves the configured JDID for the client.
1077
848
  */
@@ -1178,4 +949,4 @@ declare class JaneDM {
1178
949
  private initializeClientSideJdid;
1179
950
  }
1180
951
 
1181
- export { AdMode, BrandSpecials, ConversionExternalProduct, CustomImageData, Facets, FetchCartTopperRowProps, FetchCustomImageRowProps, type FetchCustomPlacementsProps, type FetchFacetsParams, type FetchFeaturedPlacementProps, FetchMenuRowProps, FetchMenuTopRowProps, FetchProductReviewsProps, FetchRecommendedPDPRowProps, FetchRecommendedRowProps, FetchRecommendedSortProps, IterateProductReviewsProps, JaneDM, type MultiPlacementResponse, PageContextEnum, Placement, type PosCheckoutParams, ProductReviewsIterable, ProductReviewsResponse, SearchSortEnum, type SessionEventParams, SmartSort, SmartSortClickIntent, SmartSortProduct, SmartSortProductProps, SmartSortProps, Specials, type VirtualBudtenderClickIntent, VirtualBudtenderProduct, VirtualBudtenderQuery };
952
+ export { AdMode, BrandSpecials, ConversionExternalProduct, CustomImageData, Facets, FetchCartTopperRowProps, FetchCustomImageRowProps, type FetchCustomPlacementsProps, type FetchFacetsParams, type FetchFeaturedPlacementProps, FetchMenuRowProps, FetchMenuTopRowProps, FetchProductReviewsProps, FetchRecommendedPDPRowProps, FetchRecommendedRowProps, FetchRecommendedSortProps, IterateProductReviewsProps, JaneDM, type MultiPlacementResponse, PageContextEnum, Placement, type PosCheckoutParams, ProductReviewsIterable, ProductReviewsResponse, SearchSortEnum, type SessionEventParams, SmartSort, SmartSortClickIntent, SmartSortProduct, SmartSortProductProps, SmartSortProps, Specials };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{A as ne,B as ae,C as ce,D as de,E as ue,F as pe,G as le,H as me,I as he,J as Le,a as S,b as l,c as J,d as be,e as Ge,f as we,g as Je,h as A,i as Ke,j as Qe,k as ve,l as K,m as Q,n as L,o as H,p as $,q as W,r as Z,s as X,t as Y,u as ee,v as te,w as re,x as se,y as ie,z as oe}from"./chunk-VEW5EGZ2.js";var _e="2.24.1-edge.fd78782";var Pe=(r,e)=>{let{apiKey:t,source:s}=e,i=new URL(r);return i.searchParams.set("jdm_source",s),i.searchParams.set("jdm_version",_e),t&&i.searchParams.set("jdm_api_key",t),i.searchParams.sort(),i.toString()},h=(r,e,t)=>{let s=new URL(r+e);return Pe(s.toString(),t)},w=(r,e)=>{let t=new URL(r+l.click),s=new URL(r+l.impression);return{clickEndpoint:Pe(t.toString(),e),impressionEndpoint:Pe(s.toString(),e)}},ge=class extends Error{response;constructor(e,t){super(e),this.response=t}},ke=async r=>{if(r.ok){if(r.status===204)return null}else throw new ge("Api Request Failed",r);try{return await r.json()}catch{}},He=async(r,e)=>{let t=await fetch(r,{body:JSON.stringify(e),headers:{Accept:"application/json","Content-Type":"text/plain"},method:"POST"});return ke(t)},$e=async(r,e={})=>{let{headers:t,...s}=e,i=await fetch(r,{...s,headers:{Accept:"application/json",...t},method:"GET"});return ke(i)},m={get:$e,post:He};import{nanoid as xe}from"nanoid";var v=()=>typeof window<"u"&&typeof document<"u";var We=(...r)=>{console.error("[JaneDmSDK]",...r)},Ze=(...r)=>{console.info("[JaneDmSDK]",...r)},Xe=(...r)=>{console.log("[JaneDmSDK]",...r)},_={error:We,info:Ze,log:Xe};var Ye=r=>{let e=localStorage.getItem(r);return e!==null?rt(e):e},et=(r,e)=>localStorage.setItem(r,st(e)),tt=r=>localStorage.removeItem(r),F={get:Ye,remove:tt,set:et},rt=r=>Ce(r)?r.substring(1,r.length-1):r,st=r=>Ce(r)?r:`"${r}"`,Ce=r=>{let t=r.length-1;return r[0]==='"'&&r[t]==='"'};var Se="j_fp_last_run",it=1440*60*1e3,ot=20,fe=new Set,nt=(r,e)=>`${r}:${e.apiKey}:${e.source}`;var at=r=>typeof r=="object"&&r!==null&&typeof r.token=="string"&&typeof r.endpoint=="string"&&typeof r.scriptUrlPattern=="string",ct=async(r,e)=>{try{let t=h(r,l.fingerprint,e),s=await m.get(t);return at(s)?s:null}catch(t){return _.error("Failed to fetch fingerprint token:",t),null}},dt=async(r,e,t,s)=>{try{let i=await import("@fingerprintjs/fingerprintjs-pro"),n=await i.load({apiKey:r,endpoint:[e,i.defaultEndpoint],region:"us",scriptUrlPattern:[t,i.defaultScriptUrlPattern],storageKey:"eyeD"}),o={tag:{isDmSdk:!0}};s?.linkedId&&(o.linkedId=s.linkedId);let c=await n.get(o);return!c||!c.visitorId?(_.error("Fingerprint JS did not return a valid visitorId"),null):{visitorId:c.visitorId}}catch(i){return _.error("Failed to run Fingerprint JS:",i),null}},Fe=async(r,e,t)=>{if(!v())return xe();let s=F.get("jdid");if(!s)return await Ee(r,e,t)??xe();if(s.length!==ot)return await Re(r,e,{linkedId:s}),s;let i=await Te(r,e,t);if(i)return i;if(De()==="error")try{F.set(Se,Date.now().toString())}catch{}return s},De=()=>{try{let r=F.get(Se);if(!r)return"missing";let e=parseInt(r,10);return Number.isNaN(e)?"missing":Date.now()-e>=it?"expired":"valid"}catch{return"error"}},Te=async(r,e,t)=>{let s=De();return s==="valid"||s==="error"?null:Ee(r,e,t)},Ee=async(r,e,t)=>{let s=nt(r,e);if(fe.has(s))return null;fe.add(s);try{let i=await ct(r,e);if(!i)return null;let a=await dt(i.token,i.endpoint,i.scriptUrlPattern,t);if(!a)return null;try{F.set(Se,Date.now().toString())}catch{}return a.visitorId}catch(i){return _.error("Failed to run fingerprint:",i),null}finally{fe.delete(s)}},Re=async(r,e,t)=>{if(v()&&t?.linkedId!=="user-opt-out")try{await Te(r,e,t)}catch(s){_.error("Failed to run SSR fingerprint:",s)}};var b=class r extends Error{constructor(e){super(`[Jane DM SDK]: ${e}`),this.name="SdkError",Object.setPrototypeOf(this,r.prototype)}};var ye=r=>{switch(r){case Q:return"best-seller-rank";case L:return"category-and-name-asc";case $:return"price-asc";case W:return"price-desc";case Z:return"price-eighth-ounce-asc";case X:return"price-eighth-ounce-desc";case Y:return"price-gram-asc";case ee:return"price-gram-desc";case te:return"price-half-gram-asc";case re:return"price-half-gram-desc";case se:return"price-half-ounce-asc";case ie:return"price-half-ounce-desc";case oe:return"price-ounce-asc";case ne:return"price-ounce-desc";case ae:return"price-quarter-ounce-asc";case ce:return"price-quarter-ounce-desc";case de:return"price-two-gram-asc";case ue:return"price-two-gram-desc";case pe:return"rating";case le:return"recommendation";case me:return"thc-potency-asc";case he:return"thc-potency-desc";case H:default:return"default"}};var T=r=>JSON.parse(r);var Ie=class r{isSponsored;objectId;clickPayload;clickUrl;impressPayload;impressUrl;constructor(e){this.objectId=e.objectId,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored}static fromJSON(e){return new r(T(e))}serialize(){return{clickPayload:this.clickPayload,clickUrl:this.clickUrl,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},D=class r{attributes;isSponsored;objectId;clickPayload;clickUrl;hasBeenImpressed;impressPayload;impressPromise;impressUrl;constructor(e){this.objectId=e.objectId,this.attributes=e.attributes,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored,this.hasBeenImpressed=e.hasBeenImpressed??!1}static fromJSON(e){return new r(T(e))}click(e={isAddToCart:!1}){let{isAddToCart:t=!1}=e,s={...this.clickPayload,isAddToCart:t};return m.post(this.clickUrl,s)}impress(){return this.hasBeenImpressed?Promise.resolve():(this.impressPromise??=m.post(this.impressUrl,this.impressPayload).then(()=>{this.hasBeenImpressed=!0}).finally(()=>{this.impressPromise=void 0}),this.impressPromise)}serialize(){return{attributes:this.attributes,clickPayload:this.clickPayload,clickUrl:this.clickUrl,hasBeenImpressed:this.hasBeenImpressed,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},E=class r{customImages;placement;products;rowId;searchFacets;title;totalProducts;creativeIds;cachedProducts;config;loadPromise;nextPageProps;nextPageUrl;constructor(e){this.rowId=e.rowId,this.searchFacets=e.searchFacets,this.nextPageUrl=e.nextPageUrl,this.nextPageProps=e.nextPageProps,this.products=e.products.map(t=>new D(t)),this.cachedProducts=e.cachedProducts.map(t=>new Ie(t)),this.totalProducts=e.totalProducts,this.title=e.title,this.creativeIds=e.creativeIds,this.config=e.config,this.customImages=e.customImages??[],this.placement=e.placement,v()&&!this.config.skipAutoSmartSortOnLoad&&this.onLoad().catch(t=>_.error("Failed to run onLoad:",t))}static fromJSON(e){return new r(T(e))}hasNextPage(){return this.cachedProducts.length>0}async nextPage(){if(!this.hasNextPage())return;let e=this.cachedProducts.slice(0,this.nextPageProps.pageSize),t={app_mode:this.config.appMode,jane_device_id:this.config.identifier.jdid,object_ids:e.map(a=>a.objectId),search_attributes:this.nextPageProps.searchAttributes},s=await m.post(this.nextPageUrl,t),i=new Map(s.products?.map(a=>[a.object_id,a.search_attributes]));e.forEach(a=>{let n=i.get(a.objectId);n!==void 0&&this.products.push(new D({...a.serialize(),attributes:n}))}),this.cachedProducts=this.cachedProducts.slice(this.nextPageProps.pageSize)}async onLoad(){return this.loadPromise?this.loadPromise:(this.loadPromise=(async()=>{if(!v())return;let e={apiKey:this.config.apiKey,source:this.config.source};await Re(this.config.eventsEndpoint,e,{linkedId:this.config.identifier.jdid})})(),this.loadPromise)}serialize(){return{cachedProducts:this.cachedProducts.map(e=>e.serialize()),config:this.config,creativeIds:this.creativeIds,customImages:this.customImages,nextPageProps:this.nextPageProps,nextPageUrl:this.nextPageUrl,placement:this.placement,products:this.products.map(e=>e.serialize()),rowId:this.rowId,searchFacets:this.searchFacets,title:this.title,totalProducts:this.totalProducts}}toJSON(){return JSON.stringify(this.serialize())}},j=class{async createSmartSort(e){let t={apiKey:e.config.apiKey,source:e.config.source},s=h(e.config.endpoint,l.smart,t),i=h(e.config.pageEndpoint,l.page,t),a=this.buildSmartRequest(e),n=await m.post(s,a),{clickEndpoint:o,impressionEndpoint:c}=w(e.config.eventsEndpoint,t),{creative_ids:u,custom_images:P,products:p,row_id:d,search_facets:I,title:f}=n,{cachedProducts:k,products:C}=this.generateProducts({clickUrl:o,identifier:e.config.identifier,impressUrl:c,products:p}),x=(P??[]).map(U=>this.massageCustomImageData(U)).filter(U=>U!==void 0);return new E({cachedProducts:k,config:e.config,creativeIds:u,customImages:x,nextPageProps:{pageSize:"page_size"in a?a.page_size??60:60,searchAttributes:a.search_attributes??e.searchAttributes},nextPageUrl:i,placement:e.placement,products:C,rowId:d,searchFacets:I,title:f,totalProducts:n.nb_hits??0})}generateProducts(e){let{clickUrl:t,identifier:s,impressUrl:i,products:a}=e,n={cachedProducts:[],products:[]};return a?.forEach(o=>{let c={clickPayload:{adToken:o.ad_token,distinctId:s.mixpanelDistinctId??s.jdid,isAddToCart:!1,janeDeviceId:s.jdid,kevelToken:o.kevel_token,myHighD:o.my_high_d,productId:o.product_id,storeId:o.store_id},clickUrl:t,impressPayload:{distinctId:s.mixpanelDistinctId??s.jdid,engagements:[{adToken:o.ad_token,kevelToken:o.kevel_token,myHighD:o.my_high_d,productId:o.product_id}],janeDeviceId:s.jdid},impressUrl:i,isSponsored:!!o.flight_id,objectId:o.object_id};o.search_attributes!==void 0?n.products.push({...c,attributes:o.search_attributes}):n.cachedProducts.push(c)}),n}massageCustomImageData(e){if(e)return{headline:e.headline,imageUrl:e.image_url,intendedDisplay:e.intended_display,logoUrl:e.logo_url,overlayColor:e.overlay_color,positionX:e.position_x,positionY:e.position_y,scaleNumber:e.scale_number,textColor:e.text_color}}buildSmartRequest(e){let{config:t,searchAttributes:s,...i}=e,a={app_mode:t.appMode,distinct_id:t.identifier.mixpanelDistinctId,jane_device_id:t.identifier.jdid,pos_user_id:t.identifier.posUserId,search_attributes:s,user_id:t.identifier.userId};switch(i.placement){case"cart_toppers":{let{cartProductIds:n,posCartProductIds:o,storeId:c}=i;return{...a,cart_pos_product_ids:o,cart_product_ids:n,placement:"cart_toppers",store_id:c}}case"custom_image_row":{let{searchFilter:n,storeId:o}=i;return{...a,placement:"custom_image_row",search_filter:n,store_id:o}}case"menu_dynamic_row":{let{adMode:n,filterContext:o,pageContext:c,storeId:u}=i;return{...a,ad_mode:n??"default",filter_context:o,page_context:c,placement:"menu_dynamic_row",store_id:u}}case"menu_inline":{let{adMode:n,distinctByProduct:o,metadata:c,numColumns:u,searchFilter:P,searchQuery:p,searchSort:d,storeId:I,storeIds:f}=i;return{...a,ad_mode:n??"default",distinct_by_product:o,metadata:c,num_columns:u,placement:"menu_inline",search_filter:P,search_query:p,search_sort:ye(d),store_ids:f||[I]}}case"menu_inline_table":{let{disableAds:n,distinctByProduct:o,maxProducts:c,metadata:u,numColumns:P,pageSize:p,searchFacets:d,searchFilter:I,searchQuery:f,searchSort:k,storeId:C,storeIds:x}=i;return{...a,disable_ads:n,distinct_by_product:o,max_products:c,metadata:u,num_columns:P,page_size:p,placement:"menu_inline_table",search_attributes:s,search_facets:d,search_filter:I,search_query:f,search_sort:ye(k),store_ids:x||[C]}}case"menu_top_row":{let{searchFilter:n,storeId:o}=i,c=this.extractValidCreativeIds(e);return{...a,exclude_creative_ids:c,placement:"menu_top_row",search_filter:n,store_id:o}}case"pdp_row":{let{posProductId:n,productId:o,storeId:c}=i;return{...a,placement:"pdp_row",pos_product_id:n,product_id:o,store_id:c}}default:throw new b(`Invalid Smart Sort Placement: ${i.placement}`)}}extractValidCreativeIds(e){if(e.placement==="menu_top_row"&&"excludeCreativeIds"in e&&Array.isArray(e.excludeCreativeIds))return e.excludeCreativeIds.filter(t=>typeof t=="number")}};var pt=r=>r.placement==="specials",lt=r=>r.placement==="brand_specials",M=class{placement;title;constructor(e){this.title=e,this.placement="brand_specials"}},O=class{placement;title;constructor(e){this.title=e,this.placement="specials"}},B=class extends j{async createMultiPlacement(e){let t={apiKey:e.config.apiKey,source:e.config.source},s=h(e.config.endpoint,l.multi,t),i=h(e.config.pageEndpoint,l.page,t),a=this.buildMultiRequest(e),n=await m.post(s,a),{clickEndpoint:o,impressionEndpoint:c}=w(e.config.eventsEndpoint,t),u=[];for(let[P,p]of(n.placements||[]).entries())if(pt(p))u.push(new O(p.title));else if(lt(p))u.push(new M(p.title));else{let{creative_ids:d,custom_images:I,placement:f,products:k,row_id:C,search_facets:x,title:U}=p,{cachedProducts:Ne,products:Ve}=this.generateProducts({clickUrl:o,identifier:e.config.identifier,impressUrl:c,products:k}),ze=(I??[]).map(G=>this.massageCustomImageData(G)).filter(G=>G!==void 0);u.push(new E({cachedProducts:Ne,config:{...e.config,skipAutoSmartSortOnLoad:P===0?e.config.skipAutoSmartSortOnLoad:!0},creativeIds:d,customImages:ze,nextPageProps:{pageSize:60,searchAttributes:a.search_attributes||[]},nextPageUrl:i,placement:f,products:Ve,rowId:C,searchFacets:x,title:U,totalProducts:p.nb_hits??0}))}return u}buildMultiRequest(e){let{config:t,numColumns:s,searchAttributes:i,storeId:a,...n}=e,o={app_mode:t.appMode,distinct_id:t.identifier.mixpanelDistinctId,jane_device_id:t.identifier.jdid,num_columns:s,pos_user_id:t.identifier.posUserId,search_attributes:i,store_id:a,user_id:t.identifier.userId};switch(n.multiRequestType){case"custom":return{...o,placements:this.massageCustomPlacements(n.placements),type:"custom"};case"featured":return{...o,exclude_menu_top_row:n.excludeMenuTopRow??!1,type:"featured"};default:throw new b(`Invalid Multi Type: ${n.multiRequestType}`)}}massageCustomPlacements(e){let t=[];for(let s of e)switch(s.placement){case"best_selling":t.push({placement:"best_selling",title:s.title});break;case"brand_specials":t.push({placement:"brand_specials",title:s.title});break;case"buy_again_row":t.push({placement:"buy_again_row",title:s.title});break;case"custom_image_row":t.push({placement:"custom_image_row",search_filter:s.searchFilter});break;case"featured_row":t.push({placement:"featured_row",row_id:s.rowId});break;case"menu_dynamic_row":t.push({ad_mode:s.adMode??"default",filter_context:s.filterContext,page_context:s.pageContext,placement:"menu_dynamic_row"});break;case"menu_inline":t.push({ad_mode:s.adMode??"default",metadata:s.metadata,placement:"menu_inline",search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_inline_table":t.push({disable_ads:s.disableAds,max_products:s.maxProducts,metadata:s.metadata,page_size:s.pageSize,placement:"menu_inline_table",search_facets:s.searchFacets,search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_top_row":t.push({placement:"menu_top_row",search_filter:s.searchFilter});break;case"sale":t.push({placement:"sale",title:s.title});break;case"specials":t.push({placement:"specials",title:s.title});break;default:throw new b(`Invalid Custom Placement: ${s.placement}`)}return t}};import{nanoid as Rt}from"nanoid";var je=async r=>{let{apiKey:e,appMode:t,endpoint:s,identifier:i,searchFacets:a,searchFilter:n,searchQuery:o,source:c,storeId:u}=r,{jdid:P}=i||{},p=h(s,l.facets,{apiKey:e,source:c}),d={appMode:t,janeDeviceId:P,searchFacets:a,searchFilter:n,searchQuery:o,storeId:u};return(await m.post(p,d)).searchFacets??{}};var Ue=async r=>{let{apiKey:e,endpoint:t,identifier:s,source:i,storeId:a,...n}=r,o=h(t,l.externalCheckout,{apiKey:e,source:i}),c={janeDeviceId:s.jdid,posOrderId:n.posOrderId,posUserId:n.posUserId||s.posUserId,products:n.products,storeId:a};return await m.post(o,c)};var q=class{async create(e){let{config:t,searchAttributes:s,storeId:i,...a}=e,n={apiKey:t.apiKey,source:t.source},o=h(t.endpoint,l.product,n),{clickEndpoint:c,impressionEndpoint:u}=w(t.eventsEndpoint,n),P={app_mode:t.appMode,distinct_id:t.identifier.mixpanelDistinctId,jane_device_id:t.identifier.jdid,pos_user_id:t.identifier.posUserId,search_attributes:s,store_id:i,user_id:t.identifier.userId},p=a.productId!==void 0?{...P,product_id:a.productId}:{...P,pos_product_id:a.posProductId},d=await m.post(o,p);return new D({attributes:d.search_attributes,clickPayload:{adToken:d.ad_token,distinctId:t.identifier.mixpanelDistinctId,isAddToCart:!1,janeDeviceId:t.identifier.jdid,kevelToken:d.kevel_token,myHighD:d.my_high_d,productId:d.product_id,storeId:i},clickUrl:c,impressPayload:{distinctId:t.identifier.mixpanelDistinctId??t.identifier.jdid,engagements:[{adToken:d.ad_token,kevelToken:d.kevel_token,myHighD:d.my_high_d,productId:d.product_id}],janeDeviceId:t.identifier.jdid},impressUrl:u,isSponsored:!!d.flight_id,objectId:d.object_id})}};var mt=r=>({activities:r.activities,avatar:r.avatar,comment:r.comment,createdAt:r.created_at,feelings:r.feelings,hasComment:r.has_comment,id:r.id,nickname:r.nickname,productId:r.product_id,rating:r.rating,storeId:r.store_id,storeName:r.store_name,updatedAt:r.updated_at,upvoteCount:r.upvote_count}),ht=r=>({activitiesDistribution:r.activities_distribution,averageRating:r.average_rating,distribution:r.distribution,feelingsDistribution:r.feelings_distribution,reviewCount:r.review_count}),Pt=(r,e,t)=>{let s=r.total_count,i=Math.max(1,Math.ceil(s/t));return{aggregate:ht(r.aggregate),aiSummary:r.ai_summary,items:r.reviews.map(mt),pagination:{currentPage:e,hasNextPage:e<i,hasPreviousPage:e>1,pageSize:t,totalCount:s,totalPages:i},productId:r.product_id}},Ae=async r=>{let{activities:e,config:t,feelings:s,hasComment:i,page:a,pageSize:n,productId:o,ratings:c,sort:u}=r,P=a??1,p=n??50,d=h(t.endpoint,l.productReviews,{apiKey:t.apiKey,source:t.source}),I={activities:e,feelings:s,has_comment:i||void 0,page:a,page_size:n,product_id:o,ratings:c,sort:u},f=await m.post(d,I);return Pt(f,P,p)},Me=r=>{let e={[Symbol.asyncIterator]:async function*(){let t=1;for(;;){let s=await r(t);if(yield s,!s.pagination.hasNextPage)return;t+=1}}};return{pages:e,[Symbol.asyncIterator]:async function*(){for await(let t of e)yield*t.items}}};var Oe=async r=>{let{apiKey:e,eventsEndpoint:t,identifier:s,source:i,...a}=r,n=h(t,l.sessionEvent,{apiKey:e,source:i}),o={distinctId:s.mixpanelDistinctId,events:a.events,janeDeviceId:s.jdid};return await m.post(n,o)};function R(r,e,t){let s=t.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return t.value=async function(...i){return await this.init(),s.apply(this,i)},t}function y(r,e,t){let s=t.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return t.value=async function(...i){if(!this.rateLimiter)throw new Error("throttle decorator can only be used on JaneDM class methods");return this.rateLimiter.schedule(async()=>s.apply(this,i))},t}var N=class{burst;intervalMs;rate;tat=0;toleranceMs;constructor(e,t=1){if(e<=0)throw new b("rate must be > 0");if(t<1)throw new b("burst must be >= 1");this.rate=e,this.burst=Math.floor(t),this.intervalMs=1e3/this.rate,this.toleranceMs=(this.burst-1)*this.intervalMs}async schedule(e){let t=Date.now(),s=Math.max(0,this.tat-this.toleranceMs-t);this.tat=Math.max(this.tat,t)+this.intervalMs;let i=async()=>e();return s>0?new Promise((a,n)=>setTimeout(()=>i().then(a).catch(n),s)):i()}};var gt=/^https?:\/\//,ft=/^(https?:\/\/)?(([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}|localhost)(:\d+)?(\/.*)?$/,V=(r,e)=>{let s=gt.test(r??e)?r??e:`https://${r}`,i=new URL(s);return ft.test(i.toString())?i.protocol+"//"+i.host:e};var Be=async r=>{let{apiKey:e,appMode:t,endpoint:s,identifier:i,source:a,storeId:n}=r,{jdid:o}=i;if(!o)throw new b("Jane Device ID (jdid) is required to fetch virtual budtender queries");let c=h(s,l.virtualBudtenderQueries,{apiKey:e,source:a}),u={appMode:t,janeDeviceId:o,storeId:n};return(await m.post(c,u)).queries??[]},qe=async r=>{let{apiKey:e,appMode:t,endpoint:s,eventsEndpoint:i,identifier:a,query:n,searchAttributes:o,source:c,storeId:u}=r,{jdid:P}=a;if(!P)throw new b("Jane Device ID (jdid) is required to perform virtual budtender search");let p={apiKey:e,source:c},d=h(s,l.virtualBudtenderSearch,p),I={app_mode:t,jane_device_id:P,placement:"virtual_budtender_search",query:n,search_attributes:o,store_id:u},f=await m.post(d,I),{clickEndpoint:k,impressionEndpoint:C}=w(i,p),x=St({clickUrl:k,identifier:a,impressUrl:C,products:f.products??[],storeId:u});return{htmlResponse:f.htmlResponse,markdownResponse:f.markdownResponse,products:x,query:f.query,totalResults:f.totalResults??0,unformattedResponse:f.unformattedResponse}},z=class r{attributes;isSponsored;objectId;reasoning;score;clickPayload;clickUrl;hasBeenImpressed;impressPayload;impressPromise;impressUrl;constructor(e){this.objectId=e.objectId,this.attributes=e.attributes,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored,this.hasBeenImpressed=e.hasBeenImpressed??!1,this.score=e.score,this.reasoning=e.reasoning}static fromJSON(e){return new r(T(e))}click(e={isAddToCart:!1}){let{isAddToCart:t=!1}=e,s={...this.clickPayload,isAddToCart:t};return m.post(this.clickUrl,s)}impress(){return this.hasBeenImpressed?Promise.resolve():(this.impressPromise??=m.post(this.impressUrl,this.impressPayload).then(()=>{this.hasBeenImpressed=!0}).finally(()=>{this.impressPromise=void 0}),this.impressPromise)}serialize(){return{attributes:this.attributes,clickPayload:this.clickPayload,clickUrl:this.clickUrl,hasBeenImpressed:this.hasBeenImpressed,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId,reasoning:this.reasoning,score:this.score}}toJSON(){return JSON.stringify(this.serialize())}},St=r=>{let{clickUrl:e,identifier:t,impressUrl:s,products:i,storeId:a}=r,n=[];return i?.forEach(o=>{let c={attributes:o.search_attributes,clickPayload:{adToken:o.ad_token,distinctId:t.mixpanelDistinctId??t.jdid,isAddToCart:!1,janeDeviceId:t.jdid,kevelToken:o.kevel_token,myHighD:o.my_high_d,productId:o.product_id,storeId:a},clickUrl:e,impressPayload:{distinctId:t.mixpanelDistinctId??t.jdid,engagements:[{adToken:o.ad_token,kevelToken:o.kevel_token,myHighD:o.my_high_d,productId:o.product_id}],janeDeviceId:t.jdid},impressUrl:s,isSponsored:!!o.flight_id,objectId:o.object_id,reasoning:o.reasoning,score:o.score};n.push(new z(c))}),n};var g=class{config;rateLimiter;initialized=!1;multiClient;productClient;smartSortClient;userProvidedJdid=!1;constructor(e,t){let{apiKey:s,endpoint:i,identifier:a}=e,{appMode:n="headless",eventsEndpoint:o,pageEndpoint:c,skipAutoSmartSortOnLoad:u=!1,source:P="sdk"}=t??{},p=V(i,"https://dmerch.iheartjane.com"),d=V(o,p),I=V(c,p);this.userProvidedJdid=!!a?.jdid,this.config={apiKey:s,appMode:n,endpoint:p,eventsEndpoint:d,identifier:a??{jdid:""},pageEndpoint:I,skipAutoSmartSortOnLoad:u,source:P},this.smartSortClient=new j,this.multiClient=new B,this.productClient=new q,this.rateLimiter=new N(10,20)}static generateJaneDeviceId(){return Rt()}async fetchCartTopperRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"cart_toppers"})}async fetchCustomImageRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"custom_image_row"})}async fetchCustomPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"custom",...e})}async fetchFacets(e){return je({...e,...this.config})}async fetchFeaturedPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"featured",...e})}async fetchMenuRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline"})}async fetchMenuTopRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_top_row"})}async fetchProduct(e){return this.productClient.create({config:this.config,...e})}async fetchProductReviews(e){return Ae({config:this.config,...e})}async fetchRecommendedPDPRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"pdp_row"})}async fetchRecommendedRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_dynamic_row"})}async fetchRecommendedSort(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline_table"})}async fetchVirtualBudtenderQueries(e){return Be({...e,...this.config})}async fetchVirtualBudtenderSearch(e){return qe({...e,...this.config})}getJaneDeviceId(){return this.config.identifier.jdid}async init(){this.initialized||(v()&&!this.userProvidedJdid&&await this.initializeClientSideJdid(),this.initialized=!0)}iterateProductReviews(e){return Me(t=>this.fetchProductReviews({...e,page:t}))}async sendPosCheckout(e){return Ue({...e,...this.config})}async sendSessionEvent(e){return Oe({...e,...this.config})}async initializeClientSideJdid(){let e={apiKey:this.config.apiKey,source:this.config.source},t=await Fe(this.config.eventsEndpoint,e);F.set("jdid",t),this.config.identifier.jdid=t}};S([R,y],g.prototype,"fetchCartTopperRow",1),S([R,y],g.prototype,"fetchCustomImageRow",1),S([R,y],g.prototype,"fetchCustomPlacements",1),S([R,y],g.prototype,"fetchFacets",1),S([R,y],g.prototype,"fetchFeaturedPlacements",1),S([R,y],g.prototype,"fetchMenuRow",1),S([R,y],g.prototype,"fetchMenuTopRow",1),S([R,y],g.prototype,"fetchProduct",1),S([R,y],g.prototype,"fetchProductReviews",1),S([R,y],g.prototype,"fetchRecommendedPDPRow",1),S([R,y],g.prototype,"fetchRecommendedRow",1),S([R,y],g.prototype,"fetchRecommendedSort",1),S([R,y],g.prototype,"fetchVirtualBudtenderQueries",1),S([R,y],g.prototype,"fetchVirtualBudtenderSearch",1);export{J as AdMode,be as AppMode,M as BrandSpecials,K as DEFAULT_PAGE_SIZE,Ge as IntendedDisplay,g as JaneDM,we as JaneDeviceIdSentinel,Je as PageContextEnum,A as Placement,Ke as ProductKindEnum,Qe as ReviewSortEnum,ve as SearchSortEnum,E as SmartSort,D as SmartSortProduct,O as Specials,z as VirtualBudtenderProduct,Q as bestSellerRank,L as categoryAndNameAsc,H as defaultOrder,$ as priceAsc,W as priceDesc,Z as priceEighthOunceAsc,X as priceEighthOunceDesc,Y as priceGramAsc,ee as priceGramDesc,te as priceHalfGramAsc,re as priceHalfGramDesc,se as priceHalfOunceAsc,ie as priceHalfOunceDesc,oe as priceOunceAsc,ne as priceOunceDesc,ae as priceQuarterOunceAsc,ce as priceQuarterOunceDesc,de as priceTwoGramAsc,ue as priceTwoGramDesc,pe as rating,le as recommendation,Le as searchSorts,me as thcPotencyAsc,he as thcPotencyDesc};
1
+ import{A as oe,B as ne,C as ae,D as ce,E as de,F as ue,G as pe,H as me,I as le,J as Je,a as f,b as p,c as L,d as Ie,e as ze,f as we,g as Ge,h as A,i as Ke,j as Le,k as be,l as J,m as B,n as H,o as Q,p as V,q as $,r as Z,s as X,t as Y,u as W,v as ee,w as te,x as re,y as se,z as ie}from"./chunk-TGCEYA6I.js";var ve="2.25.0";var he=(t,e)=>{let{apiKey:r,source:s}=e,i=new URL(t);return i.searchParams.set("jdm_source",s),i.searchParams.set("jdm_version",ve),r&&i.searchParams.set("jdm_api_key",r),i.searchParams.sort(),i.toString()},h=(t,e,r)=>{let s=new URL(t+e);return he(s.toString(),r)},k=(t,e)=>{let r=new URL(t+p.click),s=new URL(t+p.impression);return{clickEndpoint:he(r.toString(),e),impressionEndpoint:he(s.toString(),e)}},Pe=class extends Error{response;constructor(e,r){super(e),this.response=r}},_e=async t=>{if(t.ok){if(t.status===204)return null}else throw new Pe("Api Request Failed",t);try{return await t.json()}catch{}},Be=async(t,e)=>{let r=await fetch(t,{body:JSON.stringify(e),headers:{Accept:"application/json","Content-Type":"text/plain"},method:"POST"});return _e(r)},He=async(t,e={})=>{let{headers:r,...s}=e,i=await fetch(t,{...s,headers:{Accept:"application/json",...r},method:"GET"});return _e(i)},l={get:He,post:Be};import{nanoid as ke}from"nanoid";var b=()=>typeof window<"u"&&typeof document<"u";var Qe=(...t)=>{console.error("[JaneDmSDK]",...t)},Ve=(...t)=>{console.info("[JaneDmSDK]",...t)},$e=(...t)=>{console.log("[JaneDmSDK]",...t)},v={error:Qe,info:Ve,log:$e};var Ze=t=>{let e=localStorage.getItem(t);return e!==null?We(e):e},Xe=(t,e)=>localStorage.setItem(t,et(e)),Ye=t=>localStorage.removeItem(t),_={get:Ze,remove:Ye,set:Xe},We=t=>Ce(t)?t.substring(1,t.length-1):t,et=t=>Ce(t)?t:`"${t}"`,Ce=t=>{let r=t.length-1;return t[0]==='"'&&t[r]==='"'};var fe="j_fp_last_run",tt=1440*60*1e3,rt=20,ge=new Set,st=(t,e)=>`${t}:${e.apiKey}:${e.source}`;var it=t=>typeof t=="object"&&t!==null&&typeof t.token=="string"&&typeof t.endpoint=="string"&&typeof t.scriptUrlPattern=="string",ot=async(t,e)=>{try{let r=h(t,p.fingerprint,e),s=await l.get(r);return it(s)?s:null}catch(r){return v.error("Failed to fetch fingerprint token:",r),null}},nt=async(t,e,r,s)=>{try{let i=await import("@fingerprintjs/fingerprintjs-pro"),o=await i.load({apiKey:t,endpoint:[e,i.defaultEndpoint],region:"us",scriptUrlPattern:[r,i.defaultScriptUrlPattern],storageKey:"eyeD"}),a={tag:{isDmSdk:!0}};s?.linkedId&&(a.linkedId=s.linkedId);let c=await o.get(a);return!c||!c.visitorId?(v.error("Fingerprint JS did not return a valid visitorId"),null):{visitorId:c.visitorId}}catch(i){return v.error("Failed to run Fingerprint JS:",i),null}},xe=async(t,e,r)=>{if(!b())return ke();let s=_.get("jdid");if(!s)return await Ee(t,e,r)??ke();if(s.length!==rt)return await Se(t,e,{linkedId:s}),s;let i=await De(t,e,r);if(i)return i;if(Fe()==="error")try{_.set(fe,Date.now().toString())}catch{}return s},Fe=()=>{try{let t=_.get(fe);if(!t)return"missing";let e=parseInt(t,10);return Number.isNaN(e)?"missing":Date.now()-e>=tt?"expired":"valid"}catch{return"error"}},De=async(t,e,r)=>{let s=Fe();return s==="valid"||s==="error"?null:Ee(t,e,r)},Ee=async(t,e,r)=>{let s=st(t,e);if(ge.has(s))return null;ge.add(s);try{let i=await ot(t,e);if(!i)return null;let n=await nt(i.token,i.endpoint,i.scriptUrlPattern,r);if(!n)return null;try{_.set(fe,Date.now().toString())}catch{}return n.visitorId}catch(i){return v.error("Failed to run fingerprint:",i),null}finally{ge.delete(s)}},Se=async(t,e,r)=>{if(b()&&r?.linkedId!=="user-opt-out")try{await De(t,e,r)}catch(s){v.error("Failed to run SSR fingerprint:",s)}};var I=class t extends Error{constructor(e){super(`[Jane DM SDK]: ${e}`),this.name="SdkError",Object.setPrototypeOf(this,t.prototype)}};var Re=t=>{switch(t){case B:return"best-seller-rank";case H:return"category-and-name-asc";case V:return"price-asc";case $:return"price-desc";case Z:return"price-eighth-ounce-asc";case X:return"price-eighth-ounce-desc";case Y:return"price-gram-asc";case W:return"price-gram-desc";case ee:return"price-half-gram-asc";case te:return"price-half-gram-desc";case re:return"price-half-ounce-asc";case se:return"price-half-ounce-desc";case ie:return"price-ounce-asc";case oe:return"price-ounce-desc";case ne:return"price-quarter-ounce-asc";case ae:return"price-quarter-ounce-desc";case ce:return"price-two-gram-asc";case de:return"price-two-gram-desc";case ue:return"rating";case pe:return"recommendation";case me:return"thc-potency-asc";case le:return"thc-potency-desc";case Q:default:return"default"}};var O=t=>JSON.parse(t);var ye=class t{isSponsored;objectId;clickPayload;clickUrl;impressPayload;impressUrl;constructor(e){this.objectId=e.objectId,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored}static fromJSON(e){return new t(O(e))}serialize(){return{clickPayload:this.clickPayload,clickUrl:this.clickUrl,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},C=class t{attributes;isSponsored;objectId;clickPayload;clickUrl;hasBeenImpressed;impressPayload;impressPromise;impressUrl;constructor(e){this.objectId=e.objectId,this.attributes=e.attributes,this.impressUrl=e.impressUrl,this.impressPayload=e.impressPayload,this.clickPayload=e.clickPayload,this.clickUrl=e.clickUrl,this.isSponsored=e.isSponsored,this.hasBeenImpressed=e.hasBeenImpressed??!1}static fromJSON(e){return new t(O(e))}click(e={isAddToCart:!1}){let{isAddToCart:r=!1}=e,s={...this.clickPayload,isAddToCart:r};return l.post(this.clickUrl,s)}impress(){return this.hasBeenImpressed?Promise.resolve():(this.impressPromise??=l.post(this.impressUrl,this.impressPayload).then(()=>{this.hasBeenImpressed=!0}).finally(()=>{this.impressPromise=void 0}),this.impressPromise)}serialize(){return{attributes:this.attributes,clickPayload:this.clickPayload,clickUrl:this.clickUrl,hasBeenImpressed:this.hasBeenImpressed,impressPayload:this.impressPayload,impressUrl:this.impressUrl,isSponsored:this.isSponsored,objectId:this.objectId}}toJSON(){return JSON.stringify(this.serialize())}},x=class t{customImages;placement;products;rowId;searchFacets;title;totalProducts;creativeIds;cachedProducts;config;loadPromise;nextPageProps;nextPageUrl;constructor(e){this.rowId=e.rowId,this.searchFacets=e.searchFacets,this.nextPageUrl=e.nextPageUrl,this.nextPageProps=e.nextPageProps,this.products=e.products.map(r=>new C(r)),this.cachedProducts=e.cachedProducts.map(r=>new ye(r)),this.totalProducts=e.totalProducts,this.title=e.title,this.creativeIds=e.creativeIds,this.config=e.config,this.customImages=e.customImages??[],this.placement=e.placement,b()&&!this.config.skipAutoSmartSortOnLoad&&this.onLoad().catch(r=>v.error("Failed to run onLoad:",r))}static fromJSON(e){return new t(O(e))}hasNextPage(){return this.cachedProducts.length>0}async nextPage(){if(!this.hasNextPage())return;let e=this.cachedProducts.slice(0,this.nextPageProps.pageSize),r={app_mode:this.config.appMode,jane_device_id:this.config.identifier.jdid,object_ids:e.map(n=>n.objectId),search_attributes:this.nextPageProps.searchAttributes},s=await l.post(this.nextPageUrl,r),i=new Map(s.products?.map(n=>[n.object_id,n.search_attributes]));e.forEach(n=>{let o=i.get(n.objectId);o!==void 0&&this.products.push(new C({...n.serialize(),attributes:o}))}),this.cachedProducts=this.cachedProducts.slice(this.nextPageProps.pageSize)}async onLoad(){return this.loadPromise?this.loadPromise:(this.loadPromise=(async()=>{if(!b())return;let e={apiKey:this.config.apiKey,source:this.config.source};await Se(this.config.eventsEndpoint,e,{linkedId:this.config.identifier.jdid})})(),this.loadPromise)}serialize(){return{cachedProducts:this.cachedProducts.map(e=>e.serialize()),config:this.config,creativeIds:this.creativeIds,customImages:this.customImages,nextPageProps:this.nextPageProps,nextPageUrl:this.nextPageUrl,placement:this.placement,products:this.products.map(e=>e.serialize()),rowId:this.rowId,searchFacets:this.searchFacets,title:this.title,totalProducts:this.totalProducts}}toJSON(){return JSON.stringify(this.serialize())}},F=class{async createSmartSort(e){let r={apiKey:e.config.apiKey,source:e.config.source},s=h(e.config.endpoint,p.smart,r),i=h(e.config.pageEndpoint,p.page,r),n=this.buildSmartRequest(e),o=await l.post(s,n),{clickEndpoint:a,impressionEndpoint:c}=k(e.config.eventsEndpoint,r),{creative_ids:m,custom_images:P,products:u,row_id:d,search_facets:y,title:w}=o,{cachedProducts:D,products:E}=this.generateProducts({clickUrl:a,identifier:e.config.identifier,impressUrl:c,products:u}),T=(P??[]).map(M=>this.massageCustomImageData(M)).filter(M=>M!==void 0);return new x({cachedProducts:D,config:e.config,creativeIds:m,customImages:T,nextPageProps:{pageSize:"page_size"in n?n.page_size??60:60,searchAttributes:n.search_attributes??e.searchAttributes},nextPageUrl:i,placement:e.placement,products:E,rowId:d,searchFacets:y,title:w,totalProducts:o.nb_hits??0})}generateProducts(e){let{clickUrl:r,identifier:s,impressUrl:i,products:n}=e,o={cachedProducts:[],products:[]};return n?.forEach(a=>{let c={clickPayload:{adToken:a.ad_token,distinctId:s.mixpanelDistinctId??s.jdid,isAddToCart:!1,janeDeviceId:s.jdid,kevelToken:a.kevel_token,myHighD:a.my_high_d,productId:a.product_id,storeId:a.store_id},clickUrl:r,impressPayload:{distinctId:s.mixpanelDistinctId??s.jdid,engagements:[{adToken:a.ad_token,kevelToken:a.kevel_token,myHighD:a.my_high_d,productId:a.product_id}],janeDeviceId:s.jdid},impressUrl:i,isSponsored:!!a.flight_id,objectId:a.object_id};a.search_attributes!==void 0?o.products.push({...c,attributes:a.search_attributes}):o.cachedProducts.push(c)}),o}massageCustomImageData(e){if(e)return{headline:e.headline,imageUrl:e.image_url,intendedDisplay:e.intended_display,logoUrl:e.logo_url,overlayColor:e.overlay_color,positionX:e.position_x,positionY:e.position_y,scaleNumber:e.scale_number,textColor:e.text_color}}buildSmartRequest(e){let{config:r,searchAttributes:s,...i}=e,n={app_mode:r.appMode,distinct_id:r.identifier.mixpanelDistinctId,jane_device_id:r.identifier.jdid,pos_user_id:r.identifier.posUserId,search_attributes:s,user_id:r.identifier.userId};switch(i.placement){case"cart_toppers":{let{cartProductIds:o,posCartProductIds:a,storeId:c}=i;return{...n,cart_pos_product_ids:a,cart_product_ids:o,placement:"cart_toppers",store_id:c}}case"custom_image_row":{let{searchFilter:o,storeId:a}=i;return{...n,placement:"custom_image_row",search_filter:o,store_id:a}}case"menu_dynamic_row":{let{adMode:o,filterContext:a,pageContext:c,storeId:m}=i;return{...n,ad_mode:o??"default",filter_context:a,page_context:c,placement:"menu_dynamic_row",store_id:m}}case"menu_inline":{let{adMode:o,distinctByProduct:a,metadata:c,numColumns:m,searchFilter:P,searchQuery:u,searchSort:d,storeId:y,storeIds:w}=i;return{...n,ad_mode:o??"default",distinct_by_product:a,metadata:c,num_columns:m,placement:"menu_inline",search_filter:P,search_query:u,search_sort:Re(d),store_ids:w||[y]}}case"menu_inline_table":{let{disableAds:o,distinctByProduct:a,maxProducts:c,metadata:m,numColumns:P,pageSize:u,searchFacets:d,searchFilter:y,searchQuery:w,searchSort:D,storeId:E,storeIds:T}=i;return{...n,disable_ads:o,distinct_by_product:a,max_products:c,metadata:m,num_columns:P,page_size:u,placement:"menu_inline_table",search_attributes:s,search_facets:d,search_filter:y,search_query:w,search_sort:Re(D),store_ids:T||[E]}}case"menu_top_row":{let{searchFilter:o,storeId:a}=i,c=this.extractValidCreativeIds(e);return{...n,exclude_creative_ids:c,placement:"menu_top_row",search_filter:o,store_id:a}}case"pdp_row":{let{posProductId:o,productId:a,storeId:c}=i;return{...n,placement:"pdp_row",pos_product_id:o,product_id:a,store_id:c}}default:throw new I(`Invalid Smart Sort Placement: ${i.placement}`)}}extractValidCreativeIds(e){if(e.placement==="menu_top_row"&&"excludeCreativeIds"in e&&Array.isArray(e.excludeCreativeIds))return e.excludeCreativeIds.filter(r=>typeof r=="number")}};var ct=t=>t.placement==="specials",dt=t=>t.placement==="brand_specials",j=class{placement;title;constructor(e){this.title=e,this.placement="brand_specials"}},U=class{placement;title;constructor(e){this.title=e,this.placement="specials"}},q=class extends F{async createMultiPlacement(e){let r={apiKey:e.config.apiKey,source:e.config.source},s=h(e.config.endpoint,p.multi,r),i=h(e.config.pageEndpoint,p.page,r),n=this.buildMultiRequest(e),o=await l.post(s,n),{clickEndpoint:a,impressionEndpoint:c}=k(e.config.eventsEndpoint,r),m=[];for(let[P,u]of(o.placements||[]).entries())if(ct(u))m.push(new U(u.title));else if(dt(u))m.push(new j(u.title));else{let{creative_ids:d,custom_images:y,placement:w,products:D,row_id:E,search_facets:T,title:M}=u,{cachedProducts:Ue,products:qe}=this.generateProducts({clickUrl:a,identifier:e.config.identifier,impressUrl:c,products:D}),Ne=(y??[]).map(K=>this.massageCustomImageData(K)).filter(K=>K!==void 0);m.push(new x({cachedProducts:Ue,config:{...e.config,skipAutoSmartSortOnLoad:P===0?e.config.skipAutoSmartSortOnLoad:!0},creativeIds:d,customImages:Ne,nextPageProps:{pageSize:60,searchAttributes:n.search_attributes||[]},nextPageUrl:i,placement:w,products:qe,rowId:E,searchFacets:T,title:M,totalProducts:u.nb_hits??0}))}return m}buildMultiRequest(e){let{config:r,numColumns:s,searchAttributes:i,storeId:n,...o}=e,a={app_mode:r.appMode,distinct_id:r.identifier.mixpanelDistinctId,jane_device_id:r.identifier.jdid,num_columns:s,pos_user_id:r.identifier.posUserId,search_attributes:i,store_id:n,user_id:r.identifier.userId};switch(o.multiRequestType){case"custom":return{...a,placements:this.massageCustomPlacements(o.placements),type:"custom"};case"featured":return{...a,exclude_menu_top_row:o.excludeMenuTopRow??!1,type:"featured"};default:throw new I(`Invalid Multi Type: ${o.multiRequestType}`)}}massageCustomPlacements(e){let r=[];for(let s of e)switch(s.placement){case"best_selling":r.push({placement:"best_selling",title:s.title});break;case"brand_specials":r.push({placement:"brand_specials",title:s.title});break;case"buy_again_row":r.push({placement:"buy_again_row",title:s.title});break;case"custom_image_row":r.push({placement:"custom_image_row",search_filter:s.searchFilter});break;case"featured_row":r.push({placement:"featured_row",row_id:s.rowId});break;case"menu_dynamic_row":r.push({ad_mode:s.adMode??"default",filter_context:s.filterContext,page_context:s.pageContext,placement:"menu_dynamic_row"});break;case"menu_inline":r.push({ad_mode:s.adMode??"default",metadata:s.metadata,placement:"menu_inline",search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_inline_table":r.push({disable_ads:s.disableAds,max_products:s.maxProducts,metadata:s.metadata,page_size:s.pageSize,placement:"menu_inline_table",search_facets:s.searchFacets,search_filter:s.searchFilter,search_query:s.searchQuery,search_sort:s.searchSort,title:s.title});break;case"menu_top_row":r.push({placement:"menu_top_row",search_filter:s.searchFilter});break;case"sale":r.push({placement:"sale",title:s.title});break;case"specials":r.push({placement:"specials",title:s.title});break;default:throw new I(`Invalid Custom Placement: ${s.placement}`)}return r}};import{nanoid as Pt}from"nanoid";var Te=async t=>{let{apiKey:e,appMode:r,endpoint:s,identifier:i,searchFacets:n,searchFilter:o,searchQuery:a,source:c,storeId:m}=t,{jdid:P}=i||{},u=h(s,p.facets,{apiKey:e,source:c}),d={appMode:r,janeDeviceId:P,searchFacets:n,searchFilter:o,searchQuery:a,storeId:m};return(await l.post(u,d)).searchFacets??{}};var Me=async t=>{let{apiKey:e,endpoint:r,identifier:s,source:i,storeId:n,...o}=t,a=h(r,p.externalCheckout,{apiKey:e,source:i}),c={janeDeviceId:s.jdid,posOrderId:o.posOrderId,posUserId:o.posUserId||s.posUserId,products:o.products,storeId:n};return await l.post(a,c)};var N=class{async create(e){let{config:r,searchAttributes:s,storeId:i,...n}=e,o={apiKey:r.apiKey,source:r.source},a=h(r.endpoint,p.product,o),{clickEndpoint:c,impressionEndpoint:m}=k(r.eventsEndpoint,o),P={app_mode:r.appMode,distinct_id:r.identifier.mixpanelDistinctId,jane_device_id:r.identifier.jdid,pos_user_id:r.identifier.posUserId,search_attributes:s,store_id:i,user_id:r.identifier.userId},u=n.productId!==void 0?{...P,product_id:n.productId}:{...P,pos_product_id:n.posProductId},d=await l.post(a,u);return new C({attributes:d.search_attributes,clickPayload:{adToken:d.ad_token,distinctId:r.identifier.mixpanelDistinctId,isAddToCart:!1,janeDeviceId:r.identifier.jdid,kevelToken:d.kevel_token,myHighD:d.my_high_d,productId:d.product_id,storeId:i},clickUrl:c,impressPayload:{distinctId:r.identifier.mixpanelDistinctId??r.identifier.jdid,engagements:[{adToken:d.ad_token,kevelToken:d.kevel_token,myHighD:d.my_high_d,productId:d.product_id}],janeDeviceId:r.identifier.jdid},impressUrl:m,isSponsored:!!d.flight_id,objectId:d.object_id})}};var ut=t=>({activities:t.activities,avatar:t.avatar,comment:t.comment,createdAt:t.created_at,feelings:t.feelings,hasComment:t.has_comment,id:t.id,nickname:t.nickname,productId:t.product_id,rating:t.rating,storeId:t.store_id,storeName:t.store_name,updatedAt:t.updated_at,upvoteCount:t.upvote_count}),pt=t=>({activitiesDistribution:t.activities_distribution,averageRating:t.average_rating,distribution:t.distribution,feelingsDistribution:t.feelings_distribution,reviewCount:t.review_count}),mt=(t,e,r)=>{let s=t.total_count,i=Math.max(1,Math.ceil(s/r));return{aggregate:pt(t.aggregate),aiSummary:t.ai_summary,items:t.reviews.map(ut),pagination:{currentPage:e,hasNextPage:e<i,hasPreviousPage:e>1,pageSize:r,totalCount:s,totalPages:i},productId:t.product_id}},Ae=async t=>{let{activities:e,config:r,feelings:s,hasComment:i,page:n,pageSize:o,productId:a,ratings:c,sort:m}=t,P=n??1,u=o??50,d=h(r.endpoint,p.productReviews,{apiKey:r.apiKey,source:r.source}),y={activities:e,feelings:s,has_comment:i||void 0,page:n,page_size:o,product_id:a,ratings:c,sort:m},w=await l.post(d,y);return mt(w,P,u)},Oe=t=>{let e={[Symbol.asyncIterator]:async function*(){let r=1;for(;;){let s=await t(r);if(yield s,!s.pagination.hasNextPage)return;r+=1}}};return{pages:e,[Symbol.asyncIterator]:async function*(){for await(let r of e)yield*r.items}}};var je=async t=>{let{apiKey:e,eventsEndpoint:r,identifier:s,source:i,...n}=t,o=h(r,p.sessionEvent,{apiKey:e,source:i}),a={distinctId:s.mixpanelDistinctId,events:n.events,janeDeviceId:s.jdid};return await l.post(o,a)};function S(t,e,r){let s=r.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return r.value=async function(...i){return await this.init(),s.apply(this,i)},r}function R(t,e,r){let s=r.value;if(!s)throw new Error("Decorator applied to invalid method descriptor");return r.value=async function(...i){if(!this.rateLimiter)throw new Error("throttle decorator can only be used on JaneDM class methods");return this.rateLimiter.schedule(async()=>s.apply(this,i))},r}var z=class{burst;intervalMs;rate;tat=0;toleranceMs;constructor(e,r=1){if(e<=0)throw new I("rate must be > 0");if(r<1)throw new I("burst must be >= 1");this.rate=e,this.burst=Math.floor(r),this.intervalMs=1e3/this.rate,this.toleranceMs=(this.burst-1)*this.intervalMs}async schedule(e){let r=Date.now(),s=Math.max(0,this.tat-this.toleranceMs-r);this.tat=Math.max(this.tat,r)+this.intervalMs;let i=async()=>e();return s>0?new Promise((n,o)=>setTimeout(()=>i().then(n).catch(o),s)):i()}};var lt=/^https?:\/\//,ht=/^(https?:\/\/)?(([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}|localhost)(:\d+)?(\/.*)?$/,G=(t,e)=>{let s=lt.test(t??e)?t??e:`https://${t}`,i=new URL(s);return ht.test(i.toString())?i.protocol+"//"+i.host:e};var g=class{config;rateLimiter;initialized=!1;multiClient;productClient;smartSortClient;userProvidedJdid=!1;constructor(e,r){let{apiKey:s,endpoint:i,identifier:n}=e,{appMode:o="headless",eventsEndpoint:a,pageEndpoint:c,skipAutoSmartSortOnLoad:m=!1,source:P="sdk"}=r??{},u=G(i,"https://dmerch.iheartjane.com"),d=G(a,u),y=G(c,u);this.userProvidedJdid=!!n?.jdid,this.config={apiKey:s,appMode:o,endpoint:u,eventsEndpoint:d,identifier:n??{jdid:""},pageEndpoint:y,skipAutoSmartSortOnLoad:m,source:P},this.smartSortClient=new F,this.multiClient=new q,this.productClient=new N,this.rateLimiter=new z(10,20)}static generateJaneDeviceId(){return Pt()}async fetchCartTopperRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"cart_toppers"})}async fetchCustomImageRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"custom_image_row"})}async fetchCustomPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"custom",...e})}async fetchFacets(e){return Te({...e,...this.config})}async fetchFeaturedPlacements(e){return await this.multiClient.createMultiPlacement({config:this.config,multiRequestType:"featured",...e})}async fetchMenuRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline"})}async fetchMenuTopRow(e){return this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_top_row"})}async fetchProduct(e){return this.productClient.create({config:this.config,...e})}async fetchProductReviews(e){return Ae({config:this.config,...e})}async fetchRecommendedPDPRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"pdp_row"})}async fetchRecommendedRow(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_dynamic_row"})}async fetchRecommendedSort(e){return await this.smartSortClient.createSmartSort({...e,config:this.config,placement:"menu_inline_table"})}getJaneDeviceId(){return this.config.identifier.jdid}async init(){this.initialized||(b()&&!this.userProvidedJdid&&await this.initializeClientSideJdid(),this.initialized=!0)}iterateProductReviews(e){return Oe(r=>this.fetchProductReviews({...e,page:r}))}async sendPosCheckout(e){return Me({...e,...this.config})}async sendSessionEvent(e){return je({...e,...this.config})}async initializeClientSideJdid(){let e={apiKey:this.config.apiKey,source:this.config.source},r=await xe(this.config.eventsEndpoint,e);_.set("jdid",r),this.config.identifier.jdid=r}};f([S,R],g.prototype,"fetchCartTopperRow",1),f([S,R],g.prototype,"fetchCustomImageRow",1),f([S,R],g.prototype,"fetchCustomPlacements",1),f([S,R],g.prototype,"fetchFacets",1),f([S,R],g.prototype,"fetchFeaturedPlacements",1),f([S,R],g.prototype,"fetchMenuRow",1),f([S,R],g.prototype,"fetchMenuTopRow",1),f([S,R],g.prototype,"fetchProduct",1),f([S,R],g.prototype,"fetchProductReviews",1),f([S,R],g.prototype,"fetchRecommendedPDPRow",1),f([S,R],g.prototype,"fetchRecommendedRow",1),f([S,R],g.prototype,"fetchRecommendedSort",1);export{L as AdMode,Ie as AppMode,j as BrandSpecials,J as DEFAULT_PAGE_SIZE,ze as IntendedDisplay,g as JaneDM,we as JaneDeviceIdSentinel,Ge as PageContextEnum,A as Placement,Ke as ProductKindEnum,Le as ReviewSortEnum,be as SearchSortEnum,x as SmartSort,C as SmartSortProduct,U as Specials,B as bestSellerRank,H as categoryAndNameAsc,Q as defaultOrder,V as priceAsc,$ as priceDesc,Z as priceEighthOunceAsc,X as priceEighthOunceDesc,Y as priceGramAsc,W as priceGramDesc,ee as priceHalfGramAsc,te as priceHalfGramDesc,re as priceHalfOunceAsc,se as priceHalfOunceDesc,ie as priceOunceAsc,oe as priceOunceDesc,ne as priceQuarterOunceAsc,ae as priceQuarterOunceDesc,ce as priceTwoGramAsc,de as priceTwoGramDesc,ue as rating,pe as recommendation,Je as searchSorts,me as thcPotencyAsc,le as thcPotencyDesc};
@@ -38,8 +38,7 @@ declare enum Placement {
38
38
  MenuTopRow = "menu_top_row",
39
39
  PdpRow = "pdp_row",
40
40
  Sale = "sale",
41
- Specials = "specials",
42
- VirtualBudtenderSearch = "virtual_budtender_search"
41
+ Specials = "specials"
43
42
  }
44
43
  declare enum ProductKindEnum {
45
44
  Edible = "edible",
@@ -108,7 +107,7 @@ type Click = {
108
107
  */
109
108
  distinctId?: string;
110
109
  /**
111
- * Should be true if the click ads the product to the cart
110
+ * Should be true if the click adds the product to the cart
112
111
  */
113
112
  isAddToCart?: boolean;
114
113
  /**
@@ -200,10 +199,6 @@ interface ProductReviewsResponse$1 {
200
199
  }
201
200
  interface ProductsPlacementResponse {
202
201
  creative_ids?: number[];
203
- /**
204
- * @deprecated true
205
- */
206
- custom_image_data?: CustomImageData$1;
207
202
  custom_images?: CustomImageData$1[];
208
203
  nb_hits?: number;
209
204
  placement?: Placement;
@@ -285,74 +280,6 @@ interface SpecialsPlacementResponse {
285
280
  specials?: SpecialResponse[];
286
281
  title?: string;
287
282
  }
288
- type VirtualBudtenderProduct = {
289
- /**
290
- * AI-generated explanation for why this product matches the query
291
- *
292
- * @example This product contains CBD which is known for its calming effects and may help with sleep
293
- */
294
- reasoning?: string;
295
- /**
296
- * Relevance score for this product (0 to 10)
297
- *
298
- * @example 8.5
299
- * @format float
300
- * @maximum 10
301
- * @minimum 0
302
- */
303
- score?: number;
304
- } & Product;
305
- interface VirtualBudtenderQuery {
306
- /**
307
- * Human-readable display text for the query
308
- *
309
- * @example Help me sleep
310
- */
311
- displayText: string;
312
- /**
313
- * The natural language query string
314
- *
315
- * @example help me sleep
316
- */
317
- query: string;
318
- }
319
- interface VirtualBudtenderSearchResponse {
320
- /**
321
- * AI-generated response in HTML format
322
- *
323
- * @example <p>Based on your request for sleep help, I recommend these products...</p>
324
- */
325
- htmlResponse: string;
326
- /**
327
- * AI-generated response in markdown format
328
- *
329
- * @example Based on your request for sleep help, I recommend these products that contain CBD and indica strains...
330
- */
331
- markdownResponse: string;
332
- /**
333
- * List of products matching the query
334
- */
335
- products: VirtualBudtenderProduct[];
336
- /**
337
- * The original query that was searched
338
- *
339
- * @example help me sleep
340
- */
341
- query: string;
342
- /**
343
- * Total number of products found
344
- *
345
- * @example 15
346
- * @minimum 0
347
- */
348
- totalResults: number;
349
- /**
350
- * Raw AI-generated response without formatting
351
- *
352
- * @example Based on your request for sleep help, I recommend these products that contain CBD and indica strains...
353
- */
354
- unformattedResponse: string;
355
- }
356
283
 
357
284
  /**
358
285
  * Configuration options for the Jane DM SDK client.
@@ -1079,4 +1006,4 @@ interface SmartSortProps<ProductShape extends object = Record<string, unknown>>
1079
1006
  totalProducts: number;
1080
1007
  }
1081
1008
 
1082
- export { priceEighthOunceDesc as $, AdMode as A, type JaneDMConfig as B, type Click as C, DEFAULT_PAGE_SIZE as D, type JaneDMIdentifiers as E, type FilterContext as F, JaneDeviceIdSentinel as G, type PaginationInfo as H, type Impression as I, type JaneDMPublicConfig as J, ProductKindEnum as K, type ProductReview as L, type ProductReviewsAggregate as M, ReviewSortEnum as N, type SearchSort as O, Placement as P, type SmartSortNextPageProps as Q, type RequiredConfig as R, SearchSortEnum as S, type VirtualBudtenderSearchResponse as T, bestSellerRank as U, type VirtualBudtenderQuery as V, categoryAndNameAsc as W, defaultOrder as X, priceAsc as Y, priceDesc as Z, priceEighthOunceAsc as _, PageContextEnum as a, priceGramAsc as a0, priceGramDesc as a1, priceHalfGramAsc as a2, priceHalfGramDesc as a3, priceHalfOunceAsc as a4, priceHalfOunceDesc as a5, priceOunceAsc as a6, priceOunceDesc as a7, priceQuarterOunceAsc as a8, priceQuarterOunceDesc as a9, priceTwoGramAsc as aa, priceTwoGramDesc as ab, rating as ac, recommendation as ad, searchSorts as ae, thcPotencyAsc as af, thcPotencyDesc as ag, type PlacementResponse as ah, type Product as ai, type ProductReviewsResponse$1 as aj, type ProductsPlacementResponse as ak, type PageResponse as al, type CustomImageData$1 as am, type CustomImageData as b, type SmartSortProductProps as c, type SmartSortClickIntent as d, type SmartSortProps as e, type ConversionExternalProduct as f, type SessionEvent as g, type JaneDMInternalConfig as h, type FetchCartTopperRowProps as i, type FetchCustomImageRowProps as j, type Facets as k, type FetchMenuRowProps as l, type FetchMenuTopRowProps as m, type FetchProductReviewsProps as n, type ProductReviewsResponse as o, type FetchRecommendedPDPRowProps as p, type FetchRecommendedRowProps as q, type FetchRecommendedSortProps as r, type IterateProductReviewsProps as s, type ProductReviewsIterable as t, AppMode as u, type FetchCartTopperRowByPosProductId as v, type FetchCartTopperRowByProductProps as w, type FetchRecommendedPDPRowByPosProductId as x, type FetchRecommendedPDPRowByProductId as y, IntendedDisplay as z };
1009
+ export { priceHalfGramDesc as $, AdMode as A, JaneDeviceIdSentinel as B, type CustomImageData as C, DEFAULT_PAGE_SIZE as D, type PaginationInfo as E, type FilterContext as F, ProductKindEnum as G, type ProductReview as H, type IterateProductReviewsProps as I, type JaneDMPublicConfig as J, type ProductReviewsAggregate as K, ReviewSortEnum as L, type SearchSort as M, type SmartSortNextPageProps as N, bestSellerRank as O, Placement as P, categoryAndNameAsc as Q, type RequiredConfig as R, SearchSortEnum as S, defaultOrder as T, priceAsc as U, priceDesc as V, priceEighthOunceAsc as W, priceEighthOunceDesc as X, priceGramAsc as Y, priceGramDesc as Z, priceHalfGramAsc as _, PageContextEnum as a, priceHalfOunceAsc as a0, priceHalfOunceDesc as a1, priceOunceAsc as a2, priceOunceDesc as a3, priceQuarterOunceAsc as a4, priceQuarterOunceDesc as a5, priceTwoGramAsc as a6, priceTwoGramDesc as a7, rating as a8, recommendation as a9, searchSorts as aa, thcPotencyAsc as ab, thcPotencyDesc as ac, type PlacementResponse as ad, type Product as ae, type ProductReviewsResponse$1 as af, type ProductsPlacementResponse as ag, type PageResponse as ah, type CustomImageData$1 as ai, type SmartSortProductProps as b, type SmartSortClickIntent as c, type SmartSortProps as d, type ConversionExternalProduct as e, type SessionEvent as f, type JaneDMInternalConfig as g, type FetchCartTopperRowProps as h, type FetchCustomImageRowProps as i, type Facets as j, type FetchMenuRowProps as k, type FetchMenuTopRowProps as l, type FetchProductReviewsProps as m, type ProductReviewsResponse as n, type FetchRecommendedPDPRowProps as o, type FetchRecommendedRowProps as p, type FetchRecommendedSortProps as q, type ProductReviewsIterable as r, AppMode as s, type FetchCartTopperRowByPosProductId as t, type FetchCartTopperRowByProductProps as u, type FetchRecommendedPDPRowByPosProductId as v, type FetchRecommendedPDPRowByProductId as w, IntendedDisplay as x, type JaneDMConfig as y, type JaneDMIdentifiers as z };
@@ -38,8 +38,7 @@ declare enum Placement {
38
38
  MenuTopRow = "menu_top_row",
39
39
  PdpRow = "pdp_row",
40
40
  Sale = "sale",
41
- Specials = "specials",
42
- VirtualBudtenderSearch = "virtual_budtender_search"
41
+ Specials = "specials"
43
42
  }
44
43
  declare enum ProductKindEnum {
45
44
  Edible = "edible",
@@ -108,7 +107,7 @@ type Click = {
108
107
  */
109
108
  distinctId?: string;
110
109
  /**
111
- * Should be true if the click ads the product to the cart
110
+ * Should be true if the click adds the product to the cart
112
111
  */
113
112
  isAddToCart?: boolean;
114
113
  /**
@@ -200,10 +199,6 @@ interface ProductReviewsResponse$1 {
200
199
  }
201
200
  interface ProductsPlacementResponse {
202
201
  creative_ids?: number[];
203
- /**
204
- * @deprecated true
205
- */
206
- custom_image_data?: CustomImageData$1;
207
202
  custom_images?: CustomImageData$1[];
208
203
  nb_hits?: number;
209
204
  placement?: Placement;
@@ -285,74 +280,6 @@ interface SpecialsPlacementResponse {
285
280
  specials?: SpecialResponse[];
286
281
  title?: string;
287
282
  }
288
- type VirtualBudtenderProduct = {
289
- /**
290
- * AI-generated explanation for why this product matches the query
291
- *
292
- * @example This product contains CBD which is known for its calming effects and may help with sleep
293
- */
294
- reasoning?: string;
295
- /**
296
- * Relevance score for this product (0 to 10)
297
- *
298
- * @example 8.5
299
- * @format float
300
- * @maximum 10
301
- * @minimum 0
302
- */
303
- score?: number;
304
- } & Product;
305
- interface VirtualBudtenderQuery {
306
- /**
307
- * Human-readable display text for the query
308
- *
309
- * @example Help me sleep
310
- */
311
- displayText: string;
312
- /**
313
- * The natural language query string
314
- *
315
- * @example help me sleep
316
- */
317
- query: string;
318
- }
319
- interface VirtualBudtenderSearchResponse {
320
- /**
321
- * AI-generated response in HTML format
322
- *
323
- * @example <p>Based on your request for sleep help, I recommend these products...</p>
324
- */
325
- htmlResponse: string;
326
- /**
327
- * AI-generated response in markdown format
328
- *
329
- * @example Based on your request for sleep help, I recommend these products that contain CBD and indica strains...
330
- */
331
- markdownResponse: string;
332
- /**
333
- * List of products matching the query
334
- */
335
- products: VirtualBudtenderProduct[];
336
- /**
337
- * The original query that was searched
338
- *
339
- * @example help me sleep
340
- */
341
- query: string;
342
- /**
343
- * Total number of products found
344
- *
345
- * @example 15
346
- * @minimum 0
347
- */
348
- totalResults: number;
349
- /**
350
- * Raw AI-generated response without formatting
351
- *
352
- * @example Based on your request for sleep help, I recommend these products that contain CBD and indica strains...
353
- */
354
- unformattedResponse: string;
355
- }
356
283
 
357
284
  /**
358
285
  * Configuration options for the Jane DM SDK client.
@@ -1079,4 +1006,4 @@ interface SmartSortProps<ProductShape extends object = Record<string, unknown>>
1079
1006
  totalProducts: number;
1080
1007
  }
1081
1008
 
1082
- export { priceEighthOunceDesc as $, AdMode as A, type JaneDMConfig as B, type Click as C, DEFAULT_PAGE_SIZE as D, type JaneDMIdentifiers as E, type FilterContext as F, JaneDeviceIdSentinel as G, type PaginationInfo as H, type Impression as I, type JaneDMPublicConfig as J, ProductKindEnum as K, type ProductReview as L, type ProductReviewsAggregate as M, ReviewSortEnum as N, type SearchSort as O, Placement as P, type SmartSortNextPageProps as Q, type RequiredConfig as R, SearchSortEnum as S, type VirtualBudtenderSearchResponse as T, bestSellerRank as U, type VirtualBudtenderQuery as V, categoryAndNameAsc as W, defaultOrder as X, priceAsc as Y, priceDesc as Z, priceEighthOunceAsc as _, PageContextEnum as a, priceGramAsc as a0, priceGramDesc as a1, priceHalfGramAsc as a2, priceHalfGramDesc as a3, priceHalfOunceAsc as a4, priceHalfOunceDesc as a5, priceOunceAsc as a6, priceOunceDesc as a7, priceQuarterOunceAsc as a8, priceQuarterOunceDesc as a9, priceTwoGramAsc as aa, priceTwoGramDesc as ab, rating as ac, recommendation as ad, searchSorts as ae, thcPotencyAsc as af, thcPotencyDesc as ag, type PlacementResponse as ah, type Product as ai, type ProductReviewsResponse$1 as aj, type ProductsPlacementResponse as ak, type PageResponse as al, type CustomImageData$1 as am, type CustomImageData as b, type SmartSortProductProps as c, type SmartSortClickIntent as d, type SmartSortProps as e, type ConversionExternalProduct as f, type SessionEvent as g, type JaneDMInternalConfig as h, type FetchCartTopperRowProps as i, type FetchCustomImageRowProps as j, type Facets as k, type FetchMenuRowProps as l, type FetchMenuTopRowProps as m, type FetchProductReviewsProps as n, type ProductReviewsResponse as o, type FetchRecommendedPDPRowProps as p, type FetchRecommendedRowProps as q, type FetchRecommendedSortProps as r, type IterateProductReviewsProps as s, type ProductReviewsIterable as t, AppMode as u, type FetchCartTopperRowByPosProductId as v, type FetchCartTopperRowByProductProps as w, type FetchRecommendedPDPRowByPosProductId as x, type FetchRecommendedPDPRowByProductId as y, IntendedDisplay as z };
1009
+ export { priceHalfGramDesc as $, AdMode as A, JaneDeviceIdSentinel as B, type CustomImageData as C, DEFAULT_PAGE_SIZE as D, type PaginationInfo as E, type FilterContext as F, ProductKindEnum as G, type ProductReview as H, type IterateProductReviewsProps as I, type JaneDMPublicConfig as J, type ProductReviewsAggregate as K, ReviewSortEnum as L, type SearchSort as M, type SmartSortNextPageProps as N, bestSellerRank as O, Placement as P, categoryAndNameAsc as Q, type RequiredConfig as R, SearchSortEnum as S, defaultOrder as T, priceAsc as U, priceDesc as V, priceEighthOunceAsc as W, priceEighthOunceDesc as X, priceGramAsc as Y, priceGramDesc as Z, priceHalfGramAsc as _, PageContextEnum as a, priceHalfOunceAsc as a0, priceHalfOunceDesc as a1, priceOunceAsc as a2, priceOunceDesc as a3, priceQuarterOunceAsc as a4, priceQuarterOunceDesc as a5, priceTwoGramAsc as a6, priceTwoGramDesc as a7, rating as a8, recommendation as a9, searchSorts as aa, thcPotencyAsc as ab, thcPotencyDesc as ac, type PlacementResponse as ad, type Product as ae, type ProductReviewsResponse$1 as af, type ProductsPlacementResponse as ag, type PageResponse as ah, type CustomImageData$1 as ai, type SmartSortProductProps as b, type SmartSortClickIntent as c, type SmartSortProps as d, type ConversionExternalProduct as e, type SessionEvent as f, type JaneDMInternalConfig as g, type FetchCartTopperRowProps as h, type FetchCustomImageRowProps as i, type Facets as j, type FetchMenuRowProps as k, type FetchMenuTopRowProps as l, type FetchProductReviewsProps as m, type ProductReviewsResponse as n, type FetchRecommendedPDPRowProps as o, type FetchRecommendedRowProps as p, type FetchRecommendedSortProps as q, type ProductReviewsIterable as r, AppMode as s, type FetchCartTopperRowByPosProductId as t, type FetchCartTopperRowByProductProps as u, type FetchRecommendedPDPRowByPosProductId as v, type FetchRecommendedPDPRowByProductId as w, IntendedDisplay as x, type JaneDMConfig as y, type JaneDMIdentifiers as z };
@@ -1 +1 @@
1
- "use strict";var T=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var ie=(e,t)=>{for(var r in t)T(e,r,{get:t[r],enumerable:!0})},ce=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of se(t))!ae.call(e,n)&&n!==r&&T(e,n,{get:()=>t[n],enumerable:!(o=ne(t,n))||o.enumerable});return e};var pe=e=>ce(T({},"__esModule",{value:!0}),e);var Re={};ie(Re,{buildCustomImageData:()=>$,buildProduct:()=>k,buildProductReview:()=>L,buildProductReviewsAggregate:()=>J,buildProductsPlacementResponse:()=>p,buildSmartSortProductProps:()=>M,buildSmartSortProps:()=>H,mockClick:()=>A,mockFacets:()=>V,mockFetchProduct:()=>U,mockFetchProductReviews:()=>z,mockFingerprint:()=>E,mockImpression:()=>O,mockMultiFeaturedPlacements:()=>G,mockSessionEvent:()=>Z,mockSmartSortPage:()=>K,mockSmartSortPlacements:()=>W,mockVirtualBudtenderQueries:()=>X,mockVirtualBudtenderSearch:()=>Y});module.exports=pe(Re);var s={click:"/v2/event/2",externalCheckout:"/v2/event/3e",facets:"/v2/facets",fingerprint:"/fp/token",impression:"/v2/event/1",multi:"/v2/multi",page:"/v2/smartpage",product:"/v2/product",productReviews:"/v2/product/reviews",sessionEvent:"/v2/event/session",smart:"/v2/smart",virtualBudtenderQueries:"/v2/virtual-budtender/queries",virtualBudtenderSearch:"/v2/virtual-budtender"};var w=(o=>(o.Desktop="desktop",o.Kiosk="kiosk",o.Mobile="mobile",o))(w||{});var x=require("msw"),A=(e,t)=>x.http.post(`${e}${s.click}*`,async({request:r})=>{let o=new URL(r.url);if(t){let n=await r.json();t({reqBody:n,url:o})}return x.HttpResponse.json({},{status:200})}),O=(e,t)=>x.http.post(`${e}${s.impression}*`,async({request:r})=>{let o=new URL(r.url);if(t){let n=await r.json();t({reqBody:n,url:o})}return x.HttpResponse.json({},{status:200})});var F=require("@faker-js/faker");var j=(e={})=>{let{identifier:t,...r}=e;return{apiKey:F.faker.string.uuid(),appMode:"default",endpoint:"http://localhost:4200",eventsEndpoint:"http://localhost:4200",identifier:{jdid:F.faker.string.uuid(),...t},pageEndpoint:"http://localhost:4200",skipAutoSmartSortOnLoad:!1,source:"test",...r}};var v=require("msw"),de=(e={})=>({searchFacets:e}),V=({callback:e,endpoint:t,facets:r})=>v.http.post(`${t}${s.facets}`,async({request:o})=>{if(e){let n=new URL(o.url),i=await o.json();e({reqBody:i,url:n})}return v.HttpResponse.json(de(r),{status:200})});var C=require("msw"),E=({callback:e,endpoint:t,response:r})=>C.http.get(`${t}${s.fingerprint}`,async({request:o})=>{if(e){let n=new URL(o.url);e({reqBody:{},url:n})}return C.HttpResponse.json(r??{},{status:200})});var me=require("@faker-js/faker");var I=require("msw");var a=require("@faker-js/faker");var k=(e={})=>({ad_token:a.faker.string.uuid(),object_id:a.faker.string.uuid(),product_id:a.faker.number.int(),store_id:a.faker.number.int(),...e}),$=(e={})=>({headline:a.faker.company.catchPhrase(),image_url:a.faker.image.url(),intended_display:a.faker.helpers.arrayElement(Object.values(w)),logo_url:a.faker.internet.url(),overlay_color:a.faker.color.rgb(),position_x:a.faker.number.int({max:100,min:0}),position_y:a.faker.number.int({max:100,min:0}),scale_number:a.faker.number.float({max:2,min:.5}),text_color:a.faker.color.rgb(),...e}),p=(e={})=>{let{products:t=[k()],...r}=e;return{nb_hits:t.length,placement:"menu_dynamic_row",products:t,search_facets:{},...r}},M=(e={})=>({...N(e),attributes:e.attributes??{},hasBeenImpressed:e.hasBeenImpressed??!1}),N=(e={})=>{let{endpoint:t="http://localhost:4242",eventsEndpoint:r,...o}=e,n=r??t,i=a.faker.string.uuid(),P=a.faker.datatype.boolean(),d=a.faker.string.uuid(),g=a.faker.string.uuid(),b=a.faker.string.uuid(),f=a.faker.number.int(),_=a.faker.number.int(),l=`${n}${s.click}`,y=`${n}${s.impression}`;return{clickPayload:{adToken:i,distinctId:d,isAddToCart:P,janeDeviceId:d,kevelToken:g,myHighD:b,productId:f,storeId:_},clickUrl:l,impressPayload:{distinctId:d,engagements:[{adToken:i,kevelToken:g,myHighD:b,productId:f}],janeDeviceId:d},impressUrl:y,isSponsored:!1,objectId:a.faker.string.uuid(),...o}},ee=(e={})=>({object_id:a.faker.string.uuid(),...e}),Q=(e={})=>({products:[ee()],...e}),H=(e={creativeIds:[],endpoint:"http://localhost:4242",searchFacets:{},title:a.faker.company.catchPhrase()})=>{let{cachedProducts:t=[N()],endpoint:r="http://localhost:4242",eventsEndpoint:o,config:n=j({endpoint:r,eventsEndpoint:o??r}),creativeIds:i=[],customImages:P=[],placement:d="menu_dynamic_row",products:g=[M()],searchFacets:b={},title:f=a.faker.company.catchPhrase(),..._}=e,{totalProducts:l=t.length+g.length}=_,y=`${r}${s.page}`;return{cachedProducts:t,config:n,creativeIds:i,customImages:P,nextPageProps:{pageSize:60,searchAttributes:["*"]},nextPageUrl:y,placement:d,products:g,searchFacets:b,title:f,totalProducts:l}};var G=e=>{let{callback:t,endpoint:r,placements:o=[p({placement:"menu_top_row"}),p({placement:"menu_dynamic_row"}),p({placement:"menu_inline"})]}=e;return I.http.post(`${r}${s.multi}`,async({request:n})=>{let i=await n.json();return t&&t({reqBody:i,url:new URL(n.url)}),I.HttpResponse.json({placements:o},{status:200})})};var te=require("msw");var D=require("msw");var U=e=>{let{callback:t,endpoint:r,product:o=k()}=e;return D.http.post(`${r}${s.product}`,async({request:n})=>{let i=await n.json();return t&&t({reqBody:i,url:new URL(n.url)}),D.HttpResponse.json(o,{status:200})})};var m=require("@faker-js/faker");var B=require("msw"),L=(e={})=>({activities:[],avatar:m.faker.number.int({max:11,min:0}),comment:m.faker.lorem.sentence(),createdAt:m.faker.date.anytime().toISOString(),feelings:[],hasComment:!0,id:m.faker.number.int(),nickname:"w******a",productId:m.faker.number.int(),rating:m.faker.number.float({fractionDigits:1,max:5,min:0}),updatedAt:m.faker.date.anytime().toISOString(),upvoteCount:m.faker.number.int(),...e}),J=(e={})=>({activitiesDistribution:{},averageRating:m.faker.number.float({fractionDigits:1,max:5,min:0}),distribution:{1:1,2:2,3:5,4:10,5:20},feelingsDistribution:{},reviewCount:m.faker.number.int({max:100,min:0}),...e}),re=(e={})=>({created_at:"2026-01-15T12:00:00Z",has_comment:!0,id:1,product_id:123,rating:5,updated_at:"2026-01-15T12:00:00Z",upvote_count:0,...e}),oe=(e={})=>({average_rating:4.5,distribution:{1:1,2:2,3:5,4:10,5:20},review_count:38,...e}),le=(e={})=>({aggregate:oe(),product_id:123,reviews:[re()],total_count:1,...e}),z=({callback:e,endpoint:t,response:r})=>B.http.post(`${t}${s.productReviews}`,async({request:o})=>{if(e){let n=new URL(o.url),i=await o.json();e({reqBody:i,url:n})}return B.HttpResponse.json(le(r),{status:200})});var q=require("msw"),Z=(e,t)=>q.http.post(`${e}${s.sessionEvent}`,async({request:r})=>{if(t){let o=new URL(r.url),n=await r.json();t({reqBody:n,url:o})}return q.HttpResponse.json({},{status:200})});var u=require("msw");var W=e=>{let{callback:t,endpoint:r,...o}=e;if(!Object.values(o).some(l=>l!==void 0)){let l=Object.keys(o).join(", ");throw new Error(`At least one of [${l}] must be defined in props.`)}let{cartToppers:i,customImageRow:P,menuRow:d,menuTopRow:g,pdpRow:b,recommendedRow:f,recommendedSort:_}=o;return u.http.post(`${r}${s.smart}`,async({request:l})=>{let y=await l.json();if(t){let c=new URL(l.url);t({reqBody:y,url:c})}let{placement:R}=y;if(R==="cart_toppers"&&i){let c=p(i);return u.HttpResponse.json(c,{status:200})}if(R==="menu_inline"&&d){let c=p(d);return u.HttpResponse.json(c,{status:200})}if(R==="menu_inline_table"&&_){let c=p(_);return u.HttpResponse.json(c,{status:200})}if(R==="menu_dynamic_row"&&f){let c=p(f);return u.HttpResponse.json(c,{status:200})}if(R==="custom_image_row"&&P){let c=p(P);return u.HttpResponse.json(c,{status:200})}if(R==="menu_top_row"&&g){let c=p(g);return u.HttpResponse.json(c,{status:200})}if(R==="pdp_row"&&b){let c=p(b);return u.HttpResponse.json(c,{status:200})}return u.HttpResponse.text("Invalid placement",{status:400})})},K=(e={endpoint:"https://the.weed.shop",response:{}})=>{let{callback:t,endpoint:r,response:o}=e,n=Q(o);return u.http.post(`${r}${s.page}`,async({request:i})=>{if(t){let P=new URL(i.url),d=await i.json();t({reqBody:d,url:P})}return u.HttpResponse.json(n,{status:200})})};var h=require("msw"),Pe=(e=[])=>({queries:e}),ge=(e={})=>({htmlResponse:"<p>Here are some products to help you sleep...</p>",markdownResponse:"Here are some products to help you sleep...",products:[],query:"help me sleep",totalResults:0,unformattedResponse:"Here are some products to help you sleep...",...e}),X=({callback:e,endpoint:t,queries:r})=>h.http.post(`${t}${s.virtualBudtenderQueries}`,async({request:o})=>{if(e){let n=new URL(o.url),i=await o.json();e({reqBody:i,url:n})}return h.HttpResponse.json(Pe(r),{status:200})}),Y=({callback:e,endpoint:t,response:r})=>h.http.post(`${t}${s.virtualBudtenderSearch}`,async({request:o})=>{if(e){let n=new URL(o.url),i=await o.json();e({reqBody:i,url:n})}return h.HttpResponse.json(ge(r),{status:200})});0&&(module.exports={buildCustomImageData,buildProduct,buildProductReview,buildProductReviewsAggregate,buildProductsPlacementResponse,buildSmartSortProductProps,buildSmartSortProps,mockClick,mockFacets,mockFetchProduct,mockFetchProductReviews,mockFingerprint,mockImpression,mockMultiFeaturedPlacements,mockSessionEvent,mockSmartSortPage,mockSmartSortPlacements,mockVirtualBudtenderQueries,mockVirtualBudtenderSearch});
1
+ "use strict";var O=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var ne=(e,t)=>{for(var r in t)O(e,r,{get:t[r],enumerable:!0})},se=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of re(t))!oe.call(e,n)&&n!==r&&O(e,n,{get:()=>t[n],enumerable:!(o=te(t,n))||o.enumerable});return e};var ce=e=>se(O({},"__esModule",{value:!0}),e);var me={};ne(me,{buildCustomImageData:()=>N,buildProduct:()=>k,buildProductReview:()=>J,buildProductReviewsAggregate:()=>V,buildProductsPlacementResponse:()=>p,buildSmartSortProductProps:()=>C,buildSmartSortProps:()=>H,mockClick:()=>T,mockFacets:()=>E,mockFetchProduct:()=>L,mockFetchProductReviews:()=>Q,mockFingerprint:()=>B,mockImpression:()=>F,mockMultiFeaturedPlacements:()=>U,mockSessionEvent:()=>z,mockSmartSortPage:()=>W,mockSmartSortPlacements:()=>Z});module.exports=ce(me);var c={click:"/v2/event/2",externalCheckout:"/v2/event/3e",facets:"/v2/facets",fingerprint:"/fp/token",impression:"/v2/event/1",multi:"/v2/multi",page:"/v2/smartpage",product:"/v2/product",productReviews:"/v2/product/reviews",sessionEvent:"/v2/event/session",smart:"/v2/smart"};var y=(o=>(o.Desktop="desktop",o.Kiosk="kiosk",o.Mobile="mobile",o))(y||{});var w=require("msw"),T=(e,t)=>w.http.post(`${e}${c.click}*`,async({request:r})=>{let o=new URL(r.url);if(t){let n=await r.json();t({reqBody:n,url:o})}return w.HttpResponse.json({},{status:200})}),F=(e,t)=>w.http.post(`${e}${c.impression}*`,async({request:r})=>{let o=new URL(r.url);if(t){let n=await r.json();t({reqBody:n,url:o})}return w.HttpResponse.json({},{status:200})});var q=require("@faker-js/faker");var j=(e={})=>{let{identifier:t,...r}=e;return{apiKey:q.faker.string.uuid(),appMode:"default",endpoint:"http://localhost:4200",eventsEndpoint:"http://localhost:4200",identifier:{jdid:q.faker.string.uuid(),...t},pageEndpoint:"http://localhost:4200",skipAutoSmartSortOnLoad:!1,source:"test",...r}};var S=require("msw"),ae=(e={})=>({searchFacets:e}),E=({callback:e,endpoint:t,facets:r})=>S.http.post(`${t}${c.facets}`,async({request:o})=>{if(e){let n=new URL(o.url),i=await o.json();e({reqBody:i,url:n})}return S.HttpResponse.json(ae(r),{status:200})});var v=require("msw"),B=({callback:e,endpoint:t,response:r})=>v.http.get(`${t}${c.fingerprint}`,async({request:o})=>{if(e){let n=new URL(o.url);e({reqBody:{},url:n})}return v.HttpResponse.json(r??{},{status:200})});var pe=require("@faker-js/faker");var M=require("msw");var s=require("@faker-js/faker");var k=(e={})=>({ad_token:s.faker.string.uuid(),object_id:s.faker.string.uuid(),product_id:s.faker.number.int(),store_id:s.faker.number.int(),...e}),N=(e={})=>({headline:s.faker.company.catchPhrase(),image_url:s.faker.image.url(),intended_display:s.faker.helpers.arrayElement(Object.values(y)),logo_url:s.faker.internet.url(),overlay_color:s.faker.color.rgb(),position_x:s.faker.number.int({max:100,min:0}),position_y:s.faker.number.int({max:100,min:0}),scale_number:s.faker.number.float({max:2,min:.5}),text_color:s.faker.color.rgb(),...e}),p=(e={})=>{let{products:t=[k()],...r}=e;return{nb_hits:t.length,placement:"menu_dynamic_row",products:t,search_facets:{},...r}},C=(e={})=>({...$(e),attributes:e.attributes??{},hasBeenImpressed:e.hasBeenImpressed??!1}),$=(e={})=>{let{endpoint:t="http://localhost:4242",eventsEndpoint:r,...o}=e,n=r??t,i=s.faker.string.uuid(),P=s.faker.datatype.boolean(),m=s.faker.string.uuid(),g=s.faker.string.uuid(),b=s.faker.string.uuid(),f=s.faker.number.int(),_=s.faker.number.int(),l=`${n}${c.click}`,x=`${n}${c.impression}`;return{clickPayload:{adToken:i,distinctId:m,isAddToCart:P,janeDeviceId:m,kevelToken:g,myHighD:b,productId:f,storeId:_},clickUrl:l,impressPayload:{distinctId:m,engagements:[{adToken:i,kevelToken:g,myHighD:b,productId:f}],janeDeviceId:m},impressUrl:x,isSponsored:!1,objectId:s.faker.string.uuid(),...o}},K=(e={})=>({object_id:s.faker.string.uuid(),...e}),G=(e={})=>({products:[K()],...e}),H=(e={creativeIds:[],endpoint:"http://localhost:4242",searchFacets:{},title:s.faker.company.catchPhrase()})=>{let{cachedProducts:t=[$()],endpoint:r="http://localhost:4242",eventsEndpoint:o,config:n=j({endpoint:r,eventsEndpoint:o??r}),creativeIds:i=[],customImages:P=[],placement:m="menu_dynamic_row",products:g=[C()],searchFacets:b={},title:f=s.faker.company.catchPhrase(),..._}=e,{totalProducts:l=t.length+g.length}=_,x=`${r}${c.page}`;return{cachedProducts:t,config:n,creativeIds:i,customImages:P,nextPageProps:{pageSize:60,searchAttributes:["*"]},nextPageUrl:x,placement:m,products:g,searchFacets:b,title:f,totalProducts:l}};var U=e=>{let{callback:t,endpoint:r,placements:o=[p({placement:"menu_top_row"}),p({placement:"menu_dynamic_row"}),p({placement:"menu_inline"})]}=e;return M.http.post(`${r}${c.multi}`,async({request:n})=>{let i=await n.json();return t&&t({reqBody:i,url:new URL(n.url)}),M.HttpResponse.json({placements:o},{status:200})})};var X=require("msw");var I=require("msw");var L=e=>{let{callback:t,endpoint:r,product:o=k()}=e;return I.http.post(`${r}${c.product}`,async({request:n})=>{let i=await n.json();return t&&t({reqBody:i,url:new URL(n.url)}),I.HttpResponse.json(o,{status:200})})};var d=require("@faker-js/faker");var D=require("msw"),J=(e={})=>({activities:[],avatar:d.faker.number.int({max:11,min:0}),comment:d.faker.lorem.sentence(),createdAt:d.faker.date.anytime().toISOString(),feelings:[],hasComment:!0,id:d.faker.number.int(),nickname:"w******a",productId:d.faker.number.int(),rating:d.faker.number.float({fractionDigits:1,max:5,min:0}),updatedAt:d.faker.date.anytime().toISOString(),upvoteCount:d.faker.number.int(),...e}),V=(e={})=>({activitiesDistribution:{},averageRating:d.faker.number.float({fractionDigits:1,max:5,min:0}),distribution:{1:1,2:2,3:5,4:10,5:20},feelingsDistribution:{},reviewCount:d.faker.number.int({max:100,min:0}),...e}),Y=(e={})=>({created_at:"2026-01-15T12:00:00Z",has_comment:!0,id:1,product_id:123,rating:5,updated_at:"2026-01-15T12:00:00Z",upvote_count:0,...e}),ee=(e={})=>({average_rating:4.5,distribution:{1:1,2:2,3:5,4:10,5:20},review_count:38,...e}),ue=(e={})=>({aggregate:ee(),product_id:123,reviews:[Y()],total_count:1,...e}),Q=({callback:e,endpoint:t,response:r})=>D.http.post(`${t}${c.productReviews}`,async({request:o})=>{if(e){let n=new URL(o.url),i=await o.json();e({reqBody:i,url:n})}return D.HttpResponse.json(ue(r),{status:200})});var A=require("msw"),z=(e,t)=>A.http.post(`${e}${c.sessionEvent}`,async({request:r})=>{if(t){let o=new URL(r.url),n=await r.json();t({reqBody:n,url:o})}return A.HttpResponse.json({},{status:200})});var u=require("msw");var Z=e=>{let{callback:t,endpoint:r,...o}=e;if(!Object.values(o).some(l=>l!==void 0)){let l=Object.keys(o).join(", ");throw new Error(`At least one of [${l}] must be defined in props.`)}let{cartToppers:i,customImageRow:P,menuRow:m,menuTopRow:g,pdpRow:b,recommendedRow:f,recommendedSort:_}=o;return u.http.post(`${r}${c.smart}`,async({request:l})=>{let x=await l.json();if(t){let a=new URL(l.url);t({reqBody:x,url:a})}let{placement:R}=x;if(R==="cart_toppers"&&i){let a=p(i);return u.HttpResponse.json(a,{status:200})}if(R==="menu_inline"&&m){let a=p(m);return u.HttpResponse.json(a,{status:200})}if(R==="menu_inline_table"&&_){let a=p(_);return u.HttpResponse.json(a,{status:200})}if(R==="menu_dynamic_row"&&f){let a=p(f);return u.HttpResponse.json(a,{status:200})}if(R==="custom_image_row"&&P){let a=p(P);return u.HttpResponse.json(a,{status:200})}if(R==="menu_top_row"&&g){let a=p(g);return u.HttpResponse.json(a,{status:200})}if(R==="pdp_row"&&b){let a=p(b);return u.HttpResponse.json(a,{status:200})}return u.HttpResponse.text("Invalid placement",{status:400})})},W=(e={endpoint:"https://the.weed.shop",response:{}})=>{let{callback:t,endpoint:r,response:o}=e,n=G(o);return u.http.post(`${r}${c.page}`,async({request:i})=>{if(t){let P=new URL(i.url),m=await i.json();t({reqBody:m,url:P})}return u.HttpResponse.json(n,{status:200})})};0&&(module.exports={buildCustomImageData,buildProduct,buildProductReview,buildProductReviewsAggregate,buildProductsPlacementResponse,buildSmartSortProductProps,buildSmartSortProps,mockClick,mockFacets,mockFetchProduct,mockFetchProductReviews,mockFingerprint,mockImpression,mockMultiFeaturedPlacements,mockSessionEvent,mockSmartSortPage,mockSmartSortPlacements});
@@ -1,6 +1,6 @@
1
1
  import * as msw from 'msw';
2
2
  import { DefaultBodyType } from 'msw';
3
- import { ah as PlacementResponse, ai as Product, L as ProductReview, M as ProductReviewsAggregate, aj as ProductReviewsResponse, P as Placement, ak as ProductsPlacementResponse, al as PageResponse, k as Facets, am as CustomImageData, c as SmartSortProductProps, e as SmartSortProps, V as VirtualBudtenderQuery, T as VirtualBudtenderSearchResponse } from './smartSort-DpgTm3W4.cjs';
3
+ import { ad as PlacementResponse, ae as Product, H as ProductReview, K as ProductReviewsAggregate, af as ProductReviewsResponse, P as Placement, ag as ProductsPlacementResponse, ah as PageResponse, j as Facets, ai as CustomImageData, b as SmartSortProductProps, d as SmartSortProps } from './smartSort-Bzn30738.cjs';
4
4
 
5
5
  interface FingerprintTokenResponse {
6
6
  endpoint: string;
@@ -173,17 +173,4 @@ type BuildSmartSortProps<ProductShape extends object = Record<string, unknown>>
173
173
  } & Omit<SmartSortProps<ProductShape>, 'nextPageProps' | 'nextPageUrl'>>;
174
174
  declare const buildSmartSortProps: <ProductShape extends object = Record<string, unknown>>(props?: BuildSmartSortProps<ProductShape>) => SmartSortProps<ProductShape>;
175
175
 
176
- interface MockVirtualBudtenderQueriesProps {
177
- callback?: MockCallback;
178
- endpoint: string;
179
- queries?: VirtualBudtenderQuery[];
180
- }
181
- interface MockVirtualBudtenderSearchProps {
182
- callback?: MockCallback;
183
- endpoint: string;
184
- response?: Partial<VirtualBudtenderSearchResponse>;
185
- }
186
- declare const mockVirtualBudtenderQueries: ({ callback, endpoint, queries, }: MockVirtualBudtenderQueriesProps) => msw.HttpHandler;
187
- declare const mockVirtualBudtenderSearch: ({ callback, endpoint, response, }: MockVirtualBudtenderSearchProps) => msw.HttpHandler;
188
-
189
- export { type AvailableMocks, buildCustomImageData, buildProduct, buildProductReview, buildProductReviewsAggregate, buildProductsPlacementResponse, buildSmartSortProductProps, buildSmartSortProps, mockClick, mockFacets, mockFetchProduct, mockFetchProductReviews, mockFingerprint, mockImpression, mockMultiFeaturedPlacements, mockSessionEvent, mockSmartSortPage, mockSmartSortPlacements, mockVirtualBudtenderQueries, mockVirtualBudtenderSearch };
176
+ export { type AvailableMocks, buildCustomImageData, buildProduct, buildProductReview, buildProductReviewsAggregate, buildProductsPlacementResponse, buildSmartSortProductProps, buildSmartSortProps, mockClick, mockFacets, mockFetchProduct, mockFetchProductReviews, mockFingerprint, mockImpression, mockMultiFeaturedPlacements, mockSessionEvent, mockSmartSortPage, mockSmartSortPlacements };
@@ -1,6 +1,6 @@
1
1
  import * as msw from 'msw';
2
2
  import { DefaultBodyType } from 'msw';
3
- import { ah as PlacementResponse, ai as Product, L as ProductReview, M as ProductReviewsAggregate, aj as ProductReviewsResponse, P as Placement, ak as ProductsPlacementResponse, al as PageResponse, k as Facets, am as CustomImageData, c as SmartSortProductProps, e as SmartSortProps, V as VirtualBudtenderQuery, T as VirtualBudtenderSearchResponse } from './smartSort-DpgTm3W4.js';
3
+ import { ad as PlacementResponse, ae as Product, H as ProductReview, K as ProductReviewsAggregate, af as ProductReviewsResponse, P as Placement, ag as ProductsPlacementResponse, ah as PageResponse, j as Facets, ai as CustomImageData, b as SmartSortProductProps, d as SmartSortProps } from './smartSort-Bzn30738.js';
4
4
 
5
5
  interface FingerprintTokenResponse {
6
6
  endpoint: string;
@@ -173,17 +173,4 @@ type BuildSmartSortProps<ProductShape extends object = Record<string, unknown>>
173
173
  } & Omit<SmartSortProps<ProductShape>, 'nextPageProps' | 'nextPageUrl'>>;
174
174
  declare const buildSmartSortProps: <ProductShape extends object = Record<string, unknown>>(props?: BuildSmartSortProps<ProductShape>) => SmartSortProps<ProductShape>;
175
175
 
176
- interface MockVirtualBudtenderQueriesProps {
177
- callback?: MockCallback;
178
- endpoint: string;
179
- queries?: VirtualBudtenderQuery[];
180
- }
181
- interface MockVirtualBudtenderSearchProps {
182
- callback?: MockCallback;
183
- endpoint: string;
184
- response?: Partial<VirtualBudtenderSearchResponse>;
185
- }
186
- declare const mockVirtualBudtenderQueries: ({ callback, endpoint, queries, }: MockVirtualBudtenderQueriesProps) => msw.HttpHandler;
187
- declare const mockVirtualBudtenderSearch: ({ callback, endpoint, response, }: MockVirtualBudtenderSearchProps) => msw.HttpHandler;
188
-
189
- export { type AvailableMocks, buildCustomImageData, buildProduct, buildProductReview, buildProductReviewsAggregate, buildProductsPlacementResponse, buildSmartSortProductProps, buildSmartSortProps, mockClick, mockFacets, mockFetchProduct, mockFetchProductReviews, mockFingerprint, mockImpression, mockMultiFeaturedPlacements, mockSessionEvent, mockSmartSortPage, mockSmartSortPlacements, mockVirtualBudtenderQueries, mockVirtualBudtenderSearch };
176
+ export { type AvailableMocks, buildCustomImageData, buildProduct, buildProductReview, buildProductReviewsAggregate, buildProductsPlacementResponse, buildSmartSortProductProps, buildSmartSortProps, mockClick, mockFacets, mockFetchProduct, mockFetchProductReviews, mockFingerprint, mockImpression, mockMultiFeaturedPlacements, mockSessionEvent, mockSmartSortPage, mockSmartSortPlacements };
@@ -1 +1 @@
1
- import{b as n,e as j}from"./chunk-VEW5EGZ2.js";import{http as C,HttpResponse as B}from"msw";var I=(e,t)=>C.post(`${e}${n.click}*`,async({request:o})=>{let r=new URL(o.url);if(t){let s=await o.json();t({reqBody:s,url:r})}return B.json({},{status:200})}),T=(e,t)=>C.post(`${e}${n.impression}*`,async({request:o})=>{let r=new URL(o.url);if(t){let s=await o.json();t({reqBody:s,url:r})}return B.json({},{status:200})});import{faker as _}from"@faker-js/faker";var h=(e={})=>{let{identifier:t,...o}=e;return{apiKey:_.string.uuid(),appMode:"default",endpoint:"http://localhost:4200",eventsEndpoint:"http://localhost:4200",identifier:{jdid:_.string.uuid(),...t},pageEndpoint:"http://localhost:4200",skipAutoSmartSortOnLoad:!1,source:"test",...o}};import{http as Y,HttpResponse as ee}from"msw";var te=(e={})=>({searchFacets:e}),$=({callback:e,endpoint:t,facets:o})=>Y.post(`${t}${n.facets}`,async({request:r})=>{if(e){let s=new URL(r.url),c=await r.json();e({reqBody:c,url:s})}return ee.json(te(o),{status:200})});import{http as oe,HttpResponse as re}from"msw";var F=({callback:e,endpoint:t,response:o})=>oe.get(`${t}${n.fingerprint}`,async({request:r})=>{if(e){let s=new URL(r.url);e({reqBody:{},url:s})}return re.json(o??{},{status:200})});import{faker as Be}from"@faker-js/faker";import{http as se,HttpResponse as ne}from"msw";import{faker as a}from"@faker-js/faker";var S=(e={})=>({ad_token:a.string.uuid(),object_id:a.string.uuid(),product_id:a.number.int(),store_id:a.number.int(),...e}),D=(e={})=>({headline:a.company.catchPhrase(),image_url:a.image.url(),intended_display:a.helpers.arrayElement(Object.values(j)),logo_url:a.internet.url(),overlay_color:a.color.rgb(),position_x:a.number.int({max:100,min:0}),position_y:a.number.int({max:100,min:0}),scale_number:a.number.float({max:2,min:.5}),text_color:a.color.rgb(),...e}),p=(e={})=>{let{products:t=[S()],...o}=e;return{nb_hits:t.length,placement:"menu_dynamic_row",products:t,search_facets:{},...o}},M=(e={})=>({...x(e),attributes:e.attributes??{},hasBeenImpressed:e.hasBeenImpressed??!1}),x=(e={})=>{let{endpoint:t="http://localhost:4242",eventsEndpoint:o,...r}=e,s=o??t,c=a.string.uuid(),P=a.datatype.boolean(),u=a.string.uuid(),k=a.string.uuid(),f=a.string.uuid(),g=a.number.int(),b=a.number.int(),d=`${s}${n.click}`,y=`${s}${n.impression}`;return{clickPayload:{adToken:c,distinctId:u,isAddToCart:P,janeDeviceId:u,kevelToken:k,myHighD:f,productId:g,storeId:b},clickUrl:d,impressPayload:{distinctId:u,engagements:[{adToken:c,kevelToken:k,myHighD:f,productId:g}],janeDeviceId:u},impressUrl:y,isSponsored:!1,objectId:a.string.uuid(),...r}},A=(e={})=>({object_id:a.string.uuid(),...e}),v=(e={})=>({products:[A()],...e}),O=(e={creativeIds:[],endpoint:"http://localhost:4242",searchFacets:{},title:a.company.catchPhrase()})=>{let{cachedProducts:t=[x()],endpoint:o="http://localhost:4242",eventsEndpoint:r,config:s=h({endpoint:o,eventsEndpoint:r??o}),creativeIds:c=[],customImages:P=[],placement:u="menu_dynamic_row",products:k=[M()],searchFacets:f={},title:g=a.company.catchPhrase(),...b}=e,{totalProducts:d=t.length+k.length}=b,y=`${o}${n.page}`;return{cachedProducts:t,config:s,creativeIds:c,customImages:P,nextPageProps:{pageSize:60,searchAttributes:["*"]},nextPageUrl:y,placement:u,products:k,searchFacets:f,title:g,totalProducts:d}};var E=e=>{let{callback:t,endpoint:o,placements:r=[p({placement:"menu_top_row"}),p({placement:"menu_dynamic_row"}),p({placement:"menu_inline"})]}=e;return se.post(`${o}${n.multi}`,async({request:s})=>{let c=await s.json();return t&&t({reqBody:c,url:new URL(s.url)}),ne.json({placements:r},{status:200})})};import{http as Le,HttpResponse as qe}from"msw";import{http as ae,HttpResponse as ce}from"msw";var V=e=>{let{callback:t,endpoint:o,product:r=S()}=e;return ae.post(`${o}${n.product}`,async({request:s})=>{let c=await s.json();return t&&t({reqBody:c,url:new URL(s.url)}),ce.json(r,{status:200})})};import{faker as l}from"@faker-js/faker";import{http as ie,HttpResponse as pe}from"msw";var N=(e={})=>({activities:[],avatar:l.number.int({max:11,min:0}),comment:l.lorem.sentence(),createdAt:l.date.anytime().toISOString(),feelings:[],hasComment:!0,id:l.number.int(),nickname:"w******a",productId:l.number.int(),rating:l.number.float({fractionDigits:1,max:5,min:0}),updatedAt:l.date.anytime().toISOString(),upvoteCount:l.number.int(),...e}),U=(e={})=>({activitiesDistribution:{},averageRating:l.number.float({fractionDigits:1,max:5,min:0}),distribution:{1:1,2:2,3:5,4:10,5:20},feelingsDistribution:{},reviewCount:l.number.int({max:100,min:0}),...e}),L=(e={})=>({created_at:"2026-01-15T12:00:00Z",has_comment:!0,id:1,product_id:123,rating:5,updated_at:"2026-01-15T12:00:00Z",upvote_count:0,...e}),q=(e={})=>({average_rating:4.5,distribution:{1:1,2:2,3:5,4:10,5:20},review_count:38,...e}),ue=(e={})=>({aggregate:q(),product_id:123,reviews:[L()],total_count:1,...e}),H=({callback:e,endpoint:t,response:o})=>ie.post(`${t}${n.productReviews}`,async({request:r})=>{if(e){let s=new URL(r.url),c=await r.json();e({reqBody:c,url:s})}return pe.json(ue(o),{status:200})});import{http as de,HttpResponse as le}from"msw";var Q=(e,t)=>de.post(`${e}${n.sessionEvent}`,async({request:o})=>{if(t){let r=new URL(o.url),s=await o.json();t({reqBody:s,url:r})}return le.json({},{status:200})});import{http as J,HttpResponse as m}from"msw";var K=e=>{let{callback:t,endpoint:o,...r}=e;if(!Object.values(r).some(d=>d!==void 0)){let d=Object.keys(r).join(", ");throw new Error(`At least one of [${d}] must be defined in props.`)}let{cartToppers:c,customImageRow:P,menuRow:u,menuTopRow:k,pdpRow:f,recommendedRow:g,recommendedSort:b}=r;return J.post(`${o}${n.smart}`,async({request:d})=>{let y=await d.json();if(t){let i=new URL(d.url);t({reqBody:y,url:i})}let{placement:R}=y;if(R==="cart_toppers"&&c){let i=p(c);return m.json(i,{status:200})}if(R==="menu_inline"&&u){let i=p(u);return m.json(i,{status:200})}if(R==="menu_inline_table"&&b){let i=p(b);return m.json(i,{status:200})}if(R==="menu_dynamic_row"&&g){let i=p(g);return m.json(i,{status:200})}if(R==="custom_image_row"&&P){let i=p(P);return m.json(i,{status:200})}if(R==="menu_top_row"&&k){let i=p(k);return m.json(i,{status:200})}if(R==="pdp_row"&&f){let i=p(f);return m.json(i,{status:200})}return m.text("Invalid placement",{status:400})})},Z=(e={endpoint:"https://the.weed.shop",response:{}})=>{let{callback:t,endpoint:o,response:r}=e,s=v(r);return J.post(`${o}${n.page}`,async({request:c})=>{if(t){let P=new URL(c.url),u=await c.json();t({reqBody:u,url:P})}return m.json(s,{status:200})})};import{http as z,HttpResponse as G}from"msw";var me=(e=[])=>({queries:e}),Pe=(e={})=>({htmlResponse:"<p>Here are some products to help you sleep...</p>",markdownResponse:"Here are some products to help you sleep...",products:[],query:"help me sleep",totalResults:0,unformattedResponse:"Here are some products to help you sleep...",...e}),W=({callback:e,endpoint:t,queries:o})=>z.post(`${t}${n.virtualBudtenderQueries}`,async({request:r})=>{if(e){let s=new URL(r.url),c=await r.json();e({reqBody:c,url:s})}return G.json(me(o),{status:200})}),X=({callback:e,endpoint:t,response:o})=>z.post(`${t}${n.virtualBudtenderSearch}`,async({request:r})=>{if(e){let s=new URL(r.url),c=await r.json();e({reqBody:c,url:s})}return G.json(Pe(o),{status:200})});export{D as buildCustomImageData,S as buildProduct,N as buildProductReview,U as buildProductReviewsAggregate,p as buildProductsPlacementResponse,M as buildSmartSortProductProps,O as buildSmartSortProps,I as mockClick,$ as mockFacets,V as mockFetchProduct,H as mockFetchProductReviews,F as mockFingerprint,T as mockImpression,E as mockMultiFeaturedPlacements,Q as mockSessionEvent,Z as mockSmartSortPage,K as mockSmartSortPlacements,W as mockVirtualBudtenderQueries,X as mockVirtualBudtenderSearch};
1
+ import{b as a,e as C}from"./chunk-TGCEYA6I.js";import{http as j,HttpResponse as I}from"msw";var F=(e,t)=>j.post(`${e}${a.click}*`,async({request:o})=>{let r=new URL(o.url);if(t){let n=await o.json();t({reqBody:n,url:r})}return I.json({},{status:200})}),T=(e,t)=>j.post(`${e}${a.impression}*`,async({request:o})=>{let r=new URL(o.url);if(t){let n=await o.json();t({reqBody:n,url:r})}return I.json({},{status:200})});import{faker as D}from"@faker-js/faker";var h=(e={})=>{let{identifier:t,...o}=e;return{apiKey:D.string.uuid(),appMode:"default",endpoint:"http://localhost:4200",eventsEndpoint:"http://localhost:4200",identifier:{jdid:D.string.uuid(),...t},pageEndpoint:"http://localhost:4200",skipAutoSmartSortOnLoad:!1,source:"test",...o}};import{http as Q,HttpResponse as V}from"msw";var W=(e={})=>({searchFacets:e}),A=({callback:e,endpoint:t,facets:o})=>Q.post(`${t}${a.facets}`,async({request:r})=>{if(e){let n=new URL(r.url),c=await r.json();e({reqBody:c,url:n})}return V.json(W(o),{status:200})});import{http as X,HttpResponse as Y}from"msw";var O=({callback:e,endpoint:t,response:o})=>X.get(`${t}${a.fingerprint}`,async({request:r})=>{if(e){let n=new URL(r.url);e({reqBody:{},url:n})}return Y.json(o??{},{status:200})});import{faker as we}from"@faker-js/faker";import{http as ee,HttpResponse as te}from"msw";import{faker as s}from"@faker-js/faker";var y=(e={})=>({ad_token:s.string.uuid(),object_id:s.string.uuid(),product_id:s.number.int(),store_id:s.number.int(),...e}),E=(e={})=>({headline:s.company.catchPhrase(),image_url:s.image.url(),intended_display:s.helpers.arrayElement(Object.values(C)),logo_url:s.internet.url(),overlay_color:s.color.rgb(),position_x:s.number.int({max:100,min:0}),position_y:s.number.int({max:100,min:0}),scale_number:s.number.float({max:2,min:.5}),text_color:s.color.rgb(),...e}),p=(e={})=>{let{products:t=[y()],...o}=e;return{nb_hits:t.length,placement:"menu_dynamic_row",products:t,search_facets:{},...o}},M=(e={})=>({...x(e),attributes:e.attributes??{},hasBeenImpressed:e.hasBeenImpressed??!1}),x=(e={})=>{let{endpoint:t="http://localhost:4242",eventsEndpoint:o,...r}=e,n=o??t,c=s.string.uuid(),P=s.datatype.boolean(),m=s.string.uuid(),k=s.string.uuid(),R=s.string.uuid(),f=s.number.int(),b=s.number.int(),u=`${n}${a.click}`,S=`${n}${a.impression}`;return{clickPayload:{adToken:c,distinctId:m,isAddToCart:P,janeDeviceId:m,kevelToken:k,myHighD:R,productId:f,storeId:b},clickUrl:u,impressPayload:{distinctId:m,engagements:[{adToken:c,kevelToken:k,myHighD:R,productId:f}],janeDeviceId:m},impressUrl:S,isSponsored:!1,objectId:s.string.uuid(),...r}},$=(e={})=>({object_id:s.string.uuid(),...e}),v=(e={})=>({products:[$()],...e}),N=(e={creativeIds:[],endpoint:"http://localhost:4242",searchFacets:{},title:s.company.catchPhrase()})=>{let{cachedProducts:t=[x()],endpoint:o="http://localhost:4242",eventsEndpoint:r,config:n=h({endpoint:o,eventsEndpoint:r??o}),creativeIds:c=[],customImages:P=[],placement:m="menu_dynamic_row",products:k=[M()],searchFacets:R={},title:f=s.company.catchPhrase(),...b}=e,{totalProducts:u=t.length+k.length}=b,S=`${o}${a.page}`;return{cachedProducts:t,config:n,creativeIds:c,customImages:P,nextPageProps:{pageSize:60,searchAttributes:["*"]},nextPageUrl:S,placement:m,products:k,searchFacets:R,title:f,totalProducts:u}};var _=e=>{let{callback:t,endpoint:o,placements:r=[p({placement:"menu_top_row"}),p({placement:"menu_dynamic_row"}),p({placement:"menu_inline"})]}=e;return ee.post(`${o}${a.multi}`,async({request:n})=>{let c=await n.json();return t&&t({reqBody:c,url:new URL(n.url)}),te.json({placements:r},{status:200})})};import{http as $e,HttpResponse as Ne}from"msw";import{http as oe,HttpResponse as re}from"msw";var B=e=>{let{callback:t,endpoint:o,product:r=y()}=e;return oe.post(`${o}${a.product}`,async({request:n})=>{let c=await n.json();return t&&t({reqBody:c,url:new URL(n.url)}),re.json(r,{status:200})})};import{faker as l}from"@faker-js/faker";import{http as ne,HttpResponse as se}from"msw";var U=(e={})=>({activities:[],avatar:l.number.int({max:11,min:0}),comment:l.lorem.sentence(),createdAt:l.date.anytime().toISOString(),feelings:[],hasComment:!0,id:l.number.int(),nickname:"w******a",productId:l.number.int(),rating:l.number.float({fractionDigits:1,max:5,min:0}),updatedAt:l.date.anytime().toISOString(),upvoteCount:l.number.int(),...e}),L=(e={})=>({activitiesDistribution:{},averageRating:l.number.float({fractionDigits:1,max:5,min:0}),distribution:{1:1,2:2,3:5,4:10,5:20},feelingsDistribution:{},reviewCount:l.number.int({max:100,min:0}),...e}),q=(e={})=>({created_at:"2026-01-15T12:00:00Z",has_comment:!0,id:1,product_id:123,rating:5,updated_at:"2026-01-15T12:00:00Z",upvote_count:0,...e}),H=(e={})=>({average_rating:4.5,distribution:{1:1,2:2,3:5,4:10,5:20},review_count:38,...e}),ae=(e={})=>({aggregate:H(),product_id:123,reviews:[q()],total_count:1,...e}),J=({callback:e,endpoint:t,response:o})=>ne.post(`${t}${a.productReviews}`,async({request:r})=>{if(e){let n=new URL(r.url),c=await r.json();e({reqBody:c,url:n})}return se.json(ae(o),{status:200})});import{http as ce,HttpResponse as ie}from"msw";var K=(e,t)=>ce.post(`${e}${a.sessionEvent}`,async({request:o})=>{if(t){let r=new URL(o.url),n=await o.json();t({reqBody:n,url:r})}return ie.json({},{status:200})});import{http as Z,HttpResponse as d}from"msw";var z=e=>{let{callback:t,endpoint:o,...r}=e;if(!Object.values(r).some(u=>u!==void 0)){let u=Object.keys(r).join(", ");throw new Error(`At least one of [${u}] must be defined in props.`)}let{cartToppers:c,customImageRow:P,menuRow:m,menuTopRow:k,pdpRow:R,recommendedRow:f,recommendedSort:b}=r;return Z.post(`${o}${a.smart}`,async({request:u})=>{let S=await u.json();if(t){let i=new URL(u.url);t({reqBody:S,url:i})}let{placement:g}=S;if(g==="cart_toppers"&&c){let i=p(c);return d.json(i,{status:200})}if(g==="menu_inline"&&m){let i=p(m);return d.json(i,{status:200})}if(g==="menu_inline_table"&&b){let i=p(b);return d.json(i,{status:200})}if(g==="menu_dynamic_row"&&f){let i=p(f);return d.json(i,{status:200})}if(g==="custom_image_row"&&P){let i=p(P);return d.json(i,{status:200})}if(g==="menu_top_row"&&k){let i=p(k);return d.json(i,{status:200})}if(g==="pdp_row"&&R){let i=p(R);return d.json(i,{status:200})}return d.text("Invalid placement",{status:400})})},G=(e={endpoint:"https://the.weed.shop",response:{}})=>{let{callback:t,endpoint:o,response:r}=e,n=v(r);return Z.post(`${o}${a.page}`,async({request:c})=>{if(t){let P=new URL(c.url),m=await c.json();t({reqBody:m,url:P})}return d.json(n,{status:200})})};export{E as buildCustomImageData,y as buildProduct,U as buildProductReview,L as buildProductReviewsAggregate,p as buildProductsPlacementResponse,M as buildSmartSortProductProps,N as buildSmartSortProps,F as mockClick,A as mockFacets,B as mockFetchProduct,J as mockFetchProductReviews,O as mockFingerprint,T as mockImpression,_ as mockMultiFeaturedPlacements,K as mockSessionEvent,G as mockSmartSortPage,z as mockSmartSortPlacements};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iheartjane/dm-sdk",
3
- "version": "2.24.1-edge.fd78782",
3
+ "version": "2.25.0",
4
4
  "description": "Jane's Digital Merchandising Tool",
5
5
  "license": "MIT",
6
6
  "author": "@janetechinc",
@@ -66,6 +66,6 @@
66
66
  }
67
67
  },
68
68
  "engines": {
69
- "node": "^22.11.0 || ^24.0.0"
69
+ "node": ">=22.11.0"
70
70
  }
71
71
  }
@@ -1 +0,0 @@
1
- var N=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var Z=(p,i,c,t)=>{for(var o=t>1?void 0:t?U(i,c):i,a=p.length-1,u;a>=0;a--)(u=p[a])&&(o=(t?u(i,c,o):u(o))||o);return t&&o&&N(i,c,o),o};var d=(t=>(t.All="all",t.Default="default",t.Off="off",t))(d||{}),m=(s=>(s.Bloom="bloom",s.Default="default",s.Embedded="embedded",s.FramelessEmbed="framelessEmbed",s.Headless="headless",s.Kiosk="kiosk",s.OperatorEmbed="operatorEmbed",s.WhiteLabel="whiteLabel",s))(m||{}),l=(t=>(t.Desktop="desktop",t.Kiosk="kiosk",t.Mobile="mobile",t))(l||{}),g=(i=>(i.UserOptOut="user-opt-out",i))(g||{});var _=(c=>(c.Featured="featured",c.Midgrid="midgrid",c))(_||{}),P=(r=>(r.BestSelling="best_selling",r.BrandSpecials="brand_specials",r.BuyAgainRow="buy_again_row",r.CartToppers="cart_toppers",r.CustomImageRow="custom_image_row",r.FeaturedRow="featured_row",r.MenuDynamicRow="menu_dynamic_row",r.MenuInline="menu_inline",r.MenuInlineTable="menu_inline_table",r.MenuTopRow="menu_top_row",r.PdpRow="pdp_row",r.Sale="sale",r.Specials="specials",r.VirtualBudtenderSearch="virtual_budtender_search",r))(P||{}),R=(n=>(n.Edible="edible",n.Extract="extract",n.Flower="flower",n.Gear="gear",n.Grow="grow",n.Merch="merch",n.PreRoll="pre-roll",n.Tincture="tincture",n.Topical="topical",n.Vape="vape",n))(R||{}),b=(t=>(t.Rating="rating",t.Recent="recent",t.Upvote="upvote",t))(b||{}),x=(e=>(e.BestSellerRank="best-seller-rank",e.CategoryAndNameAsc="category-and-name-asc",e.Default="default",e.PriceAsc="price-asc",e.PriceDesc="price-desc",e.PriceEighthOunceAsc="price-eighth-ounce-asc",e.PriceEighthOunceDesc="price-eighth-ounce-desc",e.PriceGramAsc="price-gram-asc",e.PriceGramDesc="price-gram-desc",e.PriceHalfGramAsc="price-half-gram-asc",e.PriceHalfGramDesc="price-half-gram-desc",e.PriceHalfOunceAsc="price-half-ounce-asc",e.PriceHalfOunceDesc="price-half-ounce-desc",e.PriceOunceAsc="price-ounce-asc",e.PriceOunceDesc="price-ounce-desc",e.PriceQuarterOunceAsc="price-quarter-ounce-asc",e.PriceQuarterOunceDesc="price-quarter-ounce-desc",e.PriceTwoGramAsc="price-two-gram-asc",e.PriceTwoGramDesc="price-two-gram-desc",e.Rating="rating",e.Recommendation="recommendation",e.ThcPotencyAsc="thc-potency-asc",e.ThcPotencyDesc="thc-potency-desc",e))(x||{});var z=50;var f="best-seller-rank",w="category-and-name-asc",v="default",h="price-asc",y="price-desc",C="price-eighth-ounce-asc",I="price-eighth-ounce-desc",q="price-gram-asc",S="price-gram-desc",D="price-half-gram-asc",A="price-half-gram-desc",O="price-half-ounce-asc",M="price-half-ounce-desc",T="price-ounce-asc",B="price-ounce-desc",F="price-quarter-ounce-asc",k="price-quarter-ounce-desc",V="price-two-gram-asc",G="price-two-gram-desc",E="rating",j="recommendation",Q="thc-potency-asc",H="thc-potency-desc",J=[f,w,v,h,y,C,I,q,S,D,A,O,M,T,B,F,k,V,G,E,j,Q,H];var L={click:"/v2/event/2",externalCheckout:"/v2/event/3e",facets:"/v2/facets",fingerprint:"/fp/token",impression:"/v2/event/1",multi:"/v2/multi",page:"/v2/smartpage",product:"/v2/product",productReviews:"/v2/product/reviews",sessionEvent:"/v2/event/session",smart:"/v2/smart",virtualBudtenderQueries:"/v2/virtual-budtender/queries",virtualBudtenderSearch:"/v2/virtual-budtender"};export{Z as a,L as b,d as c,m as d,l as e,g as f,_ as g,P as h,R as i,b as j,x as k,z as l,f as m,w as n,v as o,h as p,y as q,C as r,I as s,q as t,S as u,D as v,A as w,O as x,M as y,T as z,B as A,F as B,k as C,V as D,G as E,E as F,j as G,Q as H,H as I,J};