11import { defineConfig , HeadConfig } from 'vitepress' ;
22import githubLinksPlugin from './plugins/github-links' ;
3- import { readFileSync } from 'fs' ;
3+ import { readdirSync , readFileSync } from 'fs' ;
44import { resolve } from 'path' ;
5+ import matter from 'gray-matter' ;
56import { tabsMarkdownPlugin } from 'vitepress-plugin-tabs' ;
67import {
78 groupIconMdPlugin ,
@@ -19,6 +20,39 @@ const version = readFileSync(
1920 'utf8'
2021) . trim ( ) ;
2122
23+ // Builds the "/blog/" sidebar from each blog post's frontmatter.
24+ function buildBlogSidebar ( ) {
25+ const blogDir = resolve ( __dirname , '../src/blog' ) ;
26+ const posts = readdirSync ( blogDir )
27+ . filter ( ( file ) => file . endsWith ( '.md' ) && file !== 'index.md' )
28+ . map ( ( file ) => {
29+ const { data : frontmatter } = matter (
30+ readFileSync ( resolve ( blogDir , file ) , 'utf8' )
31+ ) ;
32+ return {
33+ slug : file . replace ( / \. m d $ / , '' ) ,
34+ title : frontmatter . sidebarTitle ?? frontmatter . title ,
35+ date : new Date ( frontmatter . date )
36+ } ;
37+ } )
38+ . sort ( ( a , b ) => b . date . getTime ( ) - a . date . getTime ( ) ) ;
39+
40+ const byYear = new Map < number , { text : string ; link : string } [ ] > ( ) ;
41+ for ( const post of posts ) {
42+ const year = post . date . getFullYear ( ) ;
43+ if ( ! byYear . has ( year ) ) byYear . set ( year , [ ] ) ;
44+ byYear . get ( year ) ! . push ( { text : post . title , link : `/blog/${ post . slug } ` } ) ;
45+ }
46+
47+ return [ ...byYear . entries ( ) ]
48+ . sort ( ( a , b ) => b [ 0 ] - a [ 0 ] )
49+ . map ( ( [ year , items ] ) => ( {
50+ text : String ( year ) ,
51+ collapsed : false ,
52+ items
53+ } ) ) ;
54+ }
55+
2256const urlVersion =
2357 process . env . NODE_ENV === 'development'
2458 ? {
@@ -311,56 +345,7 @@ export default defineConfig({
311345 ] ,
312346
313347 sidebar : {
314- '/blog/' : [
315- {
316- text : '2026' ,
317- collapsed : false ,
318- items : [
319- {
320- text : 'GitHub SOSF' ,
321- link : '/blog/github-secure-open-source-program'
322- } ,
323- {
324- text : 'Using `go tool task`' ,
325- link : '/blog/go-tool-task'
326- } ,
327- {
328- text : 'Conditionals Statements' ,
329- link : '/blog/if-and-variable-prompt'
330- }
331- ]
332- } ,
333- {
334- text : '2025' ,
335- collapsed : false ,
336- items : [
337- {
338- text : 'Built-in Core Utilities' ,
339- link : '/blog/windows-core-utils'
340- }
341- ]
342- } ,
343- {
344- text : '2024' ,
345- collapsed : false ,
346- items : [
347- {
348- text : 'Any Variables' ,
349- link : '/blog/any-variables'
350- }
351- ]
352- } ,
353- {
354- text : '2023' ,
355- collapsed : false ,
356- items : [
357- {
358- text : 'Introducing Experiments' ,
359- link : '/blog/task-in-2023'
360- }
361- ]
362- }
363- ] ,
348+ '/blog/' : buildBlogSidebar ( ) ,
364349 '/' : [
365350 {
366351 text : 'Installation' ,
0 commit comments