← back to Tk 11331 Exec

enumerate.mjs

32 lines

// Live enumeration of candidates -> data/enum.jsonl (authoritative Admin API read).
import fs from 'fs';
import {gql,sleep} from './lib.mjs';
const ids=fs.readFileSync('data/candidates.tsv','utf8').trim().split('\n')
  .map(l=>l.split('|')[0].trim()).filter(x=>/^\d+$/.test(x))
  .map(p=>`gid://shopify/Product/${p}`);
const out=fs.createWriteStream('data/enum.jsonl',{flags:'w'});
const Q=`query($ids:[ID!]!){ nodes(ids:$ids){ ... on Product {
  id status
  variants(first:20){nodes{id sku position price}}
  mfmin:metafield(namespace:"global",key:"v_prods_quantity_order_min"){id value type}
  mfuom:metafield(namespace:"global",key:"unit_of_measure"){id value type}
  mfwidth:metafield(namespace:"global",key:"width"){id value}
}}}`;
const B=25; let done=0;
for(let i=0;i<ids.length;i+=B){
  const chunk=ids.slice(i,i+B);
  const d=await gql(Q,{ids:chunk});
  for(const n of d.nodes){
    if(!n) continue;
    out.write(JSON.stringify({
      gid:n.id, pid:n.id.split('/').pop(), status:n.status,
      variants:n.variants.nodes,
      min:n.mfmin||null, uom:n.mfuom||null, width:n.mfwidth?.value??null
    })+'\n');
  }
  done+=chunk.length;
  if(done%500<B) console.log(`enumerated ${done}/${ids.length}`);
  await sleep(120);
}
out.end(); console.log('DONE enumerate', done);