1(function(){const STORAGE_KEY="arg.searchIndex.v1";let indexCache=null,indexPromise=null;const debug=window.__searchDebug={events:[],state:()=>({indexCache:!!indexCache,indexCacheSize:indexCache?.length,indexPromise:!!indexPromise})},log=(msg,data)=>{debug.events.push({t:Date.now(),msg,data})};function loadFromStorage(){try{const raw=sessionStorage.getItem(STORAGE_KEY);return raw?JSON.parse(raw):null}catch{return null}}async function fetchIndexPage(page){log("fetch start",page);const res=await fetch("/collections/all?view=ingredient-index&page="+page);if(log("fetch resp",{page,status:res.status}),!res.ok)throw new Error("search-index fetch failed: "+res.status);const text=await res.text();log("fetch body",{page,bytes:text.length});const parsed=JSON.parse(text);return log("fetch parsed",{page,items:parsed.items.length,pages:parsed.pages}),parsed}async function buildIndex(){log("build start");const all=[];let page=1;for(;;){const data=await fetchIndexPage(page);if(all.push.apply(all,data.items),page>=data.pages)break;page+=1}log("build collected",all.length);try{sessionStorage.setItem(STORAGE_KEY,JSON.stringify(all)),log("build stored")}catch(e){log("build storage err",e.message)}return all}function getIndex(){return indexCache?Promise.resolve(indexCache):indexPromise||(indexCache=loadFromStorage(),indexCache?(log("storage hit",indexCache.length),Promise.resolve(indexCache)):(log("getIndex starting build"),indexPromise=buildIndex().then(idx=>(indexCache=idx,indexPromise=null,log("build done",idx.length),idx)).catch(e=>{throw log("build rejected",e.message),indexPromise=null,e}),indexPromise))}function stripWildcard(q){return(q||"").replace(/\*+\s*$/,"")}function searchIndex(index,query){const q=stripWildcard(query).trim().toLowerCase();return q.length<3?[]:index.filter(item=>item.text.indexOf(q)!==-1)}function collectExistingHandles(root){const handles=new Set;return root.querySelectorAll('a[href*="/products/"]').forEach(a=>{const m=(a.getAttribute("href")||"").match(/\/products\/([^/?#]+)/);m&&handles.add(m[1])}),handles}function setupDrawer(){const drawer=document.querySelector("search-drawer");if(!drawer)return;const input=drawer.querySelector('input[type="search"]');if(!input)return;const warmIndex=()=>{getIndex().catch(()=>{})};input.addEventListener("focus",warmIndex),input.addEventListener("input",warmIndex);const predictive=drawer.querySelector("predictive-search");if(!predictive)return;let scheduled=!1;new MutationObserver(()=>{scheduled||(scheduled=!0,queueMicrotask(()=>{scheduled=!1,injectDrawerMatches(drawer).catch(e=>log("inject err",e.message))}))}).observe(predictive,{childList:!0,subtree:!0}),log("observer attached")}async function injectDrawerMatches(drawer){const input=drawer.querySelector('input[type="search"]');if(!input)return;const query=stripWildcard(input.value).trim().toLowerCase();if(log("inject called",{query}),query.length<3)return;const resultsContainer=drawer.querySelector('div[slot="results"]');if(!resultsContainer)return;if(resultsContainer.dataset.searchInjected===query){log("inject already done");return}const index=await getIndex(),matches=searchIndex(index,query);if(resultsContainer.dataset.searchInjected=query,log("inject matches",{count:matches.length,isConnected:resultsContainer.isConnected}),matches.length===0)return;const fresh=matches.filter(m=>!collectExistingHandles(resultsContainer).has(m.handle));if(log("inject fresh",{count:fresh.length}),fresh.length===0)return;const html=fresh.slice(0,10).map(m=>m.drawer_html).join(""),tabs=resultsContainer.querySelector("x-tabs.predictive-search__tabs"),productPanel=tabs&&Array.from(tabs.querySelectorAll(':scope > [slot="content"]')).find(p=>p.querySelector('a[href*="/products/"]'));if(log("inject path",{hasTabs:!!tabs,hasProductPanel:!!productPanel}),productPanel)productPanel.insertAdjacentHTML("beforeend",html),log("inject appended to product panel",{isConnected:productPanel.isConnected});else if(tabs){const title=document.createElement("div");title.className="predictive-search__tab-item",title.setAttribute("slot","title"),title.innerHTML='<button type="button" class="h5">Products</button>';const content=document.createElement("div");content.className="predictive-search__tab-content v-stack gap-4 sm:gap-6",content.setAttribute("slot","content"),content.innerHTML=html,tabs.insertBefore(title,tabs.firstChild),tabs.insertBefore(content,title.nextSibling)}else{const emptyState=resultsContainer.querySelector(".empty-state");emptyState&&emptyState.remove();const wrapper=document.createElement("div");wrapper.className="predictive-search__tab-content v-stack gap-4 sm:gap-6",wrapper.innerHTML=html,resultsContainer.appendChild(wrapper)}}async function setupFullPage(){if(location.pathname!=="/search")return;const params=new URLSearchParams(location.search);if(parseInt(params.get("page")||"1",10)!==1)return;const query=stripWildcard(params.get("q")).trim().toLowerCase();if(query.length<3)return;const productList=document.querySelector(".product-list");if(!productList)return;const index=await getIndex(),matches=searchIndex(index,query);if(matches.length===0)return;const fresh=matches.filter(m=>!collectExistingHandles(productList).has(m.handle));fresh.length!==0&&productList.insertAdjacentHTML("beforeend",fresh.map(m=>m.card_html).join(""))}function boot(){setupDrawer(),setupFullPage().catch(()=>{})}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",boot):boot()})(); 2//# sourceMappingURL=/cdn/shop/t/53/assets/ingredient-search.js.map?v=107411123600868107621790029381
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.