← back to Newmor Onboard
scripts/rollback-metafields.mjs
34 lines
#!/usr/bin/env node
// TK-11346 — reverse an applied Newmor metafield backfill from its restore map.
// Usage: node scripts/rollback-metafields.mjs data/tk11346/restore-map-<stamp>.json [--apply]
// DRY-RUN by default. For each APPLIED write:
// - 'delete-if-created' -> metafieldsDelete the created metafield
// - 'set-old-value' -> metafieldsSet the recorded oldValue back
import fs from 'node:fs';
import {gql} from './shopify.mjs';
const path = process.argv[2];
const APPLY = process.argv.includes('--apply');
if (!path) { console.error('Usage: rollback-metafields.mjs <restore-map.json> [--apply]'); process.exit(1); }
const {restore_map} = JSON.parse(fs.readFileSync(path, 'utf8'));
const applied = restore_map.filter(r => r.applied);
console.log(`Restore map: ${restore_map.length} entries, ${applied.length} were applied. Mode=${APPLY ? 'APPLY' : 'DRY-RUN'}`);
let done = 0;
for (const r of applied) {
if (r.restore.action === 'delete-if-created') {
console.log(`${APPLY ? 'DELETE' : '[dry] would delete'} ${r.namespace}.${r.key} on ${r.gid} (id=${r.appliedMetafieldId})`);
if (APPLY) {
const d = await gql(`mutation($id:ID!){metafieldDelete(input:{id:$id}){deletedId userErrors{field message}}}`, {id: r.appliedMetafieldId});
const ue = d.metafieldDelete.userErrors; if (ue.length) throw new Error(JSON.stringify(ue)); done++;
}
} else if (r.restore.action === 'set-old-value') {
console.log(`${APPLY ? 'RESTORE' : '[dry] would restore'} ${r.namespace}.${r.key} on ${r.gid} -> ${JSON.stringify(r.restore.oldValue)}`);
if (APPLY) {
const d = await gql(`mutation($mf:[MetafieldsSetInput!]!){metafieldsSet(metafields:$mf){metafields{id}userErrors{field message}}}`,
{mf: [{ownerId: r.gid, namespace: r.namespace, key: r.key, type: r.restore.oldType, value: r.restore.oldValue}]});
const ue = d.metafieldsSet.userErrors; if (ue.length) throw new Error(JSON.stringify(ue)); done++;
}
}
if (APPLY) await new Promise(res => setTimeout(res, 250));
}
console.log(APPLY ? `Rolled back ${done} writes.` : `DRY-RUN: ${applied.length} writes would be reversed. Add --apply to execute.`);