@@ -14,19 +14,55 @@ import { task } from '../utils/task'
14
14
export async function generateSitemap ( siteConfig : SiteConfig ) {
15
15
if ( ! siteConfig . sitemap ?. hostname ) return
16
16
17
+ const getLastmod = async ( url : string ) => {
18
+ if ( ! siteConfig . lastUpdated ) return undefined
19
+
20
+ let path = url . replace ( / ( ^ | \/ ) $ / , '$1index' )
21
+ path = path . replace ( / ( \. h t m l ) ? $ / , '.md' )
22
+ path = siteConfig . rewrites . inv [ path ] || path
23
+
24
+ return ( await getGitTimestamp ( path ) ) || undefined
25
+ }
26
+
17
27
await task ( 'generating sitemap' , async ( ) => {
18
- let items : SitemapItem [ ] = await Promise . all (
19
- siteConfig . pages . map ( async ( page ) => {
20
- //
21
- let url = siteConfig . rewrites . map [ page ] || page
22
- url = url . replace ( / ( ^ | \/ ) i n d e x \. m d $ / , '$1' )
23
- url = url . replace ( / \. m d $ / , siteConfig . cleanUrls ? '' : '.html' )
24
-
25
- const lastmod = siteConfig . lastUpdated && ( await getGitTimestamp ( page ) )
26
- return lastmod ? { url, lastmod } : { url }
28
+ const locales = siteConfig . userConfig . locales || { }
29
+ const filteredLocales = Object . keys ( locales ) . filter (
30
+ ( locale ) => locales [ locale ] . lang && locale !== 'root'
31
+ )
32
+ const defaultLang =
33
+ locales ?. root ?. lang || siteConfig . userConfig . lang || 'en-US'
34
+
35
+ const pages = siteConfig . pages . map (
36
+ ( page ) => siteConfig . rewrites . map [ page ] || page
37
+ )
38
+
39
+ const groupedPages : Record < string , { lang : string ; url : string } [ ] > = { }
40
+ pages . forEach ( ( page ) => {
41
+ const locale = page . split ( '/' ) [ 0 ]
42
+ const lang = locales [ locale ] ?. lang || defaultLang
43
+
44
+ let url = page . replace ( / ( ^ | \/ ) i n d e x \. m d $ / , '$1' )
45
+ url = url . replace ( / \. m d $ / , siteConfig . cleanUrls ? '' : '.html' )
46
+ if ( filteredLocales . includes ( locale ) ) page = page . slice ( locale . length + 1 )
47
+
48
+ if ( ! groupedPages [ page ] ) groupedPages [ page ] = [ ]
49
+ groupedPages [ page ] . push ( { url, lang } )
50
+ } )
51
+
52
+ const _items = await Promise . all (
53
+ Object . values ( groupedPages ) . map ( async ( pages ) => {
54
+ if ( pages . length < 2 )
55
+ return { url : pages [ 0 ] . url , lastmod : await getLastmod ( pages [ 0 ] . url ) }
56
+
57
+ return await Promise . all (
58
+ pages . map ( async ( { url } ) => {
59
+ return { url, lastmod : await getLastmod ( url ) , links : pages }
60
+ } )
61
+ )
27
62
} )
28
63
)
29
- items = items . sort ( ( a , b ) => a . url . localeCompare ( b . url ) )
64
+
65
+ let items : SitemapItem [ ] = _items . flat ( )
30
66
items = ( await siteConfig . sitemap ?. transformItems ?.( items ) ) || items
31
67
32
68
const sitemapStream = new SitemapStream ( siteConfig . sitemap )
0 commit comments