@dropins/storefront-pdp 3.4.0-alpha-20261026164529 → 3.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @dropins/storefront-pdp
2
2
 
3
- ## 3.4.0-alpha-20261026164529
3
+ ## 3.4.0-beta.0
4
4
 
5
5
  ### Minor Changes
6
6
 
@@ -24,16 +24,6 @@
24
24
  customizable options in both PDP rendering paths. Preserve entered option UIDs
25
25
  and values alongside selectable options and bundle quantities, and display a
26
26
  disabled placeholder for file options.
27
- - 8add2e5: Add the `ProductRating` container, which renders the product average
28
- rating and review count with the SDK `StarRating` component. Values come from
29
- the `ac_rating_summary` (0–100) and `ac_review_count` product attributes; the
30
- container renders nothing when they are missing (for example, when reviews are
31
- disabled or the product has no approved reviews). Configurable products keep
32
- the parent product's rating when a variant is selected.
33
-
34
- Requires `StarRating`, currently only available in the `@dropins/tools` 3.0
35
- alpha (`3.0.0-alpha-20261021202251`). Do not include in a stable release until
36
- `StarRating` ships in a stable `@dropins/tools`.
37
27
 
38
28
  ### Patch Changes
39
29
 
package/api.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{merge as ve,Initializer as _e}from"@dropins/tools/lib.js";import{events as E}from"@dropins/tools/event-bus.js";import{PRODUCT_FRAGMENT as ne}from"./fragments.js";import{FetchGraphQL as Se}from"@dropins/tools/fetch-graphql.js";function Tt(e){const r=new URLSearchParams(window.location.search);Object.entries(e).forEach(([n,t])=>{t===null?r.delete(n):r.set(n,String(t))});let i=window.location.pathname;i+=`?${r.toString()}`,i+=window.location.hash,window.history.replaceState({},"",i)}function Te(){const e=new URLSearchParams(window.location.search),r={};return e.forEach((i,n)=>{r[n]=i}),r}function Ae(e=1){const i=(Te()||{}).quantity;if(i){const n=parseInt(i,10);if(!isNaN(n)&&Number.isInteger(n)&&n>0)return n}return e}function xe(e){var r,i,n,t,s,u,l,a,c,o,m,f;return{productId:Number(e==null?void 0:e.externalId),name:e==null?void 0:e.name,sku:(e==null?void 0:e.variantSku)||(e==null?void 0:e.sku),topLevelSku:e==null?void 0:e.sku,variantName:e==null?void 0:e.variantName,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:e==null?void 0:e.productType,pricing:{regularPrice:((i=(r=e==null?void 0:e.prices)==null?void 0:r.regular)==null?void 0:i.amount)||0,minimalPrice:(t=(n=e==null?void 0:e.prices)==null?void 0:n.final)==null?void 0:t.minimumAmount,maximalPrice:(u=(s=e==null?void 0:e.prices)==null?void 0:s.final)==null?void 0:u.maximumAmount,specialPrice:(a=(l=e==null?void 0:e.prices)==null?void 0:l.final)==null?void 0:a.amount,tierPricing:void 0,currencyCode:((o=(c=e==null?void 0:e.prices)==null?void 0:c.final)==null?void 0:o.currency)||"USD"},canonicalUrl:e==null?void 0:e.url,mainImageUrl:(f=(m=e==null?void 0:e.images)==null?void 0:m[0])==null?void 0:f.url}}const we={PRODUCT_CONTEXT:"productContext",CHANNEL_CONTEXT:"channelContext"},Ue={PRODUCT_PAGE_VIEW:"product-page-view"};function Oe(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function ke(){return{_id:"https://ns.adobe.com/xdm/channels/web",_type:"https://ns.adobe.com/xdm/channel-types/web"}}function Ce(e,r){const i=Oe();i.push({[e]:null}),i.push({[e]:r})}function Ne(){typeof window>"u"||Ce(we.CHANNEL_CONTEXT,ke())}function Ie(e,r){Oe().push(n=>{const t=n.getState?n.getState():{};n.push({event:e,eventInfo:{...t,...r}})})}function Fe(e){const r=xe(e);Ce(we.PRODUCT_CONTEXT,r),Ne(),Ie(Ue.PRODUCT_PAGE_VIEW)}var Z=(e=>(e.ComplexProduct="complex",e.SimpleProduct="simple",e))(Z||{}),De=(e=>(e.ComplexProductView="ComplexProductView",e.SimpleProductView="SimpleProductView",e))(De||{});function Qe(e){return!!e.canEditQuantity}function Ve(e){const r=e.quantity??e.qty,i=Number(r);return Number.isFinite(i)&&i>0?i:1}function Me(e,r){if(!(e!=null&&e.length)||!(r!=null&&r.length))return{};const i={};for(const n of e)if(n.typename==="ProductViewOptionValueProduct")for(const t of n.items)r.includes(t.id)&&(i[t.id]=t.quantity??1);return i}function Ge(e,r,i){const n=Me(r,i);return e?Object.fromEntries(Object.entries(n).map(([t,s])=>[t,e[t]??s])):n}function be(e){return e?Object.entries(e).map(([r,i])=>({uid:r,value:String(i)})):[]}function Le(e){if(!(e!=null&&e.length))return{};const r={};for(const i of e){const n=Number(i.value);Number.isFinite(n)&&n>0&&(r[i.uid]=n)}return r}function qe(e,r,i){const n=new Set([...Object.keys(r||{}),...Object.keys(i)]);return[...(e||[]).filter(t=>!n.has(t.uid)),...be(i)]}function z(e,r){var u,l,a,c,o,m,f,P,h,v,C,b;const i=((c=(a=(l=(u=e==null?void 0:e.options)==null?void 0:u[0])==null?void 0:l.values)==null?void 0:a[0])==null?void 0:c.__typename)==="ProductViewOptionValueProduct",n=Ye(e,i,r==null?void 0:r.preselectFirstOption),t=(e==null?void 0:e.__typename)===De.SimpleProductView?Z.SimpleProduct:Z.ComplexProduct,s=e?{name:e.name,sku:e.sku,isBundle:i,addToCartAllowed:e.addToCartAllowed,inStock:e.inStock,shortDescription:e.shortDescription,metaDescription:e.metaDescription,metaKeyword:e.metaKeyword,metaTitle:e.metaTitle,description:e.description,images:Re(e),videos:Be(e),prices:Ke(e,i,n),attributes:je(e),options:$e(He(e,i)),optionUIDs:n,url:e.url,urlKey:e.urlKey,externalId:e.externalId,externalParentId:e.externalParentId,variantSku:e.variantSku,variantName:e.variantName,productType:t}:null;return ve(s,((P=(f=(m=(o=I.getConfig())==null?void 0:o.models)==null?void 0:m.ProductDetails)==null?void 0:f.transformer)==null?void 0:P.call(f,e))??((b=(C=(v=(h=I.getConfig())==null?void 0:h.models)==null?void 0:v.ProductDetails)==null?void 0:C.transform)==null?void 0:b.call(C,e)))}function $e(e){var i,n,t;if(!e)return;const r=(t=(n=(i=I.getConfig())==null?void 0:i.models)==null?void 0:n.ProductOptions)==null?void 0:t.optionsTransformer;if(!r)return e;try{return r(e)??e}catch(s){return console.error("product-transform: optionsTransformer threw an error, using original options",s),e}}function Re(e){var r,i;return(i=(r=e.images)==null?void 0:r.filter(n=>{var t;return!((t=n.roles)!=null&&t.includes("hide_from_pdp"))}))==null?void 0:i.map(n=>(n.url=n.url.replace(/^https?:/,""),n))}function Be(e){var r;return(r=e.videos)==null?void 0:r.map(i=>{var n,t;return{url:(n=i.url)==null?void 0:n.replace(/^https?:/,""),title:i.title,description:i.description,preview:i.preview?{url:(t=i.preview.url)==null?void 0:t.replace(/^https?:/,""),label:i.preview.label,roles:i.preview.roles}:void 0}})}function je(e){var r,i;return(i=(r=e.attributes)==null?void 0:r.filter(({roles:n})=>(n==null?void 0:n.indexOf("visible_in_pdp"))!==-1))==null?void 0:i.map(({label:n,value:t,name:s})=>{if(s!=null&&s.startsWith("ac_"))try{let u;typeof t=="string"?u=JSON.parse(t):typeof t=="object"&&(u=t);const l=ee(u);return{id:s,label:n,value:JSON.stringify(l)}}catch{return{id:s,label:n,value:t.toString().split(",").join(", ")}}return{id:s,label:n,value:t.toString().split(",").join(", ")}})}function ee(e){if(Array.isArray(e))return e.map(ee);if(e!==null&&typeof e=="object"){const r={};for(const[i,n]of Object.entries(e)){let t=i;i==="validation_rule"?t="validationRule":i==="min_length"?t="minLength":i==="max_length"?t="maxLength":i==="purchase_separately"&&(t="purchaseSeparately"),r[t]=ee(n)}return r}return e}function He(e,r){const{options:i,optionUIDs:n}=e;return i==null?void 0:i.map(({id:t,title:s,required:u,multi:l,values:a})=>{var m,f;const c=(m=a==null?void 0:a[0])==null?void 0:m.__typename;let o=(f=a==null?void 0:a[0])==null?void 0:f.type;return o?o=o.replace("COLOR_HEX","color").replace("TEXT","text").replace("IMAGE","image"):o="dropdown",{id:t,type:o,typename:c,label:s,required:u,multiple:l,items:r?We(a,n):Xe(a,n,o)}})}function We(e,r){return e==null?void 0:e.filter(({enabled:i})=>typeof i>"u"||i).map(i=>{const{id:n,title:t,inStock:s,isDefault:u,product:l}=i;return{id:n,inStock:s,label:t,selected:(r==null?void 0:r.indexOf(n))>-1||u,value:n,product:l,quantity:Ve(i),canEditQuantity:Qe(i)}})}function Xe(e,r,i){return e==null?void 0:e.map(({id:n,title:t,inStock:s,value:u})=>({id:n,inStock:s,label:t,selected:(r==null?void 0:r.indexOf(n))>-1,value:(i==null?void 0:i.toLowerCase())==="dropdown"?n:u==null?void 0:u.replace(/^https?:/,"")}))}function Ke(e,r,i){var b,ie,se,ue,ae;const{price:n,priceRange:t,options:s,optionUIDs:u=i}=e;if(!n&&!t)return null;const{__typename:l}=e;function a(){var D,p,g,w,O,_,S,A,x,U;const T=(p=(D=n==null?void 0:n.regular)==null?void 0:D.amount)==null?void 0:p.value,d=((w=(g=n==null?void 0:n.final)==null?void 0:g.amount)==null?void 0:w.value)??((_=(O=n==null?void 0:n.regular)==null?void 0:O.amount)==null?void 0:_.value),y=((A=(S=n==null?void 0:n.regular)==null?void 0:S.amount)==null?void 0:A.currency)==="NONE"?"USD":(U=(x=n==null?void 0:n.regular)==null?void 0:x.amount)==null?void 0:U.currency;return[T,d,d,y]}function c(){var p,g,w,O,_,S,A,x,U,Q,V,M,G,L,q,$,R,B,j,H,W;const T=(w=(g=(p=t==null?void 0:t.minimum)==null?void 0:p.final)==null?void 0:g.amount)==null?void 0:w.value,d=(S=(_=(O=t==null?void 0:t.maximum)==null?void 0:O.final)==null?void 0:_.amount)==null?void 0:S.value;let y;((U=(x=(A=t==null?void 0:t.minimum)==null?void 0:A.regular)==null?void 0:x.amount)==null?void 0:U.value)===((M=(V=(Q=t==null?void 0:t.maximum)==null?void 0:Q.regular)==null?void 0:V.amount)==null?void 0:M.value)&&(y=(q=(L=(G=t==null?void 0:t.minimum)==null?void 0:G.regular)==null?void 0:L.amount)==null?void 0:q.value);const D=((B=(R=($=t==null?void 0:t.minimum)==null?void 0:$.final)==null?void 0:R.amount)==null?void 0:B.currency)==="NONE"?"USD":(W=(H=(j=t==null?void 0:t.minimum)==null?void 0:j.final)==null?void 0:H.amount)==null?void 0:W.currency;return[y,T,d,D]}function o(){var w,O,_,S,A,x,U,Q,V,M,G,L,q,$,R,B,j,H,W,oe,le,ce,me,fe;let T=0,d=0;s==null||s.forEach(F=>{var de;const J=F==null?void 0:F.values;if(J&&Array.isArray(J)){const N=J.map(k=>{var X,K,Pe,he;return(he=(Pe=(K=(X=k==null?void 0:k.product)==null?void 0:X.price)==null?void 0:K.regular)==null?void 0:Pe.amount)==null?void 0:he.value}).filter(k=>k!==void 0),Y=N.length>0?Math.max(...N):0;T+=Y}(de=F==null?void 0:F.values)==null||de.forEach(N=>{var Y,k,X,K;u!=null&&u.includes(N.id)&&(d+=(K=(X=(k=(Y=N==null?void 0:N.product)==null?void 0:Y.price)==null?void 0:k.final)==null?void 0:X.amount)==null?void 0:K.value)})});const y=(_=(O=(w=t==null?void 0:t.minimum)==null?void 0:w.final)==null?void 0:O.amount)==null?void 0:_.value,D=(x=(A=(S=t==null?void 0:t.maximum)==null?void 0:S.final)==null?void 0:A.amount)==null?void 0:x.value;let p;((V=(Q=(U=t==null?void 0:t.minimum)==null?void 0:U.regular)==null?void 0:Q.amount)==null?void 0:V.value)===((L=(G=(M=t==null?void 0:t.maximum)==null?void 0:M.regular)==null?void 0:G.amount)==null?void 0:L.value)&&(p=(R=($=(q=t==null?void 0:t.minimum)==null?void 0:q.regular)==null?void 0:$.amount)==null?void 0:R.value);const g=((H=(j=(B=t==null?void 0:t.minimum)==null?void 0:B.final)==null?void 0:j.amount)==null?void 0:H.currency)==="NONE"?"USD":(le=(oe=(W=t==null?void 0:t.minimum)==null?void 0:W.final)==null?void 0:oe.amount)==null?void 0:le.currency;return r&&(u==null?void 0:u.length)<1?[p,y,D,g]:T===((fe=(me=(ce=t==null?void 0:t.maximum)==null?void 0:ce.regular)==null?void 0:me.amount)==null?void 0:fe.value)?[d,d,d,g]:[p,y,D,g]}const[m,f,P,h]=l==="SimpleProductView"?a():r?o():c(),v=l==="SimpleProductView"?(b=n==null?void 0:n.roles)==null?void 0:b.includes("visible"):((se=(ie=t==null?void 0:t.maximum)==null?void 0:ie.roles)==null?void 0:se.includes("visible"))&&((ae=(ue=t==null?void 0:t.minimum)==null?void 0:ue.roles)==null?void 0:ae.includes("visible"));function C(T){return!T||!Array.isArray(T)?[]:T.map(d=>{var y,D,p,g,w,O;return{tier:{amount:(D=(y=d.tier)==null?void 0:y.amount)==null?void 0:D.value,currency:((g=(p=d.tier)==null?void 0:p.amount)==null?void 0:g.currency)||h},quantity:((w=d.quantity[0])==null?void 0:w.gte)||((O=d.quantity[0])==null?void 0:O.lt)||0}}).sort((d,y)=>d.quantity-y.quantity)}return P&&f===P?{regular:{amount:m,currency:h,variant:m&&f!==m?"strikethrough":"default"},final:{amount:P,currency:h,variant:"default"},tiers:C(n==null?void 0:n.tiers),visible:v}:{final:{minimumAmount:f,maximumAmount:P,currency:h},tiers:C(n==null?void 0:n.tiers),visible:v}}function Ye(e,r,i){var n;if(r){const t=Array.isArray(e==null?void 0:e.optionUIDs)?e.optionUIDs.filter(Boolean):[];if(t.length>0)return t;const s=[];return(n=e==null?void 0:e.options)==null||n.forEach(({values:u,multi:l})=>{var o;const a=u==null?void 0:u.filter(({enabled:m})=>typeof m>"u"||m),c=a==null?void 0:a.filter(({isDefault:m})=>m);if(c!=null&&c.length){l?c.forEach(m=>s.push(m.id)):s.push(c[0].id);return}i&&((o=a==null?void 0:a[0])!=null&&o.id)&&s.push(a[0].id)}),s}return e==null?void 0:e.optionUIDs}function wt(e,r){if(!(r!=null&&r.length))return Object.values(e).flatMap(n=>"values"in n?n.values:n.value?[n.value]:[]);const i=[];for(const n of r){const t=e[n.id];if(t)if("values"in t){const s=new Map(n.items.map((l,a)=>[l.id,a])),u=[...t.values].sort((l,a)=>(s.get(l)??0)-(s.get(a)??0));i.push(...u)}else"value"in t&&t.value&&i.push(t.value)}return i}function ze(e,r,i){if(!(e!=null&&e.length))return!0;const n=r??[];return i?e.every(t=>t.required?t.items.filter(u=>n.includes(u.id)).length>=1:!0):n.length===e.length}const te=new _e({init:async e=>{var l,a,c;const r=(a=(l=e==null?void 0:e.models)==null?void 0:l.ProductDetails)==null?void 0:a.initialData,n=((c=(Te()||{}).optionsUIDs)==null?void 0:c.split(","))||(r==null?void 0:r.optionsUIDs),t=Ae(1),u={...{defaultLocale:"en-US",globalLocale:"en-US",persistURLParams:!1,acdl:!1,optionsUIDs:n},...e};if(te.config.setConfig({...u}),u!=null&&u.sku){const o=r?z(r):await ge(u.sku,{preselectFirstOption:u.preselectFirstOption});E.emit("pdp/data",o,{scope:u.scope});const m=Ee({scope:u.scope}),f=(m==null?void 0:m.bundleOptionQuantities)??Le(m==null?void 0:m.enteredOptions),P=o!=null&&o.isBundle?Ge(f,o==null?void 0:o.options,o==null?void 0:o.optionUIDs):void 0,h={sku:u.sku,quantity:t,optionsUIDs:o==null?void 0:o.optionUIDs,...P&&{bundleOptionQuantities:P,enteredOptions:be(P)}};ft(()=>({...h}),{scope:u.scope}),dt(()=>o!=null&&o.options?ze(o.options,o.optionUIDs,o.isBundle):!0,{scope:u.scope}),u.acdl&&o&&Fe(o)}},listeners:()=>[E.on("locale",async()=>{const{sku:e,scope:r}=te.config.getConfig();if(e){const i=await ge(e);E.emit("pdp/data",i,{scope:r})}})]}),I=te.config,{setEndpoint:Ot,setFetchGraphQlHeader:Ct,removeFetchGraphQlHeader:Dt,setFetchGraphQlHeaders:bt,getFetchGraphQlHeader:Et,fetchGraphQl:re,getConfig:vt}=new Se().getMethods();function _t(e){return{schemaVersion:e.schemaVersion,selectable:e.selectable.map(r=>({...r,values:r.values.map(i=>({...i,price:Number(i.price)}))})),shopperInput:e.shopperInput.map(r=>({...r,price:r.price===void 0?void 0:Number(r.price)}))}}const Je=`
3
+ import{merge as ve,Initializer as Ee}from"@dropins/tools/lib.js";import{events as v}from"@dropins/tools/event-bus.js";import{PRODUCT_FRAGMENT as ne}from"./fragments.js";import{FetchGraphQL as Se}from"@dropins/tools/fetch-graphql.js";function Pt(e){const r=new URLSearchParams(window.location.search);Object.entries(e).forEach(([n,t])=>{t===null?r.delete(n):r.set(n,String(t))});let i=window.location.pathname;i+=`?${r.toString()}`,i+=window.location.hash,window.history.replaceState({},"",i)}function ge(){const e=new URLSearchParams(window.location.search),r={};return e.forEach((i,n)=>{r[n]=i}),r}function xe(e=1){const i=(ge()||{}).quantity;if(i){const n=parseInt(i,10);if(!isNaN(n)&&Number.isInteger(n)&&n>0)return n}return e}function _e(e){var r,i,n,t,s,u,l,o,c,a,m,f;return{productId:Number(e==null?void 0:e.externalId),name:e==null?void 0:e.name,sku:(e==null?void 0:e.variantSku)||(e==null?void 0:e.sku),topLevelSku:e==null?void 0:e.sku,variantName:e==null?void 0:e.variantName,specialToDate:void 0,specialFromDate:void 0,newToDate:void 0,newFromDate:void 0,createdAt:void 0,updatedAt:void 0,manufacturer:void 0,countryOfManufacture:void 0,categories:void 0,productType:e==null?void 0:e.productType,pricing:{regularPrice:((i=(r=e==null?void 0:e.prices)==null?void 0:r.regular)==null?void 0:i.amount)||0,minimalPrice:(t=(n=e==null?void 0:e.prices)==null?void 0:n.final)==null?void 0:t.minimumAmount,maximalPrice:(u=(s=e==null?void 0:e.prices)==null?void 0:s.final)==null?void 0:u.maximumAmount,specialPrice:(o=(l=e==null?void 0:e.prices)==null?void 0:l.final)==null?void 0:o.amount,tierPricing:void 0,currencyCode:((a=(c=e==null?void 0:e.prices)==null?void 0:c.final)==null?void 0:a.currency)||"USD"},canonicalUrl:e==null?void 0:e.url,mainImageUrl:(f=(m=e==null?void 0:e.images)==null?void 0:m[0])==null?void 0:f.url}}const Oe={PRODUCT_CONTEXT:"productContext",CHANNEL_CONTEXT:"channelContext"},ke={PRODUCT_PAGE_VIEW:"product-page-view"};function we(){return window.adobeDataLayer=window.adobeDataLayer||[],window.adobeDataLayer}function Ae(){return{_id:"https://ns.adobe.com/xdm/channels/web",_type:"https://ns.adobe.com/xdm/channel-types/web"}}function Ce(e,r){const i=we();i.push({[e]:null}),i.push({[e]:r})}function Ne(){typeof window>"u"||Ce(Oe.CHANNEL_CONTEXT,Ae())}function Ue(e,r){we().push(n=>{const t=n.getState?n.getState():{};n.push({event:e,eventInfo:{...t,...r}})})}function Ie(e){const r=_e(e);Ce(Oe.PRODUCT_CONTEXT,r),Ne(),Ue(ke.PRODUCT_PAGE_VIEW)}var Z=(e=>(e.ComplexProduct="complex",e.SimpleProduct="simple",e))(Z||{}),De=(e=>(e.ComplexProductView="ComplexProductView",e.SimpleProductView="SimpleProductView",e))(De||{});function Fe(e){return!!e.canEditQuantity}function Qe(e){const r=e.quantity??e.qty,i=Number(r);return Number.isFinite(i)&&i>0?i:1}function Ve(e,r){if(!(e!=null&&e.length)||!(r!=null&&r.length))return{};const i={};for(const n of e)if(n.typename==="ProductViewOptionValueProduct")for(const t of n.items)r.includes(t.id)&&(i[t.id]=t.quantity??1);return i}function Ge(e,r,i){const n=Ve(r,i);return e?Object.fromEntries(Object.entries(n).map(([t,s])=>[t,e[t]??s])):n}function Te(e){return e?Object.entries(e).map(([r,i])=>({uid:r,value:String(i)})):[]}function Me(e){if(!(e!=null&&e.length))return{};const r={};for(const i of e){const n=Number(i.value);Number.isFinite(n)&&n>0&&(r[i.uid]=n)}return r}function Le(e,r,i){const n=new Set([...Object.keys(r||{}),...Object.keys(i)]);return[...(e||[]).filter(t=>!n.has(t.uid)),...Te(i)]}function J(e,r){var u,l,o,c,a,m,f,P,h,E,D,b;const i=((c=(o=(l=(u=e==null?void 0:e.options)==null?void 0:u[0])==null?void 0:l.values)==null?void 0:o[0])==null?void 0:c.__typename)==="ProductViewOptionValueProduct",n=We(e,i,r==null?void 0:r.preselectFirstOption),t=(e==null?void 0:e.__typename)===De.SimpleProductView?Z.SimpleProduct:Z.ComplexProduct,s=e?{name:e.name,sku:e.sku,isBundle:i,addToCartAllowed:e.addToCartAllowed,inStock:e.inStock,shortDescription:e.shortDescription,metaDescription:e.metaDescription,metaKeyword:e.metaKeyword,metaTitle:e.metaTitle,description:e.description,images:$e(e),videos:je(e),prices:Re(e,i,n),attributes:Be(e),options:qe(He(e,i)),optionUIDs:n,url:e.url,urlKey:e.urlKey,externalId:e.externalId,externalParentId:e.externalParentId,variantSku:e.variantSku,variantName:e.variantName,productType:t}:null;return ve(s,((P=(f=(m=(a=I.getConfig())==null?void 0:a.models)==null?void 0:m.ProductDetails)==null?void 0:f.transformer)==null?void 0:P.call(f,e))??((b=(D=(E=(h=I.getConfig())==null?void 0:h.models)==null?void 0:E.ProductDetails)==null?void 0:D.transform)==null?void 0:b.call(D,e)))}function qe(e){var i,n,t;if(!e)return;const r=(t=(n=(i=I.getConfig())==null?void 0:i.models)==null?void 0:n.ProductOptions)==null?void 0:t.optionsTransformer;if(!r)return e;try{return r(e)??e}catch(s){return console.error("product-transform: optionsTransformer threw an error, using original options",s),e}}function $e(e){var r,i;return(i=(r=e.images)==null?void 0:r.filter(n=>{var t;return!((t=n.roles)!=null&&t.includes("hide_from_pdp"))}))==null?void 0:i.map(n=>(n.url=n.url.replace(/^https?:/,""),n))}function je(e){var r;return(r=e.videos)==null?void 0:r.map(i=>{var n,t;return{url:(n=i.url)==null?void 0:n.replace(/^https?:/,""),title:i.title,description:i.description,preview:i.preview?{url:(t=i.preview.url)==null?void 0:t.replace(/^https?:/,""),label:i.preview.label,roles:i.preview.roles}:void 0}})}function Be(e){var r,i;return(i=(r=e.attributes)==null?void 0:r.filter(({roles:n})=>(n==null?void 0:n.indexOf("visible_in_pdp"))!==-1))==null?void 0:i.map(({label:n,value:t,name:s})=>{if(s!=null&&s.startsWith("ac_"))try{let u;typeof t=="string"?u=JSON.parse(t):typeof t=="object"&&(u=t);const l=ee(u);return{id:s,label:n,value:JSON.stringify(l)}}catch{return{id:s,label:n,value:t.toString().split(",").join(", ")}}return{id:s,label:n,value:t.toString().split(",").join(", ")}})}function ee(e){if(Array.isArray(e))return e.map(ee);if(e!==null&&typeof e=="object"){const r={};for(const[i,n]of Object.entries(e)){let t=i;i==="validation_rule"?t="validationRule":i==="min_length"?t="minLength":i==="max_length"?t="maxLength":i==="purchase_separately"&&(t="purchaseSeparately"),r[t]=ee(n)}return r}return e}function He(e,r){const{options:i,optionUIDs:n}=e;return i==null?void 0:i.map(({id:t,title:s,required:u,multi:l,values:o})=>{var m,f;const c=(m=o==null?void 0:o[0])==null?void 0:m.__typename;let a=(f=o==null?void 0:o[0])==null?void 0:f.type;return a?a=a.replace("COLOR_HEX","color").replace("TEXT","text").replace("IMAGE","image"):a="dropdown",{id:t,type:a,typename:c,label:s,required:u,multiple:l,items:r?Xe(o,n):Ke(o,n,a)}})}function Xe(e,r){return e==null?void 0:e.filter(({enabled:i})=>typeof i>"u"||i).map(i=>{const{id:n,title:t,inStock:s,isDefault:u,product:l}=i;return{id:n,inStock:s,label:t,selected:(r==null?void 0:r.indexOf(n))>-1||u,value:n,product:l,quantity:Qe(i),canEditQuantity:Fe(i)}})}function Ke(e,r,i){return e==null?void 0:e.map(({id:n,title:t,inStock:s,value:u})=>({id:n,inStock:s,label:t,selected:(r==null?void 0:r.indexOf(n))>-1,value:(i==null?void 0:i.toLowerCase())==="dropdown"?n:u==null?void 0:u.replace(/^https?:/,"")}))}function Re(e,r,i){var b,ie,se,ue,oe;const{price:n,priceRange:t,options:s,optionUIDs:u=i}=e;if(!n&&!t)return null;const{__typename:l}=e;function o(){var T,y,g,w,C,S,x,_,k,A;const O=(y=(T=n==null?void 0:n.regular)==null?void 0:T.amount)==null?void 0:y.value,d=((w=(g=n==null?void 0:n.final)==null?void 0:g.amount)==null?void 0:w.value)??((S=(C=n==null?void 0:n.regular)==null?void 0:C.amount)==null?void 0:S.value),p=((_=(x=n==null?void 0:n.regular)==null?void 0:x.amount)==null?void 0:_.currency)==="NONE"?"USD":(A=(k=n==null?void 0:n.regular)==null?void 0:k.amount)==null?void 0:A.currency;return[O,d,d,p]}function c(){var y,g,w,C,S,x,_,k,A,Q,V,G,M,L,q,$,j,B,H,X,K;const O=(w=(g=(y=t==null?void 0:t.minimum)==null?void 0:y.final)==null?void 0:g.amount)==null?void 0:w.value,d=(x=(S=(C=t==null?void 0:t.maximum)==null?void 0:C.final)==null?void 0:S.amount)==null?void 0:x.value;let p;((A=(k=(_=t==null?void 0:t.minimum)==null?void 0:_.regular)==null?void 0:k.amount)==null?void 0:A.value)===((G=(V=(Q=t==null?void 0:t.maximum)==null?void 0:Q.regular)==null?void 0:V.amount)==null?void 0:G.value)&&(p=(q=(L=(M=t==null?void 0:t.minimum)==null?void 0:M.regular)==null?void 0:L.amount)==null?void 0:q.value);const T=((B=(j=($=t==null?void 0:t.minimum)==null?void 0:$.final)==null?void 0:j.amount)==null?void 0:B.currency)==="NONE"?"USD":(K=(X=(H=t==null?void 0:t.minimum)==null?void 0:H.final)==null?void 0:X.amount)==null?void 0:K.currency;return[p,O,d,T]}function a(){var w,C,S,x,_,k,A,Q,V,G,M,L,q,$,j,B,H,X,K,ae,le,ce,me,fe;let O=0,d=0;s==null||s.forEach(F=>{var de;const Y=F==null?void 0:F.values;if(Y&&Array.isArray(Y)){const U=Y.map(N=>{var R,W,Pe,he;return(he=(Pe=(W=(R=N==null?void 0:N.product)==null?void 0:R.price)==null?void 0:W.regular)==null?void 0:Pe.amount)==null?void 0:he.value}).filter(N=>N!==void 0),z=U.length>0?Math.max(...U):0;O+=z}(de=F==null?void 0:F.values)==null||de.forEach(U=>{var z,N,R,W;u!=null&&u.includes(U.id)&&(d+=(W=(R=(N=(z=U==null?void 0:U.product)==null?void 0:z.price)==null?void 0:N.final)==null?void 0:R.amount)==null?void 0:W.value)})});const p=(S=(C=(w=t==null?void 0:t.minimum)==null?void 0:w.final)==null?void 0:C.amount)==null?void 0:S.value,T=(k=(_=(x=t==null?void 0:t.maximum)==null?void 0:x.final)==null?void 0:_.amount)==null?void 0:k.value;let y;((V=(Q=(A=t==null?void 0:t.minimum)==null?void 0:A.regular)==null?void 0:Q.amount)==null?void 0:V.value)===((L=(M=(G=t==null?void 0:t.maximum)==null?void 0:G.regular)==null?void 0:M.amount)==null?void 0:L.value)&&(y=(j=($=(q=t==null?void 0:t.minimum)==null?void 0:q.regular)==null?void 0:$.amount)==null?void 0:j.value);const g=((X=(H=(B=t==null?void 0:t.minimum)==null?void 0:B.final)==null?void 0:H.amount)==null?void 0:X.currency)==="NONE"?"USD":(le=(ae=(K=t==null?void 0:t.minimum)==null?void 0:K.final)==null?void 0:ae.amount)==null?void 0:le.currency;return r&&(u==null?void 0:u.length)<1?[y,p,T,g]:O===((fe=(me=(ce=t==null?void 0:t.maximum)==null?void 0:ce.regular)==null?void 0:me.amount)==null?void 0:fe.value)?[d,d,d,g]:[y,p,T,g]}const[m,f,P,h]=l==="SimpleProductView"?o():r?a():c(),E=l==="SimpleProductView"?(b=n==null?void 0:n.roles)==null?void 0:b.includes("visible"):((se=(ie=t==null?void 0:t.maximum)==null?void 0:ie.roles)==null?void 0:se.includes("visible"))&&((oe=(ue=t==null?void 0:t.minimum)==null?void 0:ue.roles)==null?void 0:oe.includes("visible"));function D(O){return!O||!Array.isArray(O)?[]:O.map(d=>{var p,T,y,g,w,C;return{tier:{amount:(T=(p=d.tier)==null?void 0:p.amount)==null?void 0:T.value,currency:((g=(y=d.tier)==null?void 0:y.amount)==null?void 0:g.currency)||h},quantity:((w=d.quantity[0])==null?void 0:w.gte)||((C=d.quantity[0])==null?void 0:C.lt)||0}}).sort((d,p)=>d.quantity-p.quantity)}return P&&f===P?{regular:{amount:m,currency:h,variant:m&&f!==m?"strikethrough":"default"},final:{amount:P,currency:h,variant:"default"},tiers:D(n==null?void 0:n.tiers),visible:E}:{final:{minimumAmount:f,maximumAmount:P,currency:h},tiers:D(n==null?void 0:n.tiers),visible:E}}function We(e,r,i){var n;if(r){const t=Array.isArray(e==null?void 0:e.optionUIDs)?e.optionUIDs.filter(Boolean):[];if(t.length>0)return t;const s=[];return(n=e==null?void 0:e.options)==null||n.forEach(({values:u,multi:l})=>{var a;const o=u==null?void 0:u.filter(({enabled:m})=>typeof m>"u"||m),c=o==null?void 0:o.filter(({isDefault:m})=>m);if(c!=null&&c.length){l?c.forEach(m=>s.push(m.id)):s.push(c[0].id);return}i&&((a=o==null?void 0:o[0])!=null&&a.id)&&s.push(o[0].id)}),s}return e==null?void 0:e.optionUIDs}function ht(e,r){if(!(r!=null&&r.length))return Object.values(e).flatMap(n=>"values"in n?n.values:n.value?[n.value]:[]);const i=[];for(const n of r){const t=e[n.id];if(t)if("values"in t){const s=new Map(n.items.map((l,o)=>[l.id,o])),u=[...t.values].sort((l,o)=>(s.get(l)??0)-(s.get(o)??0));i.push(...u)}else"value"in t&&t.value&&i.push(t.value)}return i}function ze(e,r,i){if(!(e!=null&&e.length))return!0;const n=r??[];return i?e.every(t=>t.required?t.items.filter(u=>n.includes(u.id)).length>=1:!0):n.length===e.length}const te=new Ee({init:async e=>{var l,o,c;const r=(o=(l=e==null?void 0:e.models)==null?void 0:l.ProductDetails)==null?void 0:o.initialData,n=((c=(ge()||{}).optionsUIDs)==null?void 0:c.split(","))||(r==null?void 0:r.optionsUIDs),t=xe(1),u={...{defaultLocale:"en-US",globalLocale:"en-US",persistURLParams:!1,acdl:!1,optionsUIDs:n},...e};if(te.config.setConfig({...u}),u!=null&&u.sku){const a=r?J(r):await ye(u.sku,{preselectFirstOption:u.preselectFirstOption});v.emit("pdp/data",a,{scope:u.scope});const m=be({scope:u.scope}),f=(m==null?void 0:m.bundleOptionQuantities)??Me(m==null?void 0:m.enteredOptions),P=a!=null&&a.isBundle?Ge(f,a==null?void 0:a.options,a==null?void 0:a.optionUIDs):void 0,h={sku:u.sku,quantity:t,optionsUIDs:a==null?void 0:a.optionUIDs,...P&&{bundleOptionQuantities:P,enteredOptions:Te(P)}};ot(()=>({...h}),{scope:u.scope}),at(()=>a!=null&&a.options?ze(a.options,a.optionUIDs,a.isBundle):!0,{scope:u.scope}),u.acdl&&a&&Ie(a)}},listeners:()=>[v.on("locale",async()=>{const{sku:e,scope:r}=te.config.getConfig();if(e){const i=await ye(e);v.emit("pdp/data",i,{scope:r})}})]}),I=te.config,{setEndpoint:pt,setFetchGraphQlHeader:yt,removeFetchGraphQlHeader:gt,setFetchGraphQlHeaders:Ot,getFetchGraphQlHeader:wt,fetchGraphQl:re,getConfig:Ct}=new Se().getMethods();function Dt(e){return{schemaVersion:e.schemaVersion,selectable:e.selectable.map(r=>({...r,values:r.values.map(i=>({...i,price:Number(i.price)}))})),shopperInput:e.shopperInput.map(r=>({...r,price:r.price===void 0?void 0:Number(r.price)}))}}const Je=`
4
4
  query GET_PRODUCT_DATA($skus: [String]) {
5
5
  products(skus: $skus) {
6
6
  ...PRODUCT_FRAGMENT
@@ -8,7 +8,7 @@ query GET_PRODUCT_DATA($skus: [String]) {
8
8
  }
9
9
 
10
10
  ${ne}
11
- `,Ze=async(e,r,i)=>{var s;const{data:n}=await re(Je,{method:"GET",variables:{skus:[e]}}),t=(s=n==null?void 0:n.products)==null?void 0:s[0];return r!=null&&r.optionsUIDs&&(t.optionUIDs=r.optionsUIDs),t?i?t:z(t,{preselectFirstOption:r==null?void 0:r.preselectFirstOption}):null},et=`
11
+ `,Ye=async(e,r,i)=>{var s;const{data:n}=await re(Je,{method:"GET",variables:{skus:[e]}}),t=(s=n==null?void 0:n.products)==null?void 0:s[0];return r!=null&&r.optionsUIDs&&(t.optionUIDs=r.optionsUIDs),t?i?t:J(t,{preselectFirstOption:r==null?void 0:r.preselectFirstOption}):null},Ze=`
12
12
  query GET_PRODUCTS_DATA($skus: [String]) {
13
13
  products(skus: $skus) {
14
14
  ...PRODUCT_FRAGMENT
@@ -16,7 +16,7 @@ query GET_PRODUCTS_DATA($skus: [String]) {
16
16
  }
17
17
 
18
18
  ${ne}
19
- `,St=async(e,r)=>{if(!e||e.length===0)return null;const i=e.map(u=>u.sku),{data:n}=await re(et,{method:"GET",variables:{skus:i}}),t=n==null?void 0:n.products;if(!t||t.length===0)return null;const s=e.reduce((u,l)=>(u[l.sku]=l,u),{});return r?t:t.map(u=>{const l=s[u.sku];return l!=null&&l.optionsUIDs&&(u.optionUIDs=l.optionsUIDs),z(u,{preselectFirstOption:l==null?void 0:l.preselectFirstOption})})},tt="ac_rating_summary",nt="ac_review_count",rt=[tt,nt],it=`
19
+ `,Tt=async(e,r)=>{if(!e||e.length===0)return null;const i=e.map(u=>u.sku),{data:n}=await re(Ze,{method:"GET",variables:{skus:i}}),t=n==null?void 0:n.products;if(!t||t.length===0)return null;const s=e.reduce((u,l)=>(u[l.sku]=l,u),{});return r?t:t.map(u=>{const l=s[u.sku];return l!=null&&l.optionsUIDs&&(u.optionUIDs=l.optionsUIDs),J(u,{preselectFirstOption:l==null?void 0:l.preselectFirstOption})})},et=`
20
20
  query REFINE_PRODUCT_QUERY(
21
21
  $optionIds: [String!]!
22
22
  $sku: String!
@@ -38,7 +38,7 @@ query REFINE_PRODUCT_QUERY(
38
38
  }
39
39
 
40
40
  ${ne}
41
- `;function st(e){try{return atob(e).startsWith("custom-option/")}catch{return!1}}const ye=({name:e})=>!!e&&rt.includes(e);function ut(e,r){var n;const i=((n=e==null?void 0:e.attributes)==null?void 0:n.filter(ye))??[];return!r||!i.length?{}:{attributes:[...(r.attributes??[]).filter(t=>!ye(t)),...i]}}async function pe(e,r){const i=r.filter(l=>!st(l)),n=ot(i),t=lt(n,e),s=it.replace("# %extendedPlaceholder%",t),{data:u}=await re(s,{method:"GET",variables:{optionIds:i,sku:e}});return u}const at=async(e,r,i,n)=>{var h,v,C;const t=await pe(e,r);if(!t)return null;const{products:s,refineProduct:u,...l}=t;let a=u;const c=s==null?void 0:s[0],o=ct(Object.values(l),c.options,i);if(i!=null&&i.length&&a===null){r=mt(o,r,i);const b=await pe(e,r);a=b==null?void 0:b.refineProduct}const m={...a||c,...ut(c,a),sku:c.sku,name:c.name,externalParentId:c==null?void 0:c.externalId,options:o,optionUIDs:r,variantSku:(a==null?void 0:a.__typename)==="SimpleProductView"?a==null?void 0:a.sku:void 0,variantName:(a==null?void 0:a.__typename)==="SimpleProductView"?a==null?void 0:a.name:void 0},f=n?m:z(m),P=(C=(v=(h=I==null?void 0:I.getConfig())==null?void 0:h.models)==null?void 0:v.ProductDetails)==null?void 0:C.fallbackData;return P?P(c,f):f};function ot(e){if(e.length<2)return[e];const r=[];return e.forEach(i=>{const n=[];e.forEach(t=>{i!==t&&n.push(t)}),r.push(n)}),r}function lt(e,r){return e.map((i,n)=>`
41
+ `;function tt(e){try{return atob(e).startsWith("custom-option/")}catch{return!1}}async function pe(e,r){const i=r.filter(l=>!tt(l)),n=rt(i),t=it(n,e),s=et.replace("# %extendedPlaceholder%",t),{data:u}=await re(s,{method:"GET",variables:{optionIds:i,sku:e}});return u}const nt=async(e,r,i,n)=>{var h,E,D;const t=await pe(e,r);if(!t)return null;const{products:s,refineProduct:u,...l}=t;let o=u;const c=s==null?void 0:s[0],a=st(Object.values(l),c.options,i);if(i!=null&&i.length&&o===null){r=ut(a,r,i);const b=await pe(e,r);o=b==null?void 0:b.refineProduct}const m={...o||c,sku:c.sku,name:c.name,externalParentId:c==null?void 0:c.externalId,options:a,optionUIDs:r,variantSku:(o==null?void 0:o.__typename)==="SimpleProductView"?o==null?void 0:o.sku:void 0,variantName:(o==null?void 0:o.__typename)==="SimpleProductView"?o==null?void 0:o.name:void 0},f=n?m:J(m),P=(D=(E=(h=I==null?void 0:I.getConfig())==null?void 0:h.models)==null?void 0:E.ProductDetails)==null?void 0:D.fallbackData;return P?P(c,f):f};function rt(e){if(e.length<2)return[e];const r=[];return e.forEach(i=>{const n=[];e.forEach(t=>{i!==t&&n.push(t)}),r.push(n)}),r}function it(e,r){return e.map((i,n)=>`
42
42
  ProductOption${n}: refineProduct(
43
43
  optionIds: [
44
44
  ${i.map(t=>`"${t}"`).join(", ")}
@@ -51,5 +51,5 @@ ${ne}
51
51
  }
52
52
  }
53
53
  }
54
- `).join("")}function ct(e,r=[],i){const n=Object.values(e).filter(s=>!!s).reduce((s,u)=>u.options?[...s,...u.options]:[...s],[]),t=new Map(r.map(s=>[s.id,s]));return n.forEach(s=>{i!=null&&i.includes(s.id)||t.set(s.id,s)}),[...t.values()]}function mt(e,r,i){const n=[];let t;return e.forEach(s=>{var u,l,a,c;i.includes(s.id)?t=((l=(u=s.values)==null?void 0:u.find(o=>r.includes(o==null?void 0:o.id)))==null?void 0:l.id)||((a=s.values[0])==null?void 0:a.id):t=(c=s.values[0])==null?void 0:c.id,n.push(t)}),n}const ge=async(e,r)=>{const{anchors:i,optionsUIDs:n}=I.getConfig(),{optionsUIDs:t=n,anchors:s=i,preselectFirstOption:u,isBundle:l,skipTransform:a}=r??{};return!l&&t&&t.length>0?await at(e,t,s,a):await Ze(e,{preselectFirstOption:u,optionsUIDs:t},a)},ft=(e,r)=>{const i=Ee({scope:r==null?void 0:r.scope})??{},n=e(i);n.bundleOptionQuantities&&(n.enteredOptions=qe(n.enteredOptions,i.bundleOptionQuantities,n.bundleOptionQuantities)),E.emit("pdp/values",{...n},{scope:r==null?void 0:r.scope})},Ee=({scope:e}={})=>E.lastPayload("pdp/values",{scope:e})??null,dt=(e,r)=>{const i=Pt({scope:r==null?void 0:r.scope}),n=e(i);E.emit("pdp/valid",n,{scope:r==null?void 0:r.scope})},At=async({scope:e}={})=>{const r=E.lastPayload("pdp/data",{scope:e});return r?Promise.resolve(r):new Promise(i=>{const n=E.on("pdp/data",t=>{i(t),n==null||n.off()},{eager:!0,scope:e})})},Pt=({scope:e}={})=>E.lastPayload("pdp/valid",{scope:e})??null;export{tt as R,nt as a,wt as b,Me as c,I as config,be as d,qe as e,_t as f,re as fetchGraphQl,ge as fetchProductData,Ae as g,vt as getConfig,Et as getFetchGraphQlHeader,At as getFetchedProductData,Ee as getProductConfigurationValues,Ze as getProductData,St as getProductsData,at as getRefinedProduct,ze as i,te as initialize,st as isCustomOptionUID,Pt as isProductConfigurationValid,Ge as m,Fe as p,Dt as removeFetchGraphQlHeader,Tt as s,Ot as setEndpoint,Ct as setFetchGraphQlHeader,bt as setFetchGraphQlHeaders,dt as setProductConfigurationValid,ft as setProductConfigurationValues,z as t};
54
+ `).join("")}function st(e,r=[],i){const n=Object.values(e).filter(s=>!!s).reduce((s,u)=>u.options?[...s,...u.options]:[...s],[]),t=new Map(r.map(s=>[s.id,s]));return n.forEach(s=>{i!=null&&i.includes(s.id)||t.set(s.id,s)}),[...t.values()]}function ut(e,r,i){const n=[];let t;return e.forEach(s=>{var u,l,o,c;i.includes(s.id)?t=((l=(u=s.values)==null?void 0:u.find(a=>r.includes(a==null?void 0:a.id)))==null?void 0:l.id)||((o=s.values[0])==null?void 0:o.id):t=(c=s.values[0])==null?void 0:c.id,n.push(t)}),n}const ye=async(e,r)=>{const{anchors:i,optionsUIDs:n}=I.getConfig(),{optionsUIDs:t=n,anchors:s=i,preselectFirstOption:u,isBundle:l,skipTransform:o}=r??{};return!l&&t&&t.length>0?await nt(e,t,s,o):await Ye(e,{preselectFirstOption:u,optionsUIDs:t},o)},ot=(e,r)=>{const i=be({scope:r==null?void 0:r.scope})??{},n=e(i);n.bundleOptionQuantities&&(n.enteredOptions=Le(n.enteredOptions,i.bundleOptionQuantities,n.bundleOptionQuantities)),v.emit("pdp/values",{...n},{scope:r==null?void 0:r.scope})},be=({scope:e}={})=>v.lastPayload("pdp/values",{scope:e})??null,at=(e,r)=>{const i=lt({scope:r==null?void 0:r.scope}),n=e(i);v.emit("pdp/valid",n,{scope:r==null?void 0:r.scope})},bt=async({scope:e}={})=>{const r=v.lastPayload("pdp/data",{scope:e});return r?Promise.resolve(r):new Promise(i=>{const n=v.on("pdp/data",t=>{i(t),n==null||n.off()},{eager:!0,scope:e})})},lt=({scope:e}={})=>v.lastPayload("pdp/valid",{scope:e})??null;export{ht as a,Ve as b,Te as c,I as config,Le as d,Dt as e,re as fetchGraphQl,ye as fetchProductData,xe as g,Ct as getConfig,wt as getFetchGraphQlHeader,bt as getFetchedProductData,be as getProductConfigurationValues,Ye as getProductData,Tt as getProductsData,nt as getRefinedProduct,ze as i,te as initialize,tt as isCustomOptionUID,lt as isProductConfigurationValid,Ge as m,Ie as p,gt as removeFetchGraphQlHeader,Pt as s,pt as setEndpoint,yt as setFetchGraphQlHeader,Ot as setFetchGraphQlHeaders,at as setProductConfigurationValid,ot as setProductConfigurationValues,J as t};
55
55
  //# sourceMappingURL=api.js.map
package/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["/@dropins/storefront-pdp/src/lib/url-params.ts","/@dropins/storefront-pdp/src/data/transforms/acdl-context.ts","/@dropins/storefront-pdp/src/lib/acdl.ts","/@dropins/storefront-pdp/src/data/models/acdl-models.ts","/@dropins/storefront-pdp/src/lib/bundle-option-quantities.ts","/@dropins/storefront-pdp/src/data/transforms/product-transform.ts","/@dropins/storefront-pdp/src/lib/product-option-selection.ts","/@dropins/storefront-pdp/src/api/initialize/initialize.ts","/@dropins/storefront-pdp/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-pdp/src/data/transforms/customizable-options-transform.ts","/@dropins/storefront-pdp/src/api/getProductData/graphql/getProductData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/getProductData.ts","/@dropins/storefront-pdp/src/api/getProductsData/graphql/getProductsData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductsData/getProductsData.ts","/@dropins/storefront-pdp/src/data/models/product-rating-model.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/getRefinedProduct.ts","/@dropins/storefront-pdp/src/api/fetchProductData/fetchProductData.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValues/setProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/getProductConfigurationValues/getProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValid/setProductConfigurationValid.ts","/@dropins/storefront-pdp/src/api/getFetchedProductData/getFetchedProductData.ts","/@dropins/storefront-pdp/src/api/isProductConfigurationValid/isProductConfigurationValid.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport function setUrlParams(\n params: Record<string, string | number | null>,\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\nexport function getValidatedQuantityFromUrl(\n defaultQuantity: number = 1,\n): number {\n const urlParams = getUrlParams() || {};\n const quantityParam = urlParams.quantity; // 'quantity' is the key\n\n if (quantityParam) {\n const parsedQuantity = parseInt(quantityParam, 10);\n\n if (\n !isNaN(parsedQuantity) &&\n Number.isInteger(parsedQuantity) &&\n parsedQuantity > 0\n ) {\n // Return the valid quantity from the URL\n return parsedQuantity;\n }\n }\n\n // Return the default quantity if the parameter is missing, invalid, or not positive\n return defaultQuantity;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { ProductModel } from '../models';\n\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: Number(product?.externalId),\n name: product?.name,\n sku: product?.variantSku || product?.sku,\n topLevelSku: product?.sku,\n variantName: product?.variantName,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: product?.productType,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: product?.prices?.final?.minimumAmount,\n maximalPrice: product?.prices?.final?.maximumAmount,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.url,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n CHANNEL_CONTEXT: 'channelContext',\n};\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts\n */\nexport const events = {\n PRODUCT_PAGE_VIEW: 'product-page-view',\n};\n\nexport function getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\nexport function getChannelContext() {\n return {\n _id: 'https://ns.adobe.com/xdm/channels/web',\n _type: 'https://ns.adobe.com/xdm/channel-types/web',\n };\n}\n\n/**\n * Sets a context in the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/Base.ts#L6\n */\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\nexport function setChannelContext() {\n if (typeof window === 'undefined') {\n return;\n }\n\n setContext(contexts.CHANNEL_CONTEXT, getChannelContext());\n}\n\n/**\n * Pushes an event to the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/1973d0ce28471ef190fa06dad6359ffa0ab51db6/packages/storefront-events-sdk/src/Base.ts#L34\n */\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\n// Triggered when a product page is viewed\nexport function publishProductPageViewEvent(product: ProductModel) {\n const productItem = transformProduct(product);\n setContext(contexts.PRODUCT_CONTEXT, productItem);\n setChannelContext();\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/**\n * ACDL Product Types from:\n * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts\n */\n\nexport type Product = {\n productId: number;\n name: string;\n sku: string;\n topLevelSku?: string | null;\n variantName?: string | null;\n specialToDate?: string | null;\n specialFromDate?: string | null;\n newToDate?: string | null;\n newFromDate?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n manufacturer?: string | null;\n countryOfManufacture?: string | null;\n categories?: string[] | null;\n productType?: ProductType;\n pricing?: {\n regularPrice: number;\n minimalPrice?: number;\n maximalPrice?: number;\n specialPrice?: number;\n tierPricing?: {\n customerGroupId?: number | null;\n qty: number;\n value: number;\n }[];\n currencyCode: string | null;\n };\n canonicalUrl?: string | null;\n mainImageUrl?: string | null;\n};\n\nexport enum ProductType {\n ComplexProduct = 'complex',\n SimpleProduct = 'simple',\n}\n\nexport enum ProductViewType {\n ComplexProductView = 'ComplexProductView',\n SimpleProductView = 'SimpleProductView',\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport type { Option } from '@/pdp/data/models';\n\nexport type BundleOptionQuantities = Record<string, number>;\n\nexport function readCanEditQuantity(value: Record<string, unknown>): boolean {\n return Boolean(value.canEditQuantity);\n}\n\nexport function readDefaultOptionQuantity(\n value: Record<string, unknown>,\n): number {\n const raw = value.quantity ?? value.qty;\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;\n}\n\nexport function buildBundleOptionQuantitiesFromOptions(\n options: Option[] | undefined,\n optionUIDs: string[] | undefined,\n): BundleOptionQuantities {\n if (!options?.length || !optionUIDs?.length) {\n return {};\n }\n\n const quantities: BundleOptionQuantities = {};\n\n for (const option of options) {\n if (option.typename !== 'ProductViewOptionValueProduct') {\n continue;\n }\n\n for (const item of option.items) {\n if (!optionUIDs.includes(item.id)) {\n continue;\n }\n\n quantities[item.id] = item.quantity ?? 1;\n }\n }\n\n return quantities;\n}\n\nexport function mergeBundleOptionQuantities(\n previous: BundleOptionQuantities | undefined,\n options: Option[] | undefined,\n optionUIDs: string[] | undefined,\n): BundleOptionQuantities {\n const next = buildBundleOptionQuantitiesFromOptions(options, optionUIDs);\n\n if (!previous) {\n return next;\n }\n\n return Object.fromEntries(\n Object.entries(next).map(([uid, defaultQty]) => [\n uid,\n previous[uid] ?? defaultQty,\n ]),\n );\n}\n\nexport function bundleOptionQuantitiesToEnteredOptions(\n quantities: BundleOptionQuantities | undefined,\n): Array<{ uid: string; value: string }> {\n if (!quantities) {\n return [];\n }\n\n return Object.entries(quantities).map(([uid, quantity]) => ({\n uid,\n value: String(quantity),\n }));\n}\n\nexport function bundleOptionQuantitiesFromEnteredOptions(\n enteredOptions: Array<{ uid: string; value: string }> | undefined,\n): BundleOptionQuantities {\n if (!enteredOptions?.length) {\n return {};\n }\n\n const quantities: BundleOptionQuantities = {};\n for (const option of enteredOptions) {\n const quantity = Number(option.value);\n if (Number.isFinite(quantity) && quantity > 0) {\n quantities[option.uid] = quantity;\n }\n }\n return quantities;\n}\n\nexport function mergeBundleEnteredOptions(\n enteredOptions: Array<{ uid: string; value: string }> | undefined,\n previous: BundleOptionQuantities | undefined,\n next: BundleOptionQuantities,\n): Array<{ uid: string; value: string }> {\n const bundleUIDs = new Set([\n ...Object.keys(previous || {}),\n ...Object.keys(next),\n ]);\n return [\n ...(enteredOptions || []).filter((entry) => !bundleUIDs.has(entry.uid)),\n ...bundleOptionQuantitiesToEnteredOptions(next),\n ];\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/pdp/api';\nimport { ProductModel, Option } from '@/pdp/data/models';\nimport { ProductType, ProductViewType } from '../models/acdl-models';\nimport {\n readCanEditQuantity,\n readDefaultOptionQuantity,\n} from '@/pdp/lib/bundle-option-quantities';\n\nexport function transformProductData(\n data: any,\n options?: {\n preselectFirstOption?: boolean;\n },\n): ProductModel | null {\n const isBundle =\n data?.options?.[0]?.values?.[0]?.__typename ===\n 'ProductViewOptionValueProduct';\n const optionUIDs = getOptionUIDs(\n data,\n isBundle,\n options?.preselectFirstOption,\n );\n const productType =\n data?.__typename === ProductViewType.SimpleProductView\n ? ProductType.SimpleProduct\n : ProductType.ComplexProduct;\n\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n isBundle,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n videos: transformVideos(data),\n prices: transformPrices(data, isBundle, optionUIDs),\n attributes: transformAttributes(data),\n options: applyOptionsTransformer(transformOptions(data, isBundle)),\n optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n variantName: data.variantName,\n productType,\n } as ProductModel)\n : null;\n\n // extend the model with custom transformer\n return merge(\n productData,\n config.getConfig()?.models?.ProductDetails?.transformer?.(data) ??\n config.getConfig()?.models?.ProductDetails?.transform?.(data),\n );\n}\n\nfunction applyOptionsTransformer(\n options: Option[] | undefined,\n): Option[] | undefined {\n if (!options) return undefined;\n\n const optionsTransformer =\n config.getConfig()?.models?.ProductOptions?.optionsTransformer;\n\n if (!optionsTransformer) {\n return options;\n }\n\n try {\n const transformed = optionsTransformer(options);\n return transformed ?? options;\n } catch (error) {\n console.error(\n 'product-transform: optionsTransformer threw an error, using original options',\n error,\n );\n return options;\n }\n}\n\nfunction transformImages(data: any) {\n return data.images\n ?.filter((image: any) => !image.roles?.includes('hide_from_pdp'))\n ?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformVideos(data: any) {\n return data.videos?.map((video: any) => ({\n url: video.url?.replace(/^https?:/, ''),\n title: video.title,\n description: video.description,\n preview: video.preview\n ? {\n url: video.preview.url?.replace(/^https?:/, ''),\n label: video.preview.label,\n roles: video.preview.roles,\n }\n : undefined,\n }));\n}\n\nfunction transformAttributes(data: any) {\n return (\n data.attributes\n // only show attributes that are visible in PDP\n ?.filter(({ roles }: any) => roles?.indexOf('visible_in_pdp') !== -1)\n // transform attribute values\n ?.map(({ label, value, name }: any) => {\n // Special handling for ac_giftcard attribute\n if (name?.startsWith('ac_')) {\n try {\n let parsedValue;\n\n if (typeof value === 'string') {\n parsedValue = JSON.parse(value);\n } else if (typeof value === 'object') {\n parsedValue = value;\n }\n // Transform specific snake_case fields to camelCase\n const transformedValue = transformSnakeToCamel(parsedValue);\n\n return {\n id: name,\n label,\n value: JSON.stringify(transformedValue),\n };\n } catch {\n // If parsing fails, return original value\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n }\n }\n\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n })\n );\n}\n\nfunction transformSnakeToCamel(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map(transformSnakeToCamel);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const transformed: any = {};\n for (const [key, value] of Object.entries(obj)) {\n // Only transform specific snake_case fields to camelCase\n let camelKey = key;\n if (key === 'validation_rule') {\n camelKey = 'validationRule';\n } else if (key === 'min_length') {\n camelKey = 'minLength';\n } else if (key === 'max_length') {\n camelKey = 'maxLength';\n } else if (key === 'purchase_separately') {\n camelKey = 'purchaseSeparately';\n }\n\n transformed[camelKey] = transformSnakeToCamel(value);\n }\n return transformed;\n }\n\n return obj;\n}\n\nfunction transformOptions(data: any, isBundle?: boolean) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: string = values?.[0]?.type;\n\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: isBundle\n ? mapBundleOptionValues(values, optionUIDs)\n : mapOptionValues(values, optionUIDs, type),\n };\n });\n}\n\nfunction mapBundleOptionValues(values: any, optionUIDs: string[]) {\n return values\n ?.filter(({ enabled }: any) => typeof enabled === 'undefined' || enabled)\n .map((value: any) => {\n const { id, title, inStock, isDefault, product } = value;\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1 || isDefault,\n value: id,\n product,\n quantity: readDefaultOptionQuantity(value),\n canEditQuantity: readCanEditQuantity(value),\n };\n });\n}\n\nfunction mapOptionValues(values: any, optionUIDs: string[], type: string) {\n return values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1,\n value:\n type?.toLowerCase() === 'dropdown'\n ? id\n : value?.replace(/^https?:/, ''),\n };\n });\n}\n\nfunction transformPrices(\n data: any,\n isBundle: boolean,\n defaultOptionUIDs?: string[],\n) {\n const { price, priceRange, options, optionUIDs = defaultOptionUIDs } = data;\n\n if (!price && !priceRange) {\n return null;\n }\n\n const { __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price?.regular?.amount?.value;\n const finalPrice =\n price?.final?.amount?.value ?? price?.regular?.amount?.value;\n\n const currency =\n price?.regular?.amount?.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular?.amount?.currency;\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final?.amount?.value;\n const finalMaximumPrice = priceRange?.maximum?.final?.amount?.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount?.value ===\n priceRange?.maximum?.regular?.amount?.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount?.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount?.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount?.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n function getBundleProductPrice() {\n // Currently the Catalog Service does not have support for the individual prices of the options of a fixed bundle,\n // so the price used in UI is taken from the priceRange object.\n\n // The dynamic bundle has full support in Catalog Service.\n // If there are pre-selected values of the option, then the starting price is the sum of those and\n // after each selection, the price is updated with the sum of prices for the selected options.\n // This is not supported by default and needs to be updated in the drop-in upon each selection.\n\n let maxSumRegular = 0;\n let bundlePrice = 0;\n options?.forEach((option: any) => {\n const values = option?.values;\n if (values && Array.isArray(values)) {\n const regularAmounts = values\n .map((value) => value?.product?.price?.regular?.amount?.value)\n .filter((amount) => amount !== undefined);\n\n const maxRegularAmount =\n regularAmounts.length > 0 ? Math.max(...regularAmounts) : 0;\n maxSumRegular += maxRegularAmount;\n }\n option?.values?.forEach((value: any) => {\n if (optionUIDs?.includes(value.id)) {\n bundlePrice += value?.product?.price?.final?.amount?.value;\n }\n });\n });\n\n const finalMinimumPrice = priceRange?.minimum?.final?.amount?.value;\n const finalMaximumPrice = priceRange?.maximum?.final?.amount?.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount?.value ===\n priceRange?.maximum?.regular?.amount?.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount?.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount?.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount?.currency;\n\n if (isBundle && optionUIDs?.length < 1) {\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n return maxSumRegular === priceRange?.maximum?.regular?.amount?.value\n ? [bundlePrice, bundlePrice, bundlePrice, currency]\n : [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] =\n type === 'SimpleProductView'\n ? getSimpleProductPrices()\n : isBundle\n ? getBundleProductPrice()\n : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n function transformTiers(tiers: any[]): any[] {\n if (!tiers || !Array.isArray(tiers)) {\n return [];\n }\n\n return tiers\n .map((tier) => ({\n tier: {\n amount: tier.tier?.amount?.value,\n currency: tier.tier?.amount?.currency || currency,\n },\n quantity: tier.quantity[0]?.gte || tier.quantity[0]?.lt || 0,\n }))\n .sort((a, b) => a.quantity - b.quantity);\n }\n\n if (finalMaximumPrice && finalMinimumPrice === finalMaximumPrice) {\n const hasDiscount = regularPrice && finalMinimumPrice !== regularPrice;\n\n return {\n regular: {\n amount: regularPrice,\n currency,\n variant: hasDiscount ? 'strikethrough' : 'default',\n },\n final: {\n amount: finalMaximumPrice,\n currency,\n variant: 'default',\n },\n tiers: transformTiers(price?.tiers),\n visible,\n };\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency,\n },\n tiers: transformTiers(price?.tiers),\n visible,\n };\n}\n\nfunction getOptionUIDs(\n data: any,\n isBundle?: boolean,\n preselectFirstOption?: boolean,\n): string[] {\n if (isBundle) {\n const fromRequest = Array.isArray(data?.optionUIDs)\n ? (data.optionUIDs as string[]).filter(Boolean)\n : [];\n if (fromRequest.length > 0) {\n return fromRequest;\n }\n\n const uids: string[] = [];\n\n data?.options?.forEach(({ values, multi }: any) => {\n const enabledValues = values?.filter(\n ({ enabled }: any) => typeof enabled === 'undefined' || enabled,\n );\n const defaults = enabledValues?.filter(({ isDefault }: any) => isDefault);\n\n if (defaults?.length) {\n if (multi) {\n defaults.forEach((d: { id: string }) => uids.push(d.id));\n } else {\n uids.push(defaults[0].id);\n }\n return;\n }\n\n if (preselectFirstOption && enabledValues?.[0]?.id) {\n uids.push(enabledValues[0].id);\n }\n });\n\n return uids;\n }\n\n return data?.optionUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport type { Option } from '@/pdp/data/models';\n\n/** Single-select option group (one chosen item UID). */\nexport type ProductOptionSelectionSingle = { label: string; value: string };\n\n/** Multi-select option group (one or more chosen item UIDs). */\nexport type ProductOptionSelectionMulti = { label: string; values: string[] };\n\nexport type ProductOptionSelectionEntry =\n ProductOptionSelectionSingle | ProductOptionSelectionMulti;\n\nexport type ProductOptionSelectionMap = {\n [optionId: string]: ProductOptionSelectionEntry;\n};\n\n/**\n * Flatten selection map to UID list. When `optionsOrder` is provided (e.g. `data.options`),\n * UIDs are emitted in that order for stable URLs and API payloads.\n */\nexport function selectionMapToOptionUIDs(\n selections: ProductOptionSelectionMap,\n optionsOrder?: Option[],\n): string[] {\n if (!optionsOrder?.length) {\n return Object.values(selections).flatMap((entry) =>\n 'values' in entry ? entry.values : entry.value ? [entry.value] : [],\n );\n }\n\n const list: string[] = [];\n for (const def of optionsOrder) {\n const entry = selections[def.id];\n if (!entry) continue;\n if ('values' in entry) {\n const order = new Map(def.items.map((item, idx) => [item.id, idx]));\n const sorted = [...entry.values].sort(\n (a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0),\n );\n list.push(...sorted);\n } else if ('value' in entry && entry.value) {\n list.push(entry.value);\n }\n }\n return list;\n}\n\n/**\n * Whether the shopper has satisfied all option groups for add-to-cart.\n * Bundle multi-select may contribute more than one UID while still satisfying one group.\n */\nexport function isProductOptionsSelectionComplete(\n options: Option[] | undefined,\n optionUIDs: string[] | undefined,\n isBundle: boolean | undefined,\n): boolean {\n if (!options?.length) {\n return true;\n }\n\n const uids = optionUIDs ?? [];\n\n if (isBundle) {\n return options.every((option) => {\n if (!option.required) {\n return true;\n }\n const selectedCount = option.items.filter((item) =>\n uids.includes(item.id),\n ).length;\n return selectedCount >= 1;\n });\n }\n\n return uids.length === options.length;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel, Option } from '@/pdp/data/models';\nimport {\n fetchProductData,\n getProductConfigurationValues,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n getUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\nimport { isProductOptionsSelectionComplete } from '@/pdp/lib/product-option-selection';\nimport {\n bundleOptionQuantitiesFromEnteredOptions,\n bundleOptionQuantitiesToEnteredOptions,\n mergeBundleOptionQuantities,\n} from '@/pdp/lib/bundle-option-quantities';\n\nexport type OptionsTransformer = (options: Option[]) => Option[];\n\ntype ModelConfig = {\n initialData?: any;\n /** @deprecated Use \"transformer\" instead */\n transform?: (data?: ProductModel) => ProductModel;\n transformer?: (data?: ProductModel) => ProductModel;\n fallbackData?: (\n parentProduct: any,\n simpleProduct: ProductModel,\n ) => ProductModel;\n};\n\ntype ProductOptionsConfig = {\n optionsTransformer?: OptionsTransformer;\n};\n\ntype ConfigProps = {\n scope?: string;\n langDefinitions?: Lang;\n defaultLocale?: string;\n globalLocale?: string;\n sku?: string;\n acdl?: boolean;\n anchors?: string[];\n persistURLParams?: boolean;\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n models?: {\n ProductDetails?: ModelConfig;\n ProductOptions?: ProductOptionsConfig;\n [name: string]: ModelConfig | ProductOptionsConfig | undefined;\n };\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (_config) => {\n const initialData = _config?.models?.ProductDetails?.initialData;\n\n // Get URL parameters safely\n const urlParams = getUrlParams() || {};\n\n // Get optionsUIDs from URL params or config\n const optionsUIDs =\n urlParams.optionsUIDs?.split(',') || initialData?.optionsUIDs;\n\n // Get and validate quantity from URL params\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1 - Ensures backward compatibility\n\n // Set default config\n const defaultConfig: ConfigProps = {\n defaultLocale: 'en-US',\n globalLocale: 'en-US',\n persistURLParams: false,\n acdl: false,\n optionsUIDs,\n };\n\n const config = { ...defaultConfig, ..._config };\n\n initialize.config.setConfig({ ...config });\n\n if (config?.sku) {\n // Get PDP data\n const data = initialData\n ? transformProductData(initialData)\n : await fetchProductData(config.sku, {\n preselectFirstOption: config.preselectFirstOption,\n });\n\n // Emit PDP initial data\n events.emit('pdp/data', data, { scope: config.scope });\n\n const existingValues = getProductConfigurationValues({\n scope: config.scope,\n });\n const previousBundleQuantities =\n existingValues?.bundleOptionQuantities ??\n bundleOptionQuantitiesFromEnteredOptions(\n existingValues?.enteredOptions,\n );\n\n const bundleOptionQuantities = data?.isBundle\n ? mergeBundleOptionQuantities(\n previousBundleQuantities,\n data?.options,\n data?.optionUIDs,\n )\n : undefined;\n\n // Set default values for product configuration\n const defaultValues = {\n sku: config.sku,\n quantity: initialQuantity, // Use the determined quantity from URL params or default to 1\n optionsUIDs: data?.optionUIDs,\n ...(bundleOptionQuantities && {\n bundleOptionQuantities,\n enteredOptions: bundleOptionQuantitiesToEnteredOptions(\n bundleOptionQuantities,\n ),\n }),\n };\n\n setProductConfigurationValues(() => ({ ...defaultValues }), {\n scope: config.scope,\n });\n\n setProductConfigurationValid(\n () => {\n if (data?.options) {\n return isProductOptionsSelectionComplete(\n data.options,\n data.optionUIDs,\n data.isBundle,\n );\n }\n\n return true;\n },\n { scope: config.scope },\n );\n\n // Publish ACDL event\n if (config.acdl && data) {\n publishProductPageViewEvent(data);\n }\n }\n },\n\n listeners: () => [\n events.on('locale', async () => {\n const { sku, scope } = initialize.config.getConfig();\n\n if (sku) {\n const next = await fetchProductData(sku);\n events.emit('pdp/data', next, { scope });\n }\n }),\n ],\n});\n\nexport const config = initialize.config;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n CustomizableOptionsAttributeValue,\n RawCustomizableOptionsAttributeValue,\n} from '@/pdp/data/models';\n\n/**\n * Coerces the numeric-string `price` fields delivered by Catalog Service\n * (e.g. \"108.000000\") into numbers, leaving every other field untouched.\n */\nexport function parseCustomizableOptionsAttribute(\n raw: RawCustomizableOptionsAttributeValue,\n): CustomizableOptionsAttributeValue {\n return {\n schemaVersion: raw.schemaVersion,\n selectable: raw.selectable.map((option) => ({\n ...option,\n values: option.values.map((value) => ({\n ...value,\n price: Number(value.price),\n })),\n })),\n shopperInput: raw.shopperInput.map((option) => ({\n ...option,\n price: option.price === undefined ? undefined : Number(option.price),\n })),\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\nexport const getProductData = async (\n sku: string,\n options?: {\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n },\n raw?: boolean,\n): Promise<ProductModel | null> => {\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (options?.optionsUIDs) {\n product.optionUIDs = options.optionsUIDs;\n }\n\n if (!product) {\n return null;\n }\n return raw\n ? product\n : transformProductData(product, {\n preselectFirstOption: options?.preselectFirstOption,\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCTS_DATA = `\nquery GET_PRODUCTS_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCTS_DATA } from './graphql/getProductsData.graphql';\n\nexport interface ProductDataItem {\n sku: string;\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n}\n\n/**\n * Fetches multiple products by SKUs with optional per-product configuration.\n *\n * @example\n * // Basic usage\n * const products = await getProductsData([\n * { sku: 'SKU001' },\n * { sku: 'SKU002' }\n * ]);\n *\n * @example\n * // With options\n * const products = await getProductsData([\n * { sku: 'SKU001', optionsUIDs: ['option1'], preselectFirstOption: true },\n * { sku: 'SKU002', optionsUIDs: ['option2'] }\n * ]);\n *\n * @example\n * // Get raw data without transformation\n * const rawProducts = await getProductsData([{ sku: 'SKU001' }], true);\n */\nexport const getProductsData = async (\n items: ProductDataItem[],\n raw?: boolean,\n): Promise<ProductModel[] | null> => {\n if (!items || items.length === 0) {\n return null;\n }\n\n const skus = items.map((item) => item.sku);\n const { data } = await fetchGraphQl(GET_PRODUCTS_DATA, {\n method: 'GET',\n variables: { skus },\n });\n const products = data?.products;\n\n if (!products || products.length === 0) {\n return null;\n }\n\n // Create a map for quick lookup of options by SKU\n const optionsMap = items.reduce(\n (acc, item) => {\n acc[item.sku] = item;\n return acc;\n },\n {} as Record<string, ProductDataItem>,\n );\n\n return raw\n ? products\n : products.map((product: any) => {\n const itemOptions = optionsMap[product.sku];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (itemOptions?.optionsUIDs) {\n product.optionUIDs = itemOptions.optionsUIDs;\n }\n\n return transformProductData(product, {\n preselectFirstOption: itemOptions?.preselectFirstOption,\n });\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/** Average rating as a percentage (0–100), exported by Commerce Data Export. */\nexport const RATING_SUMMARY_ATTRIBUTE = 'ac_rating_summary';\n\n/** Number of approved reviews, exported by Commerce Data Export. */\nexport const REVIEW_COUNT_ATTRIBUTE = 'ac_review_count';\n\n/** Review aggregates are stored on the parent product, not on its variants. */\nexport const REVIEW_SUMMARY_ATTRIBUTES = [\n RATING_SUMMARY_ATTRIBUTE,\n REVIEW_COUNT_ATTRIBUTE,\n];\n\nexport interface ProductRatingModel {\n /** Average rating on a 0–5 scale. */\n rating: number;\n reviewCount: number;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...PRODUCT_FRAGMENT\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...PRODUCT_FRAGMENT\n }\n\n # %extendedPlaceholder%\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel, REVIEW_SUMMARY_ATTRIBUTES } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\n// Option UIDs are base64 of \"<optionType>/<id>/<value>\" (e.g. \"configurable/193/23\"\n// vs \"custom-option/2/5\") — Catalog Service encodes the option kind into the UID\n// itself since ProductViewOption doesn't otherwise expose it. Confirmed via ACCS-1601.\nexport function isCustomOptionUID(uid: string): boolean {\n try {\n return atob(uid).startsWith('custom-option/');\n } catch {\n return false;\n }\n}\n\nconst isReviewSummaryAttribute = ({ name }: { name?: string }) =>\n !!name && REVIEW_SUMMARY_ATTRIBUTES.includes(name);\n\n// Review aggregates live on the parent product, so keep them when a variant replaces the parent data.\nfunction withParentReviewSummary(parent: any, refineProduct: any) {\n const parentAttributes =\n parent?.attributes?.filter(isReviewSummaryAttribute) ?? [];\n\n if (!refineProduct || !parentAttributes.length) return {};\n\n return {\n attributes: [\n ...(refineProduct.attributes ?? []).filter(\n (attribute: { name?: string }) => !isReviewSummaryAttribute(attribute),\n ),\n ...parentAttributes,\n ],\n };\n}\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n // Custom-option UIDs aren't resolvable as variants; Catalog Service only matches on configurable UIDs\n const variantOptionUIDs = optionUIDs.filter((uid) => !isCustomOptionUID(uid));\n\n const optionPairCombinations = getPairCombination(variantOptionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries,\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: variantOptionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[],\n raw?: boolean,\n): Promise<ProductModel | null> => {\n const data = await getProductData(sku, optionUIDs);\n if (!data) return null;\n\n const {\n products,\n refineProduct: initialRefineProduct,\n ...refinedOptions\n } = data;\n let refineProduct = initialRefineProduct;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options,\n anchorOptions,\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const response = {\n ...(refineProduct || parent),\n ...withParentReviewSummary(parent, refineProduct),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.sku\n : undefined,\n variantName:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.name\n : undefined,\n };\n\n const refinedData = raw ? response : transformProductData(response);\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(\n options: {},\n parent: [] = [],\n anchorOptions?: string[],\n) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(\n options: any[],\n optionsUIDs: string[],\n anchorOptions: string[],\n): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue =\n option.values?.find((value: any) => optionsUIDs.includes(value?.id))\n ?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { getProductData, getRefinedProduct, config } from '@/pdp/api';\n\nexport type Options = {\n anchors?: string[];\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n isBundle?: boolean;\n skipTransform?: boolean;\n};\n\nexport const fetchProductData = async (sku: string, options?: Options) => {\n // Get the default configuration values\n const { anchors: defaultAnchors, optionsUIDs: defaultOptionsUIDs } =\n config.getConfig();\n\n // Destructure the options object\n const {\n optionsUIDs = defaultOptionsUIDs,\n anchors = defaultAnchors,\n preselectFirstOption,\n isBundle,\n skipTransform,\n } = options ?? {};\n\n // ❗️ Warning ❗️\n // If we have default selections, but we cannot determine that the product is of type bundle, then the response is going to result in null objects and error(s).\n // Only the `products` object will be populated correctly, the `ProductOption${i}` and `refinedProduct` will be set as null.\n // This does not affect the UI, but the error message(s) can be detected by 3rd party tools that the client might be using.\n // This is accepted as a known behaviour, since a bundle product does not have variants.\n // However, if initialData is passed from the integration layer, then we can determine if the product is a bundle and set the isBundle flag accordingly.\n return !isBundle && optionsUIDs && optionsUIDs.length > 0\n ? await getRefinedProduct(sku, optionsUIDs, anchors, skipTransform)\n : await getProductData(\n sku,\n {\n preselectFirstOption,\n optionsUIDs,\n },\n skipTransform,\n );\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\nimport { getProductConfigurationValues } from '@/pdp/api';\nimport { mergeBundleEnteredOptions } from '@/pdp/lib/bundle-option-quantities';\n\nexport const setProductConfigurationValues = (\n callback: (prev: ValuesModel) => ValuesModel,\n options?: { scope?: string },\n) => {\n // Null until the first `pdp/values` emit (e.g. containers rendered without initialize()).\n const prev =\n getProductConfigurationValues({ scope: options?.scope }) ??\n ({} as ValuesModel);\n\n const next = callback(prev);\n\n if (next.bundleOptionQuantities) {\n next.enteredOptions = mergeBundleEnteredOptions(\n next.enteredOptions,\n prev.bundleOptionQuantities,\n next.bundleOptionQuantities,\n );\n }\n\n events.emit('pdp/values', { ...next }, { scope: options?.scope });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\n\nexport const getProductConfigurationValues = ({\n scope,\n}: { scope?: string } = {}): ValuesModel | null => {\n return events.lastPayload('pdp/values', { scope }) ?? null;\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { isProductConfigurationValid } from '@/pdp/api';\n\nexport const setProductConfigurationValid = (\n callback: (prev: boolean) => boolean,\n options?: { scope?: string },\n) => {\n const prev = isProductConfigurationValid({ scope: options?.scope });\n\n const next = callback(prev as boolean);\n\n events.emit('pdp/valid', next, { scope: options?.scope });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\n\nexport const getFetchedProductData = async ({\n scope,\n}: { scope?: string } = {}): Promise<ProductModel | null> => {\n const payload = events.lastPayload('pdp/data', { scope });\n // if the event has already been emitted, return the last payload\n if (payload) {\n return Promise.resolve(payload);\n }\n\n // otherwise, wait for the next event\n return new Promise((resolve) => {\n const event = events.on(\n 'pdp/data',\n (data) => {\n resolve(data);\n event?.off();\n },\n { eager: true, scope },\n );\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const isProductConfigurationValid = ({\n scope,\n}: { scope?: string } = {}): boolean | null => {\n return events.lastPayload('pdp/valid', { scope }) ?? null;\n};\n"],"names":["setUrlParams","params","urlSearchParams","key","value","url","getUrlParams","getValidatedQuantityFromUrl","defaultQuantity","quantityParam","parsedQuantity","transformProduct","product","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","contexts","events","getAdobeDataLayer","getChannelContext","setContext","name","data","adobeDataLayer","setChannelContext","pushEvent","event","additionalContext","acdl","state","publishProductPageViewEvent","productItem","ProductType","ProductViewType","readCanEditQuantity","readDefaultOptionQuantity","raw","parsed","buildBundleOptionQuantitiesFromOptions","options","optionUIDs","quantities","option","item","mergeBundleOptionQuantities","previous","next","uid","defaultQty","bundleOptionQuantitiesToEnteredOptions","quantity","bundleOptionQuantitiesFromEnteredOptions","enteredOptions","mergeBundleEnteredOptions","bundleUIDs","entry","transformProductData","isBundle","getOptionUIDs","productType","productData","transformImages","transformVideos","transformPrices","transformAttributes","applyOptionsTransformer","transformOptions","merge","config","optionsTransformer","error","image","video","roles","label","parsedValue","transformedValue","transformSnakeToCamel","obj","transformed","camelKey","id","title","required","multi","values","typename","type","mapBundleOptionValues","mapOptionValues","enabled","inStock","isDefault","defaultOptionUIDs","price","priceRange","getSimpleProductPrices","regularPrice","finalPrice","currency","getComplexProductPrices","finalMinimumPrice","finalMaximumPrice","_o","_n","_m","_r","_q","_p","_u","_t","_s","getBundleProductPrice","maxSumRegular","bundlePrice","regularAmounts","amount","maxRegularAmount","_x","_w","_v","visible","transformTiers","tiers","tier","a","b","preselectFirstOption","fromRequest","uids","enabledValues","defaults","d","selectionMapToOptionUIDs","selections","optionsOrder","list","def","order","idx","sorted","isProductOptionsSelectionComplete","initialize","Initializer","_config","initialData","optionsUIDs","initialQuantity","fetchProductData","existingValues","getProductConfigurationValues","previousBundleQuantities","bundleOptionQuantities","defaultValues","setProductConfigurationValues","setProductConfigurationValid","sku","scope","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","parseCustomizableOptionsAttribute","GET_PRODUCT_DATA","PRODUCT_FRAGMENT","getProductData","GET_PRODUCTS_DATA","getProductsData","items","skus","products","optionsMap","acc","itemOptions","RATING_SUMMARY_ATTRIBUTE","REVIEW_COUNT_ATTRIBUTE","REVIEW_SUMMARY_ATTRIBUTES","REFINE_PRODUCT_QUERY","isCustomOptionUID","isReviewSummaryAttribute","withParentReviewSummary","parent","refineProduct","parentAttributes","attribute","variantOptionUIDs","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","getRefinedProduct","anchorOptions","initialRefineProduct","refinedOptions","mergeRefinedOptions","updateSelections","updatedRefinedData","response","refinedData","fallback","arr","result","temp","item2","ids","i","x","curr","map","current","updatedOptionsUIDs","optionValue","defaultAnchors","defaultOptionsUIDs","anchors","skipTransform","callback","prev","isProductConfigurationValid","getFetchedProductData","payload","resolve"],"mappings":"yOAgBO,SAASA,GACdC,EACM,CACN,MAAMC,EAAkB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAE3D,OAAA,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC3CA,IAAU,KACZF,EAAgB,OAAOC,CAAG,EAE1BD,EAAgB,IAAIC,EAAK,OAAOC,CAAK,CAAC,CACxC,CACD,EAEG,IAAAC,EAAM,OAAO,SAAS,SACnBA,GAAA,IAAIH,EAAgB,SAAU,CAAA,GACrCG,GAAO,OAAO,SAAS,KAEvB,OAAO,QAAQ,aAAa,CAAA,EAAI,GAAIA,CAAG,CACzC,CAEO,SAASC,IAAuC,CACrD,MAAMJ,EAAkB,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAC5DD,EAAiC,CAAC,EAExB,OAAAC,EAAA,QAAQ,CAACE,EAAOD,IAAQ,CACtCF,EAAOE,CAAG,EAAIC,CAAA,CACf,EAEMH,CACT,CAEgB,SAAAM,GACdC,EAA0B,EAClB,CAER,MAAMC,GADYH,GAAa,GAAK,CAAC,GACL,SAEhC,GAAIG,EAAe,CACX,MAAAC,EAAiB,SAASD,EAAe,EAAE,EAG/C,GAAA,CAAC,MAAMC,CAAc,GACrB,OAAO,UAAUA,CAAc,GAC/BA,EAAiB,EAGV,OAAAA,CACT,CAIK,OAAAF,CACT,CChDO,SAASG,GAAiBC,EAAgC,6BACxD,MAAA,CACL,UAAW,OAAOA,GAAA,YAAAA,EAAS,UAAU,EACrC,KAAMA,GAAA,YAAAA,EAAS,KACf,KAAKA,GAAA,YAAAA,EAAS,cAAcA,GAAA,YAAAA,EAAS,KACrC,YAAaA,GAAA,YAAAA,EAAS,IACtB,YAAaA,GAAA,YAAAA,EAAS,YACtB,cAAe,OACf,gBAAiB,OACjB,UAAW,OACX,YAAa,OACb,UAAW,OACX,UAAW,OACX,aAAc,OACd,qBAAsB,OACtB,WAAY,OACZ,YAAaA,GAAA,YAAAA,EAAS,YACtB,QAAS,CACP,eAAcC,GAAAC,EAAAF,GAAA,YAAAA,EAAS,SAAT,YAAAE,EAAiB,UAAjB,YAAAD,EAA0B,SAAU,EAClD,cAAcE,GAAAC,EAAAJ,GAAA,YAAAA,EAAS,SAAT,YAAAI,EAAiB,QAAjB,YAAAD,EAAwB,cACtC,cAAcE,GAAAC,EAAAN,GAAA,YAAAA,EAAS,SAAT,YAAAM,EAAiB,QAAjB,YAAAD,EAAwB,cACtC,cAAcE,GAAAC,EAAAR,GAAA,YAAAA,EAAS,SAAT,YAAAQ,EAAiB,QAAjB,YAAAD,EAAwB,OACtC,YAAa,OACb,eAAcE,GAAAC,EAAAV,GAAA,YAAAA,EAAS,SAAT,YAAAU,EAAiB,QAAjB,YAAAD,EAAwB,WAAY,KACpD,EACA,aAAcT,GAAA,YAAAA,EAAS,IACvB,cAAcW,GAAAC,EAAAZ,GAAA,YAAAA,EAAS,SAAT,YAAAY,EAAkB,KAAlB,YAAAD,EAAsB,GACtC,CACF,CCxBO,MAAME,GAAW,CACtB,gBAAiB,iBACjB,gBAAiB,gBACnB,EAKaC,GAAS,CACpB,kBAAmB,mBACrB,EAEO,SAASC,IAAoB,CAE3B,cAAA,eAAiB,OAAO,gBAAkB,CAAC,EAE3C,OAAO,cAChB,CAEO,SAASC,IAAoB,CAC3B,MAAA,CACL,IAAK,wCACL,MAAO,4CACT,CACF,CAMA,SAASC,GAAWC,EAAcC,EAAW,CAC3C,MAAMC,EAAiBL,GAAkB,EAGzCK,EAAe,KAAK,CAClB,CAACF,CAAI,EAAG,IAAA,CACT,EAGDE,EAAe,KAAK,CAClB,CAACF,CAAI,EAAGC,CAAA,CACT,CACH,CAEO,SAASE,IAAoB,CAC9B,OAAO,OAAW,KAIXJ,GAAAJ,GAAS,gBAAiBG,IAAmB,CAC1D,CAMA,SAASM,GAAUC,EAAeC,EAAyB,CAClCT,GAAkB,EAE1B,KAAMU,GAAc,CACjC,MAAMC,EAAQD,EAAK,SAAWA,EAAK,WAAa,CAAC,EAEjDA,EAAK,KAAK,CACR,MAAAF,EACA,UAAW,CACT,GAAGG,EACH,GAAGF,CAAA,CACL,CACD,CAAA,CACF,CACH,CAGO,SAASG,GAA4B3B,EAAuB,CAC3D,MAAA4B,EAAc7B,GAAiBC,CAAO,EACjCiB,GAAAJ,GAAS,gBAAiBe,CAAW,EAC9BP,GAAA,EAClBC,GAAUR,GAAO,iBAAiB,CACpC,CCjDY,IAAAe,GAAAA,IACVA,EAAA,eAAiB,UACjBA,EAAA,cAAgB,SAFNA,IAAAA,GAAA,CAAA,CAAA,EAKAC,IAAAA,IACVA,EAAA,mBAAqB,qBACrBA,EAAA,kBAAoB,oBAFVA,IAAAA,IAAA,CAAA,CAAA,ECtCL,SAASC,GAAoBvC,EAAyC,CACpE,MAAA,EAAQA,EAAM,eACvB,CAEO,SAASwC,GACdxC,EACQ,CACF,MAAAyC,EAAMzC,EAAM,UAAYA,EAAM,IAC9B0C,EAAS,OAAOD,CAAG,EACzB,OAAO,OAAO,SAASC,CAAM,GAAKA,EAAS,EAAIA,EAAS,CAC1D,CAEgB,SAAAC,GACdC,EACAC,EACwB,CACxB,GAAI,EAACD,GAAA,MAAAA,EAAS,SAAU,EAACC,GAAA,MAAAA,EAAY,QACnC,MAAO,CAAC,EAGV,MAAMC,EAAqC,CAAC,EAE5C,UAAWC,KAAUH,EACf,GAAAG,EAAO,WAAa,gCAIb,UAAAC,KAAQD,EAAO,MACnBF,EAAW,SAASG,EAAK,EAAE,IAIhCF,EAAWE,EAAK,EAAE,EAAIA,EAAK,UAAY,GAIpC,OAAAF,CACT,CAEgB,SAAAG,GACdC,EACAN,EACAC,EACwB,CAClB,MAAAM,EAAOR,GAAuCC,EAASC,CAAU,EAEvE,OAAKK,EAIE,OAAO,YACZ,OAAO,QAAQC,CAAI,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAU,IAAM,CAC9CD,EACAF,EAASE,CAAG,GAAKC,CAClB,CAAA,CACH,EARSF,CASX,CAEO,SAASG,GACdR,EACuC,CACvC,OAAKA,EAIE,OAAO,QAAQA,CAAU,EAAE,IAAI,CAAC,CAACM,EAAKG,CAAQ,KAAO,CAC1D,IAAAH,EACA,MAAO,OAAOG,CAAQ,CAAA,EACtB,EANO,CAAC,CAOZ,CAEO,SAASC,GACdC,EACwB,CACpB,GAAA,EAACA,GAAA,MAAAA,EAAgB,QACnB,MAAO,CAAC,EAGV,MAAMX,EAAqC,CAAC,EAC5C,UAAWC,KAAUU,EAAgB,CAC7B,MAAAF,EAAW,OAAOR,EAAO,KAAK,EAChC,OAAO,SAASQ,CAAQ,GAAKA,EAAW,IAC/BT,EAAAC,EAAO,GAAG,EAAIQ,EAC3B,CAEK,OAAAT,CACT,CAEgB,SAAAY,GACdD,EACAP,EACAC,EACuC,CACjC,MAAAQ,MAAiB,IAAI,CACzB,GAAG,OAAO,KAAKT,GAAY,EAAE,EAC7B,GAAG,OAAO,KAAKC,CAAI,CAAA,CACpB,EACM,MAAA,CACL,IAAIM,GAAkB,IAAI,OAAQG,GAAU,CAACD,EAAW,IAAIC,EAAM,GAAG,CAAC,EACtE,GAAGN,GAAuCH,CAAI,CAChD,CACF,CCjGgB,SAAAU,EACdlC,EACAiB,EAGqB,6BACf,MAAAkB,IACJnD,GAAAC,GAAAH,GAAAC,EAAAiB,GAAA,YAAAA,EAAM,UAAN,YAAAjB,EAAgB,KAAhB,YAAAD,EAAoB,SAApB,YAAAG,EAA6B,KAA7B,YAAAD,EAAiC,cACjC,gCACIkC,EAAakB,GACjBpC,EACAmC,EACAlB,GAAA,YAAAA,EAAS,oBACX,EACMoB,GACJrC,GAAA,YAAAA,EAAM,cAAeW,GAAgB,kBACjCD,EAAY,cACZA,EAAY,eAEZ4B,EAActC,EACf,CACC,KAAMA,EAAK,KACX,IAAKA,EAAK,IACV,SAAAmC,EACA,iBAAkBnC,EAAK,iBACvB,QAASA,EAAK,QACd,iBAAkBA,EAAK,iBACvB,gBAAiBA,EAAK,gBACtB,YAAaA,EAAK,YAClB,UAAWA,EAAK,UAChB,YAAaA,EAAK,YAClB,OAAQuC,GAAgBvC,CAAI,EAC5B,OAAQwC,GAAgBxC,CAAI,EAC5B,OAAQyC,GAAgBzC,EAAMmC,EAAUjB,CAAU,EAClD,WAAYwB,GAAoB1C,CAAI,EACpC,QAAS2C,GAAwBC,GAAiB5C,EAAMmC,CAAQ,CAAC,EACjE,WAAAjB,EACA,IAAKlB,EAAK,IACV,OAAQA,EAAK,OACb,WAAYA,EAAK,WACjB,iBAAkBA,EAAK,iBACvB,WAAYA,EAAK,WACjB,YAAaA,EAAK,YAClB,YAAAqC,CAAA,EAEF,KAGG,OAAAQ,GACLP,IACAlD,GAAAC,GAAAH,GAAAC,EAAA2D,EAAO,UAAa,IAApB,YAAA3D,EAAoB,SAApB,YAAAD,EAA4B,iBAA5B,YAAAG,EAA4C,cAA5C,YAAAD,EAAA,KAAAC,EAA0DW,OACxDR,GAAAC,GAAAH,GAAAC,EAAAuD,EAAO,UAAU,IAAjB,YAAAvD,EAAoB,SAApB,YAAAD,EAA4B,iBAA5B,YAAAG,EAA4C,YAA5C,YAAAD,EAAA,KAAAC,EAAwDO,GAC5D,CACF,CAEA,SAAS2C,GACP1B,EACsB,WAClB,GAAA,CAACA,EAAgB,OAErB,MAAM8B,GACJ9D,GAAAH,GAAAC,EAAA+D,EAAO,UAAU,IAAjB,YAAA/D,EAAoB,SAApB,YAAAD,EAA4B,iBAA5B,YAAAG,EAA4C,mBAE9C,GAAI,CAAC8D,EACI,OAAA9B,EAGL,GAAA,CAEF,OADoB8B,EAAmB9B,CAAO,GACxBA,QACf+B,EAAO,CACN,eAAA,MACN,+EACAA,CACF,EACO/B,CAAA,CAEX,CAEA,SAASsB,GAAgBvC,EAAW,SAClC,OAAOlB,GAAAC,EAAAiB,EAAK,SAAL,YAAAjB,EACH,OAAQkE,UAAe,SAAClE,EAAAkE,EAAM,QAAN,MAAAlE,EAAa,SAAS,sBAD3C,YAAAD,EAEH,IAAKmE,IAELA,EAAM,IAAMA,EAAM,IAAI,QAAQ,WAAY,EAAE,EAErCA,GAEb,CAEA,SAAST,GAAgBxC,EAAW,OAClC,OAAOjB,EAAAiB,EAAK,SAAL,YAAAjB,EAAa,IAAKmE,GAAgB,SAAA,OACvC,KAAKnE,EAAAmE,EAAM,MAAN,YAAAnE,EAAW,QAAQ,WAAY,IACpC,MAAOmE,EAAM,MACb,YAAaA,EAAM,YACnB,QAASA,EAAM,QACX,CACE,KAAKpE,EAAAoE,EAAM,QAAQ,MAAd,YAAApE,EAAmB,QAAQ,WAAY,IAC5C,MAAOoE,EAAM,QAAQ,MACrB,MAAOA,EAAM,QAAQ,KAAA,EAEvB,MAAA,GAER,CAEA,SAASR,GAAoB1C,EAAW,SACtC,OACElB,GAAAC,EAAAiB,EAAK,aAAL,YAAAjB,EAEI,OAAO,CAAC,CAAE,MAAAoE,CAAA,KAAiBA,GAAA,YAAAA,EAAO,QAAQ,qBAAsB,MAFpE,YAAArE,EAII,IAAI,CAAC,CAAE,MAAAsE,EAAO,MAAA/E,EAAO,KAAA0B,KAAgB,CAEjC,GAAAA,GAAA,MAAAA,EAAM,WAAW,OACf,GAAA,CACE,IAAAsD,EAEA,OAAOhF,GAAU,SACLgF,EAAA,KAAK,MAAMhF,CAAK,EACrB,OAAOA,GAAU,WACZgF,EAAAhF,GAGV,MAAAiF,EAAmBC,GAAsBF,CAAW,EAEnD,MAAA,CACL,GAAItD,EACJ,MAAAqD,EACA,MAAO,KAAK,UAAUE,CAAgB,CACxC,CAAA,MACM,CAEC,MAAA,CACL,GAAIvD,EACJ,MAAAqD,EACA,MAAO/E,EAAM,SAAS,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAC9C,CAAA,CAIG,MAAA,CACL,GAAI0B,EACJ,MAAAqD,EACA,MAAO/E,EAAM,SAAS,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAC9C,CAAA,EAGR,CAEA,SAASkF,GAAsBC,EAAe,CACxC,GAAA,MAAM,QAAQA,CAAG,EACZ,OAAAA,EAAI,IAAID,EAAqB,EAGtC,GAAIC,IAAQ,MAAQ,OAAOA,GAAQ,SAAU,CAC3C,MAAMC,EAAmB,CAAC,EAC1B,SAAW,CAACrF,EAAKC,CAAK,IAAK,OAAO,QAAQmF,CAAG,EAAG,CAE9C,IAAIE,EAAWtF,EACXA,IAAQ,kBACCsF,EAAA,iBACFtF,IAAQ,aACNsF,EAAA,YACFtF,IAAQ,aACNsF,EAAA,YACFtF,IAAQ,wBACNsF,EAAA,sBAGDD,EAAAC,CAAQ,EAAIH,GAAsBlF,CAAK,CAAA,CAE9C,OAAAoF,CAAA,CAGF,OAAAD,CACT,CAEA,SAASZ,GAAiB5C,EAAWmC,EAAoB,CACjD,KAAA,CAAE,QAAAlB,EAAS,WAAAC,CAAA,EAAelB,EAEzB,OAAAiB,GAAA,YAAAA,EAAS,IAAI,CAAC,CAAE,GAAA0C,EAAI,MAAAC,EAAO,SAAAC,EAAU,MAAAC,EAAO,OAAAC,KAAkB,SAC7D,MAAAC,GAAWjF,EAAAgF,GAAA,YAAAA,EAAS,KAAT,YAAAhF,EAAa,WAC1B,IAAAkF,GAAenF,EAAAiF,GAAA,YAAAA,EAAS,KAAT,YAAAjF,EAAa,KAEhC,OAAImF,EACKA,EAAAA,EACJ,QAAQ,YAAa,OAAO,EAC5B,QAAQ,OAAQ,MAAM,EACtB,QAAQ,QAAS,OAAO,EAEpBA,EAAA,WAGF,CACL,GAAAN,EACA,KAAAM,EACA,SAAAD,EACA,MAAOJ,EACP,SAAAC,EACA,SAAUC,EACV,MAAO3B,EACH+B,GAAsBH,EAAQ7C,CAAU,EACxCiD,GAAgBJ,EAAQ7C,EAAY+C,CAAI,CAC9C,CAAA,EAEJ,CAEA,SAASC,GAAsBH,EAAa7C,EAAsB,CAChE,OAAO6C,GAAA,YAAAA,EACH,OAAO,CAAC,CAAE,QAAAK,CAAQ,IAAW,OAAOA,EAAY,KAAeA,GAChE,IAAK/F,GAAe,CACnB,KAAM,CAAE,GAAAsF,EAAI,MAAAC,EAAO,QAAAS,EAAS,UAAAC,EAAW,QAAAzF,GAAYR,EAC5C,MAAA,CACL,GAAAsF,EACA,QAAAU,EACA,MAAOT,EACP,UAAU1C,GAAA,YAAAA,EAAY,QAAQyC,IAAM,IAAMW,EAC1C,MAAOX,EACP,QAAA9E,EACA,SAAUgC,GAA0BxC,CAAK,EACzC,gBAAiBuC,GAAoBvC,CAAK,CAC5C,CAAA,EAEN,CAEA,SAAS8F,GAAgBJ,EAAa7C,EAAsB+C,EAAc,CACjE,OAAAF,GAAA,YAAAA,EAAQ,IAAI,CAAC,CAAE,GAAAJ,EAAI,MAAAC,EAAO,QAAAS,EAAS,MAAAhG,MACjC,CACL,GAAAsF,EACA,QAAAU,EACA,MAAOT,EACP,UAAU1C,GAAA,YAAAA,EAAY,QAAQyC,IAAM,GACpC,OACEM,GAAA,YAAAA,EAAM,iBAAkB,WACpBN,EACAtF,GAAA,YAAAA,EAAO,QAAQ,WAAY,GACnC,GAEJ,CAEA,SAASoE,GACPzC,EACAmC,EACAoC,EACA,mBACA,KAAM,CAAE,MAAAC,EAAO,WAAAC,EAAY,QAAAxD,EAAS,WAAAC,EAAaqD,GAAsBvE,EAEnE,GAAA,CAACwE,GAAS,CAACC,EACN,OAAA,KAGH,KAAA,CAAE,WAAYR,CAAA,EAASjE,EAE7B,SAAS0E,GAAyB,yBAC1BC,MAAAA,GAAe7F,GAAAC,EAAAyF,GAAA,YAAAA,EAAO,UAAP,YAAAzF,EAAgB,SAAhB,YAAAD,EAAwB,MACvC8F,IACJ5F,GAAAC,EAAAuF,GAAA,YAAAA,EAAO,QAAP,YAAAvF,EAAc,SAAd,YAAAD,EAAsB,UAASE,GAAAC,EAAAqF,GAAA,YAAAA,EAAO,UAAP,YAAArF,EAAgB,SAAhB,YAAAD,EAAwB,OAEnD2F,IACJzF,GAAAC,EAAAmF,GAAA,YAAAA,EAAO,UAAP,YAAAnF,EAAgB,SAAhB,YAAAD,EAAwB,YAAa,OACjC,OACAE,GAAAC,EAAAiF,GAAA,YAAAA,EAAO,UAAP,YAAAjF,EAAgB,SAAhB,YAAAD,EAAwB,SAE9B,MAAO,CAACqF,EAAcC,EAAYA,EAAYC,CAAQ,CAAA,CAGxD,SAASC,GAA0B,+CACjC,MAAMC,GAAoB9F,GAAAH,GAAAC,EAAA0F,GAAA,YAAAA,EAAY,UAAZ,YAAA1F,EAAqB,QAArB,YAAAD,EAA4B,SAA5B,YAAAG,EAAoC,MACxD+F,GAAoB9F,GAAAC,GAAAH,EAAAyF,GAAA,YAAAA,EAAY,UAAZ,YAAAzF,EAAqB,QAArB,YAAAG,EAA4B,SAA5B,YAAAD,EAAoC,MAC1DyF,IAAAA,IAGFpF,GAAAH,GAAAC,EAAAoF,GAAA,YAAAA,EAAY,UAAZ,YAAApF,EAAqB,UAArB,YAAAD,EAA8B,SAA9B,YAAAG,EAAsC,WACtCC,GAAAC,GAAAH,EAAAmF,GAAA,YAAAA,EAAY,UAAZ,YAAAnF,EAAqB,UAArB,YAAAG,EAA8B,SAA9B,YAAAD,EAAsC,SAEtCmF,GAAeM,GAAAC,GAAAC,EAAAV,GAAA,YAAAA,EAAY,UAAZ,YAAAU,EAAqB,UAArB,YAAAD,EAA8B,SAA9B,YAAAD,EAAsC,OAGjDJ,MAAAA,IACJO,GAAAC,GAAAC,EAAAb,GAAA,YAAAA,EAAY,UAAZ,YAAAa,EAAqB,QAArB,YAAAD,EAA4B,SAA5B,YAAAD,EAAoC,YAAa,OAC7C,OACAG,GAAAC,GAAAC,EAAAhB,GAAA,YAAAA,EAAY,UAAZ,YAAAgB,EAAqB,QAArB,YAAAD,EAA4B,SAA5B,YAAAD,EAAoC,SAE1C,MAAO,CAACZ,EAAcI,EAAmBC,EAAmBH,CAAQ,CAAA,CAGtE,SAASa,GAAwB,0DAS/B,IAAIC,EAAgB,EAChBC,EAAc,EACT3E,GAAA,MAAAA,EAAA,QAASG,GAAgB,QAChC,MAAM2C,EAAS3C,GAAA,YAAAA,EAAQ,OACvB,GAAI2C,GAAU,MAAM,QAAQA,CAAM,EAAG,CACnC,MAAM8B,EAAiB9B,EACpB,IAAK1F,GAAA,eAAU,OAAAW,IAAAC,IAAAH,GAAAC,EAAAV,GAAA,YAAAA,EAAO,UAAP,YAAAU,EAAgB,QAAhB,YAAAD,EAAuB,UAAvB,YAAAG,GAAgC,SAAhC,YAAAD,GAAwC,MAAK,EAC5D,OAAQ8G,GAAWA,IAAW,MAAS,EAEpCC,EACJF,EAAe,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAc,EAAI,EAC3CF,GAAAI,CAAA,EAEXhH,GAAAqC,GAAA,YAAAA,EAAA,SAAA,MAAArC,GAAQ,QAASV,GAAe,aAClC6C,GAAA,MAAAA,EAAY,SAAS7C,EAAM,MAC7BuH,IAAe5G,GAAAC,GAAAH,GAAAC,EAAAV,GAAA,YAAAA,EAAO,UAAP,YAAAU,EAAgB,QAAhB,YAAAD,EAAuB,QAAvB,YAAAG,EAA8B,SAA9B,YAAAD,EAAsC,MACvD,EACD,GAGH,MAAM+F,GAAoB9F,GAAAH,GAAAC,EAAA0F,GAAA,YAAAA,EAAY,UAAZ,YAAA1F,EAAqB,QAArB,YAAAD,EAA4B,SAA5B,YAAAG,EAAoC,MACxD+F,GAAoB9F,GAAAC,GAAAH,EAAAyF,GAAA,YAAAA,EAAY,UAAZ,YAAAzF,EAAqB,QAArB,YAAAG,EAA4B,SAA5B,YAAAD,EAAoC,MAC1DyF,IAAAA,IAGFpF,GAAAH,GAAAC,EAAAoF,GAAA,YAAAA,EAAY,UAAZ,YAAApF,EAAqB,UAArB,YAAAD,EAA8B,SAA9B,YAAAG,EAAsC,WACtCC,GAAAC,GAAAH,EAAAmF,GAAA,YAAAA,EAAY,UAAZ,YAAAnF,EAAqB,UAArB,YAAAG,EAA8B,SAA9B,YAAAD,EAAsC,SAEtCmF,GAAeM,GAAAC,GAAAC,EAAAV,GAAA,YAAAA,EAAY,UAAZ,YAAAU,EAAqB,UAArB,YAAAD,EAA8B,SAA9B,YAAAD,EAAsC,OAGjDJ,MAAAA,IACJO,GAAAC,GAAAC,EAAAb,GAAA,YAAAA,EAAY,UAAZ,YAAAa,EAAqB,QAArB,YAAAD,EAA4B,SAA5B,YAAAD,EAAoC,YAAa,OAC7C,OACAG,IAAAC,IAAAC,EAAAhB,GAAA,YAAAA,EAAY,UAAZ,YAAAgB,EAAqB,QAArB,YAAAD,GAA4B,SAA5B,YAAAD,GAAoC,SAEtC,OAAApD,IAAYjB,GAAA,YAAAA,EAAY,QAAS,EAC5B,CAACyD,EAAcI,EAAmBC,EAAmBH,CAAQ,EAG/Dc,MAAkBK,IAAAC,IAAAC,GAAAzB,GAAA,YAAAA,EAAY,UAAZ,YAAAyB,GAAqB,UAArB,YAAAD,GAA8B,SAA9B,YAAAD,GAAsC,OAC3D,CAACJ,EAAaA,EAAaA,EAAaf,CAAQ,EAChD,CAACF,EAAcI,EAAmBC,EAAmBH,CAAQ,CAAA,CAGnE,KAAM,CAACF,EAAcI,EAAmBC,EAAmBH,CAAQ,EACjEZ,IAAS,oBACLS,EAAuB,EACvBvC,EACEuD,EAAA,EACAZ,EAAwB,EAE1BqB,EACJlC,IAAS,qBACLlF,EAAAyF,GAAA,YAAAA,EAAO,QAAP,YAAAzF,EAAc,SAAS,aACvBE,IAAAH,GAAA2F,GAAA,YAAAA,EAAY,UAAZ,YAAA3F,GAAqB,QAArB,YAAAG,GAA4B,SAAS,eACrCE,IAAAH,GAAAyF,GAAA,YAAAA,EAAY,UAAZ,YAAAzF,GAAqB,QAArB,YAAAG,GAA4B,SAAS,YAE3C,SAASiH,EAAeC,EAAqB,CAC3C,MAAI,CAACA,GAAS,CAAC,MAAM,QAAQA,CAAK,EACzB,CAAC,EAGHA,EACJ,IAAKC,GAAU,iBAAA,OACd,KAAM,CACJ,QAAQxH,GAAAC,EAAAuH,EAAK,OAAL,YAAAvH,EAAW,SAAX,YAAAD,EAAmB,MAC3B,WAAUE,GAAAC,EAAAqH,EAAK,OAAL,YAAArH,EAAW,SAAX,YAAAD,EAAmB,WAAY6F,CAC3C,EACA,WAAU1F,EAAAmH,EAAK,SAAS,CAAC,IAAf,YAAAnH,EAAkB,QAAOD,EAAAoH,EAAK,SAAS,CAAC,IAAf,YAAApH,EAAkB,KAAM,CAAA,EAC3D,EACD,KAAK,CAACqH,EAAGC,IAAMD,EAAE,SAAWC,EAAE,QAAQ,CAAA,CAGvC,OAAAxB,GAAqBD,IAAsBC,EAGtC,CACL,QAAS,CACP,OAAQL,EACR,SAAAE,EACA,QANgBF,GAAgBI,IAAsBJ,EAM/B,gBAAkB,SAC3C,EACA,MAAO,CACL,OAAQK,EACR,SAAAH,EACA,QAAS,SACX,EACA,MAAOuB,EAAe5B,GAAA,YAAAA,EAAO,KAAK,EAClC,QAAA2B,CACF,EAGK,CACL,MAAO,CACL,cAAepB,EACf,cAAeC,EACf,SAAAH,CACF,EACA,MAAOuB,EAAe5B,GAAA,YAAAA,EAAO,KAAK,EAClC,QAAA2B,CACF,CACF,CAEA,SAAS/D,GACPpC,EACAmC,EACAsE,EACU,OACV,GAAItE,EAAU,CACN,MAAAuE,EAAc,MAAM,QAAQ1G,GAAA,YAAAA,EAAM,UAAU,EAC7CA,EAAK,WAAwB,OAAO,OAAO,EAC5C,CAAC,EACD,GAAA0G,EAAY,OAAS,EAChB,OAAAA,EAGT,MAAMC,EAAiB,CAAC,EAExB,OAAA5H,EAAAiB,GAAA,YAAAA,EAAM,UAAN,MAAAjB,EAAe,QAAQ,CAAC,CAAE,OAAAgF,EAAQ,MAAAD,KAAiB,OACjD,MAAM8C,EAAgB7C,GAAA,YAAAA,EAAQ,OAC5B,CAAC,CAAE,QAAAK,CAAA,IAAmB,OAAOA,EAAY,KAAeA,GAEpDyC,EAAWD,GAAA,YAAAA,EAAe,OAAO,CAAC,CAAE,UAAAtC,KAAqBA,GAE/D,GAAIuC,GAAA,MAAAA,EAAU,OAAQ,CAChB/C,EACF+C,EAAS,QAASC,GAAsBH,EAAK,KAAKG,EAAE,EAAE,CAAC,EAEvDH,EAAK,KAAKE,EAAS,CAAC,EAAE,EAAE,EAE1B,MAAA,CAGEJ,KAAwB1H,EAAA6H,GAAA,YAAAA,EAAgB,KAAhB,MAAA7H,EAAoB,KAC9C4H,EAAK,KAAKC,EAAc,CAAC,EAAE,EAAE,CAC/B,GAGKD,CAAA,CAGT,OAAO3G,GAAA,YAAAA,EAAM,UACf,CC3agB,SAAA+G,GACdC,EACAC,EACU,CACN,GAAA,EAACA,GAAA,MAAAA,EAAc,QACV,OAAA,OAAO,OAAOD,CAAU,EAAE,QAAS/E,GACxC,WAAYA,EAAQA,EAAM,OAASA,EAAM,MAAQ,CAACA,EAAM,KAAK,EAAI,CAAA,CACnE,EAGF,MAAMiF,EAAiB,CAAC,EACxB,UAAWC,KAAOF,EAAc,CACxB,MAAAhF,EAAQ+E,EAAWG,EAAI,EAAE,EAC/B,GAAKlF,EACL,GAAI,WAAYA,EAAO,CACrB,MAAMmF,EAAQ,IAAI,IAAID,EAAI,MAAM,IAAI,CAAC9F,EAAMgG,IAAQ,CAAChG,EAAK,GAAIgG,CAAG,CAAC,CAAC,EAC5DC,EAAS,CAAC,GAAGrF,EAAM,MAAM,EAAE,KAC/B,CAACsE,EAAGC,KAAOY,EAAM,IAAIb,CAAC,GAAK,IAAMa,EAAM,IAAIZ,CAAC,GAAK,EACnD,EACKU,EAAA,KAAK,GAAGI,CAAM,CACV,KAAA,UAAWrF,GAASA,EAAM,OAC9BiF,EAAA,KAAKjF,EAAM,KAAK,CACvB,CAEK,OAAAiF,CACT,CAMgB,SAAAK,GACdtG,EACAC,EACAiB,EACS,CACL,GAAA,EAAClB,GAAA,MAAAA,EAAS,QACL,MAAA,GAGH,MAAA0F,EAAOzF,GAAc,CAAC,EAE5B,OAAIiB,EACKlB,EAAQ,MAAOG,GACfA,EAAO,SAGUA,EAAO,MAAM,OAAQC,GACzCsF,EAAK,SAAStF,EAAK,EAAE,CAAA,EACrB,QACsB,EALf,EAMV,EAGIsF,EAAK,SAAW1F,EAAQ,MACjC,CChBa,MAAAuG,GAAa,IAAIC,GAAyB,CACrD,KAAM,MAAOC,GAAY,WACjB,MAAAC,GAAc7I,GAAAC,EAAA2I,GAAA,YAAAA,EAAS,SAAT,YAAA3I,EAAiB,iBAAjB,YAAAD,EAAiC,YAM/C8I,IACJ3I,GAJgBV,GAAa,GAAK,CAAC,GAIzB,cAAV,YAAAU,EAAuB,MAAM,QAAQ0I,GAAA,YAAAA,EAAa,aAG9CE,EAAkBrJ,GAA4B,CAAC,EAW/CsE,EAAS,CAAE,GARkB,CACjC,cAAe,QACf,aAAc,QACd,iBAAkB,GAClB,KAAM,GACN,YAAA8E,CACF,EAEmC,GAAGF,CAAQ,EAI9C,GAFAF,GAAW,OAAO,UAAU,CAAE,GAAG1E,EAAQ,EAErCA,GAAAA,MAAAA,EAAQ,IAAK,CAET,MAAA9C,EAAO2H,EACTzF,EAAqByF,CAAW,EAChC,MAAMG,GAAiBhF,EAAO,IAAK,CACjC,qBAAsBA,EAAO,oBAAA,CAC9B,EAGLnD,EAAO,KAAK,WAAYK,EAAM,CAAE,MAAO8C,EAAO,MAAO,EAErD,MAAMiF,EAAiBC,GAA8B,CACnD,MAAOlF,EAAO,KAAA,CACf,EACKmF,GACJF,GAAA,YAAAA,EAAgB,yBAChBlG,GACEkG,GAAA,YAAAA,EAAgB,cAClB,EAEIG,EAAyBlI,GAAA,MAAAA,EAAM,SACjCsB,GACE2G,EACAjI,GAAA,YAAAA,EAAM,QACNA,GAAA,YAAAA,EAAM,UAAA,EAER,OAGEmI,EAAgB,CACpB,IAAKrF,EAAO,IACZ,SAAU+E,EACV,YAAa7H,GAAA,YAAAA,EAAM,WACnB,GAAIkI,GAA0B,CAC5B,uBAAAA,EACA,eAAgBvG,GACduG,CAAA,CACF,CAEJ,EAEAE,GAA8B,KAAO,CAAE,GAAGD,CAAA,GAAkB,CAC1D,MAAOrF,EAAO,KAAA,CACf,EAEDuF,GACE,IACMrI,GAAA,MAAAA,EAAM,QACDuH,GACLvH,EAAK,QACLA,EAAK,WACLA,EAAK,QACP,EAGK,GAET,CAAE,MAAO8C,EAAO,KAAM,CACxB,EAGIA,EAAO,MAAQ9C,GACjBQ,GAA4BR,CAAI,CAClC,CAEJ,EAEA,UAAW,IAAM,CACfL,EAAO,GAAG,SAAU,SAAY,CAC9B,KAAM,CAAE,IAAA2I,EAAK,MAAAC,CAAA,EAAUf,GAAW,OAAO,UAAU,EAEnD,GAAIc,EAAK,CACD,MAAA9G,EAAO,MAAMsG,GAAiBQ,CAAG,EACvC3I,EAAO,KAAK,WAAY6B,EAAM,CAAE,MAAA+G,EAAO,CAAA,CAE1C,CAAA,CAAA,CAEL,CAAC,EAEYzF,EAAS0E,GAAW,OClKpB,CACX,YAAAgB,GACA,sBAAAC,GACA,yBAAAC,GACA,uBAAAC,GACA,sBAAAC,GACA,aAAAC,GACA,UAAAC,EACF,EAAI,IAAIC,GAAa,EAAE,WAAW,ECD3B,SAASC,GACdlI,EACmC,CAC5B,MAAA,CACL,cAAeA,EAAI,cACnB,WAAYA,EAAI,WAAW,IAAKM,IAAY,CAC1C,GAAGA,EACH,OAAQA,EAAO,OAAO,IAAK/C,IAAW,CACpC,GAAGA,EACH,MAAO,OAAOA,EAAM,KAAK,CAAA,EACzB,CAAA,EACF,EACF,aAAcyC,EAAI,aAAa,IAAKM,IAAY,CAC9C,GAAGA,EACH,MAAOA,EAAO,QAAU,OAAY,OAAY,OAAOA,EAAO,KAAK,CAAA,EACnE,CACJ,CACF,CCxBO,MAAM6H,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9BC,EAAgB;AAAA,ECJLC,GAAiB,MAC5Bb,EACArH,EAIAH,IACiC,OACjC,KAAM,CAAE,KAAAd,CAAA,EAAS,MAAM6I,GAAaI,GAAkB,CACpD,OAAQ,MACR,UAAW,CAAE,KAAM,CAACX,CAAG,CAAE,CAAA,CAC1B,EAEKzJ,GAAUE,EAAAiB,GAAA,YAAAA,EAAM,WAAN,YAAAjB,EAAiB,GAOjC,OAJIkC,GAAA,MAAAA,EAAS,cACXpC,EAAQ,WAAaoC,EAAQ,aAG1BpC,EAGEiC,EACHjC,EACAqD,EAAqBrD,EAAS,CAC5B,qBAAsBoC,GAAA,YAAAA,EAAS,oBAAA,CAChC,EANI,IAOX,EC/BamI,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/BF,EAAgB;AAAA,ECuBLG,GAAkB,MAC7BC,EACAxI,IACmC,CACnC,GAAI,CAACwI,GAASA,EAAM,SAAW,EACtB,OAAA,KAGT,MAAMC,EAAOD,EAAM,IAAKjI,GAASA,EAAK,GAAG,EACnC,CAAE,KAAArB,CAAA,EAAS,MAAM6I,GAAaO,GAAmB,CACrD,OAAQ,MACR,UAAW,CAAE,KAAAG,CAAK,CAAA,CACnB,EACKC,EAAWxJ,GAAA,YAAAA,EAAM,SAEvB,GAAI,CAACwJ,GAAYA,EAAS,SAAW,EAC5B,OAAA,KAIT,MAAMC,EAAaH,EAAM,OACvB,CAACI,EAAKrI,KACAqI,EAAArI,EAAK,GAAG,EAAIA,EACTqI,GAET,CAAA,CACF,EAEA,OAAO5I,EACH0I,EACAA,EAAS,IAAK3K,GAAiB,CACvB,MAAA8K,EAAcF,EAAW5K,EAAQ,GAAG,EAG1C,OAAI8K,GAAA,MAAAA,EAAa,cACf9K,EAAQ,WAAa8K,EAAY,aAG5BzH,EAAqBrD,EAAS,CACnC,qBAAsB8K,GAAA,YAAAA,EAAa,oBAAA,CACpC,CAAA,CACF,CACP,ECzEaC,GAA2B,oBAG3BC,GAAyB,kBAGzBC,GAA4B,CACvCF,GACAC,EACF,ECRaE,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBlCb,EAAgB;AAAA,ECfX,SAASc,GAAkBvI,EAAsB,CAClD,GAAA,CACF,OAAO,KAAKA,CAAG,EAAE,WAAW,gBAAgB,CAAA,MACtC,CACC,MAAA,EAAA,CAEX,CAEA,MAAMwI,GAA2B,CAAC,CAAE,KAAAlK,KAClC,CAAC,CAACA,GAAQ+J,GAA0B,SAAS/J,CAAI,EAGnD,SAASmK,GAAwBC,EAAaC,EAAoB,OAChE,MAAMC,IACJtL,EAAAoL,GAAA,YAAAA,EAAQ,aAAR,YAAApL,EAAoB,OAAOkL,MAA6B,CAAC,EAE3D,MAAI,CAACG,GAAiB,CAACC,EAAiB,OAAe,CAAC,EAEjD,CACL,WAAY,CACV,IAAID,EAAc,YAAc,CAAA,GAAI,OACjCE,GAAiC,CAACL,GAAyBK,CAAS,CACvE,EACA,GAAGD,CAAA,CAEP,CACF,CAEA,eAAelB,GAAeb,EAAapH,EAAoC,CAEvE,MAAAqJ,EAAoBrJ,EAAW,OAAQO,GAAQ,CAACuI,GAAkBvI,CAAG,CAAC,EAEtE+I,EAAyBC,GAAmBF,CAAiB,EAC7DG,EAAgBC,GAAsBH,EAAwBlC,CAAG,EAEjEsC,EAAgBb,GAAqB,QACzC,0BACAW,CACF,EAEM,CAAE,KAAA1K,CAAA,EAAS,MAAM6I,GAAa+B,EAAe,CACjD,OAAQ,MACR,UAAW,CAAE,UAAWL,EAAmB,IAAAjC,CAAI,CAAA,CAChD,EACM,OAAAtI,CACT,CAEO,MAAM6K,GAAoB,MAC/BvC,EACApH,EACA4J,EACAhK,IACiC,WACjC,MAAMd,EAAO,MAAMmJ,GAAeb,EAAKpH,CAAU,EAC7C,GAAA,CAAClB,EAAa,OAAA,KAEZ,KAAA,CACJ,SAAAwJ,EACA,cAAeuB,EACf,GAAGC,CAAA,EACDhL,EACJ,IAAIoK,EAAgBW,EAEd,MAAAZ,EAASX,GAAA,YAAAA,EAAW,GAEpBvI,EAAUgK,GACd,OAAO,OAAOD,CAAc,EAC5Bb,EAAO,QACPW,CACF,EAGI,GAAAA,GAAA,MAAAA,EAAe,QAAUV,IAAkB,KAAM,CACtClJ,EAAAgK,GAAiBjK,EAASC,EAAY4J,CAAa,EAChE,MAAMK,EAAqB,MAAMhC,GAAeb,EAAKpH,CAAU,EAC/DkJ,EAAgBe,GAAA,YAAAA,EAAoB,aAAA,CAGtC,MAAMC,EAAW,CACf,GAAIhB,GAAiBD,EACrB,GAAGD,GAAwBC,EAAQC,CAAa,EAChD,IAAKD,EAAO,IACZ,KAAMA,EAAO,KACb,iBAAkBA,GAAA,YAAAA,EAAQ,WAC1B,QAAAlJ,EACA,WAAAC,EACA,YACEkJ,GAAA,YAAAA,EAAe,cAAe,oBAC1BA,GAAA,YAAAA,EAAe,IACf,OACN,aACEA,GAAA,YAAAA,EAAe,cAAe,oBAC1BA,GAAA,YAAAA,EAAe,KACf,MACR,EAEMiB,EAAcvK,EAAMsK,EAAWlJ,EAAqBkJ,CAAQ,EAE5DE,GAAWrM,GAAAH,GAAAC,EAAA+D,GAAA,YAAAA,EAAQ,cAAR,YAAA/D,EAAqB,SAArB,YAAAD,EAA6B,iBAA7B,YAAAG,EAA6C,aAE9D,OAAIqM,EACKA,EAASnB,EAAQkB,CAAY,EAG/BA,CACT,EAEA,SAASZ,GAAmBc,EAA2B,CACjD,GAAAA,EAAI,OAAS,EACf,MAAO,CAACA,CAAG,EAGb,MAAMC,EAAqB,CAAC,EAExB,OAAAD,EAAA,QAASlK,GAAS,CACpB,MAAMoK,EAAiB,CAAC,EAEpBF,EAAA,QAASG,GAAU,CACjBrK,IAASqK,GACXD,EAAK,KAAKC,CAAK,CACjB,CACD,EAEDF,EAAO,KAAKC,CAAI,CAAA,CACjB,EAEMD,CACT,CAEA,SAASb,GAAsBzJ,EAAwBoH,EAAqB,CAC1E,OAAOpH,EACJ,IAAI,CAACyK,EAAeC,IACZ;AAAA,yBACYA,CAAC;AAAA;AAAA,gBAEVD,EAAI,IAAKhI,GAAO,IAAIA,CAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,oBAEjC2E,CAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SASlB,EACA,KAAK,EAAE,CACZ,CAEA,SAAS2C,GACPhK,EACAkJ,EAAa,CAAA,EACbW,EACA,CAEA,MAAME,EAAsB,OAAO,OAAO/J,CAAO,EAC9C,OAAQ4K,GAAM,CAAC,CAACA,CAAC,EACjB,OAAO,CAACnC,EAAUoC,IACZA,EAAK,QAEH,CAAC,GAAGpC,EAAK,GAAGoC,EAAK,OAAO,EAFL,CAAC,GAAGpC,CAAG,EAGhC,EAAE,EAGDqC,EAAM,IAAI,IAAI5B,EAAO,IAAK9I,GAAc,CAACA,EAAK,GAAIA,CAAI,CAAC,CAAC,EAG/C,OAAA2J,EAAA,QAASgB,GAAiB,CAEnClB,GAAA,MAAAA,EAAe,SAASkB,EAAQ,KAIhCD,EAAA,IAAIC,EAAQ,GAAIA,CAAO,CAAA,CAC5B,EAEM,CAAC,GAAGD,EAAI,QAAQ,CACzB,CAEA,SAASb,GACPjK,EACA2G,EACAkD,EACU,CACV,MAAMmB,EAA+B,CAAC,EAElC,IAAAC,EACI,OAAAjL,EAAA,QAASG,GAAgB,aAC3B0J,EAAc,SAAS1J,EAAO,EAAE,EAClC8K,IACEpN,GAAAC,EAAAqC,EAAO,SAAP,YAAArC,EAAe,KAAMV,GAAeuJ,EAAY,SAASvJ,GAAA,YAAAA,EAAO,EAAE,KAAlE,YAAAS,EACI,OAAMG,EAAAmC,EAAO,OAAO,CAAC,IAAf,YAAAnC,EAAkB,IAEhBiN,GAAAlN,EAAAoC,EAAO,OAAO,CAAC,IAAf,YAAApC,EAAkB,GAElCiN,EAAmB,KAAKC,CAAW,CAAA,CACpC,EACMD,CACT,CCrMa,MAAAnE,GAAmB,MAAOQ,EAAarH,IAAsB,CAExE,KAAM,CAAE,QAASkL,EAAgB,YAAaC,CAAmB,EAC/DtJ,EAAO,UAAU,EAGb,CACJ,YAAA8E,EAAcwE,EACd,QAAAC,EAAUF,EACV,qBAAA1F,EACA,SAAAtE,EACA,cAAAmK,CACF,EAAIrL,GAAW,CAAC,EAQhB,MAAO,CAACkB,GAAYyF,GAAeA,EAAY,OAAS,EACpD,MAAMiD,GAAkBvC,EAAKV,EAAayE,EAASC,CAAa,EAChE,MAAMnD,GACJb,EACA,CACE,qBAAA7B,EACA,YAAAmB,CACF,EACA0E,CACF,CACN,ECnCalE,GAAgC,CAC3CmE,EACAtL,IACG,CAEG,MAAAuL,EACJxE,GAA8B,CAAE,MAAO/G,GAAA,YAAAA,EAAS,KAAO,CAAA,GACtD,CAAC,EAEEO,EAAO+K,EAASC,CAAI,EAEtBhL,EAAK,yBACPA,EAAK,eAAiBO,GACpBP,EAAK,eACLgL,EAAK,uBACLhL,EAAK,sBACP,GAGK7B,EAAA,KAAK,aAAc,CAAE,GAAG6B,GAAQ,CAAE,MAAOP,GAAA,YAAAA,EAAS,MAAO,CAClE,ECtBa+G,GAAgC,CAAC,CAC5C,MAAAO,CACF,EAAwB,KACf5I,EAAO,YAAY,aAAc,CAAE,MAAA4I,CAAA,CAAO,GAAK,KCH3CF,GAA+B,CAC1CkE,EACAtL,IACG,CACH,MAAMuL,EAAOC,GAA4B,CAAE,MAAOxL,GAAA,YAAAA,EAAS,MAAO,EAE5DO,EAAO+K,EAASC,CAAe,EAErC7M,EAAO,KAAK,YAAa6B,EAAM,CAAE,MAAOP,GAAA,YAAAA,EAAS,MAAO,CAC1D,ECTayL,GAAwB,MAAO,CAC1C,MAAAnE,CACF,EAAwB,KAAqC,CAC3D,MAAMoE,EAAUhN,EAAO,YAAY,WAAY,CAAE,MAAA4I,EAAO,EAExD,OAAIoE,EACK,QAAQ,QAAQA,CAAO,EAIzB,IAAI,QAASC,GAAY,CAC9B,MAAMxM,EAAQT,EAAO,GACnB,WACCK,GAAS,CACR4M,EAAQ5M,CAAI,EACZI,GAAA,MAAAA,EAAO,KACT,EACA,CAAE,MAAO,GAAM,MAAAmI,CAAM,CACvB,CAAA,CACD,CACH,ECrBakE,GAA8B,CAAC,CAC1C,MAAAlE,CACF,EAAwB,KACf5I,EAAO,YAAY,YAAa,CAAE,MAAA4I,CAAA,CAAO,GAAK"}
1
+ {"version":3,"file":"api.js","sources":["/@dropins/storefront-pdp/src/lib/url-params.ts","/@dropins/storefront-pdp/src/data/transforms/acdl-context.ts","/@dropins/storefront-pdp/src/lib/acdl.ts","/@dropins/storefront-pdp/src/data/models/acdl-models.ts","/@dropins/storefront-pdp/src/lib/bundle-option-quantities.ts","/@dropins/storefront-pdp/src/data/transforms/product-transform.ts","/@dropins/storefront-pdp/src/lib/product-option-selection.ts","/@dropins/storefront-pdp/src/api/initialize/initialize.ts","/@dropins/storefront-pdp/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-pdp/src/data/transforms/customizable-options-transform.ts","/@dropins/storefront-pdp/src/api/getProductData/graphql/getProductData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductData/getProductData.ts","/@dropins/storefront-pdp/src/api/getProductsData/graphql/getProductsData.graphql.ts","/@dropins/storefront-pdp/src/api/getProductsData/getProductsData.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/graphql/RefineProductQuery.graphql.ts","/@dropins/storefront-pdp/src/api/getRefinedProduct/getRefinedProduct.ts","/@dropins/storefront-pdp/src/api/fetchProductData/fetchProductData.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValues/setProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/getProductConfigurationValues/getProductConfigurationValues.ts","/@dropins/storefront-pdp/src/api/setProductConfigurationValid/setProductConfigurationValid.ts","/@dropins/storefront-pdp/src/api/getFetchedProductData/getFetchedProductData.ts","/@dropins/storefront-pdp/src/api/isProductConfigurationValid/isProductConfigurationValid.ts"],"sourcesContent":["/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nexport function setUrlParams(\n params: Record<string, string | number | null>,\n): void {\n const urlSearchParams = new URLSearchParams(window.location.search);\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === null) {\n urlSearchParams.delete(key);\n } else {\n urlSearchParams.set(key, String(value));\n }\n });\n\n let url = window.location.pathname;\n url += `?${urlSearchParams.toString()}`;\n url += window.location.hash;\n\n window.history.replaceState({}, '', url);\n}\n\nexport function getUrlParams(): Record<string, string> {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const params: Record<string, string> = {};\n\n urlSearchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\nexport function getValidatedQuantityFromUrl(\n defaultQuantity: number = 1,\n): number {\n const urlParams = getUrlParams() || {};\n const quantityParam = urlParams.quantity; // 'quantity' is the key\n\n if (quantityParam) {\n const parsedQuantity = parseInt(quantityParam, 10);\n\n if (\n !isNaN(parsedQuantity) &&\n Number.isInteger(parsedQuantity) &&\n parsedQuantity > 0\n ) {\n // Return the valid quantity from the URL\n return parsedQuantity;\n }\n }\n\n // Return the default quantity if the parameter is missing, invalid, or not positive\n return defaultQuantity;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { ProductModel } from '../models';\n\nimport { Product } from '../models/acdl-models';\n\nexport function transformProduct(product: ProductModel): Product {\n return {\n productId: Number(product?.externalId),\n name: product?.name,\n sku: product?.variantSku || product?.sku,\n topLevelSku: product?.sku,\n variantName: product?.variantName,\n specialToDate: undefined,\n specialFromDate: undefined,\n newToDate: undefined,\n newFromDate: undefined,\n createdAt: undefined,\n updatedAt: undefined,\n manufacturer: undefined,\n countryOfManufacture: undefined,\n categories: undefined,\n productType: product?.productType,\n pricing: {\n regularPrice: product?.prices?.regular?.amount || 0,\n minimalPrice: product?.prices?.final?.minimumAmount,\n maximalPrice: product?.prices?.final?.maximumAmount,\n specialPrice: product?.prices?.final?.amount,\n tierPricing: undefined,\n currencyCode: product?.prices?.final?.currency || 'USD',\n },\n canonicalUrl: product?.url,\n mainImageUrl: product?.images?.[0]?.url,\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/* Publish functions for the Adobe Client Data Layer (ACDL) */\n\nimport { ProductModel } from '../data/models';\nimport { transformProduct } from '../data/transforms/acdl-context';\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/contexts.ts\n */\nexport const contexts = {\n PRODUCT_CONTEXT: 'productContext',\n CHANNEL_CONTEXT: 'channelContext',\n};\n\n/**\n * See: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/events.ts\n */\nexport const events = {\n PRODUCT_PAGE_VIEW: 'product-page-view',\n};\n\nexport function getAdobeDataLayer() {\n // @ts-ignore\n window.adobeDataLayer = window.adobeDataLayer || [];\n // @ts-ignore\n return window.adobeDataLayer;\n}\n\nexport function getChannelContext() {\n return {\n _id: 'https://ns.adobe.com/xdm/channels/web',\n _type: 'https://ns.adobe.com/xdm/channel-types/web',\n };\n}\n\n/**\n * Sets a context in the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/Base.ts#L6\n */\nfunction setContext(name: string, data: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n // Clear existing context\n adobeDataLayer.push({\n [name]: null,\n });\n\n // Set new context\n adobeDataLayer.push({\n [name]: data,\n });\n}\n\nexport function setChannelContext() {\n if (typeof window === 'undefined') {\n return;\n }\n\n setContext(contexts.CHANNEL_CONTEXT, getChannelContext());\n}\n\n/**\n * Pushes an event to the Adobe Client Data Layer (ACDL)\n * Logic based on: https://github.com/adobe/commerce-events/blob/1973d0ce28471ef190fa06dad6359ffa0ab51db6/packages/storefront-events-sdk/src/Base.ts#L34\n */\nfunction pushEvent(event: string, additionalContext?: any) {\n const adobeDataLayer = getAdobeDataLayer();\n\n adobeDataLayer.push((acdl: any) => {\n const state = acdl.getState ? acdl.getState() : {};\n\n acdl.push({\n event,\n eventInfo: {\n ...state,\n ...additionalContext,\n },\n });\n });\n}\n\n// Triggered when a product page is viewed\nexport function publishProductPageViewEvent(product: ProductModel) {\n const productItem = transformProduct(product);\n setContext(contexts.PRODUCT_CONTEXT, productItem);\n setChannelContext();\n pushEvent(events.PRODUCT_PAGE_VIEW);\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\n/**\n * ACDL Product Types from:\n * https://github.com/adobe/commerce-events/blob/main/packages/storefront-events-sdk/src/types/schemas/product.ts\n */\n\nexport type Product = {\n productId: number;\n name: string;\n sku: string;\n topLevelSku?: string | null;\n variantName?: string | null;\n specialToDate?: string | null;\n specialFromDate?: string | null;\n newToDate?: string | null;\n newFromDate?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n manufacturer?: string | null;\n countryOfManufacture?: string | null;\n categories?: string[] | null;\n productType?: ProductType;\n pricing?: {\n regularPrice: number;\n minimalPrice?: number;\n maximalPrice?: number;\n specialPrice?: number;\n tierPricing?: {\n customerGroupId?: number | null;\n qty: number;\n value: number;\n }[];\n currencyCode: string | null;\n };\n canonicalUrl?: string | null;\n mainImageUrl?: string | null;\n};\n\nexport enum ProductType {\n ComplexProduct = 'complex',\n SimpleProduct = 'simple',\n}\n\nexport enum ProductViewType {\n ComplexProductView = 'ComplexProductView',\n SimpleProductView = 'SimpleProductView',\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport type { Option } from '@/pdp/data/models';\n\nexport type BundleOptionQuantities = Record<string, number>;\n\nexport function readCanEditQuantity(value: Record<string, unknown>): boolean {\n return Boolean(value.canEditQuantity);\n}\n\nexport function readDefaultOptionQuantity(\n value: Record<string, unknown>,\n): number {\n const raw = value.quantity ?? value.qty;\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;\n}\n\nexport function buildBundleOptionQuantitiesFromOptions(\n options: Option[] | undefined,\n optionUIDs: string[] | undefined,\n): BundleOptionQuantities {\n if (!options?.length || !optionUIDs?.length) {\n return {};\n }\n\n const quantities: BundleOptionQuantities = {};\n\n for (const option of options) {\n if (option.typename !== 'ProductViewOptionValueProduct') {\n continue;\n }\n\n for (const item of option.items) {\n if (!optionUIDs.includes(item.id)) {\n continue;\n }\n\n quantities[item.id] = item.quantity ?? 1;\n }\n }\n\n return quantities;\n}\n\nexport function mergeBundleOptionQuantities(\n previous: BundleOptionQuantities | undefined,\n options: Option[] | undefined,\n optionUIDs: string[] | undefined,\n): BundleOptionQuantities {\n const next = buildBundleOptionQuantitiesFromOptions(options, optionUIDs);\n\n if (!previous) {\n return next;\n }\n\n return Object.fromEntries(\n Object.entries(next).map(([uid, defaultQty]) => [\n uid,\n previous[uid] ?? defaultQty,\n ]),\n );\n}\n\nexport function bundleOptionQuantitiesToEnteredOptions(\n quantities: BundleOptionQuantities | undefined,\n): Array<{ uid: string; value: string }> {\n if (!quantities) {\n return [];\n }\n\n return Object.entries(quantities).map(([uid, quantity]) => ({\n uid,\n value: String(quantity),\n }));\n}\n\nexport function bundleOptionQuantitiesFromEnteredOptions(\n enteredOptions: Array<{ uid: string; value: string }> | undefined,\n): BundleOptionQuantities {\n if (!enteredOptions?.length) {\n return {};\n }\n\n const quantities: BundleOptionQuantities = {};\n for (const option of enteredOptions) {\n const quantity = Number(option.value);\n if (Number.isFinite(quantity) && quantity > 0) {\n quantities[option.uid] = quantity;\n }\n }\n return quantities;\n}\n\nexport function mergeBundleEnteredOptions(\n enteredOptions: Array<{ uid: string; value: string }> | undefined,\n previous: BundleOptionQuantities | undefined,\n next: BundleOptionQuantities,\n): Array<{ uid: string; value: string }> {\n const bundleUIDs = new Set([\n ...Object.keys(previous || {}),\n ...Object.keys(next),\n ]);\n return [\n ...(enteredOptions || []).filter((entry) => !bundleUIDs.has(entry.uid)),\n ...bundleOptionQuantitiesToEnteredOptions(next),\n ];\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\nimport { merge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/pdp/api';\nimport { ProductModel, Option } from '@/pdp/data/models';\nimport { ProductType, ProductViewType } from '../models/acdl-models';\nimport {\n readCanEditQuantity,\n readDefaultOptionQuantity,\n} from '@/pdp/lib/bundle-option-quantities';\n\nexport function transformProductData(\n data: any,\n options?: {\n preselectFirstOption?: boolean;\n },\n): ProductModel | null {\n const isBundle =\n data?.options?.[0]?.values?.[0]?.__typename ===\n 'ProductViewOptionValueProduct';\n const optionUIDs = getOptionUIDs(\n data,\n isBundle,\n options?.preselectFirstOption,\n );\n const productType =\n data?.__typename === ProductViewType.SimpleProductView\n ? ProductType.SimpleProduct\n : ProductType.ComplexProduct;\n\n const productData = data\n ? ({\n name: data.name,\n sku: data.sku,\n isBundle,\n addToCartAllowed: data.addToCartAllowed,\n inStock: data.inStock,\n shortDescription: data.shortDescription,\n metaDescription: data.metaDescription,\n metaKeyword: data.metaKeyword,\n metaTitle: data.metaTitle,\n description: data.description,\n images: transformImages(data),\n videos: transformVideos(data),\n prices: transformPrices(data, isBundle, optionUIDs),\n attributes: transformAttributes(data),\n options: applyOptionsTransformer(transformOptions(data, isBundle)),\n optionUIDs,\n url: data.url,\n urlKey: data.urlKey,\n externalId: data.externalId,\n externalParentId: data.externalParentId,\n variantSku: data.variantSku,\n variantName: data.variantName,\n productType,\n } as ProductModel)\n : null;\n\n // extend the model with custom transformer\n return merge(\n productData,\n config.getConfig()?.models?.ProductDetails?.transformer?.(data) ??\n config.getConfig()?.models?.ProductDetails?.transform?.(data),\n );\n}\n\nfunction applyOptionsTransformer(\n options: Option[] | undefined,\n): Option[] | undefined {\n if (!options) return undefined;\n\n const optionsTransformer =\n config.getConfig()?.models?.ProductOptions?.optionsTransformer;\n\n if (!optionsTransformer) {\n return options;\n }\n\n try {\n const transformed = optionsTransformer(options);\n return transformed ?? options;\n } catch (error) {\n console.error(\n 'product-transform: optionsTransformer threw an error, using original options',\n error,\n );\n return options;\n }\n}\n\nfunction transformImages(data: any) {\n return data.images\n ?.filter((image: any) => !image.roles?.includes('hide_from_pdp'))\n ?.map((image: any) => {\n // Remove protocol from image URL\n image.url = image.url.replace(/^https?:/, '');\n\n return image;\n });\n}\n\nfunction transformVideos(data: any) {\n return data.videos?.map((video: any) => ({\n url: video.url?.replace(/^https?:/, ''),\n title: video.title,\n description: video.description,\n preview: video.preview\n ? {\n url: video.preview.url?.replace(/^https?:/, ''),\n label: video.preview.label,\n roles: video.preview.roles,\n }\n : undefined,\n }));\n}\n\nfunction transformAttributes(data: any) {\n return (\n data.attributes\n // only show attributes that are visible in PDP\n ?.filter(({ roles }: any) => roles?.indexOf('visible_in_pdp') !== -1)\n // transform attribute values\n ?.map(({ label, value, name }: any) => {\n // Special handling for ac_giftcard attribute\n if (name?.startsWith('ac_')) {\n try {\n let parsedValue;\n\n if (typeof value === 'string') {\n parsedValue = JSON.parse(value);\n } else if (typeof value === 'object') {\n parsedValue = value;\n }\n // Transform specific snake_case fields to camelCase\n const transformedValue = transformSnakeToCamel(parsedValue);\n\n return {\n id: name,\n label,\n value: JSON.stringify(transformedValue),\n };\n } catch {\n // If parsing fails, return original value\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n }\n }\n\n return {\n id: name,\n label,\n value: value.toString().split(',').join(', '),\n };\n })\n );\n}\n\nfunction transformSnakeToCamel(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map(transformSnakeToCamel);\n }\n\n if (obj !== null && typeof obj === 'object') {\n const transformed: any = {};\n for (const [key, value] of Object.entries(obj)) {\n // Only transform specific snake_case fields to camelCase\n let camelKey = key;\n if (key === 'validation_rule') {\n camelKey = 'validationRule';\n } else if (key === 'min_length') {\n camelKey = 'minLength';\n } else if (key === 'max_length') {\n camelKey = 'maxLength';\n } else if (key === 'purchase_separately') {\n camelKey = 'purchaseSeparately';\n }\n\n transformed[camelKey] = transformSnakeToCamel(value);\n }\n return transformed;\n }\n\n return obj;\n}\n\nfunction transformOptions(data: any, isBundle?: boolean) {\n const { options, optionUIDs } = data;\n\n return options?.map(({ id, title, required, multi, values }: any) => {\n const typename = values?.[0]?.__typename;\n let type: string = values?.[0]?.type;\n\n if (type) {\n type = type\n .replace('COLOR_HEX', 'color')\n .replace('TEXT', 'text')\n .replace('IMAGE', 'image');\n } else {\n type = 'dropdown';\n }\n\n return {\n id,\n type,\n typename,\n label: title,\n required,\n multiple: multi,\n items: isBundle\n ? mapBundleOptionValues(values, optionUIDs)\n : mapOptionValues(values, optionUIDs, type),\n };\n });\n}\n\nfunction mapBundleOptionValues(values: any, optionUIDs: string[]) {\n return values\n ?.filter(({ enabled }: any) => typeof enabled === 'undefined' || enabled)\n .map((value: any) => {\n const { id, title, inStock, isDefault, product } = value;\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1 || isDefault,\n value: id,\n product,\n quantity: readDefaultOptionQuantity(value),\n canEditQuantity: readCanEditQuantity(value),\n };\n });\n}\n\nfunction mapOptionValues(values: any, optionUIDs: string[], type: string) {\n return values?.map(({ id, title, inStock, value }: any) => {\n return {\n id,\n inStock,\n label: title,\n selected: optionUIDs?.indexOf(id) > -1,\n value:\n type?.toLowerCase() === 'dropdown'\n ? id\n : value?.replace(/^https?:/, ''),\n };\n });\n}\n\nfunction transformPrices(\n data: any,\n isBundle: boolean,\n defaultOptionUIDs?: string[],\n) {\n const { price, priceRange, options, optionUIDs = defaultOptionUIDs } = data;\n\n if (!price && !priceRange) {\n return null;\n }\n\n const { __typename: type } = data;\n\n function getSimpleProductPrices() {\n const regularPrice = price?.regular?.amount?.value;\n const finalPrice =\n price?.final?.amount?.value ?? price?.regular?.amount?.value;\n\n const currency =\n price?.regular?.amount?.currency === 'NONE' //temporary fix if there is no currency\n ? 'USD'\n : price?.regular?.amount?.currency;\n\n return [regularPrice, finalPrice, finalPrice, currency];\n }\n\n function getComplexProductPrices() {\n const finalMinimumPrice = priceRange?.minimum?.final?.amount?.value;\n const finalMaximumPrice = priceRange?.maximum?.final?.amount?.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount?.value ===\n priceRange?.maximum?.regular?.amount?.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount?.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount?.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount?.currency;\n\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n function getBundleProductPrice() {\n // Currently the Catalog Service does not have support for the individual prices of the options of a fixed bundle,\n // so the price used in UI is taken from the priceRange object.\n\n // The dynamic bundle has full support in Catalog Service.\n // If there are pre-selected values of the option, then the starting price is the sum of those and\n // after each selection, the price is updated with the sum of prices for the selected options.\n // This is not supported by default and needs to be updated in the drop-in upon each selection.\n\n let maxSumRegular = 0;\n let bundlePrice = 0;\n options?.forEach((option: any) => {\n const values = option?.values;\n if (values && Array.isArray(values)) {\n const regularAmounts = values\n .map((value) => value?.product?.price?.regular?.amount?.value)\n .filter((amount) => amount !== undefined);\n\n const maxRegularAmount =\n regularAmounts.length > 0 ? Math.max(...regularAmounts) : 0;\n maxSumRegular += maxRegularAmount;\n }\n option?.values?.forEach((value: any) => {\n if (optionUIDs?.includes(value.id)) {\n bundlePrice += value?.product?.price?.final?.amount?.value;\n }\n });\n });\n\n const finalMinimumPrice = priceRange?.minimum?.final?.amount?.value;\n const finalMaximumPrice = priceRange?.maximum?.final?.amount?.value;\n let regularPrice;\n\n if (\n priceRange?.minimum?.regular?.amount?.value ===\n priceRange?.maximum?.regular?.amount?.value\n ) {\n regularPrice = priceRange?.minimum?.regular?.amount?.value;\n }\n\n const currency =\n priceRange?.minimum?.final?.amount?.currency === 'NONE'\n ? 'USD'\n : priceRange?.minimum?.final?.amount?.currency;\n\n if (isBundle && optionUIDs?.length < 1) {\n return [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n return maxSumRegular === priceRange?.maximum?.regular?.amount?.value\n ? [bundlePrice, bundlePrice, bundlePrice, currency]\n : [regularPrice, finalMinimumPrice, finalMaximumPrice, currency];\n }\n\n const [regularPrice, finalMinimumPrice, finalMaximumPrice, currency] =\n type === 'SimpleProductView'\n ? getSimpleProductPrices()\n : isBundle\n ? getBundleProductPrice()\n : getComplexProductPrices();\n\n const visible =\n type === 'SimpleProductView'\n ? price?.roles?.includes('visible')\n : priceRange?.maximum?.roles?.includes('visible') &&\n priceRange?.minimum?.roles?.includes('visible');\n\n function transformTiers(tiers: any[]): any[] {\n if (!tiers || !Array.isArray(tiers)) {\n return [];\n }\n\n return tiers\n .map((tier) => ({\n tier: {\n amount: tier.tier?.amount?.value,\n currency: tier.tier?.amount?.currency || currency,\n },\n quantity: tier.quantity[0]?.gte || tier.quantity[0]?.lt || 0,\n }))\n .sort((a, b) => a.quantity - b.quantity);\n }\n\n if (finalMaximumPrice && finalMinimumPrice === finalMaximumPrice) {\n const hasDiscount = regularPrice && finalMinimumPrice !== regularPrice;\n\n return {\n regular: {\n amount: regularPrice,\n currency,\n variant: hasDiscount ? 'strikethrough' : 'default',\n },\n final: {\n amount: finalMaximumPrice,\n currency,\n variant: 'default',\n },\n tiers: transformTiers(price?.tiers),\n visible,\n };\n }\n\n return {\n final: {\n minimumAmount: finalMinimumPrice,\n maximumAmount: finalMaximumPrice,\n currency,\n },\n tiers: transformTiers(price?.tiers),\n visible,\n };\n}\n\nfunction getOptionUIDs(\n data: any,\n isBundle?: boolean,\n preselectFirstOption?: boolean,\n): string[] {\n if (isBundle) {\n const fromRequest = Array.isArray(data?.optionUIDs)\n ? (data.optionUIDs as string[]).filter(Boolean)\n : [];\n if (fromRequest.length > 0) {\n return fromRequest;\n }\n\n const uids: string[] = [];\n\n data?.options?.forEach(({ values, multi }: any) => {\n const enabledValues = values?.filter(\n ({ enabled }: any) => typeof enabled === 'undefined' || enabled,\n );\n const defaults = enabledValues?.filter(({ isDefault }: any) => isDefault);\n\n if (defaults?.length) {\n if (multi) {\n defaults.forEach((d: { id: string }) => uids.push(d.id));\n } else {\n uids.push(defaults[0].id);\n }\n return;\n }\n\n if (preselectFirstOption && enabledValues?.[0]?.id) {\n uids.push(enabledValues[0].id);\n }\n });\n\n return uids;\n }\n\n return data?.optionUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport type { Option } from '@/pdp/data/models';\n\n/** Single-select option group (one chosen item UID). */\nexport type ProductOptionSelectionSingle = { label: string; value: string };\n\n/** Multi-select option group (one or more chosen item UIDs). */\nexport type ProductOptionSelectionMulti = { label: string; values: string[] };\n\nexport type ProductOptionSelectionEntry =\n ProductOptionSelectionSingle | ProductOptionSelectionMulti;\n\nexport type ProductOptionSelectionMap = {\n [optionId: string]: ProductOptionSelectionEntry;\n};\n\n/**\n * Flatten selection map to UID list. When `optionsOrder` is provided (e.g. `data.options`),\n * UIDs are emitted in that order for stable URLs and API payloads.\n */\nexport function selectionMapToOptionUIDs(\n selections: ProductOptionSelectionMap,\n optionsOrder?: Option[],\n): string[] {\n if (!optionsOrder?.length) {\n return Object.values(selections).flatMap((entry) =>\n 'values' in entry ? entry.values : entry.value ? [entry.value] : [],\n );\n }\n\n const list: string[] = [];\n for (const def of optionsOrder) {\n const entry = selections[def.id];\n if (!entry) continue;\n if ('values' in entry) {\n const order = new Map(def.items.map((item, idx) => [item.id, idx]));\n const sorted = [...entry.values].sort(\n (a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0),\n );\n list.push(...sorted);\n } else if ('value' in entry && entry.value) {\n list.push(entry.value);\n }\n }\n return list;\n}\n\n/**\n * Whether the shopper has satisfied all option groups for add-to-cart.\n * Bundle multi-select may contribute more than one UID while still satisfying one group.\n */\nexport function isProductOptionsSelectionComplete(\n options: Option[] | undefined,\n optionUIDs: string[] | undefined,\n isBundle: boolean | undefined,\n): boolean {\n if (!options?.length) {\n return true;\n }\n\n const uids = optionUIDs ?? [];\n\n if (isBundle) {\n return options.every((option) => {\n if (!option.required) {\n return true;\n }\n const selectedCount = option.items.filter((item) =>\n uids.includes(item.id),\n ).length;\n return selectedCount >= 1;\n });\n }\n\n return uids.length === options.length;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { ProductModel, Option } from '@/pdp/data/models';\nimport {\n fetchProductData,\n getProductConfigurationValues,\n setProductConfigurationValid,\n setProductConfigurationValues,\n} from '@/pdp/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n getUrlParams,\n getValidatedQuantityFromUrl,\n} from '@/pdp/lib/url-params';\nimport { publishProductPageViewEvent } from '@/pdp/lib/acdl';\nimport { transformProductData } from '@/pdp/data/transforms/product-transform';\nimport { isProductOptionsSelectionComplete } from '@/pdp/lib/product-option-selection';\nimport {\n bundleOptionQuantitiesFromEnteredOptions,\n bundleOptionQuantitiesToEnteredOptions,\n mergeBundleOptionQuantities,\n} from '@/pdp/lib/bundle-option-quantities';\n\nexport type OptionsTransformer = (options: Option[]) => Option[];\n\ntype ModelConfig = {\n initialData?: any;\n /** @deprecated Use \"transformer\" instead */\n transform?: (data?: ProductModel) => ProductModel;\n transformer?: (data?: ProductModel) => ProductModel;\n fallbackData?: (\n parentProduct: any,\n simpleProduct: ProductModel,\n ) => ProductModel;\n};\n\ntype ProductOptionsConfig = {\n optionsTransformer?: OptionsTransformer;\n};\n\ntype ConfigProps = {\n scope?: string;\n langDefinitions?: Lang;\n defaultLocale?: string;\n globalLocale?: string;\n sku?: string;\n acdl?: boolean;\n anchors?: string[];\n persistURLParams?: boolean;\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n models?: {\n ProductDetails?: ModelConfig;\n ProductOptions?: ProductOptionsConfig;\n [name: string]: ModelConfig | ProductOptionsConfig | undefined;\n };\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (_config) => {\n const initialData = _config?.models?.ProductDetails?.initialData;\n\n // Get URL parameters safely\n const urlParams = getUrlParams() || {};\n\n // Get optionsUIDs from URL params or config\n const optionsUIDs =\n urlParams.optionsUIDs?.split(',') || initialData?.optionsUIDs;\n\n // Get and validate quantity from URL params\n const initialQuantity = getValidatedQuantityFromUrl(1); // Default quantity to 1 - Ensures backward compatibility\n\n // Set default config\n const defaultConfig: ConfigProps = {\n defaultLocale: 'en-US',\n globalLocale: 'en-US',\n persistURLParams: false,\n acdl: false,\n optionsUIDs,\n };\n\n const config = { ...defaultConfig, ..._config };\n\n initialize.config.setConfig({ ...config });\n\n if (config?.sku) {\n // Get PDP data\n const data = initialData\n ? transformProductData(initialData)\n : await fetchProductData(config.sku, {\n preselectFirstOption: config.preselectFirstOption,\n });\n\n // Emit PDP initial data\n events.emit('pdp/data', data, { scope: config.scope });\n\n const existingValues = getProductConfigurationValues({\n scope: config.scope,\n });\n const previousBundleQuantities =\n existingValues?.bundleOptionQuantities ??\n bundleOptionQuantitiesFromEnteredOptions(\n existingValues?.enteredOptions,\n );\n\n const bundleOptionQuantities = data?.isBundle\n ? mergeBundleOptionQuantities(\n previousBundleQuantities,\n data?.options,\n data?.optionUIDs,\n )\n : undefined;\n\n // Set default values for product configuration\n const defaultValues = {\n sku: config.sku,\n quantity: initialQuantity, // Use the determined quantity from URL params or default to 1\n optionsUIDs: data?.optionUIDs,\n ...(bundleOptionQuantities && {\n bundleOptionQuantities,\n enteredOptions: bundleOptionQuantitiesToEnteredOptions(\n bundleOptionQuantities,\n ),\n }),\n };\n\n setProductConfigurationValues(() => ({ ...defaultValues }), {\n scope: config.scope,\n });\n\n setProductConfigurationValid(\n () => {\n if (data?.options) {\n return isProductOptionsSelectionComplete(\n data.options,\n data.optionUIDs,\n data.isBundle,\n );\n }\n\n return true;\n },\n { scope: config.scope },\n );\n\n // Publish ACDL event\n if (config.acdl && data) {\n publishProductPageViewEvent(data);\n }\n }\n },\n\n listeners: () => [\n events.on('locale', async () => {\n const { sku, scope } = initialize.config.getConfig();\n\n if (sku) {\n const next = await fetchProductData(sku);\n events.emit('pdp/data', next, { scope });\n }\n }),\n ],\n});\n\nexport const config = initialize.config;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n getFetchGraphQlHeader,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2026 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport {\n CustomizableOptionsAttributeValue,\n RawCustomizableOptionsAttributeValue,\n} from '@/pdp/data/models';\n\n/**\n * Coerces the numeric-string `price` fields delivered by Catalog Service\n * (e.g. \"108.000000\") into numbers, leaving every other field untouched.\n */\nexport function parseCustomizableOptionsAttribute(\n raw: RawCustomizableOptionsAttributeValue,\n): CustomizableOptionsAttributeValue {\n return {\n schemaVersion: raw.schemaVersion,\n selectable: raw.selectable.map((option) => ({\n ...option,\n values: option.values.map((value) => ({\n ...value,\n price: Number(value.price),\n })),\n })),\n shopperInput: raw.shopperInput.map((option) => ({\n ...option,\n price: option.price === undefined ? undefined : Number(option.price),\n })),\n };\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCT_DATA = `\nquery GET_PRODUCT_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCT_DATA } from './graphql/getProductData.graphql';\n\nexport const getProductData = async (\n sku: string,\n options?: {\n preselectFirstOption?: boolean;\n optionsUIDs?: string[];\n },\n raw?: boolean,\n): Promise<ProductModel | null> => {\n const { data } = await fetchGraphQl(GET_PRODUCT_DATA, {\n method: 'GET',\n variables: { skus: [sku] },\n });\n\n const product = data?.products?.[0];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (options?.optionsUIDs) {\n product.optionUIDs = options.optionsUIDs;\n }\n\n if (!product) {\n return null;\n }\n return raw\n ? product\n : transformProductData(product, {\n preselectFirstOption: options?.preselectFirstOption,\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const GET_PRODUCTS_DATA = `\nquery GET_PRODUCTS_DATA($skus: [String]) {\n products(skus: $skus) {\n ...PRODUCT_FRAGMENT\n }\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { GET_PRODUCTS_DATA } from './graphql/getProductsData.graphql';\n\nexport interface ProductDataItem {\n sku: string;\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n}\n\n/**\n * Fetches multiple products by SKUs with optional per-product configuration.\n *\n * @example\n * // Basic usage\n * const products = await getProductsData([\n * { sku: 'SKU001' },\n * { sku: 'SKU002' }\n * ]);\n *\n * @example\n * // With options\n * const products = await getProductsData([\n * { sku: 'SKU001', optionsUIDs: ['option1'], preselectFirstOption: true },\n * { sku: 'SKU002', optionsUIDs: ['option2'] }\n * ]);\n *\n * @example\n * // Get raw data without transformation\n * const rawProducts = await getProductsData([{ sku: 'SKU001' }], true);\n */\nexport const getProductsData = async (\n items: ProductDataItem[],\n raw?: boolean,\n): Promise<ProductModel[] | null> => {\n if (!items || items.length === 0) {\n return null;\n }\n\n const skus = items.map((item) => item.sku);\n const { data } = await fetchGraphQl(GET_PRODUCTS_DATA, {\n method: 'GET',\n variables: { skus },\n });\n const products = data?.products;\n\n if (!products || products.length === 0) {\n return null;\n }\n\n // Create a map for quick lookup of options by SKU\n const optionsMap = items.reduce(\n (acc, item) => {\n acc[item.sku] = item;\n return acc;\n },\n {} as Record<string, ProductDataItem>,\n );\n\n return raw\n ? products\n : products.map((product: any) => {\n const itemOptions = optionsMap[product.sku];\n\n // If optionsUIDs are provided, override the optionsUIDs from the response\n if (itemOptions?.optionsUIDs) {\n product.optionUIDs = itemOptions.optionsUIDs;\n }\n\n return transformProductData(product, {\n preselectFirstOption: itemOptions?.preselectFirstOption,\n });\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { PRODUCT_FRAGMENT } from '@/pdp/api/graphql/ProductFragment.graphql';\n\nexport const REFINE_PRODUCT_QUERY = `\nquery REFINE_PRODUCT_QUERY(\n $optionIds: [String!]!\n $sku: String!\n) {\n # Refined Product\n refineProduct(\n optionIds: $optionIds \n sku: $sku\n ) {\n ...PRODUCT_FRAGMENT\n }\n\n # Parent Product\n products(skus: [$sku]) {\n ...PRODUCT_FRAGMENT\n }\n\n # %extendedPlaceholder%\n}\n\n${PRODUCT_FRAGMENT}\n`;\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2023 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { fetchGraphQl, config } from '@/pdp/api';\nimport { ProductModel } from '@/pdp/data/models';\nimport { transformProductData } from '@/pdp/data/transforms';\nimport { REFINE_PRODUCT_QUERY } from './graphql/RefineProductQuery.graphql';\n\n// Option UIDs are base64 of \"<optionType>/<id>/<value>\" (e.g. \"configurable/193/23\"\n// vs \"custom-option/2/5\") — Catalog Service encodes the option kind into the UID\n// itself since ProductViewOption doesn't otherwise expose it. Confirmed via ACCS-1601.\nexport function isCustomOptionUID(uid: string): boolean {\n try {\n return atob(uid).startsWith('custom-option/');\n } catch {\n return false;\n }\n}\n\nasync function getProductData(sku: string, optionUIDs: string[]): Promise<any> {\n // Custom-option UIDs aren't resolvable as variants; Catalog Service only matches on configurable UIDs\n const variantOptionUIDs = optionUIDs.filter((uid) => !isCustomOptionUID(uid));\n\n const optionPairCombinations = getPairCombination(variantOptionUIDs);\n const optionQueries = getProductOptionQuery(optionPairCombinations, sku);\n\n const mergedQueries = REFINE_PRODUCT_QUERY.replace(\n '# %extendedPlaceholder%',\n optionQueries,\n );\n\n const { data } = await fetchGraphQl(mergedQueries, {\n method: 'GET',\n variables: { optionIds: variantOptionUIDs, sku },\n });\n return data;\n}\n\nexport const getRefinedProduct = async (\n sku: string,\n optionUIDs: string[],\n anchorOptions?: string[],\n raw?: boolean,\n): Promise<ProductModel | null> => {\n const data = await getProductData(sku, optionUIDs);\n if (!data) return null;\n\n const {\n products,\n refineProduct: initialRefineProduct,\n ...refinedOptions\n } = data;\n let refineProduct = initialRefineProduct;\n\n const parent = products?.[0];\n\n const options = mergeRefinedOptions(\n Object.values(refinedOptions),\n parent.options,\n anchorOptions,\n );\n\n // needed when anchor options exist\n if (anchorOptions?.length && refineProduct === null) {\n optionUIDs = updateSelections(options, optionUIDs, anchorOptions);\n const updatedRefinedData = await getProductData(sku, optionUIDs);\n refineProduct = updatedRefinedData?.refineProduct;\n }\n\n const response = {\n ...(refineProduct || parent),\n sku: parent.sku,\n name: parent.name,\n externalParentId: parent?.externalId,\n options,\n optionUIDs,\n variantSku:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.sku\n : undefined,\n variantName:\n refineProduct?.__typename === 'SimpleProductView'\n ? refineProduct?.name\n : undefined,\n };\n\n const refinedData = raw ? response : transformProductData(response);\n\n const fallback = config?.getConfig()?.models?.ProductDetails?.fallbackData;\n\n if (fallback) {\n return fallback(parent, refinedData!);\n }\n\n return refinedData;\n};\n\nfunction getPairCombination(arr: string[]): string[][] {\n if (arr.length < 2) {\n return [arr];\n }\n\n const result: string[][] = [];\n\n arr.forEach((item) => {\n const temp: string[] = [];\n\n arr.forEach((item2) => {\n if (item !== item2) {\n temp.push(item2);\n }\n });\n\n result.push(temp);\n });\n\n return result;\n}\n\nfunction getProductOptionQuery(optionUIDs: string[][], sku: string): string {\n return optionUIDs\n .map((ids: string[], i: number) => {\n return `\n ProductOption${i}: refineProduct(\n optionIds: [\n ${ids.map((id) => `\"${id}\"`).join(', ')}\n ]\n sku: \"${sku}\"\n ) {\n ... on ComplexProductView {\n options {\n ...PRODUCT_OPTION_FRAGMENT\n }\n }\n }\n `;\n })\n .join('');\n}\n\nfunction mergeRefinedOptions(\n options: {},\n parent: [] = [],\n anchorOptions?: string[],\n) {\n // flat _refined[].options[] to _refinedOptions[]\n const refinedOptions: any = Object.values(options)\n .filter((x) => !!x)\n .reduce((acc: any, curr: any) => {\n if (!curr.options) return [...acc];\n\n return [...acc, ...curr.options];\n }, []);\n\n // Create a map to store items by their id from original\n const map = new Map(parent.map((item: any) => [item.id, item]));\n\n // Iterate through refinedOptions and merge items\n refinedOptions.forEach((current: any) => {\n // anchor options should display all values, so no merge is performed\n if (anchorOptions?.includes(current.id)) {\n return;\n }\n\n map.set(current.id, current);\n });\n\n return [...map.values()];\n}\n\nfunction updateSelections(\n options: any[],\n optionsUIDs: string[],\n anchorOptions: string[],\n): string[] {\n const updatedOptionsUIDs: string[] = [];\n\n let optionValue: string;\n options.forEach((option: any) => {\n if (anchorOptions.includes(option.id)) {\n optionValue =\n option.values?.find((value: any) => optionsUIDs.includes(value?.id))\n ?.id || option.values[0]?.id;\n } else {\n optionValue = option.values[0]?.id; // TODO check if we should use default value instead\n }\n updatedOptionsUIDs.push(optionValue);\n });\n return updatedOptionsUIDs;\n}\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { getProductData, getRefinedProduct, config } from '@/pdp/api';\n\nexport type Options = {\n anchors?: string[];\n optionsUIDs?: string[];\n preselectFirstOption?: boolean;\n isBundle?: boolean;\n skipTransform?: boolean;\n};\n\nexport const fetchProductData = async (sku: string, options?: Options) => {\n // Get the default configuration values\n const { anchors: defaultAnchors, optionsUIDs: defaultOptionsUIDs } =\n config.getConfig();\n\n // Destructure the options object\n const {\n optionsUIDs = defaultOptionsUIDs,\n anchors = defaultAnchors,\n preselectFirstOption,\n isBundle,\n skipTransform,\n } = options ?? {};\n\n // ❗️ Warning ❗️\n // If we have default selections, but we cannot determine that the product is of type bundle, then the response is going to result in null objects and error(s).\n // Only the `products` object will be populated correctly, the `ProductOption${i}` and `refinedProduct` will be set as null.\n // This does not affect the UI, but the error message(s) can be detected by 3rd party tools that the client might be using.\n // This is accepted as a known behaviour, since a bundle product does not have variants.\n // However, if initialData is passed from the integration layer, then we can determine if the product is a bundle and set the isBundle flag accordingly.\n return !isBundle && optionsUIDs && optionsUIDs.length > 0\n ? await getRefinedProduct(sku, optionsUIDs, anchors, skipTransform)\n : await getProductData(\n sku,\n {\n preselectFirstOption,\n optionsUIDs,\n },\n skipTransform,\n );\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\nimport { getProductConfigurationValues } from '@/pdp/api';\nimport { mergeBundleEnteredOptions } from '@/pdp/lib/bundle-option-quantities';\n\nexport const setProductConfigurationValues = (\n callback: (prev: ValuesModel) => ValuesModel,\n options?: { scope?: string },\n) => {\n // Null until the first `pdp/values` emit (e.g. containers rendered without initialize()).\n const prev =\n getProductConfigurationValues({ scope: options?.scope }) ??\n ({} as ValuesModel);\n\n const next = callback(prev);\n\n if (next.bundleOptionQuantities) {\n next.enteredOptions = mergeBundleEnteredOptions(\n next.enteredOptions,\n prev.bundleOptionQuantities,\n next.bundleOptionQuantities,\n );\n }\n\n events.emit('pdp/values', { ...next }, { scope: options?.scope });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ValuesModel } from '@/pdp/data/models';\n\nexport const getProductConfigurationValues = ({\n scope,\n}: { scope?: string } = {}): ValuesModel | null => {\n return events.lastPayload('pdp/values', { scope }) ?? null;\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { isProductConfigurationValid } from '@/pdp/api';\n\nexport const setProductConfigurationValid = (\n callback: (prev: boolean) => boolean,\n options?: { scope?: string },\n) => {\n const prev = isProductConfigurationValid({ scope: options?.scope });\n\n const next = callback(prev as boolean);\n\n events.emit('pdp/valid', next, { scope: options?.scope });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { ProductModel } from '@/pdp/data/models/product-model';\n\nexport const getFetchedProductData = async ({\n scope,\n}: { scope?: string } = {}): Promise<ProductModel | null> => {\n const payload = events.lastPayload('pdp/data', { scope });\n // if the event has already been emitted, return the last payload\n if (payload) {\n return Promise.resolve(payload);\n }\n\n // otherwise, wait for the next event\n return new Promise((resolve) => {\n const event = events.on(\n 'pdp/data',\n (data) => {\n resolve(data);\n event?.off();\n },\n { eager: true, scope },\n );\n });\n};\n","/**\n * ADOBE CONFIDENTIAL\n * __________________\n * Copyright 2024 Adobe\n * All Rights Reserved.\n * __________________\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n */\n\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const isProductConfigurationValid = ({\n scope,\n}: { scope?: string } = {}): boolean | null => {\n return events.lastPayload('pdp/valid', { scope }) ?? null;\n};\n"],"names":["setUrlParams","params","urlSearchParams","key","value","url","getUrlParams","getValidatedQuantityFromUrl","defaultQuantity","quantityParam","parsedQuantity","transformProduct","product","_b","_a","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","contexts","events","getAdobeDataLayer","getChannelContext","setContext","name","data","adobeDataLayer","setChannelContext","pushEvent","event","additionalContext","acdl","state","publishProductPageViewEvent","productItem","ProductType","ProductViewType","readCanEditQuantity","readDefaultOptionQuantity","raw","parsed","buildBundleOptionQuantitiesFromOptions","options","optionUIDs","quantities","option","item","mergeBundleOptionQuantities","previous","next","uid","defaultQty","bundleOptionQuantitiesToEnteredOptions","quantity","bundleOptionQuantitiesFromEnteredOptions","enteredOptions","mergeBundleEnteredOptions","bundleUIDs","entry","transformProductData","isBundle","getOptionUIDs","productType","productData","transformImages","transformVideos","transformPrices","transformAttributes","applyOptionsTransformer","transformOptions","merge","config","optionsTransformer","error","image","video","roles","label","parsedValue","transformedValue","transformSnakeToCamel","obj","transformed","camelKey","id","title","required","multi","values","typename","type","mapBundleOptionValues","mapOptionValues","enabled","inStock","isDefault","defaultOptionUIDs","price","priceRange","getSimpleProductPrices","regularPrice","finalPrice","currency","getComplexProductPrices","finalMinimumPrice","finalMaximumPrice","_o","_n","_m","_r","_q","_p","_u","_t","_s","getBundleProductPrice","maxSumRegular","bundlePrice","regularAmounts","amount","maxRegularAmount","_x","_w","_v","visible","transformTiers","tiers","tier","a","b","preselectFirstOption","fromRequest","uids","enabledValues","defaults","d","selectionMapToOptionUIDs","selections","optionsOrder","list","def","order","idx","sorted","isProductOptionsSelectionComplete","initialize","Initializer","_config","initialData","optionsUIDs","initialQuantity","fetchProductData","existingValues","getProductConfigurationValues","previousBundleQuantities","bundleOptionQuantities","defaultValues","setProductConfigurationValues","setProductConfigurationValid","sku","scope","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","getFetchGraphQlHeader","fetchGraphQl","getConfig","FetchGraphQL","parseCustomizableOptionsAttribute","GET_PRODUCT_DATA","PRODUCT_FRAGMENT","getProductData","GET_PRODUCTS_DATA","getProductsData","items","skus","products","optionsMap","acc","itemOptions","REFINE_PRODUCT_QUERY","isCustomOptionUID","variantOptionUIDs","optionPairCombinations","getPairCombination","optionQueries","getProductOptionQuery","mergedQueries","getRefinedProduct","anchorOptions","initialRefineProduct","refinedOptions","refineProduct","parent","mergeRefinedOptions","updateSelections","updatedRefinedData","response","refinedData","fallback","arr","result","temp","item2","ids","i","x","curr","map","current","updatedOptionsUIDs","optionValue","defaultAnchors","defaultOptionsUIDs","anchors","skipTransform","callback","prev","isProductConfigurationValid","getFetchedProductData","payload","resolve"],"mappings":"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"}