https://betseyjohnson.com/cdn/shop/t/1305/assets/find-in-store-v2.js?v=53630095638056950101785743223
1(function(){"use strict";const STORAGE_KEY="fis_selected_store";let INVENTORY_THRESHOLDS={IN_STOCK:4,LOW_STOCK:3,OUT_OF_STOCK:0},INVENTORY_MESSAGES={IN_STOCK:"In Stock",LOW_STOCK:"Limited Stock",OUT_OF_STOCK:"Out of Stock"};const DEFAULT_STORES_TO_SHOW=3;function calculateDistance(lat1,lon1,lat2,lon2){const dLat=(lat2-lat1)*Math.PI/180,dLon=(lon2-lon1)*Math.PI/180,a=Math.sin(dLat/2)*Math.sin(dLat/2)+Math.cos(lat1*Math.PI/180)*Math.cos(lat2*Math.PI/180)*Math.sin(dLon/2)*Math.sin(dLon/2);return(3959*(2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a)))).toFixed(1)}function getUserLocation(){return new Promise((resolve,reject)=>{if(!navigator.geolocation){reject(new Error("Geolocation not supported"));return}navigator.geolocation.getCurrentPosition(position=>resolve({lat:position.coords.latitude,lng:position.coords.longitude}),error=>reject(error),{timeout:1e4,enableHighAccuracy:!1})})}function setStorageWithExpiry(key,value,expiryDays){const item={value,expiry:new Date().getTime()+expiryDays*24*60*60*1e3};try{localStorage.setItem(key,JSON.stringify(item))}catch(e){console.warn("[Find in Store] localStorage not available",e)}}function getStorageWithExpiry(key){try{const itemStr=localStorage.getItem(key);if(!itemStr)return null;const item=JSON.parse(itemStr);return new Date().getTime()>item.expiry?(localStorage.removeItem(key),null):item.value}catch(e){return console.warn("[Find in Store] Error reading from localStorage",e),null}}function getInventoryStatus(quantity){return quantity>=INVENTORY_THRESHOLDS.IN_STOCK?{status:"in-stock",label:INVENTORY_MESSAGES.IN_STOCK}:quantity>=INVENTORY_THRESHOLDS.LOW_STOCK?{status:"low-stock",label:INVENTORY_MESSAGES.LOW_STOCK}:{status:"out-of-stock",label:INVENTORY_MESSAGES.OUT_OF_STOCK}}function getVariantTitleFromEmbeddedData(variantId){const dataEl=document.querySelector("[data-fis-all-inventory]");if(!dataEl)return null;try{return JSON.parse(dataEl.textContent||"{}")?.[variantId]||null}catch(error){return console.warn("[Find in Store] Could not read variant data from embedded inventory data:",error),null}}function formatVariantLabel(title){const normalizedTitle=String(title||"").trim();return normalizedTitle?/^\d+(\.\d+)?$/.test(normalizedTitle)?`Size ${normalizedTitle}`:/size|sz|us\s*\d/i.test(normalizedTitle)?normalizedTitle:`Variant ${normalizedTitle}`:""}function updateVariantLabel(modal,variantId){const labelEl=modal?.querySelector("[data-fis-variant-label]");if(!labelEl)return;const variant=getVariantTitleFromEmbeddedData(variantId);if(!variant){labelEl.textContent="",labelEl.classList.add("fis-hidden");return}const labelText=`${variant.product_title} - ${variant.title}`;labelEl.textContent=labelText,labelEl.classList.toggle("fis-hidden",!labelText)}function resolveLocationQuantity(availabilityData,locationId,inventoryData){if(!availabilityData)return null;const apiQuantity=Number(availabilityData.quantityAvailable);if(Number.isFinite(apiQuantity))return apiQuantity;if(inventoryData&&!inventoryData._fallback&&!inventoryData._empty&&!inventoryData._error){const embeddedQuantity=Number(inventoryData[locationId]);if(Number.isFinite(embeddedQuantity))return embeddedQuantity}return null}function getEmbeddedLocationQuantity(locationData){if(!locationData||typeof locationData!="object")return null;const quantity=Number(locationData.quantity??locationData.inventory_quantity??locationData.available_quantity);return Number.isFinite(quantity)?quantity:null}function loadSettingsFromSection(section){if(!section)return;const inStockThreshold=section.dataset.fisInStockThreshold,lowStockThreshold=section.dataset.fisLowStockThreshold,inStockMessage=section.dataset.fisInStockMessage,limitedStockMessage=section.dataset.fisLimitedStockMessage,outOfStockMessage=section.dataset.fisOutOfStockMessage;inStockThreshold&&(INVENTORY_THRESHOLDS.IN_STOCK=parseInt(inStockThreshold,10)),lowStockThreshold&&(INVENTORY_THRESHOLDS.LOW_STOCK=parseInt(lowStockThreshold,10)),inStockMessage&&(INVENTORY_MESSAGES.IN_STOCK=inStockMessage),limitedStockMessage&&(INVENTORY_MESSAGES.LOW_STOCK=limitedStockMessage),outOfStockMessage&&(INVENTORY_MESSAGES.OUT_OF_STOCK=outOfStockMessage),console.log("[Find in Store] Loaded settings - Thresholds:",INVENTORY_THRESHOLDS,"Messages:",INVENTORY_MESSAGES)}async function storefrontQuery(query,variables={}){const apiUrl=`${window.Shopify.routes.root}
1api/2024-01/graphql.json`;if(console.log("[Find in Store] \u{1F50D} Checking Storefront API configuration..."),console.log("[Find in Store] API URL:",apiUrl),console.log("[Find in Store] Token configured:",!!window.Shopify?.storefrontAccessToken),!window.Shopify?.storefrontAccessToken)throw console.warn("[Find in Store] \u274C No Storefront API token found"),console.warn("[Find in Store] \u2192 window.Shopify.storefrontAccessToken is:",window.Shopify?.storefrontAccessToken),console.warn("[Find in Store] \u2192 To fix: Ensure Storefront API token is set in theme"),new Error("No storefront token");console.log("[Find in Store] \u2705 Token found, making API request...");try{const response=await fetch(apiUrl,{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":window.Shopify.storefrontAccessToken},body:JSON.stringify({query,variables})});if(console.log("[Find in Store] API Response status:",response.status),!response.ok)throw console.error("[Find in Store] \u274C API request failed with status:",response.status),new Error(`API request failed: ${response.status}`);const data=await response.json();if(data.errors)throw console.error("[Find in Store] \u274C GraphQL errors:",data.errors),new Error(data.errors[0]?.message||"GraphQL error");return console.log("[Find in Store] \u2705 API request successful"),data.data}catch(error){throw console.error("[Find in Store] \u274C API query failed:",error),error}}window.testStoreAvailabilityAPI=async function(variantId){if(console.log("=".repeat(60)),console.log("\u{1F50D} STORE AVAILABILITY API DIAGNOSTIC TEST"),console.log("=".repeat(60)),console.log(` 2\u{1F4CB} Step 1: Checking Shopify configuration...`),console.log(" window.Shopify exists:",!!window.Shopify),console.log(" window.Shopify.routes:",window.Shopify?.routes),console.log(" storefrontAccessToken:",window.Shopify?.storefrontAccessToken?"\u2705 SET":"\u274C NOT SET"),!window.Shopify?.storefrontAccessToken)return console.error(` 3\u274C PROBLEM: Storefront API token is not configured!`),console.log(` 4\u{1F527} TO FIX: Add this to your theme (theme.liquid or a snippet):`),console.log(` 5 <script> 6 window.Shopify = window.Shopify || {}; 7 window.Shopify.storefrontAccessToken = 'YOUR_STOREFRONT_API_TOKEN'; 8 <\/script> 9 `),console.log(` 10You can get the token from:`),console.log(" Shopify Admin \u2192 Settings \u2192 Apps and sales channels \u2192 Develop apps"),console.log(" \u2192 Create or select an app \u2192 API credentials \u2192 Storefront API access token"),{success:!1,error:"No token"};console.log(` 11\u{1F4CB} Step 2: Testing basic API access...`);const apiUrl=`${window.Shopify.routes.root}api/2024-01/graphql.json`;console.log(" API URL:",apiUrl);try{const response=await fetch(apiUrl,{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":window.Shopify.storefrontAccessToken},body:JSON.stringify({query:"{ shop { name } }"})});if(console.log(" Response status:",response.status),!response.ok){console.error(" \u274C API returned error status:",response.status);const text=await response.text();return console.error(" Response body:",text),{success:!1,error:`HTTP ${response.status}`}}const data=await response.json();console.log(" \u2705 Basic API access works!"),console.log(" Shop name:",data.data?.shop?.name)}catch(error){return console.error(" \u274C API request failed:",error),{success:!1,error:error.message}}if(console.log(` 12\u{1F4CB} Step 3: Testing StoreAvailability query...`),variantId||(variantId=document.querySelector('[name="id"], .product-variant-id, [data-product-variant-id]')?.value,console.log(" Auto-detected variant ID:",variantId)),!variantId)return console.warn(" \u26A0\uFE0F No variant ID found. Please provide one:"),console.log(' window.testStoreAvailabilityAPI("YOUR_VARIANT_ID")'),{success:!1,error:"No variant ID"};const gid=variantId.toString().startsWith("gid://")?variantId:`gid://shopify/ProductVariant/${variantId}`;console.log(" Variant GID:",gid);try{const data=await(await fetch(apiUrl,{method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":window.Shopify.storefrontAccessToken},body:JSON.stringify({query:` 13 query GetVariantStoreAvailability($id: ID!) { 14 node(id: $id) { 15 ... on ProductVariant { 16 id 17 title 18 availableForSale 19 quantityAvailable 20 storeAvailability(first: 100) { 21 edges { 22 node { 23 available 24 pickUpTime 25 quantityAvailable 26 location { 27 id 28 name 29 } 30 } 31 } 32 } 33 } 34 } 35 } 36 `,variables:{id:gid}})})).json();if(data.errors)return console.error(" \u274C GraphQL errors:",data.errors),{success:!1,error:data.errors[0]?.message};const storeAvail=data.data?.node?.storeAvailability?.edges||[],variantQuantity=data.data?.node?.quantityAvailable;console.log(" \u2705 StoreAvailability query successful!"),console.log(" Variant title:",data.data?.node?.title),console.log(" Available for sale:",data.data?.node?.availableForSale),console.log(" Variant total quantityAvailable:",variantQuantity!==void 0?variantQuantity:"\u274C NOT AVAILABLE IN API"),console.log(" Store locations with availability:",storeAvail.length);const hasPerLocationQty=storeAvail.some(edge=>edge.node.quantityAvailable!==void 0);return console.log(" Per-location quantityAvailable:",hasPerLocationQty?"\u2705 AVAILABLE":"\u274C NOT AVAILABLE IN API"),storeAvail.length>0?(console.log(` 37\u{1F4CD} Available Locations:`),storeAvail.forEach((edge,i)=>{const loc=edge.node;console.log(` ${i+1}. ${loc.location.name}`),console.log(` ID: ${loc.location.id}`),console.log(` Available: ${loc.available?"\u2705 Yes":"\u274C No"}`),console.log(` Pickup Time: ${loc.pickUpTime||"N/A"}`),loc.quantityAvailable!==void 0&&console.log(` Quantity Available: ${loc.quantityAvailable}`)})):(console.log(` 38\u26A0\uFE0F No store locations returned.`),console.log(" This could mean:"),console.log(" - No inventory at any location for this variant"),console.log(" - StoreAvailability is not configured for this store")),console.log(` 39`+"=".repeat(60)),console.log("\u2705 DIAGNOSTIC TEST COMPLETE"),console.log("=".repeat(60)),{success:!0,data:data.data,locationsCount:storeAvail.length,hasPerLocationQuantity:hasPerLocationQty,variantQuantity}}catch(error){return console.error(" \u274C StoreAvailability query failed:",error),{success:!1,error:error.message}}},console.log("[Find in Store] \u{1F4A1} Diagnostic tool available: Run window.testStoreAvailabilityAPI() in console");async function fetchStoreAvailabilityForVariant(variantId){console.log("[Find in Store] Fetching StoreAvailability for variant:",variantId),console.log("[Find in Store] \u{1F4A1} Run window.testStoreAvailabilityAPI() for detailed diagnostics");try{const query=` 40 query GetVariantStoreAvailability($id: ID!) { 41 node(id: $id) { 42 ... on ProductVariant { 43 id 44 title 45 availableForSale 46 quantityAvailable 47 storeAvailability(first: 100) { 48 edges { 49 node { 50 available 51 pickUpTime 52 quantityAvailable 53 location { 54 id 55 name 56 address { 57 address1 58 address2 59 city 60 province 61 country 62 zip 63 } 64 } 65 } 66 } 67 } 68 } 69 } 70 } 71 `,gid=variantId.toString().startsWith("gid://")?variantId:`gid://shopify/ProductVariant/${variantId}`,data=await storefrontQuery(query,{id:gid});if(!data.node||!data.node.storeAvailability)return console.warn("[Find in Store] No store availability data returned for variant:",variantId),{enabled:!1,locations:[]};const storeAvailability=data.node.storeAvailability.edges.map(edge=>edge.node);console.log("[Find in Store] \u2705 StoreAvailability API is ENABLED - returned",storeAvailability.length,"locations"),console.log("[Find in Store] \u2192 This means pickup functionality is automatically available");const locationsData=storeAvailability.map(node=>{const locationIdMatch=node.location.id.match(/Location\/(\d+)/),locationId=locationIdMatch?locationIdMatch[1]:null;return node.quantityAvailable!==void 0&&console.log(`[FIS] API returned quantityAvailable for ${node.location.name}: ${node.quantityAvailable}`),{locationId,locationGid:node.location.id,locationName:node.location.name,available:node.available,pickUpTime:node.pickUpTime,address:node.location.address,quantityAvailable:node.quantityAvailable}}),variantQuantity=data.node.quantityAvailable;return variantQuantity!==void 0&&console.log("[Find in Store] Variant total quantityAvailable:",variantQuantity),{enabled:storeAvailability.length>0,locations:locationsData,variantQuantityAvailable:variantQuantity,_apiSource:"storeAvailability"}}catch(error){return console.error("[Find in Store] \u274C StoreAvailability API failed:",error.message),console.log("[Find in Store] \u2192 API not accessible, will use fallback method"),console.log("[Find in Store] \u{1F4A1} Run window.testStoreAvailabilityAPI() in console for detailed diagnostics"),error.message==="No storefront token"&&(console.warn("[Find in Store] \u26A0\uFE0F MISSING: window.Shopify.storefrontAccessToken"),console.warn("[Find in Store] \u2192 Add the token to your theme (see diagnostic tool for instructions)")),{enabled:!1,locations:[],_error:error.message}}}async function fetchStores(){const embeddedStores=getEmbeddedStoresData();if(embeddedStores&&embeddedStores.length>0)return console.log("[Find in Store] Using embedded stores data:",embeddedStores.length),embeddedStores;console.log("[Find in Store] Using default store fallback");const defaultStore=createDefaultStore();if(defaultStore)return[defaultStore];try{return await fetchStoresViaGraphQL()}catch(error){return console.log("[Find in Store] GraphQL failed, using empty stores:",error.message),[]}}function createDefaultStore(){const inventoryEl=document.querySelector("[data-fis-variants-inventory]");if(!inventoryEl)return null;try{const inventoryData=JSON.parse(inventoryEl.textContent||"{}
71"),firstVariantId=Object.keys(inventoryData)[0];if(!firstVariantId)return null;const storeAvailabilities=inventoryData[firstVariantId]?.store_availabilities||{},locationIds=Object.keys(storeAvailabilities);if(locationIds.length===0)return null;const locationId=locationIds[0],locationData=storeAvailabilities[locationId];return console.log("[Find in Store] Creating default store from location:",locationId,locationData?.location_name),{id:`default-${locationId}`,handle:"default-store",name:locationData?.location_name||"Store Pickup Available",description:"",address:"",city:"",region:"",country:"CA",postal_code:"",latitude:null,longitude:null,phone:"",email:"",store_type:"retail",hours_json:"{}",timezone:"",enable_find_in_store:!0,location_id:locationId,image:null}}catch(error){return console.error("[Find in Store] Error creating default store:",error),null}}function getEmbeddedStoresData(){const dataEl=document.querySelector("[data-stores-json]");if(!dataEl)return console.log("[Find in Store] No embedded stores data found"),null;try{const storesData=JSON.parse(dataEl.textContent||"[]");console.log("[Find in Store] Found",storesData.length,"stores in embedded data");const filteredStores=storesData.filter(store=>{const hasLocationId=store.location_id&&String(store.location_id).trim()!=="";return hasLocationId||console.log("[Find in Store] Skipping store without location_id:",store.name),hasLocationId});return console.log("[Find in Store] Filtered to",filteredStores.length,"stores with location_id"),filteredStores.length===0&&storesData.length>0&&console.warn("[Find in Store] All stores filtered out - missing location_id field"),filteredStores}catch(error){return console.error("[Find in Store] Error parsing embedded stores data:",error),null}}async function fetchStoresViaGraphQL(){const data=await storefrontQuery(` 72 query GetStoreMetaobjects($type: String!, $first: Int!) { 73 metaobjects(type: $type, first: $first) { 74 edges { 75 node { 76 id 77 handle 78 fields { 79 key 80 value 81 type 82 reference { 83 ... on MediaImage { 84 image { 85 url 86 altText 87 } 88 } 89 } 90 } 91 } 92 } 93 } 94 } 95 `,{type:"stores",first:100});return!data.metaobjects||!data.metaobjects.edges?(console.warn("[Find in Store] No metaobjects returned"),[]):parseStoresFromData(data.metaobjects.edges)}function parseStoresFromData(edges){try{const stores=edges.map(edge=>{const fields={};edge.node.fields.forEach(field=>{field.type==="file_reference"&&field.reference?.image?fields[field.key]=field.reference.image.url:fields[field.key]=field.value});const locationId=fields.location_id||fields.shopify_location_id||fields["location-id"]||fields["Location ID"]||"";return{id:edge.node.id,handle:edge.node.handle,name:fields.name||"",description:fields.description||"",address:fields.address||"",city:fields.city||"",region:fields.region||"",country:fields.country||"",postal_code:fields.postal_code||"",latitude:parseFloat(fields.latitude)||null,longitude:parseFloat(fields.longitude)||null,phone:fields.phone||"",email:fields.email||"",store_type:fields.store_type||"",hours_json:fields.hours_json||"{}",timezone:fields.timezone||"",location_id:locationId,image:fields.image||null,google_my_business_map_link:fields.google_my_business_map_link||"",_rawFields:fields}});console.log("[Find in Store] Total stores fetched:",stores.length),console.log("[Find in Store] Stores with location_id:",stores.filter(s=>s.location_id).length),stores.length>0&&(console.log("[Find in Store] First store sample:",stores[0]),console.log("[Find in Store] Available field keys:",Object.keys(stores[0]._rawFields)));const filteredStores=stores.filter(store=>store.location_id);return console.log("[Find in Store] Stores after filtering (location_id only):",filteredStores.length),filteredStores.length===0&&stores.length>0&&(console.warn("[Find in Store] All stores filtered out. Check:"),console.warn(" - location_id field values:",stores.map(s=>({name:s.name,location:s._rawFields.location_id||"MISSING"})))),filteredStores}catch(error){return console.error("[Find in Store] Failed to parse stores:",error),[]}}async function fetchInventoryForVariant(variantId){try{const url=`${window.Shopify.routes.root}variants/${variantId}/?section_id=find-in-store-availability`,response=await fetch(url);if(!response.ok)throw new Error(`Failed to fetch variant data: ${response.status}`);const html=await response.text(),dataEl=new DOMParser().parseFromString(html,"text/html").querySelector("[data-fis-inventory-data]");return dataEl?JSON.parse(dataEl.textContent||"{}"):{}}catch(error){return console.error("[Find in Store] Failed to fetch inventory:",error),{}}}async function fetchInventoryViaEndpoint(productHandle,variantId){try{const url=`/apps/store-inventory?product=${productHandle}&variant=${variantId}`,response=await fetch(url);if(!response.ok)throw new Error(`Endpoint failed: ${response.status}`);return await response.json()}catch(error){return console.error("[Find in Store] Endpoint error:",error),{}}}function filterStoresWithInventory(stores,inventoryData){if(inventoryData._fallback&&inventoryData._available)return console.log("[Find in Store] Fallback mode: No specific location data available"),console.log("[Find in Store] Cannot determine which stores have inventory"),[];if(inventoryData._empty||inventoryData._error)return console.log("[Find in Store] No inventory data, returning empty list"),[];console.log("[Find in Store] Filtering stores by inventory map:",inventoryData),console.log("[Find in Store] Available location IDs:",Object.keys(inventoryData));const storesWithInventory=stores.map(store=>{const locationId=String(store.location_id||"").trim(),quantity=inventoryData[locationId]||0,inventoryStatus=getInventoryStatus(quantity);return console.log(`[FIS] Store: ${store.name}, Location ID: "${locationId}", Quantity: ${quantity}`),quantity>INVENTORY_THRESHOLDS.OUT_OF_STOCK?{...store,quantity,available:!0,status:inventoryStatus.status,statusLabel:inventoryStatus.label}:null}
95).filter(Boolean);return console.log("[Find in Store] Filtered to",storesWithInventory.length,"stores with inventory"),storesWithInventory}function filterStoresWithStoreAvailability(stores,storeAvailabilityData,inventoryData={}){if(!storeAvailabilityData.enabled)return console.log("[Find in Store] StoreAvailability API not accessible"),storeAvailabilityData._error&&console.log("[Find in Store] API Error:",storeAvailabilityData._error),[];const locations=storeAvailabilityData.locations||[];console.log("[Find in Store] \u2705 StoreAvailability API is ENABLED"),console.log("[Find in Store] \u2192 Pickup functionality is automatically available"),console.log("[Find in Store] \u2192 API returned",locations.length,"locations with this variant");const apiHasQuantity=locations.some(loc=>loc.quantityAvailable!==void 0&&loc.quantityAvailable!==null);console.log("[Find in Store] API has per-location quantityAvailable:",apiHasQuantity);const locationMap={};locations.forEach(loc=>{loc.locationId&&(locationMap[loc.locationId]=loc)}),console.log("[Find in Store] Location IDs from API:",Object.keys(locationMap)),console.log("[Find in Store] Inventory data for quantity lookup:",inventoryData);const hasValidInventoryData=inventoryData&&!inventoryData._fallback&&!inventoryData._empty&&!inventoryData._error&&Object.keys(inventoryData).some(key=>!key.startsWith("_"));console.log("[Find in Store] Has valid inventory data:",hasValidInventoryData);const storesWithAvailability=stores.map(store=>{const locationId=String(store.location_id||"").trim(),availabilityData=locationMap[locationId];if(console.log(`[FIS] Checking store: ${store.name}, Location ID: "${locationId}", API has data: ${!!availabilityData}`),!availabilityData)return console.log(`[FIS] \u274C Store ${store.name} - not in API response`),null;if(!availabilityData.available)return console.log(`[FIS] \u274C Store ${store.name} - location exists but variant not available`),null;const embeddedQty=hasValidInventoryData?Number(inventoryData[locationId]):null;if(Number.isFinite(embeddedQty)&&embeddedQty===0)return console.log(`[FIS] \u274C Store ${store.name} - embedded inventory explicitly shows 0 units; excluding`),null;const quantity=resolveLocationQuantity(availabilityData,locationId,inventoryData);if(quantity===null){if(availabilityData.available){console.log(`[FIS] \u2705 Store ${store.name} - API confirms available but no explicit quantity; defaulting to In Stock`);const inventoryStatus2=getInventoryStatus(INVENTORY_THRESHOLDS.IN_STOCK);return{...store,available:!0,quantity:INVENTORY_THRESHOLDS.IN_STOCK,pickUpTime:availabilityData.pickUpTime,status:inventoryStatus2.status,statusLabel:inventoryStatus2.label,_apiLocationData:availabilityData}}return console.log(`[FIS] \u23ED\uFE0F Store ${store.name} - no explicit quantity available; skipping to avoid false positives`),null}if(quantity<=INVENTORY_THRESHOLDS.OUT_OF_STOCK)return console.log(`[FIS] \u274C Store ${store.name} - quantity is ${quantity}; excluding from results`),null;const inventoryStatus=getInventoryStatus(quantity);return console.log(`[FIS] \u2705 Store ${store.name} - variant available for pickup, quantity: ${quantity}, status: ${inventoryStatus.label}`),{...store,available:!0,quantity,pickUpTime:availabilityData.pickUpTime,status:inventoryStatus.status,statusLabel:inventoryStatus.label,_apiLocationData:availabilityData}}).filter(Boolean);return console.log("[Find in Store] Filtered to",storesWithAvailability.length,"stores with pickup availability"),storesWithAvailability}function sortStoresByDistance(stores,userLocation){return userLocation?stores.map(store=>({...store,distance:store.latitude&&store.longitude?calculateDistance(userLocation.lat,userLocation.lng,store.latitude,store.longitude):null})).sort((a,b)=>a.distance===null&&b.distance===null?0:a.distance===null?1:b.distance===null?-1:parseFloat(a.distance)-parseFloat(b.distance)):stores}function filterStoresBySearch(stores,searchQuery){if(!searchQuery)return stores;const query=searchQuery.toLowerCase().trim();return stores.filter(store=>store.name.toLowerCase().includes(query)||store.city.toLowerCase().includes(query)||store.postal_code.toLowerCase().includes(query)||store.address.toLowerCase().includes(query))}function filterStoresByState(stores,stateCode){return stateCode?stores.filter(store=>store.region.toUpperCase()===stateCode.toUpperCase()):stores}
95function renderStoreList(modal,stores,selectedStoreId,productId,productHandle){const storeList=modal.querySelector("[data-fis-store-list]"),template=modal.querySelector("[data-fis-store-template]"),countEl=modal.querySelector("[data-fis-count-text]"),emptyEl=modal.querySelector("[data-fis-empty]"),loadingEl=modal.querySelector("[data-fis-loading]");if(!(!storeList||!template)){if(storeList.innerHTML="",loadingEl?.classList.add("fis-hidden"),stores.length===0){emptyEl?.classList.remove("fis-hidden"),countEl.textContent="";return}else emptyEl?.classList.add("fis-hidden");countEl.textContent=`(${stores.length})`,stores.forEach(store=>{const clone=template.content.cloneNode(!0),item=clone.querySelector(".fis-store-item");if(!item)return;item.dataset.storeId=store.id,selectedStoreId&&store.id===selectedStoreId&&(item.classList.add("selected"),item.querySelector("[data-fis-select]").textContent="Selected");const nameEl=clone.querySelector(".fis-store-name"),cityEl=clone.querySelector(".fis-store-city"),statusEl=clone.querySelector(".fis-store-status"),addressEl=clone.querySelector(".fis-store-address"),postalcodeEl=clone.querySelector(".fis-store-postalcode"),distanceEl=clone.querySelector(".fis-store-distance"),phoneEl=clone.querySelector(".fis-store-phone"),hoursEl=clone.querySelector(".fis-store-hours");if(nameEl&&(nameEl.textContent=store.name),cityEl&&(cityEl.textContent=`${store.city}${store.region?", "+store.region:""}`),statusEl&&(statusEl.textContent=store.statusLabel||"Available",statusEl.className=`fis-store-status ${store.status||"in-stock"}`),addressEl&&(addressEl.textContent=store.address),postalcodeEl&&(postalcodeEl.textContent=store.postal_code),distanceEl&&store.distance?distanceEl.textContent=`${store.distance} miles away`:distanceEl&&(distanceEl.style.display="none"),phoneEl&&store.phone?phoneEl.innerHTML=`<span class="phone-label">Phone Number:</span> <a href="tel:${store.phone}">${store.phone}</a>`:phoneEl&&(phoneEl.style.display="none"),hoursEl)try{const hours=typeof store.hours_json=="string"?JSON.parse(store.hours_json||"{}"):store.hours_json||{},daysMap={sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},today=new Date().toLocaleDateString("en-US",{weekday:"short"}).toLowerCase().slice(0,3);if(Object.keys(hours).length>0){const todayHours=hours[today];if(todayHours&&todayHours.length>0){const timeRanges=todayHours.map(h=>`${h.open} - ${h.close}`).join(", ");hoursEl.innerHTML=`<div class="hours-today"><span>Today's Opening Hours:</span> <span>${timeRanges}</span></div>`}else{const dayOrder=["mon","tue","wed","thu","fri","sat","sun"];let scheduleHTML='<div class="hours-week">';dayOrder.forEach(day=>{if(hours[day]&&hours[day].length>0){const timeRanges=hours[day].map(h=>`${h.open} - ${h.close}`).join(", ");scheduleHTML+=`<div class="${day===today?"hours-row today":"hours-row"}"><span class="hours-day">${daysMap[day]}:</span> <span class="hours-time">${timeRanges}</span></div>`}}),scheduleHTML+="</div>",hoursEl.innerHTML=scheduleHTML}}else hoursEl.innerHTML='<span class="hours-unavailable">Hours not available</span>'}catch(e){console.error("[FIS] Hours parsing error:",e),hoursEl.innerHTML='<span class="hours-unavailable">Hours not available</span>'}const directionsLink=clone.querySelector("[data-fis-select]"),directionsUrl=store.google_my_business_map_link||(store.latitude&&store.longitude?`https://www.google.com/maps/search/?api=1&query=${store.latitude},${store.longitude}`:null);directionsLink&&(directionsLink.dataset.storeId=store.id||store.location_id,directionsLink.dataset.storeName=store.name,directionsUrl&&(directionsLink.href=directionsUrl,directionsLink.target="_blank",directionsLink.rel="noopener noreferrer")),storeList.appendChild(clone)})}}document.addEventListener("click",function(e){const btn=e.target.closest("[data-fis-select]");btn&&(window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:"fis_get_directions",storeId:btn.dataset.storeId,storeName:btn.dataset.storeName,productId:btn.dataset.productId,productHandle:btn.dataset.productHandle}),console.log("[FIS] Get Directions",{storeId:btn.dataset.storeId,storeName:btn.dataset.storeName,productId:btn.dataset.productId,productHandle:btn.dataset.productHandle}))});function updatePDPSection(section,store){const content=section.querySelector("[data-fis-content]"),unavailable=section.querySelector("[data-fis-unavailable]"),loading=section.querySelector("[data-fis-loading]"),storeName=section.querySelector("[data-fis-store-name]"),storeAddress=section.querySelector("[data-fis-store-address]"),badge=section.querySelector("[data-fis-badge]"),stockStatus=section.querySelector("[data-fis-stock-status]");if(content)if(loading?.classList.add("fis-hidden"),store){if(section.classList.remove("fis-hidden"),content.classList.remove("fis-hidden"),unavailable?.classList.add("fis-hidden"),storeName&&(storeName.textContent=store.name),stockStatus&&(stockStatus.textContent=store.statusLabel||"In Stock"),storeAddress){const addressText=[store.city,store.region].filter(
95Boolean).join(", ");storeAddress.textContent=addressText}badge&&(badge.textContent=store.statusLabel?`(${store.statusLabel})`:"")}else console.log("[Find in Store] No stores available for this variant - hiding section"),section.classList.add("fis-hidden"),content.classList.add("fis-hidden"),unavailable?.classList.add("fis-hidden")}function populateStateFilter(modal,stores){const stateFilter=modal.querySelector("[data-fis-state-filter]");if(!stateFilter)return;const states=[...new Set(stores.map(s=>s.region))].filter(Boolean).sort();for(;stateFilter.options.length>1;)stateFilter.remove(1);states.forEach(state=>{const option=document.createElement("option");option.value=state,option.textContent=state,stateFilter.appendChild(option)})}async function fetchInventoryDataForVariant(variantId,productHandle){const embeddedData=getEmbeddedInventoryData(variantId);if(embeddedData&&!embeddedData._fallback&&!embeddedData._empty&&!embeddedData._error)return console.log("[Find in Store] Using embedded inventory data for variant:",variantId),embeddedData;embeddedData&&(embeddedData._fallback||embeddedData._empty)&&console.log("[Find in Store] Embedded data has no locations, trying full page fetch for:",variantId);try{const url=`${window.Shopify.routes.root}products/${productHandle}?variant=${variantId}`;console.log("[Find in Store] Fetching full product page for variant inventory:",url);const response=await fetch(url,{headers:{Accept:"text/html"}});if(!response.ok)return console.warn("[Find in Store] Product page fetch failed:",response.status),embeddedData?(console.log("[Find in Store] Falling back to embedded data"),embeddedData):{_error:!0};const html=await response.text(),dataEl=new DOMParser().parseFromString(html,"text/html").querySelector("[data-fis-all-inventory]");if(dataEl)try{const variantData=JSON.parse(dataEl.textContent||"{}")[variantId];if(variantData){console.log("[Find in Store] \u2705 Got inventory from full page for variant:",variantId,variantData.title||"");const locationsData=variantData.locations,inventoryMap={};if(locationsData&&typeof locationsData=="object")for(const[locationId,locationData]of Object.entries(locationsData)){const normalizedId=String(locationId).trim();normalizedId&&(inventoryMap[normalizedId]=getEmbeddedLocationQuantity(locationData),inventoryMap[normalizedId]===null&&(inventoryMap[normalizedId]=(locationData.available,0)),console.log(`[FIS] Location "${normalizedId}": qty=${inventoryMap[normalizedId]}`))}if(console.log("[Find in Store] Inventory map from page:",inventoryMap,"(",Object.keys(inventoryMap).length,"locations)"),Object.keys(inventoryMap).length>0)return updateEmbeddedInventoryData(variantId,inventoryMap,variantData),inventoryMap;if(variantData.available)return console.log("[Find in Store] \u26A0\uFE0F Variant available but no pickup locations in fetched page"),{_fallback:!0,_available:!0,_quantity:variantData.inventory_quantity||0}}else console.warn("[Find in Store] Variant not found in fetched page data")}catch(parseError){console.error("[Find in Store] Error parsing fetched page data:",parseError)}else console.warn("[Find in Store] No embedded inventory data in fetched page");return embeddedData?(console.log("[Find in Store] Falling back to embedded data"),embeddedData):{_empty:!0,_reason:"no_data_in_fetched_page"}}catch(error){return console.error("[Find in Store] Failed to fetch inventory data:",error),embeddedData?(console.log("[Find in Store] Falling back to embedded data"),embeddedData):{_error:!0}}}function getEmbeddedInventoryData(variantId){let dataEl=document.querySelector("[data-fis-all-inventory]"),isNewFormat=!0;if(dataEl||(dataEl=document.querySelector("[data-fis-variants-inventory]"),isNewFormat=!1),!dataEl)return console.log("[Find in Store] No embedded inventory data found"),null;try{const allVariantsData=JSON.parse(dataEl.textContent||"{}"),variantData=allVariantsData[variantId];if(!variantData)return console.warn("[Find in Store] Variant",variantId,"not found in embedded data"),console.log("[Find in Store] Available variant IDs:",Object.keys(allVariantsData)),null;console.log("[Find in Store] \u2705 Found embedded data for variant:",variantId,variantData.title||"");const locationsData=isNewFormat?variantData.locations:variantData.store_availabilities,inventoryMap={};if(locationsData&&typeof locationsData=="object")for(const[locationId,locationData]of Object.entries(locationsData)){const normalizedId=String(locationId).trim();if(!normalizedId)continue;
95const qty=getEmbeddedLocationQuantity(locationData);qty!==null?(inventoryMap[normalizedId]=qty,console.log(`[FIS] Location "${normalizedId}": explicit qty=${qty}`)):locationData.available===!1?(inventoryMap[normalizedId]=0,console.log(`[FIS] Location "${normalizedId}": not available, mapped qty=0`)):console.log(`[FIS] Location "${normalizedId}": no explicit qty (available=${locationData.available}), skipping map`)}return console.log("[Find in Store] Inventory map:",inventoryMap,"(",Object.keys(inventoryMap).length,"locations)"),Object.keys(inventoryMap).length===0&&variantData.available?(console.log("[Find in Store] \u26A0\uFE0F No store availabilities, but variant is available - using fallback"),{_fallback:!0,_available:!0,_quantity:variantData.inventory_quantity||0}):Object.keys(inventoryMap).length===0?(console.log("[Find in Store] No store availabilities and variant not available"),{_empty:!0}):inventoryMap}catch(error){return console.error("[Find in Store] Error parsing embedded inventory data:",error),null}}function updateEmbeddedInventoryData(variantId,inventoryMap,variantData){const dataEl=document.querySelector("[data-fis-all-inventory]");if(dataEl)try{const allVariantsData=JSON.parse(dataEl.textContent||"{}");if(allVariantsData[variantId]){allVariantsData[variantId].locations={};for(const[locationId,qty]of Object.entries(inventoryMap))allVariantsData[variantId].locations[locationId]={available:qty>0,quantity:qty};dataEl.textContent=JSON.stringify(allVariantsData),console.log("[Find in Store] \u2705 Cached inventory data for variant:",variantId)}}catch(error){console.warn("[Find in Store] Could not cache inventory data:",error)}}class FindInStoreController{constructor(){if(this.modal=document.querySelector("[data-fis-modal]"),this.section=document.querySelector("[data-fis-section]"),!this.modal||!this.section){console.log("[Find in Store] Required elements not found");return}loadSettingsFromSection(this.section),this.allStores=[],this.filteredStores=[],this.inventoryData={},this.userLocation=null,this.selectedStore=null,this.currentVariantId=null,this.init()}
95async init(){if(this.productHandle=this.modal.querySelector("[data-fis-product-handle]")?.value||this.section.querySelector("[data-fis-product-handle]")?.value,this.currentVariantId=this.modal.querySelector("[data-fis-variant-id]")?.value||this.section.querySelector("[data-fis-current-variant]")?.value,updateVariantLabel(this.modal,this.currentVariantId),!this.productHandle||!this.currentVariantId){console.warn("[Find in Store] Missing product handle or variant ID"),console.warn("Product handle:",this.productHandle,"Variant ID:",this.currentVariantId);return}console.log("[Find in Store] Initialized with product:",this.productHandle,"variant:",this.currentVariantId),this.setupEventListeners(),await this.loadData(this.currentVariantId);const savedStoreId=getStorageWithExpiry(STORAGE_KEY);if(savedStoreId){const savedStore=this.filteredStores.find(s=>s.id===savedStoreId);savedStore?this.selectStore(savedStore):this.showDefaultStores()}else this.showDefaultStores()}async loadData(variantId){try{this.section.querySelector("[data-fis-loading]")?.classList.remove("fis-hidden"),this.section.querySelector("[data-fis-content]")?.classList.add("fis-hidden"),this.section.querySelector("[data-fis-unavailable]")?.classList.add("fis-hidden");const stores=await fetchStores();this.allStores=stores,console.log("[Find in Store] Loaded",stores.length,"stores");const inventoryData=await fetchInventoryDataForVariant(variantId,this.productHandle);this.inventoryData=inventoryData,console.log("[Find in Store] Checking if StoreAvailability API is enabled...");const storeAvailabilityData=await fetchStoreAvailabilityForVariant(variantId);storeAvailabilityData.enabled?(console.log("[Find in Store] \u2705 StoreAvailability API ENABLED - using API method"),console.log('[Find in Store] \u2192 No dependency on Shopify Admin "Pickup in Store" settings'),this.filteredStores=filterStoresWithStoreAvailability(stores,storeAvailabilityData,inventoryData),this.usingStoreAvailabilityAPI=!0):(console.log("[Find in Store] \u26A0\uFE0F StoreAvailability API not accessible - using fallback inventory method"),this.filteredStores=filterStoresWithInventory(stores,inventoryData),this.usingStoreAvailabilityAPI=!1),console.log("[Find in Store] Final filtered stores:",this.filteredStores.length),populateStateFilter(this.modal,this.filteredStores)}catch(error){console.error("[Find in Store] Failed to load data:",error),this.section.querySelector("[data-fis-loading]")?.classList.add("fis-hidden"),this.section.querySelector("[data-fis-content]")?.classList.add("fis-hidden"),this.section.querySelector("[data-fis-unavailable]")?.classList.remove("fis-hidden")}}setupEventListeners(){this.section.querySelector("[data-fis-open-modal]")?.addEventListener("click",()=>this.openModal());const closeButton=this.modal.querySelector("[data-fis-close]"),backdrop=this.modal.querySelector("[data-fis-backdrop]");closeButton?.addEventListener("click",()=>this.closeModal()),backdrop?.addEventListener("click",()=>this.closeModal()),this.modal.querySelector("[data-fis-search]")?.addEventListener("input",e=>this.handleSearch(e.target.value)),this.modal.querySelector("[data-fis-state-filter]")?.addEventListener("change",e=>this.handleStateFilter(e.target.value)),this.modal.querySelector("[data-fis-geo]")?.addEventListener("click",()=>this.handleGeoLocation()),this.modal.querySelector("[data-fis-store-list]")?.addEventListener("click",e=>{const selectButton=e.target.closest("[data-fis-select]");if(selectButton){const storeId=selectButton.closest(".fis-store-item")?.dataset.storeId;if(storeId){const store=this.filteredStores.find(s=>s.id===storeId);store&&(this.selectStore(store),this.closeModal())}}}),document.addEventListener("variant:change",e=>{e.detail?.variant?.id&&(console.log("[Find in Store] variant:change event detected:",e.detail.variant.id),this.handleVariantChange(e.detail.variant.id))}),document.addEventListener("swym:variant-change",e=>{e.detail&&(console.log("[Find in Store] swym:variant-change event detected:",e.detail),this.handleVariantChange(e.detail))}),document.addEventListener("size-variant-changed",()=>{const variantIdEl=document.querySelector("[data-product-variant-id]")||document.querySelector(".product-variant-id")||document.querySelector('[name="id"]');if(variantIdEl){const newVariantId=variantIdEl.value||variantIdEl.dataset.productVariantId;newVariantId&&newVariantId!==this.currentVariantId&&(console.log("[Find in Store] size-variant-changed event detected:",newVariantId),this.handleVariantChange(newVariantId))}});const variantInputSelectors=[".product-variant-id",'[name="id"]',"[data-product-variant-id]",'input[type="hidden"][name="id"]'];for(const selector of variantInputSelectors){const variantInput=document.querySelector(selector);if(variantInput){console.log("[Find in Store] Watching variant input:",selector),new MutationObserver(()=>{const newVariantId=variantInput.value||variantInput.dataset.productVariantId;newVariantId&&newVariantId!==this.currentVariantId&&(console.log("[Find in Store] Variant input changed:",newVariantId),this.handleVariantChange(newVariantId))}).observe(variantInput,{attributes:!0,attributeFilter:["value","data-product-variant-id"]});break}}}async handleVariantChange(newVariantId){this.currentVariantId=newVariantId;const variantInput=this.modal.querySelector("[data-fis-variant-id]");variantInput&&(variantInput.value=newVariantId),this.section.querySelector("[data-fis-loading]")?.classList.remove("fis-hidden"),this.section.querySelector("[data-fis-content]")?.classList.add("fis-hidden"),this.section.querySelector("[data-fis-unavailable]")?.classList.add("fis-hidden"),updateV
95ariantLabel(this.modal,newVariantId),this.inventoryData=await fetchInventoryDataForVariant(newVariantId,this.productHandle);const storeAvailabilityData=await fetchStoreAvailabilityForVariant(newVariantId);if(storeAvailabilityData.enabled?(console.log("[Find in Store] \u2705 StoreAvailability API enabled for variant change"),this.filteredStores=filterStoresWithStoreAvailability(this.allStores,storeAvailabilityData,this.inventoryData),this.usingStoreAvailabilityAPI=!0):(console.log("[Find in Store] \u26A0\uFE0F Using fallback inventory method for variant change"),this.filteredStores=filterStoresWithInventory(this.allStores,this.inventoryData),this.usingStoreAvailabilityAPI=!1),this.selectedStore){const stillAvailable=this.filteredStores.find(s=>s.id===this.selectedStore.id);stillAvailable?this.selectStore(stillAvailable):(this.selectedStore=null,this.showDefaultStores())}else this.showDefaultStores()}showDefaultStores(){const defaultStores=this.filteredStores.slice(0,DEFAULT_STORES_TO_SHOW);defaultStores.length>0?(updatePDPSection(this.section,defaultStores[0]),this.selectedStore=defaultStores[0]):(this.section.querySelector("[data-fis-loading]")?.classList.add("fis-hidden"),this.section.querySelector("[data-fis-content]")?.classList.add("fis-hidden"),this.section.querySelector("[data-fis-unavailable]")?.classList.remove("fis-hidden"),this.selectedStore=null)}selectStore(store){this.selectedStore=store,updatePDPSection(this.section,store),setStorageWithExpiry(STORAGE_KEY,store.id,30),this.modal.querySelectorAll(".fis-store-item").forEach(item=>{const button=item.querySelector("[data-fis-select]");item.dataset.storeId===store.id?(item.classList.add("selected"),button&&(button.textContent="Selected")):(item.classList.remove("selected"),button&&(button.textContent="Select this store"))})}openModal(){const drawer=this.modal.querySelector("[data-fis-drawer]"),backdrop=this.modal.querySelector("[data-fis-backdrop]");drawer?.classList.remove("fis-hidden"),backdrop?.classList.remove("fis-hidden"),setTimeout(()=>{drawer?.classList.add("fis-active"),backdrop?.classList.add("fis-active")},10);let storesToShow=this.filteredStores;const stateFilter=this.modal.querySelector("[data-fis-state-filter]");stateFilter?.value&&(storesToShow=filterStoresByState(storesToShow,stateFilter.value));const searchInput=this.modal.querySelector("[data-fis-search]");searchInput?.value&&(storesToShow=filterStoresBySearch(storesToShow,searchInput.value)),this.userLocation&&(storesToShow=sortStoresByDistance(storesToShow,this.userLocation)),renderStoreList(this.modal,this.filteredStores,this.selectedStore?.id,this.productId,this.productHandle),document.body.style.overflow="hidden"}closeModal(){const drawer=this.modal.querySelector("[data-fis-drawer]"),backdrop=this.modal.querySelector("[data-fis-backdrop]");drawer?.classList.remove("fis-active"),backdrop?.classList.remove("fis-active"),setTimeout(()=>{drawer?.classList.add("fis-hidden"),backdrop?.classList.add("fis-hidden")},300),document.body.style.overflow=""}handleSearch(query){let stores=filterStoresBySearch(this.filteredStores,query
95);const stateFilter=this.modal.querySelector("[data-fis-state-filter]");stateFilter?.value&&(stores=filterStoresByState(stores,stateFilter.value)),this.userLocation&&(stores=sortStoresByDistance(stores,this.userLocation)),renderStoreList(this.modal,stores,this.selectedStore?.id,this.productId,this.productHandle)}handleStateFilter(stateCode){let stores=filterStoresByState(this.filteredStores,stateCode);const searchInput=this.modal.querySelector("[data-fis-search]");searchInput?.value&&(stores=filterStoresBySearch(stores,searchInput.value)),this.userLocation&&(stores=sortStoresByDistance(stores,this.userLocation)),renderStoreList(this.modal,stores,this.selectedStore?.id,this.productId,this.productHandle)}async handleGeoLocation(){const geoButton=this.modal.querySelector("[data-fis-geo]");if(geoButton){geoButton.disabled=!0,geoButton.innerHTML="<span>Getting location...</span>";try{this.userLocation=await getUserLocation();let stores=sortStoresByDistance(this.filteredStores,this.userLocation);const searchInput=this.modal.querySelector("[data-fis-search]");searchInput?.value&&(stores=filterStoresBySearch(stores,searchInput.value));const stateFilter=this.modal.querySelector("[data-fis-state-filter]");stateFilter?.value&&(stores=filterStoresByState(stores,stateFilter.value)),renderStoreList(this.modal,stores,this.selectedStore?.id),geoButton.disabled=!1,geoButton.innerHTML=` 96 <svg width="16" height="16" viewBox="0 0 16 16" fill="none"> 97 <path d="M8 0C5.24 0 3 2.24 3 5c0 3.38 5 11 5 11s5-7.62 5-11c0-2.76-2.24-5-5-5zm0 7a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" fill="currentColor"/> 98 </svg> 99 <span>Sorted by distance</span> 100 `}catch(error){console.error("[Find in Store] Geolocation error:",error),alert("Unable to access your location. Please enable location services and try again."),geoButton.disabled=!1,geoButton.innerHTML=` 101 <svg width="16" height="16" viewBox="0 0 16 16" fill="none"> 102 <path d="M8 0C5.24 0 3 2.24 3 5c0 3.38 5 11 5 11s5-7.62 5-11c0-2.76-2.24-5-5-5zm0 7a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" fill="currentColor"/> 103 </svg> 104 <span>Near me</span> 105 `}}}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{new FindInStoreController}):new FindInStoreController})(); 106//# sourceMappingURL=/cdn/shop/t/1305/assets/find-in-store-v2.js.map?v=53630095638056950101785743223
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.