← back to Novasuede Min Fix

live-salt-full.mjs

32 lines

import fs from 'fs';
const env=fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8');
const get=k=>(env.match(new RegExp('^'+k+'=(.*)$','m'))||[])[1];
const TOKEN=get('SHOPIFY_ADMIN_TOKEN');
const API='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
async function gql(q,v={}){const r=await fetch(API,{method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});return r.json();}
const Q=`query{
  productByHandle(handle:"novasuede™-salt"){
    id title handle status tags
    options{ id name position values }
    variants(first:20){ nodes{
      id title sku position availableForSale inventoryPolicy inventoryQuantity price
      selectedOptions{ name value }
      inventoryItem{ tracked }
    }}
    metafields(first:40){ nodes{ namespace key value type } }
  }
}`;
const r=await gql(Q);
if(r.errors){console.log(JSON.stringify(r.errors));process.exit(1)}
const p=r.data.productByHandle;
console.log('TITLE:',p.title,'status:',p.status);
console.log('TAGS:',JSON.stringify(p.tags));
console.log('OPTIONS:',JSON.stringify(p.options));
console.log('--- default/display metafields ---');
for(const m of p.metafields.nodes) if(/default|display|variant/i.test(m.key+m.namespace)) console.log('  '+m.namespace+'.'+m.key+' = '+JSON.stringify(m.value)+' ['+m.type+']');
console.log('--- ALL product metafields ---');
for(const m of p.metafields.nodes) console.log('  '+m.namespace+'.'+m.key+' = '+JSON.stringify(m.value).slice(0,80));
console.log('--- VARIANTS live-order ---');
p.variants.nodes.forEach(v=>console.log('  pos'+v.position,'|',JSON.stringify(v.title),'| avail='+v.availableForSale,'| invPol='+v.inventoryPolicy,'| invQty='+v.inventoryQuantity,'| tracked='+v.inventoryItem.tracked,'| price='+v.price,'| opts='+JSON.stringify(v.selectedOptions)));
fs.writeFileSync('salt-live.json',JSON.stringify(p,null,2));