37 lines
785 B
TypeScript
37 lines
785 B
TypeScript
|
import glob from 'fast-glob'
|
||
|
|
||
|
interface Article {
|
||
|
title: string
|
||
|
description: string
|
||
|
author: string
|
||
|
date: string
|
||
|
}
|
||
|
|
||
|
export interface ArticleWithSlug extends Article {
|
||
|
slug: string
|
||
|
}
|
||
|
|
||
|
async function importArticle(
|
||
|
articleFilename: string,
|
||
|
): Promise<ArticleWithSlug> {
|
||
|
let { article } = (await import(`../app/articles/${articleFilename}`)) as {
|
||
|
default: React.ComponentType
|
||
|
article: Article
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
slug: articleFilename.replace(/(\/page)?\.mdx$/, ''),
|
||
|
...article,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export async function getAllArticles() {
|
||
|
let articleFilenames = await glob('*/page.mdx', {
|
||
|
cwd: './src/app/articles',
|
||
|
})
|
||
|
|
||
|
let articles = await Promise.all(articleFilenames.map(importArticle))
|
||
|
|
||
|
return articles.sort((a, z) => +new Date(z.date) - +new Date(a.date))
|
||
|
}
|