import * as cheerio from 'cheerio'; const readStdIn = () => { return new Promise((resolve, reject) => { let stdIn = ''; process.stdin.on('data', data => stdIn += data); process.stdin.on('end', () => resolve(stdIn)); process.stdin.on('error', err => reject(err)); }); }; const $ = cheerio.load(await readStdIn()); const info = { title: '', metaTitle: '', desc: '', siteName: '', image: '', colour: '', type: 'website', }; const titleTag = $('title').first(); if(titleTag.length > 0) info.title = titleTag.text().trim(); const metaTags = $('meta'); for(const elemInfo of metaTags) { const elem = $(elemInfo); const nameAttr = (elem.attr('name') ?? elem.attr('property') ?? '').trim(); if(nameAttr === '') continue; const valueAttr = (elem.attr('value') ?? elem.attr('content') ?? '').trim(); switch(nameAttr) { case 'og:title': case 'twitter:title': if(info.metaTitle === '' || valueAttr.length > info.metaTitle.length) info.metaTitle = valueAttr; break; case 'description': case 'og:description': case 'twitter:description': if(info.desc === '' || valueAttr.length > info.desc.length) info.desc = valueAttr; break; case 'og:site_name': if(info.siteName === '') info.siteName = valueAttr; break; case 'og:image': case 'twitter:image': if(info.image === '') info.image = valueAttr; break; case 'theme-color': if(info.colour === '') info.colour = valueAttr; break; case 'og:type': if(info.type === '') info.type = `website:${valueAttr}`; break; } } console.log(JSON.stringify(info));