← back to Hollywood Import
hollywood-remap-dump.mjs
56 lines
// TK-10679 Phase 2 — READ-ONLY raw dump of every AFFECTED Hollywood product, so we can
// score recovery tiers (variant-clean / metafield-clean / staging-join / truly-held) offline.
// Writes NOTHING to Shopify. Output: remap-affected-raw.json
import { gql } from '/Users/macstudio3/.claude/skills/dw-hollywood-sku-canary/shopify.mjs';
import { FABRICATED } from '/Users/macstudio3/.claude/skills/dw-hollywood-sku-canary/lib.mjs';
import { writeFileSync } from 'node:fs';
const VENDOR = 'Hollywood Wallcoverings';
const PAGE = `query($cursor:String){
products(first:50, query:"vendor:\\"${VENDOR}\\"", after:$cursor){
pageInfo{ hasNextPage endCursor }
nodes{
id handle title status
mfG: metafield(namespace:"global", key:"dw_sku"){ value }
mfD: metafield(namespace:"dwc", key:"dw_sku"){ value }
mfC: metafield(namespace:"custom", key:"dw_sku"){ value }
pat: metafield(namespace:"dwc", key:"pattern_name"){ value }
col: metafield(namespace:"dwc", key:"color_name"){ value }
mom: metafield(namespace:"dwc", key:"momentum_sku"){ value }
man: metafield(namespace:"dwc", key:"manufacturer_sku"){ value }
variants(first:20){ nodes{ sku } }
}
}
}`;
const sleep = ms => new Promise(r => setTimeout(r, ms));
const isFab = s => !!s && FABRICATED.test(s);
const baseOf = sku => (sku || '').replace(/-(sample|yard|roll)$/i, '');
const rows = [];
let cursor = null, scanned = 0;
while (true) {
let res;
for (let a = 0; ; a++) {
try { res = await gql(PAGE, { cursor }); break; }
catch (e) { if (/THROTTLED|throttle/i.test(e.message) && a < 8) { await sleep(2000 * (a + 1)); continue; } throw e; }
}
for (const p of res.data.products.nodes) {
scanned++;
const vbases = [...new Set(p.variants.nodes.map(v => baseOf(v.sku)).filter(Boolean))];
const mfVals = { global: p.mfG?.value || null, dwc: p.mfD?.value || null, custom: p.mfC?.value || null };
const anyFab = isFab(mfVals.global) || isFab(mfVals.dwc) || isFab(mfVals.custom) || vbases.some(isFab);
if (!anyFab) continue;
rows.push({
id: p.id, handle: p.handle, title: p.title,
mf: mfVals, vbases,
pat: p.pat?.value || null, col: p.col?.value || null,
mom: p.mom?.value || null, man: p.man?.value || null,
});
}
if (!res.data.products.pageInfo.hasNextPage) break;
cursor = res.data.products.pageInfo.endCursor;
await sleep(300);
}
writeFileSync(new URL('./remap-affected-raw.json', import.meta.url).pathname, JSON.stringify(rows, null, 1));
console.log(`scanned=${scanned} affected=${rows.length} -> remap-affected-raw.json`);