← back to Dw Yolo Loop
scripts/nav-link-reachability/navmenus-admin-probe.mjs
25 lines
import fs from 'fs';
const ENV=fs.readFileSync('/Users/macstudio3/Projects/secrets-manager/.env','utf8');
const TOK=((ENV.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m)||[])[1]||'').replace(/['"\r]/g,'').trim();
const GQL='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
async function gql(q,v){const r=await fetch(GQL,{method:'POST',headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});return r.json();}
// Admin GraphQL menus connection (online store navigation)
const q=`{ menus(first:30){ edges{ node{ handle title
items{ title type url resourceId
items{ title type url resourceId
items{ title type url resourceId } } } } } } }`;
const j=await gql(q,{});
if(j.errors){ console.log("ERRORS:",JSON.stringify(j.errors)); process.exit(0); }
const collHandles=new Set(); const linkTypes={};
function walk(items){ for(const it of (items||[])){ linkTypes[it.type]=(linkTypes[it.type]||0)+1;
const m=(it.url||'').match(/\/collections\/([^\/?#]+)/); if(m) collHandles.add(m[1]);
if(it.type==='COLLECTION' && it.resourceId) collHandles.add('gid:'+it.resourceId);
walk(it.items); } }
const menus=j.data.menus.edges.map(e=>e.node);
console.log("MENUS:", menus.map(m=>`${m.handle}("${m.title}", menu)`).join(' | '));
menus.forEach(m=>walk(m.items));
console.log("\nlink types:", JSON.stringify(linkTypes));
console.log("\ncollection handles linked in nav ("+collHandles.size+"):");
console.log([...collHandles].sort().join('\n'));
fs.writeFileSync('/tmp/nav-linked-collections.json',JSON.stringify({ts:'2026-06-18',menus:menus.map(m=>({handle:m.handle,title:m.title,itemsCount:m.itemsCount})),linkedHandles:[...collHandles]},null,2));