diff --git a/.gitignore b/.gitignore index cc6b8e5..799a347 100755 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ yarn-error.log* .idea/ #Feeds public/feeds/ +public/sitemap* + diff --git a/data/external/cms.js b/data/external/cms.js index 8c844b4..12e90c0 100755 --- a/data/external/cms.js +++ b/data/external/cms.js @@ -52,6 +52,20 @@ export const getAllPosts = async (filter, page, limit) => { return await res.json() } +export const getSinglePost = async (postId) => { + const { serverRuntimeConfig} = getConfig() + const url = serverRuntimeConfig.base_path + 'articles?filters[Slug][$eq]=' + postId + '&populate=*' + + const res = await fetch(url, { + headers: new Headers({ + 'Authorization': serverRuntimeConfig.strapi_token, + 'Content-Type': 'application/x-www-form-urlencoded' + }) + }) + const artdata = await res.json() + return artdata.data[0].attributes +} + export const getAllPodcastSeries = async () => { const { serverRuntimeConfig } = getConfig() const qs = require('qs') diff --git a/data/internal/sitemap-generator.js b/data/internal/sitemap-generator.js index e69de29..b29c628 100755 --- a/data/internal/sitemap-generator.js +++ b/data/internal/sitemap-generator.js @@ -0,0 +1,71 @@ +import { getAllPosts } from "../external/cms" +import fs from "fs" +import prettier from "prettier" +import config from './config' + + +export const generateSitemap = async () => { + const getDate = new Date().toISOString() + + const staticPaths = fs.readdirSync("pages", {withFileTypes: true}) + .filter((staticPage) => { + if(staticPage.isFile()) { + return ![ + "api", + "_app.js", + "_document.js", + "404.js", + "sitemap.xml.js", + "index.js" + ].includes(staticPage.name); + } + }) + .map((staticPagePath) => { + console.log(staticPagePath) + return `${config.siteURL}/${staticPagePath.name}`; + } + ); + + const postData = await getAllPosts() + const postList = [] + postData.data.forEach(post => postList.push({slug: post.attributes.Slug, updatedAt: post.attributes.updatedAt})) + + console.log(postList) + + const formatted = sitemap => prettier.format(sitemap, { parser: "html" }); + + const pageListMap = staticPaths.map(page => { + return ` + + ${page} + ${getDate} + 1 + ` + }).join("") + + const postListSiteMap = postList.map(post => { + return ` + + ${`${config.siteURL}/news/${post.slug}`} + ${post.updatedAt} + 0.5 + ` + }) + .join("") + + const generatedSitemap = ` + + ${pageListMap} + ${postListSiteMap} + + ` + + console.log(generatedSitemap) + const formattedSitemap = [formatted(generatedSitemap)]; + + fs.writeFileSync("public/sitemap-posts.xml", generatedSitemap, "utf8") +} \ No newline at end of file diff --git a/package.json b/package.json index 26fd053..0689e2e 100755 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@zeit/next-less": "^1.0.1", "bootstrap": "^4.6.0", "feed": "^4.2.2", + "fs": "^0.0.1-security", "less": "^3.13.1", "mdbreact": "^5.1.0", "next": "^10.2.3", @@ -22,6 +23,7 @@ "next-fonts": "^1.5.1", "next-images": "^1.8.1", "postcss": "^8.3.6", + "prettier": "^2.7.1", "qs": "^6.10.3", "react": "^16.14.0", "react-bootstrap": "^1.6.1", diff --git a/pages/_document.js b/pages/_document.js index d8f22ea..801c1b7 100755 --- a/pages/_document.js +++ b/pages/_document.js @@ -29,6 +29,13 @@ class CustomDocument extends Document { `, }} /> + + + + + + + diff --git a/pages/index.js b/pages/index.js index 649ce44..277d8a8 100755 --- a/pages/index.js +++ b/pages/index.js @@ -6,11 +6,13 @@ import Head from 'next/head' import Image from 'next/image'; import { FEEDS, getFeed } from "../lib/rss" import { generatePodcastFeeds, generateRssFeed } from "../data/internal/feed-generator" +import { generateSitemap } from "../data/internal/sitemap-generator" export async function getStaticProps(context) { generateRssFeed() generateRssFeed('tech-and-disability') generatePodcastFeeds() + generateSitemap() const { serverRuntimeConfig, publicRuntimeConfig, strapiConfig } = getConfig() console.log(serverRuntimeConfig.strapi_token) diff --git a/pages/news/[slug].js b/pages/news/[slug].js index 4375bd5..589ac3c 100755 --- a/pages/news/[slug].js +++ b/pages/news/[slug].js @@ -3,7 +3,7 @@ import "../../components/main.js" import Layout from "../../components/main.js" import FeatureImage from "../../components/featureimage.js" import StorySideBar from '../../components/storysidebar.js' -import { getAllPosts } from '../../data/external/cms' +import { getAllPosts, getSinglePost } from '../../data/external/cms' import * as gtag from "../../lib/gtag" import Image from 'next/image'; import Head from 'next/head' @@ -44,16 +44,8 @@ export async function getStaticPaths() { export async function getStaticProps({params}) { const { serverRuntimeConfig, publicRuntimeConfig } = getConfig() const slug = params.slug - const url = serverRuntimeConfig.base_path + 'articles?filters[Slug][$eq]=' + slug + '&populate=*' - - const res = await fetch(url, { - headers: new Headers({ - 'Authorization': serverRuntimeConfig.strapi_token, - 'Content-Type': 'application/x-www-form-urlencoded' - }) - }) - const artdata = await res.json() - const article_obj = artdata.data[0].attributes + + const article_obj = await getSinglePost(slug) const qs = require('qs') const query = qs.stringify({ diff --git a/yarn.lock b/yarn.lock index 6b89925..872c868 100755 --- a/yarn.lock +++ b/yarn.lock @@ -1312,6 +1312,11 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs@^0.0.1-security: + version "0.0.1-security" + resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== + fsevents@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -2655,6 +2660,11 @@ prebuild-install@^7.1.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"