-
Notifications
You must be signed in to change notification settings - Fork 127
/
Copy pathmodule.js
72 lines (57 loc) · 2.23 KB
/
module.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
const path = require('path')
const fs = require('fs-extra')
const { generateSitemaps } = require('./generator')
const logger = require('./logger')
const { registerSitemaps } = require('./middleware')
const { getStaticRoutes } = require('./routes')
module.exports = async function module(moduleOptions) {
const nuxtInstance = this
// Init options
const options = await initOptions(nuxtInstance, moduleOptions)
if (options === false) {
logger.info('Sitemap disabled')
return
}
// Init cache
// a file "sitemap-routes.json" is written to "dist" dir on "build" mode
const jsonStaticRoutesPath = !nuxtInstance.options.dev
? path.resolve(nuxtInstance.options.buildDir, path.join('dist', 'sitemap-routes.json'))
: null
const staticRoutes = fs.readJsonSync(jsonStaticRoutesPath, { throws: false })
const globalCache = { staticRoutes }
// Init static routes
nuxtInstance.extendRoutes((routes) => {
// Create a cache for static routes
globalCache.staticRoutes = getStaticRoutes(routes)
// On run cmd "build"
if (!nuxtInstance.options.dev) {
// Save static routes
fs.outputJsonSync(jsonStaticRoutesPath, globalCache.staticRoutes)
}
})
// On "generate" mode, generate static files for each sitemap or sitemapindex
nuxtInstance.nuxt.hook('generate:done', async () => {
await nuxtInstance.nuxt.callHook('sitemap:generate:before', nuxtInstance, options)
logger.info('Generating sitemaps')
await Promise.all(options.map((options) => generateSitemaps(options, globalCache, nuxtInstance)))
await nuxtInstance.nuxt.callHook('sitemap:generate:done', nuxtInstance)
})
// On "ssr" mode, register middlewares for each sitemap or sitemapindex
options.forEach((options) => {
registerSitemaps(options, globalCache, nuxtInstance)
})
}
async function initOptions(nuxtInstance, moduleOptions) {
if (nuxtInstance.options.sitemap === false || moduleOptions === false) {
return false
}
let options = nuxtInstance.options.sitemap || moduleOptions
if (typeof options === 'function') {
options = await options.call(nuxtInstance)
}
if (options === false) {
return false
}
return Array.isArray(options) ? options : [options]
}
module.exports.meta = require('../package.json')