← 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);