nextjs-sitemap icon indicating copy to clipboard operation
nextjs-sitemap copied to clipboard

Allow es modules to be imported in sitemap-generator to use fetch or axios inside sitemap-generator.js ?

Open SSylvain1989 opened this issue 2 years ago • 0 comments

Hello ,

Your documentation say we can implement dynamic paths in our sitemap https://github.com/SergeyMyssak/nextjs-sitemap#with-dynamic-routes but i can't manage to do so , I need to fetch all my url blog from sanity.io

See your example

const { configureSitemap } = require('@sergeymyssak/nextjs-sitemap');

async function fetchDynamicPaths() {
  return ['house', 'flower', 'table'];
}

async function getDynamicPaths() {
  const paths = await fetchDynamicPaths();

  return paths.map((item) => `/project/${item}`);
}

getDynamicPaths().then((paths) => {
  const Sitemap = configureSitemap({
    domains: [{ domain: 'example.com', defaultLocale: 'en' }],
    include: paths,
    exclude: ['/project/*'],
    excludeIndex: true,
    pagesConfig: {
      '/project/*': {
        priority: '0.5',
        changefreq: 'daily',
      },
    },
    trailingSlash: true,
    targetDirectory: __dirname + '/public',
    pagesDirectory: __dirname + '/src/pages',
  });

  Sitemap.generateSitemap();
});

But if i want to import fetch module i get an error

const fetch = require("node-fetch")

const { configureSitemap } = require("@sergeymyssak/nextjs-sitemap")
const fs = require("fs")

async function fetchDynamicPaths() {
  const query = encodeURIComponent(`{
    "posts": *[_type == "post"]  {
      ...,
      categories[]->
    }}
  `)
  const url = `https://eb29jfco.api.sanity.io/v1/data/query/production?query=${query}`
  const result = await fetch(url).then((res) => res.json())
  const paths = []
  result.result.posts.map((element) => {
    return paths.push({
      slug: `${element.slug.current}`,
    })
  })

  return {
    paths,
  }
}

async function getDynamicPaths() {
  const paths = await fetchDynamicPaths()
  return paths.paths.map((item) => `/blog/${item.slug}`)
}
const paths = getDynamicPaths()
console.log(paths)

async function writeSitemap() {
  // const dynamicPaths = uniquePaths
  const publicDirectory = `${__dirname}/public`
  const domain = "www.myblog.app"
  const Sitemap = configureSitemap({
    domains: [
      {
        domain,
        locales: ["fr"],
        defaultLocale: "en",
      },
    ],
    // include: dynamicPaths,
    exclude: ["/advisor", "/404", "/api/*", "blog/*"],
    targetDirectory: publicDirectory,
    pagesDirectory: `${__dirname}/pages`,
  })
  const result = await Sitemap.generateSitemap()
  let sitemaps = ""
  result.forEach((r) => {
    sitemaps += `Sitemap: https://${domain}/${r.name}\n`
  })
  const robotTxt = `# *
User-agent: *
Allow: /
# Host
Host: https://${domain}
# Sitemaps
${sitemaps}`
  fs.writeFileSync(`${publicDirectory}/robots.txt`, robotTxt)
}
writeSitemap()

error image

SSylvain1989 avatar May 05 '22 21:05 SSylvain1989