const path = require('path'); const fs = require('fs'); const yaml = require('js-yaml'); const apiKey = process.env.SPONSOR_SHEET_API_KEY; const sheetId = process.env.SPONSOR_SHEET_ID; if (!apiKey || !sheetId) { console.error('Missing API key or sheet ID'); process.exit(1); } const sheetRange = 'A3:I1001'; const sheetUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${sheetRange}?key=${apiKey}`; function populatePageAds({ pageUrl, company, redirectUrl, imageUrl, adTitle, adDescription, startDate, endDate, isActive, }) { const isConfiguredActive = isActive.toLowerCase() === 'yes'; const currentDate = new Date(); const isDateInRange = currentDate >= new Date(startDate) && currentDate <= new Date(endDate); const shouldShowAd = isConfiguredActive && isDateInRange; const urlPart = pageUrl .replace('https://roadmap.sh/', '') .replace(/\?.+?$/, ''); const parentDir = urlPart.startsWith('best-practices/') ? 'best-practices' : 'roadmaps'; const pageId = urlPart.replace(`${parentDir}/`, ''); const pageFilePath = path.join( __dirname, `../src/data/${parentDir}`, `${pageId}/${pageId}.md` ); if (!fs.existsSync(pageFilePath)) { console.error(`Page file not found: ${pageFilePath}`); process.exit(1); } console.log(`Updating page: ${urlPart}`); const pageFileContent = fs.readFileSync(pageFilePath, 'utf8'); const frontMatterRegex = /---\n([\s\S]*?)\n---/; const existingFrontmatter = pageFileContent.match(frontMatterRegex)[1]; const contentWithoutFrontmatter = pageFileContent .replace(frontMatterRegex, ``) .trim(); let frontmatterObj = yaml.load(existingFrontmatter); delete frontmatterObj.sponsor; if (shouldShowAd) { const frontmatterValues = Object.entries(frontmatterObj); const roadmapLabel = frontmatterObj.briefTitle; // Insert sponsor data at 10 index i.e. after // roadmap dimensions in the frontmatter frontmatterValues.splice(10, 0, [ 'sponsor', { url: redirectUrl, title: adTitle, imageUrl, description: adDescription, event: { category: 'SponsorClick', action: `${company} Redirect`, label: `${roadmapLabel} / ${company} Link`, }, }, ]); frontmatterObj = Object.fromEntries(frontmatterValues); } const newFrontmatter = yaml.dump(frontmatterObj, { lineWidth: 10000, forceQuotes: true, quotingType: '"', }); const newContent = `---\n${newFrontmatter}---\n\n${contentWithoutFrontmatter}`; fs.writeFileSync(pageFilePath, newContent, 'utf8'); } fetch(sheetUrl) .then((res) => res.json()) .then((rawData) => { const rows = rawData.values; rows.map((row) => { // prettier-ignore const [ pageUrl, company, redirectUrl, imageUrl, adTitle, adDescription, startDate, endDate, isActive, ] = row; populatePageAds({ pageUrl, company, redirectUrl, imageUrl, adTitle, adDescription, startDate, endDate, isActive, }); }); });