diff --git a/package-lock.json b/package-lock.json index 8e5c07def4e..962a73d9127 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1461,6 +1461,12 @@ "universalify": "^0.1.0" } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", @@ -1492,6 +1498,20 @@ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -1701,6 +1721,16 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2577,6 +2607,15 @@ "ee-first": "1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, "onchange": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/onchange/-/onchange-7.0.2.tgz", @@ -2827,6 +2866,12 @@ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -4799,6 +4844,12 @@ } } }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, "ws": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", diff --git a/package.json b/package.json index 183040dc9e7..50b0f2a04ad 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "optimize": "npm-run-all -p optimize:* -s rev", "optimize:styles": "csso dist/css/main.css --output dist/css/main.css", "rev": "node-file-rev --manifest=generated/rev.json --root=dist dist/css/* dist/js/* dist/img/*.svg dist/img/cover/*.png dist/img/team/*.jpg dist/img/team/*.png", - "prod": "NODE_ENV=production npm-run-all build optimize -s build:pages" + "sitemap": "node tasks/generate_sitemap.js", + "prod": "NODE_ENV=production npm-run-all build optimize -s build:pages sitemap" }, "dependencies": { "amplitudejs": "5.2.0" @@ -34,6 +35,7 @@ "autoprefixer": "10.0.1", "browser-sync": "2.26.12", "csso-cli": "3.0.0", + "glob": "7.1.6", "jstransformer-markdown-it": "2.1.0", "markdown-it": "11.0.1", "node-file-rev": "1.1.2", diff --git a/src/sitemap.pug b/src/sitemap.pug new file mode 100644 index 00000000000..8d77a4382d6 --- /dev/null +++ b/src/sitemap.pug @@ -0,0 +1,7 @@ +doctype xml +urlset(xmlns="http://www.sitemaps.org/schemas/sitemap/0.9") + each url in pages + url + loc= url + lastmod= now + changefreq weekly diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 00000000000..60f6eb72319 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://einundzwanzig.space/sitemap.xml diff --git a/tasks/generate_sitemap.js b/tasks/generate_sitemap.js new file mode 100644 index 00000000000..1495cf6daa6 --- /dev/null +++ b/tasks/generate_sitemap.js @@ -0,0 +1,13 @@ +const pug = require('pug') +const glob = require('glob') +const { writeFileSync } = require('fs') +const { resolve } = require('path') + +const html = glob.sync(resolve(__dirname, '..', `dist/**/*.html`)) +const pages = html.map(file => file.replace(/.*\/dist/, 'https://einundzwanzig.space')) +const now = (new Date()).toISOString() +const file = resolve(__dirname, '..', `src/sitemap.pug`) +const rendered = pug.renderFile(file, { pages, now, pretty: true }) +const dst = resolve(__dirname, '..', 'dist', 'sitemap.xml') + +writeFileSync(dst, rendered)