← back to Shopify Sample Shipping

quote-edge.mjs

25 lines

import {query} from './query.mjs';
import fs from 'node:fs';
// Three real sample variants ($4.25 each) reused from quote-check.mjs, plus the regular control.
const S = ['gid://shopify/ProductVariant/44090076954675','gid://shopify/ProductVariant/44086096756787','gid://shopify/ProductVariant/44044973408307'];
const REG = 'gid://shopify/ProductVariant/40348093055027';
const q = fs.readFileSync(new URL('./quote-check.graphql', import.meta.url), 'utf8');
function samples(total){ // spread `total` sample units across the 3 variants
  const items=[]; let left=total; for(let i=0;i<S.length;i++){const qty=Math.ceil(left/(S.length-i)); if(qty>0)items.push({variantId:S[i],quantity:qty}); left-=qty;} return items;
}
const cases = {
  s6_$25_50: samples(6),
  s8_$34_00: samples(8),
  s12_$51_00: samples(12),
  regular_1: [{variantId:REG,quantity:1}],
};
const out={};
for (const [name, items] of Object.entries(cases)) {
  const r = await query(q, {items});
  const rates = r.draftOrderAvailableDeliveryOptions.availableShippingRates;
  const free = rates.find(x=>parseFloat(x.price.amount)===0);
  out[name] = { unitsRequested: items.reduce((a,b)=>a+b.quantity,0), freeOffered: !!free, freeTitle: free?.title||null, rateCount: rates.length, cheapestPaid: rates.filter(x=>parseFloat(x.price.amount)>0).map(x=>x.price.amount).sort((a,b)=>a-b)[0]||null };
}
fs.writeFileSync(new URL('./verification/quote-edge.json', import.meta.url), JSON.stringify(out,null,2)+'\n');
console.log(JSON.stringify(out,null,2));