← back to Wolfgordon Crawl

inspect-rich-product.js

25 lines

#!/usr/bin/env node
// Read-only: dump the full metafield set + descriptionHtml of one richly-enriched
// WG product so the backfill mirrors store conventions (namespace/key/type).
const fs = require('fs'); const os = require('os');
function loadToken() {
  if (process.env.SHOPIFY_ADMIN_TOKEN) return process.env.SHOPIFY_ADMIN_TOKEN;
  const p = os.homedir() + '/Projects/secrets-manager/.env';
  const line = fs.readFileSync(p, 'utf8').split('\n').find(l => l.startsWith('SHOPIFY_ADMIN_TOKEN='));
  return line.slice('SHOPIFY_ADMIN_TOKEN='.length).replace(/^["']|["']$/g, '').trim();
}
const TOKEN = loadToken();
const SHOP = 'designer-laboratory-sandbox.myshopify.com'; const API = '2024-10';
const GQL = `https://${SHOP}/admin/api/${API}/graphql.json`;
async function gql(q, v) { const res = await fetch(GQL, { method: 'POST', headers: { 'X-Shopify-Access-Token': TOKEN, 'Content-Type': 'application/json' }, body: JSON.stringify({ query: q, variables: v }) }); const j = await res.json(); if (j.errors) throw new Error(JSON.stringify(j.errors)); return j.data; }
(async () => {
  // find a WG product with many metafields + a description
  const d = await gql(`{ products(first:60, query:"vendor:'Wolf Gordon'"){ edges{ node{ id title status descriptionHtml metafields(first:60){edges{node{namespace key type value}}} } } } }`);
  let best = null;
  for (const e of d.products.edges) { const n = e.node; if ((n.metafields.edges.length) > (best?.metafields.edges.length || 0)) best = n; }
  console.log('TITLE:', best.title, '| status', best.status);
  console.log('DESC(first 300):', (best.descriptionHtml || '').slice(0, 300));
  console.log('METAFIELDS:');
  for (const m of best.metafields.edges) console.log(`  ${m.node.namespace}.${m.node.key} [${m.node.type}] = ${String(m.node.value).slice(0, 70)}`);
})().catch(e => { console.error('ERR', e.message); process.exit(1); });