uniswap-interface-uncensored/scripts/generate-sitemap.js

68 lines
1.9 KiB
JavaScript
Raw Normal View History

/* eslint-env node */
const fs = require('fs')
const { parseStringPromise, Builder } = require('xml2js')
const weekMs = 7 * 24 * 60 * 60 * 1000
const nowISO = new Date().toISOString()
const getQuery = (chain) => `
query {
topTokens(pageSize: 100, page: 1, chain: ${chain}, orderBy: VOLUME) {
address
}
}
`
const chains = ['ETHEREUM', 'ARBITRUM', 'OPTIMISM', 'POLYGON', 'BASE', 'BNB', 'CELO']
fs.readFile('./public/sitemap.xml', 'utf8', async (err, data) => {
const sitemapURLs = {}
try {
const sitemap = await parseStringPromise(data)
if (sitemap.urlset.url) {
sitemap.urlset.url.forEach((url) => {
const lastMod = new Date(url['$'].lastmod).getTime()
if (lastMod < Date.now() - weekMs) {
url['$'].lastmod = nowISO
}
sitemapURLs[url['$']['loc']] = true
})
}
for (const chainName of chains) {
const response = await fetch('https://api.uniswap.org/v1/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Origin: 'https://app.uniswap.org',
},
body: JSON.stringify({ query: getQuery(chainName) }),
})
const tokensJSON = await response.json()
const tokenAddresses = tokensJSON.data.topTokens.map((token) => token.address.toLowerCase())
tokenAddresses.forEach((address) => {
const tokenURL = `https://app.uniswap.org/tokens/${chainName.toLowerCase()}/${address}`
if (!(tokenURL in sitemapURLs)) {
sitemap.urlset.url.push({
$: {
loc: [tokenURL],
lastmod: [nowISO],
priority: [0.8],
},
})
}
})
}
const builder = new Builder()
const xml = builder.buildObject(sitemap)
fs.writeFile('./public/sitemap.xml', xml, (error) => {
if (error) throw error
console.log('Sitemap updated')
})
} catch (e) {
console.error(e)
}
})