diff --git a/packages/@vuepress/plugin-sitemap/.npmignore b/packages/@vuepress/plugin-sitemap/.npmignore new file mode 100644 index 0000000000..13c38ea313 --- /dev/null +++ b/packages/@vuepress/plugin-sitemap/.npmignore @@ -0,0 +1,3 @@ +__tests__ +__mocks__ +.temp diff --git a/packages/@vuepress/plugin-sitemap/README.md b/packages/@vuepress/plugin-sitemap/README.md new file mode 100644 index 0000000000..ce901d8d28 --- /dev/null +++ b/packages/@vuepress/plugin-sitemap/README.md @@ -0,0 +1,27 @@ +# @vuepress/plugin-sitemap + +> Sitemap plugin for vuepress + +## Usage + +1. Enable this plugin: + +```js +// .vuepress/config.js or themedir/index.js + +module.exports = { + plugins: [ + [ + "@vuepress/sitemap", + { + hostname: "https://yours.net.id", + outFile: 'sitemap.xml' + } + ] + ] +}; +``` + +## Options + +All the options of https://npm.im/sitemap plus `outFile` (relative target file name) diff --git a/packages/@vuepress/plugin-sitemap/index.js b/packages/@vuepress/plugin-sitemap/index.js new file mode 100644 index 0000000000..5c18917b78 --- /dev/null +++ b/packages/@vuepress/plugin-sitemap/index.js @@ -0,0 +1,52 @@ +const { path, fs, logger } = require('@vuepress/shared-utils') +const { createSitemap } = require('sitemap') + +module.exports = (options, context) => { + const { + outFile = 'sitemap.xml', + hostname, + changefreq = 'daily', + cacheTime = 600000, + urls = [], + ...others + } = options + + return { + async generated () { + if (!hostname) { + return logger.warn( + `\nNot generating sitemap because required 'hostname' option doesn't exist` + ) + } + + logger.wait('\nGenerating sitemap...') + + const _urls = context.pages + .map(i => { + const lastmodISO = i.lastUpdated + ? new Date(i.lastUpdated).toISOString() + : undefined + + return { + url: i.path, + lastmodISO, + changefreq + } + }) + .concat(urls) + + const sitemap = createSitemap({ + hostname: hostname, + cacheTime: cacheTime, + urls: _urls, + ...others + }) + + const sitemapXML = path.resolve(context.outDir, outFile) + + await fs.writeFile(sitemapXML, sitemap.toString()) + + logger.success(`sitemap generated at ${sitemapXML}`) + } + } +} diff --git a/packages/@vuepress/plugin-sitemap/package.json b/packages/@vuepress/plugin-sitemap/package.json new file mode 100644 index 0000000000..d7788d67b5 --- /dev/null +++ b/packages/@vuepress/plugin-sitemap/package.json @@ -0,0 +1,30 @@ +{ + "name": "@vuepress/plugin-sitemap", + "version": "1.0.0-alpha.2", + "description": "sitemap plugin for vuepress", + "main": "index.js", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/vuejs/vuepress.git" + }, + "keywords": [ + "documentation", + "vue", + "vuepress", + "vuepress-plugin", + "sitemap", + "generator" + ], + "author": "Eko Eryanto ", + "license": "MIT", + "bugs": { + "url": "https://github.com/vuejs/vuepress/issues" + }, + "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-sitemap#readme", + "dependencies": { + "sitemap": "^2.0.1" + } +} diff --git a/packages/docs/docs/.vuepress/config.js b/packages/docs/docs/.vuepress/config.js index 346ff55bc2..3b8d0c3e18 100644 --- a/packages/docs/docs/.vuepress/config.js +++ b/packages/docs/docs/.vuepress/config.js @@ -104,7 +104,10 @@ module.exports = { serviceWorker: true, updatePopup: true }, - '@vuepress/plugin-medium-zoom': true + '@vuepress/plugin-medium-zoom': true, + '@vuepress/plugin-sitemap': { + hostname: 'https://vuepress.vuejs.org' + } } } diff --git a/packages/docs/package.json b/packages/docs/package.json index 015098c2da..fcc0672fc6 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -27,6 +27,7 @@ "@vuepress/plugin-i18n-ui": "^1.0.0-alpha.2", "@vuepress/plugin-medium-zoom": "^1.0.0-alpha.2", "@vuepress/plugin-pwa": "^1.0.0-alpha.2", + "@vuepress/plugin-sitemap": "^1.0.0-alpha.2", "vuepress": "^1.0.0-alpha.2" } } diff --git a/yarn.lock b/yarn.lock index f997163ff3..4d0d50bfca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8117,6 +8117,14 @@ sisteransi@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" +sitemap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-2.0.1.tgz#24f9ae89efeadd80e85e91b7247165497a5e655b" + dependencies: + lodash "^4.17.10" + url-join "^4.0.0" + xmlbuilder "^10.0.0" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -9533,6 +9541,10 @@ xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" +xmlbuilder@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.0.0.tgz#c64e52f8ae097fe5fd46d1c38adaade071ee1b55" + xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"