From 90dd810960946a2e4a68a867d978a00bb80bf68a Mon Sep 17 00:00:00 2001 From: Eric Jinks Date: Fri, 9 Feb 2018 09:56:30 +1000 Subject: [PATCH] Generate Sitemap --- functions/generate-sitemap.js | 52 +++++++++++++++++++++++++++++++++++ functions/sitemap-ignore.json | 1 + package.json | 13 +++++---- yarn.lock | 13 ++++++++- 4 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 functions/generate-sitemap.js create mode 100644 functions/sitemap-ignore.json diff --git a/functions/generate-sitemap.js b/functions/generate-sitemap.js new file mode 100644 index 0000000..e0e2474 --- /dev/null +++ b/functions/generate-sitemap.js @@ -0,0 +1,52 @@ +const generateSitemap = require('sitemap-static') +const fs = require('fs') +const _find = require('lodash/find') +const _endsWith = require('lodash/endsWith') +const data = require('../src/data.json') + +const options = { + buildDir: 'build', + ignoreFile: 'functions/sitemap-ignore.json', + siteUrl: null, + pretty: true +} + +const getSiteUrl = () => { + // get siteUrl from: data.settings.global.siteUrl + if (!data || !data.settings) return null + const globalSettings = _find(data.settings, item => item.name === 'global') + if (!globalSettings) return null + const siteUrl = _endsWith(globalSettings.siteUrl, '/') + ? globalSettings.siteUrl + : globalSettings.siteUrl + '/' + return siteUrl +} + +const siteUrl = options.siteUrl || getSiteUrl() + +const writeSitemapToRobotsTxt = siteUrl => { + console.log(`Writing sitemap to ./${options.buildDir}/robots.txt`) + fs.appendFileSync( + `./${options.buildDir}/robots.txt`, + `Sitemap: ${siteUrl}sitemap.xml`, + 'utf8', + err => { + throw err + } + ) +} + +if (siteUrl) { + console.log(`Writing sitemap.xml to ./${options.buildDir}/sitemap.xml`) + const writer = fs.createWriteStream(`./${options.buildDir}/sitemap.xml`) + + generateSitemap(writer, { + findRoot: options.buildDir, + ignoreFile: options.ignoreFile, + prefix: siteUrl, + pretty: options.pretty + }) + writeSitemapToRobotsTxt(siteUrl) +} else { + console.log(`Cannot write sitemap, couldn't find siteUrl in data.json`) +} diff --git a/functions/sitemap-ignore.json b/functions/sitemap-ignore.json new file mode 100644 index 0000000..3b0456a --- /dev/null +++ b/functions/sitemap-ignore.json @@ -0,0 +1 @@ +["build/admin/", "build/404.html", "build/200.html"] diff --git a/package.json b/package.json index f2c8927..1e82416 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "prop-types": "^15.6.0", "react-scripts": "^1.0.10", "sharp": "^0.18.4", + "sitemap-static": "^0.4.2", "snazzy": "^7.0.0", "standard": "^10.0.2", "sw-precache": "^5.2.0" @@ -49,20 +50,20 @@ "start": "npm-run-all prepare-content -p start:content start:js", "start:js": "react-scripts start", "start:content": "chokidar 'content/**/**' -c 'npm run prepare-content'", - "build": "npm-run-all -s prepare-content build:js build:postcss react-snapshot sw", + "build": + "npm-run-all -s prepare-content build:* build:postcss build:react-snapshot build:sitemap build:sw", "build:js": "react-scripts build", "build:postcss": "postcss build/static/css/*.css -r", - "react-snapshot": "react-snapshot", + "build:react-snapshot": "react-snapshot", + "build:sw": "sw-precache --config='sw-precache-config.js'", + "build:sitemap": "node ./functions/generate-sitemap.js", "parse-content": "node ./functions/parse-content.js", "resize-images": "node ./functions/resize-images.js", "prepare-content": "npm-run-all -s parse-content resize-images", - "sw": "sw-precache --config='sw-precache-config.js'", "test": "standard | snazzy && react-scripts test --env=jsdom", "eject": "react-scripts eject" }, "reactSnapshot": { - "include": [ - "/404" - ] + "include": ["/404"] } } diff --git a/yarn.lock b/yarn.lock index f970e77..3830dbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3289,6 +3289,10 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +findit@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findit/-/findit-2.0.0.tgz#6509f0126af4c178551cfa99394e032e13a4d56e" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -5289,7 +5293,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -7594,6 +7598,13 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sitemap-static@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/sitemap-static/-/sitemap-static-0.4.2.tgz#f7acc86f79f84236fc0e152dec8f6d385fee1e13" + dependencies: + findit "~2.0.0" + minimist "1.2.0" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"