← back to Dw Discovery
build-staged.cjs
36 lines
const fs=require('fs');
let all=[]; for(let pg=1;pg<=20;pg++){try{all=all.concat(JSON.parse(fs.readFileSync('/tmp/all'+pg+'.json','utf8')).products||[]);}catch(e){}}
// newest first
all.sort((a,b)=>new Date(b.published_at||b.created_at||0)-new Date(a.published_at||a.created_at||0));
all=all.slice(0,5000);
const BUCKET_HEX={Red:'#b23b3b',Burgundy:'#6e2233',Coral:'#e3795f',Pink:'#d98fa6',Orange:'#cf7b3a',Terracotta:'#b5683f',Yellow:'#d8c463',Gold:'#c4a35a',Green:'#6f8f72',Aqua:'#5fb7b0',Blue:'#4f6d8c',Purple:'#7d5a86',Brown:'#6b513a',Beige:'#d9cdb8',Cream:'#e8dcc5',White:'#e7e3da',Gray:'#9a9a9a',Black:'#2a2a2a',Neutral:'#cfc6b6'};
const SYN=[[/black|ebony|onyx/,'Black'],[/charcoal/,'Gray'],[/gray|grey|silver|slate|pewter/,'Gray'],[/white/,'White'],[/cream|ivory|off.?white/,'Cream'],[/beige|sand|khaki|oatmeal/,'Beige'],[/neutral|natural|greige|commercial/,'Neutral'],[/burgundy|maroon|wine|oxblood/,'Burgundy'],[/coral|salmon/,'Coral'],[/terracotta|terra/,'Terracotta'],[/pink|rose|blush|fuchsia|magenta/,'Pink'],[/red|scarlet|crimson|indianred|cardinal|cherry|ruby/,'Red'],[/orange|rust|tangerine|copper/,'Orange'],[/gold|brass|bronze/,'Gold'],[/yellow|mustard|ochre/,'Yellow'],[/aqua|turquoise|teal/,'Aqua'],[/blue|navy|indigo|sky|cobalt|azure/,'Blue'],[/purple|plum|lavender|lilac|violet|eggplant/,'Purple'],[/green|sage|olive|emerald|moss/,'Green'],[/brown|chocolate|taupe|tan|mocha/,'Brown']];
const STYLES=['Damask','Floral','Geometric','Stripe','Modern','Traditional','Texture','Chinoiserie','Abstract','Toile','Ikat','Trellis','Botanical','Animal','Tropical','Moroccan','Plaid','Paisley','Ogee','Solid','Mural'];
const SUBTYPES=['Grasscloth','Silk','Linen','Cork','Vinyl','Mural','Raffia','Mylar','Weave','Flock','Mica','Leather','Paper','Fabric'];
const titleClean=t=>t.split('|')[0].replace(/\s*-\s*$/,'').trim();
const pick=(tags,list)=>{for(const s of list){if(tags.some(t=>new RegExp('\\b'+s+'\\b','i').test(t)))return s;}return null;};
const bucketOf=raw=>{if(!raw)return null;const s=raw.toLowerCase();for(const[re,b]of SYN)if(re.test(s))return b;return null;};
const colorRaw=tags=>{const bg=tags.find(t=>/^background color /i.test(t));if(bg)return bg.replace(/background color /i,'').trim();for(const k of Object.keys(BUCKET_HEX))if(tags.some(t=>t.toLowerCase()===k.toLowerCase()))return k;return null;};
const numFrom=(tags,re)=>{for(const t of tags){const m=t.match(re);if(m)return parseFloat(m[1]);}return null;};
const now=Date.now();
const out=all.map((p,i)=>{
const tags=(p.tags||[]);
const rollV=(p.variants||[]).slice().sort((a,b)=>parseFloat(b.price)-parseFloat(a.price))[0]||{};
const raw=colorRaw(tags); const bucket=bucketOf(raw)||'Neutral';
const img=(p.images&&p.images[0]&&p.images[0].src)||null;
const img2=(p.images&&p.images[1]&&p.images[1].src)||null; // 2nd image = room-setting shot when present
const pub=new Date(p.published_at||p.created_at||now);
return {id:i+1, sku:(rollV.sku||p.handle||('DW-'+(i+1))), title:titleClean(p.title), vendor:p.vendor||'Designer Wallcoverings',
category:p.product_type||'Wallcovering', subtype:pick(tags,SUBTYPES)||(p.product_type||'Wallcovering'),
style:pick(tags,STYLES)||'Other', colorName:(raw||bucket), colorBucket:bucket, hex:BUCKET_HEX[bucket]||'#9a9a9a',
width_in:numFrom(tags,/(\d+(?:\.\d+)?)\s*"?\s*(?:inch|in\b)?\s*(?:wide|width)/i),
repeat_in:numFrom(tags,/(\d+(?:\.\d+)?)\s*"?\s*(?:v\s*)?repeat/i),
price:parseFloat(rollV.price)||0, inStock:(p.variants||[]).some(v=>v.available)!==false,
featured:false, createdDaysAgo:Math.round((now-pub)/864e5), image:img, image2:img2};
}).filter(p=>p.image && p.price>0);
fs.writeFileSync('data/products.staged.json', JSON.stringify(out));
const cnt=f=>{const m={};out.forEach(p=>m[p[f]]=(m[p[f]]||0)+1);return Object.keys(m).length;};
console.log('staged products:',out.length,'| vendors:',cnt('vendor'),'| styles:',cnt('style'),'| color buckets:',cnt('colorBucket'));
console.log('newest:',out[0].title,'('+out[0].createdDaysAgo+'d) |',out[0].vendor);
console.log('file:', (fs.statSync('data/products.staged.json').size/1048576).toFixed(2)+'MB');