← back to Shopify Sample Shipping

export-samples.mjs

28 lines

import fs from 'node:fs';
import {query} from './query.mjs';
const dir=new URL('./verification/',import.meta.url);
const mode=process.argv[2];
if(mode==='start'){
 const q='{productVariants{edges{node{id title sku price deliveryProfile{id} product{id status title} inventoryItem{measurement{weight{value unit}}}}}}}';
 const j=await query('mutation($query:String!){bulkOperationRunQuery(query:$query){bulkOperation{id status} userErrors{field message}}}',{query:q});
 if(j.bulkOperationRunQuery.userErrors.length) throw Error(JSON.stringify(j));
 fs.writeFileSync(new URL('export-operation.json',dir),JSON.stringify(j,null,2));
 console.log(JSON.stringify(j));
} else if(mode==='status') {
 const start=JSON.parse(fs.readFileSync(new URL('export-operation.json',dir)));
 const j=await query('query($id:ID!){node(id:$id){... on BulkOperation{id status errorCode objectCount url partialDataUrl}}}',{id:start.bulkOperationRunQuery.bulkOperation.id});
 fs.writeFileSync(new URL('export-status.json',dir),JSON.stringify(j,null,2));
 console.log(JSON.stringify({...j.node,url:!!j.node.url,partialDataUrl:!!j.node.partialDataUrl}));
 if(j.node.status==='COMPLETED'){
   const r=await fetch(j.node.url);if(!r.ok)throw Error('Export download '+r.status);
   const raw=await r.text();const rows=raw.trim().split('\n').filter(Boolean).map(s=>JSON.parse(s));
   const variants=rows.filter(v=>v.id.startsWith('gid://shopify/ProductVariant/'));
   const accepted=variants.filter(v=>/\bsample\b/i.test(v.title)&&v.product.status==='ACTIVE'&&v.deliveryProfile?.id==='gid://shopify/DeliveryProfile/29033627699');
   fs.writeFileSync(new URL('sample-variants.json',dir),JSON.stringify(accepted,null,2));
   const summary={total:variants.length,accepted:accepted.length,rejected:variants.length-accepted.length,byTitle:{}};
   for(const v of accepted)summary.byTitle[v.title]=(summary.byTitle[v.title]||0)+1;
   fs.writeFileSync(new URL('sample-export-summary.json',dir),JSON.stringify(summary,null,2));
   console.log(JSON.stringify(summary));
 }
} else throw Error('Use start or status');