← back to Newmor Onboard

scripts/range-check.mjs

28 lines

import fs from 'node:fs';
import assert from 'node:assert/strict';
import {ROOT, read, save} from './shopify.mjs';
const previous=read('data/newmor-live-colourways-2026-09-04.json');
const plan=read('data/newmor-showroom-plan-2026-09-08.json');
const normalize=s=>s.toUpperCase().replace(/[^A-Z0-9]/g,'').replace(/([A-Z])0+(\d)/g,'$1$2');
const ranges={};
for (const slug of new Set([...Object.keys(previous),...plan.candidates.map(c=>c.pattern.toLowerCase().replace(/\s+/g,'-'))])) {
 let response=await fetch(`https://newmor.com/wallcovering/${slug}/`,{signal:AbortSignal.timeout(60000)});
 if(!response.ok) response=await fetch(`https://newmor.com/product/${slug}/`,{signal:AbortSignal.timeout(60000)});
 if(!response.ok){ranges[slug]={url:response.url,checked_at:new Date().toISOString(),codes:[],error:`HTTP ${response.status}`};console.log(`${slug}: HOLD HTTP ${response.status}`);continue;}
 const html=await response.text();
 const codes=[...html.matchAll(/<p[^>]*class="color-title"[^>]*>\s*Colours:\s*([^<]+)<\/p>/g)].map(x=>x[1].trim());
 if(!codes.length){ranges[slug]={url:response.url,checked_at:new Date().toISOString(),codes:[],error:'No colorways parsed'};console.log(`${slug}: HOLD no parsed colorways`);continue;}
 assert.equal(new Set(codes.map(normalize)).size,codes.length,`Ambiguous normalized codes ${slug}`);
 ranges[slug]={url:response.url,checked_at:new Date().toISOString(),codes};
 fs.mkdirSync(`${ROOT}/data/live-2026-09-09/vendor`,{recursive:true});
 fs.writeFileSync(`${ROOT}/data/live-2026-09-09/vendor/${slug}.html`,html);
 console.log(`${slug}: ${codes.length} colorways`);
}
const results=plan.candidates.map(c=>{
 const slug=c.pattern.toLowerCase().replace(/\s+/g,'-');
 const range=ranges[slug];
 return {id:c.id,code:c.manufacturer_code,pattern:c.pattern,url:range?.url,found:!!range?.codes.some(code=>normalize(code)===normalize(c.manufacturer_code))};
});
save('data/live-2026-09-09/vendor-range.json',{checked_at:new Date().toISOString(),ranges,candidates:results});
console.log(`Verified ${results.filter(r=>r.found).length}/${results.length} exact candidates; HOLD ${results.filter(r=>!r.found).length}`);