PageSourceSearch

https://www.bl101.com/cdn/shop/t/206/assets/cart-continuity.js?v=120135541984751238681787314556

js bl101.com collected 2026-10-03 21:21:51 UTC 12,473 bytes, 2 lines download raw bytes

1(function(){"use strict";const CONFIG={payloadParam:"cart_restore",restoredParam:"cart_restored",refValue:"iab-continue",maxPayloadAgeMs:6048e5,maxUrlLength:1800,rebuyReadyTimeoutMs:8e3,guardKey:"bl101:cart-continuity:restored",iabClass:"bl101-iab",cacheTtlMs:3e4,debugParam:"cc_debug",debugKey:"bl101:cart-continuity:debug",documentLoadTimeoutMs:4e3},debugEnabled=(function(){try{return new URLSearchParams(window.location.search).get(CONFIG.debugParam)?(window.sessionStorage.setItem(CONFIG.debugKey,"1"),!0):window.sessionStorage.getItem(CONFIG.debugKey)==="1"}catch{return!1}})();function debug(...args){debugEnabled&&console.log("[cart-continuity]",...args)}const IAB_PATTERNS=[/FBAN|FBAV|FB_IAB|FBIOS/i,/Instagram/i,/TikTok|BytedanceWebview|musical_ly/i,/Snapchat/i,/Pinterest/i,/\bTwitter/i,/LinkedInApp/i,/MicroMessenger/i,/Line\//i,/KAKAOTALK/i,/\bReddit/i,/GSA\//i,/SamsungBrowser\/[^\s]*CrossApp/i,/\bwv\b/i];function isIOS(){const ua=navigator.userAgent||"";return/iPad|iPhone|iPod/.test(ua)?!0:navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1}function isInAppBrowser(){const ua=navigator.userAgent||navigator.vendor||"";return IAB_PATTERNS.some(pattern=>pattern.test(ua))?!0:isIOS()&&!/Safari/.test(ua)&&!/CriOS|FxiOS|EdgiOS|OPiOS/.test(ua)?navigator.standalone!==!0:!1}function encodePayload(object){const bytes=new TextEncoder().encode(JSON.stringify(object));let binary="";return bytes.forEach(byte=>{binary+=String.fromCharCode(byte)}),btoa(binary).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function decodePayload(raw){try{const base64=raw.replace(/-/g,"+").replace(/_/g,"/"),binary=atob(base64+"=".repeat((4-base64.length%4)%4)),bytes=Uint8Array.from(binary,char=>char.charCodeAt(0)),payload=JSON.parse(new TextDecoder().decode(bytes));return!payload||payload.v!==1||!Array.isArray(payload.i)||payload.t&&Date.now()-payload.t>CONFIG.maxPayloadAgeMs?null:payload}catch{return null}}function fingerprint(string){let hash=0;for(let i=0;i<string.length;i+=1)hash=hash*31+string.charCodeAt(i)|0;return String(hash)}function fetchCart(){return fetch("/cart.js",{headers:{Accept:"application/json"},cache:"no-store"}).then(response=>response.ok?response.json():null).catch(()=>null)}function sellingPlanId(item){const id=item?.selling_plan_allocation?.selling_plan?.id;return id?String(id):""}function discountCodes(cart){return Array.isArray(cart.discount_codes)&&cart.discount_codes.length>0?cart.discount_codes.filter(entry=>entry.applicable!==!1&&entry.code).map(entry=>entry.code):(cart.cart_level_discount_applications||[]).filter(application=>application.type==="discount_code"&&application.title).map(application=>application.title)}const APP_OWNED_ATTRIBUTES=[/^_attribution$/,/^_source$/,/^_barId$/,/^redo_/i];function portableAttributes(attributes){const portable={};return Object.entries(attributes||{}).forEach(([key,value])=>{value&&(APP_OWNED_ATTRIBUTES.some(pattern=>pattern.test(key))||(portable[key]=value))}),portable}function buildPayloadUrl(cart){const payload={v:1,t:Date.now(),i:cart.items.map(item=>{const line={id:String(item.variant_id),q:item.quantity};item.properties&&Object.keys(item.properties).length>0&&(line.p=item.properties);const plan=sellingPlanId(item);return plan&&(line.s=plan),line})},codes=discountCodes(cart);codes.length>0&&(payload.d=codes),cart.note&&(payload.n=cart.note);const attributes=portableAttributes(cart.attributes);Object.keys(attributes).length>0&&(payload.a=attributes);const params=new URLSearchParams;return params.set(CONFIG.payloadParam,encodePayload(payload)),params.set("ref",CONFIG.refValue),window.location.origin+"/?"+params.toString()}function buildPermalinkUrl(cart){const items=cart.items.map(item=>item.variant_id+":"+item.quantity).join(","),params=new URLSearchParams;params.set("storefront","true"),params.set("ref",CONFIG.refValue);const codes=discountCodes(cart);return codes.length>0&&params.set("discount",codes.join(",")),cart.note&&params.set("note",cart.note),Object.entries(portableAttributes(cart.attributes)).forEach(([key,value])=>{params.set("attributes["+key+"]",value)}),window.location.origin+"/cart/"+items+"?"+params.toString()}async function buildContinueUrl(){const cart=await fetchCart();if(!cart||!Array.isArray(cart.items)||cart.items.length===0)return null;const url=buildPayloadUrl(cart);return url.length>CONFIG.maxUrlLength?buildPermalinkUrl(cart):url}let cachedUrl=null,cachedAt=0;function refreshCachedUrl(){return buildContinueUrl().then(url=>(cachedUrl=url,cachedAt=Date.now(),url))}function cachedUrlIfFresh(){return cachedUrl&&Date.now()-cachedAt<CONFIG.cacheTtlMs?cachedUrl:null}function escapeUrlFor(url){const ua=navigator.userAgent||"",bare=url.replace(/^https?:\/\//,"").split("#")[0];return/Android/i.test(ua)?"intent://"+bare+"#Intent;scheme=https;action=android.intent.action.VIEW;end":isIOS()?"x-safari-https://"+bare:null}function copyToClipboard(text){return navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(text).catch(()=>copyViaTextarea(text)):Promise.resolve(copyViaTextarea(text))}function copyViaTextarea(text){try{const textarea=document.createElement("textarea");textarea.value=text,textarea.setAttribute("readonly",""),textarea.style.cssText="position:fixed;top:0;left:-9999px;opacity:0;",document.body.appendChild(textarea),textarea.select();const copied=document.execCommand("copy");return textarea.remove(),copied}catch{return!1}}function rootFor(element){return element?.closest?.("[data-cart-continuity-root]")||null}function setState(root,state){root&&root.setAttribute("data-state",state)}function showFallback(root,url){if(!root)return;setState(root,"fallback");const field=root.querySelector("[data-cart-continuity-url]");field&&(field.value=url,field.setAttribute("value",url))}function continueInBrowser(trigger){const root=rootFor(trigger),ready=cachedUrlIfFresh();return ready?(handoff(ready,root),Promise.resolve(ready)):(setState(root,"working"),refreshCachedUrl().then(url=>url?(handoff(url,root),url):(setState(root,"empty"),null)))}function handoff(url,root){copyToClipboard(url),setState(root,"working");const escapeUrl=escapeUrlFor(url);if(!escapeUrl){if(window.open(url,"_blank","noopener"))return;showFallback(root,url);return}try{window.location.href=escapeUrl}catch{showFallback(root,url);return}window.setTimeout(()=>{document.visibilityState==="visible"&&showFallback(root,url)},1400)}function waitForSmartCart(){const smartCart=window.Rebuy?.SmartCart;return smartCart&&smartCart.status==="ready"?Promise.resolve(smartCart):new Promise(resolve=>{const startedAt=Date.now(),timer=window.setInterval(()=>{const candidate=window.Rebuy?.SmartCart;candidate&&candidate.status==="ready"?(window.clearInterval(timer),resolve(candidate)):Date.now()-startedAt>CONFIG.rebuyReadyTimeoutMs&&(window.clearInterval(timer),resolve(null))},200)})}function whenDocumentLoaded(){return document.readyState==="complete"?Promise.resolve():new Promise(resolve=>{window.addEventListener("load",resolve,{once:!0}),window.setTimeout(resolve,CONFIG.documentLoadTimeoutMs)})}function afterNextPaint(){return new Promise(resolve=>{window.requestAnimationFrame(()=>window.requestAnimationFrame(resolve))})}async function openCart(){const smartCart=await waitForSmartCart();if(smartCart){const cart=await fetchCart();if(cart&&typeof smartCart.setCart=="function")try{smartCart.setCart(cart)}catch{}if(document.dispatchEvent(new CustomEvent("rebuy:cart.change",{detail:{cart}})),typeof smartCart.show=="function"){await whenDocumentLoaded(),await afterNextPaint(),debug("openCart: showing Smart Cart"),smartCart.show();return}}debug("openCart: Smart Cart unavailable, falling back to /cart"),window.location.assign("/cart")}function propertiesKey(properties){return properties?Object.keys(properties).sort().map(key=>key+"="+properties[key]).join("&"):""}function linesMatch(item,line){return String(item.variant_id)===String(line.id)&&propertiesKey(item.properties)===propertiesKey(line.p)&&sellingPlanId(item)===(line.s||"")}function postJson(path,body){return fetch(path,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(body)})}async function addItems(items){if(items.length===0)return;const batch=await postJson("/cart/add.js",{items}).catch(()=>null);if(!(batch&&batch.ok)){debug("add: batch rejected",batch?batch.status:"network error");for(const item of items){const response=await postJson("/cart/add.js",{items:[item]}).catch(()=>null);(!response||!response.ok)&&debug("add: line rejected",item.id,response?response.status:"network error")}}}async function applyDiscounts(codes){for(const code of[...codes].reverse())await fetch("/discount/"+encodeURIComponent(code),{credentials:"same-origin"}).catch(()=>null)}function missingAdditions(cart,payload){const additions=[];
1return payload.i.forEach(line=>{const target=Math.max(1,Number(line.q)||1),existing=(cart.items||[]).filter(item=>linesMatch(item,line)).reduce((total,item)=>total+item.quantity,0),missing=target-existing;if(missing<=0)return;const addition={id:Number(line.id),quantity:missing};line.p&&(addition.properties=line.p),line.s&&(addition.selling_plan=Number(line.s)),additions.push(addition)}),additions}function cartSatisfies(cart,payload){return payload.i.some(line=>(cart.items||[]).some(item=>linesMatch(item,line)))}async function restore(payload){let cart=await fetchCart()||{items:[]},additions=missingAdditions(cart,payload);debug("restore: payload has",payload.i.length,"line(s),",additions.length,"missing"),additions.length>0&&(await addItems(additions),cart=await fetchCart()||{items:[]},additions=missingAdditions(cart,payload),additions.length>0&&(debug("restore: retrying",additions.length,"line(s) still missing"),await addItems(additions),cart=await fetchCart()||{items:[]}));const update={};payload.n&&!cart.note&&(update.note=payload.n),payload.a&&Object.keys(payload.a).length>0&&(update.attributes=payload.a),Object.keys(update).length>0&&await postJson("/cart/update.js",update).catch(()=>null),Array.isArray(payload.d)&&payload.d.length>0&&await applyDiscounts(payload.d);const restored=cartSatisfies(cart,payload);return debug("restore: finished with",(cart.items||[]).length,"item(s); restored =",restored),restored&&await openCart(),restored}function stripParams(keys){try{const url=new URL(window.location.href);let changed=!1;keys.forEach(key=>{url.searchParams.has(key)&&(url.searchParams.delete(key),changed=!0)}),changed&&window.history.replaceState({},"",url.pathname+(url.search||"")+url.hash)}catch{}}async function handleLanding(){const params=new URLSearchParams(window.location.search),raw=params.get(CONFIG.payloadParam);if(!raw){params.get(CONFIG.restoredParam)&&(stripParams([CONFIG.restoredParam]),openCart());return}const payload=decodePayload(raw);if(!payload){debug("landing: payload malformed or expired"),stripParams([CONFIG.payloadParam]);return}const guard=fingerprint(raw);let alreadyRestored=!1;try{alreadyRestored=window.localStorage.getItem(CONFIG.guardKey)===guard}catch{}if(alreadyRestored){const cart=await fetchCart()||{items:[]};if(cartSatisfies(cart,payload)){debug("landing: already restored and cart matches \u2014 just opening it"),stripParams([CONFIG.payloadParam]),openCart();return}debug("landing: guard is set but the cart is missing the items \u2014 restoring again")}const restored=await restore(payload);if(stripParams([CONFIG.payloadParam]),restored)try{window.localStorage.setItem(CONFIG.guardKey,guard)}catch{}}function markEnvironment(){isInAppBrowser()&&document.documentElement.classList.add(CONFIG.iabClass)}function watchCart(){if(!isInAppBrowser())return;let timer=null;const schedule=()=>{window.clearTimeout(timer),timer=window.setTimeout(()=>{refreshCachedUrl()},250)};["rebuy:smartcart.ready","rebuy:smartcart.show","rebuy:cart.change"].forEach(name=>{document.addEventListener(name,schedule)})}window.BL101CartContinuity={isInAppBrowser,buildContinueUrl,continueInBrowser,openCart,copyToClipboard,copyLink(trigger){const root=rootFor(trigger),url=cachedUrlIfFresh();return url?(copyToClipboard(url),setState(root,"copied"),Promise.resolve(url)):refreshCachedUrl().then(fresh=>fresh?(copyToClipboard(fresh),showFallback(root,fresh),setState(root,"copied"),fresh):null)}},markEnvironment(),watchCart(),handleLanding().catch(error=>debug("landing: failed",error))})();
2//# sourceMappingURL=/cdn/shop/t/206/assets/cart-continuity.js.map?v=120135541984751238681787314556

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.