| @@ -1,6 +1,8 @@ | ||||
| import { NewsletterAPI } from 'pliny/newsletter' | ||||
| import siteMetadata from '@/data/siteMetadata' | ||||
|  | ||||
| export const dynamic = 'force-static' | ||||
|  | ||||
| const handler = NewsletterAPI({ | ||||
|   // @ts-ignore | ||||
|   provider: siteMetadata.newsletter.provider, | ||||
|   | ||||
| @@ -21,11 +21,10 @@ const layouts = { | ||||
|   PostBanner, | ||||
| } | ||||
|  | ||||
| export async function generateMetadata({ | ||||
|   params, | ||||
| }: { | ||||
|   params: { slug: string[] } | ||||
| export async function generateMetadata(props: { | ||||
|   params: Promise<{ slug: string[] }> | ||||
| }): Promise<Metadata | undefined> { | ||||
|   const params = await props.params | ||||
|   const slug = decodeURI(params.slug.join('/')) | ||||
|   const post = allBlogs.find((p) => p.slug === slug) | ||||
|   const authorList = post?.authors || ['default'] | ||||
| @@ -78,7 +77,8 @@ export const generateStaticParams = async () => { | ||||
|   return allBlogs.map((p) => ({ slug: p.slug.split('/').map((name) => decodeURI(name)) })) | ||||
| } | ||||
|  | ||||
| export default async function Page({ params }: { params: { slug: string[] } }) { | ||||
| export default async function Page(props: { params: Promise<{ slug: string[] }> }) { | ||||
|   const params = await props.params | ||||
|   const slug = decodeURI(params.slug.join('/')) | ||||
|   // Filter out drafts in production | ||||
|   const sortedCoreContents = allCoreContent(sortPosts(allBlogs)) | ||||
|   | ||||
| @@ -11,7 +11,8 @@ export const generateStaticParams = async () => { | ||||
|   return paths | ||||
| } | ||||
|  | ||||
| export default function Page({ params }: { params: { page: string } }) { | ||||
| export default async function Page(props: { params: Promise<{ page: string }> }) { | ||||
|   const params = await props.params | ||||
|   const posts = allCoreContent(sortPosts(allBlogs)) | ||||
|   const pageNumber = parseInt(params.page as string) | ||||
|   const initialDisplayPosts = posts.slice( | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| import { MetadataRoute } from 'next' | ||||
| import siteMetadata from '@/data/siteMetadata' | ||||
|  | ||||
| export const dynamic = 'force-static' | ||||
|  | ||||
| export default function robots(): MetadataRoute.Robots { | ||||
|   return { | ||||
|     rules: { | ||||
|   | ||||
| @@ -2,6 +2,8 @@ import { MetadataRoute } from 'next' | ||||
| import { allBlogs } from 'contentlayer/generated' | ||||
| import siteMetadata from '@/data/siteMetadata' | ||||
|  | ||||
| export const dynamic = 'force-static' | ||||
|  | ||||
| export default function sitemap(): MetadataRoute.Sitemap { | ||||
|   const siteUrl = siteMetadata.siteUrl | ||||
|  | ||||
|   | ||||
| @@ -8,7 +8,10 @@ import { genPageMetadata } from 'app/seo' | ||||
| import { Metadata } from 'next' | ||||
| import { notFound } from 'next/navigation' | ||||
|  | ||||
| export async function generateMetadata({ params }: { params: { tag: string } }): Promise<Metadata> { | ||||
| export async function generateMetadata(props: { | ||||
|   params: Promise<{ tag: string }> | ||||
| }): Promise<Metadata> { | ||||
|   const params = await props.params | ||||
|   const tag = decodeURI(params.tag) | ||||
|   return genPageMetadata({ | ||||
|     title: tag, | ||||
| @@ -31,7 +34,8 @@ export const generateStaticParams = async () => { | ||||
|   return paths | ||||
| } | ||||
|  | ||||
| export default function TagPage({ params }: { params: { tag: string } }) { | ||||
| export default async function TagPage(props: { params: Promise<{ tag: string }> }) { | ||||
|   const params = await props.params | ||||
|   const tag = decodeURI(params.tag) | ||||
|   // Capitalize first letter and convert space to dash | ||||
|   const title = tag[0].toUpperCase() + tag.split(' ').join('-').slice(1) | ||||
|   | ||||
							
								
								
									
										34
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								package.json
									
									
									
									
									
								
							| @@ -12,25 +12,25 @@ | ||||
|     "prepare": "husky" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@headlessui/react": "1.7.19", | ||||
|     "@next/bundle-analyzer": "14.2.3", | ||||
|     "@tailwindcss/forms": "^0.5.7", | ||||
|     "@tailwindcss/typography": "^0.5.12", | ||||
|     "@headlessui/react": "2.2.0", | ||||
|     "@next/bundle-analyzer": "15.0.2", | ||||
|     "@tailwindcss/forms": "^0.5.9", | ||||
|     "@tailwindcss/typography": "^0.5.15", | ||||
|     "autoprefixer": "^10.4.13", | ||||
|     "body-scroll-lock": "^4.0.0-beta.0", | ||||
|     "contentlayer2": "0.5.1", | ||||
|     "contentlayer2": "0.5.3", | ||||
|     "esbuild": "0.20.2", | ||||
|     "github-slugger": "^2.0.0", | ||||
|     "gray-matter": "^4.0.2", | ||||
|     "hast-util-from-html-isomorphic": "^2.0.0", | ||||
|     "image-size": "1.0.0", | ||||
|     "next": "14.2.3", | ||||
|     "next-contentlayer2": "0.5.1", | ||||
|     "next": "15.0.2", | ||||
|     "next-contentlayer2": "0.5.3", | ||||
|     "next-themes": "^0.3.0", | ||||
|     "pliny": "0.2.1", | ||||
|     "pliny": "0.4.0", | ||||
|     "postcss": "^8.4.24", | ||||
|     "react": "18.3.1", | ||||
|     "react-dom": "18.3.1", | ||||
|     "react": "rc", | ||||
|     "react-dom": "rc", | ||||
|     "reading-time": "1.5.0", | ||||
|     "rehype-autolink-headings": "^7.1.0", | ||||
|     "rehype-citation": "^2.0.0", | ||||
| @@ -42,20 +42,20 @@ | ||||
|     "remark-gfm": "^4.0.0", | ||||
|     "remark-github-blockquote-alert": "^1.2.1", | ||||
|     "remark-math": "^6.0.0", | ||||
|     "tailwindcss": "^3.4.3", | ||||
|     "tailwindcss": "^3.4.14", | ||||
|     "unist-util-visit": "^5.0.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@svgr/webpack": "^8.0.1", | ||||
|     "@types/mdx": "^2.0.12", | ||||
|     "@types/react": "^18.2.73", | ||||
|     "@typescript-eslint/eslint-plugin": "^6.1.0", | ||||
|     "@typescript-eslint/parser": "^6.1.0", | ||||
|     "@typescript-eslint/eslint-plugin": "^8.12.0", | ||||
|     "@typescript-eslint/parser": "^8.12.0", | ||||
|     "cross-env": "^7.0.3", | ||||
|     "eslint": "^8.45.0", | ||||
|     "eslint-config-next": "14.2.3", | ||||
|     "eslint-config-prettier": "^8.8.0", | ||||
|     "eslint-plugin-prettier": "^5.0.0", | ||||
|     "eslint": "^9.14.0", | ||||
|     "eslint-config-next": "15.0.2", | ||||
|     "eslint-config-prettier": "^9.1.0", | ||||
|     "eslint-plugin-prettier": "^5.2.0", | ||||
|     "husky": "^9.0.0", | ||||
|     "lint-staged": "^13.0.0", | ||||
|     "prettier": "^3.0.0", | ||||
|   | ||||
| @@ -47,9 +47,7 @@ async function generateRSS(config, allBlogs, page = 'feed.xml') { | ||||
|  | ||||
|   if (publishPosts.length > 0) { | ||||
|     for (const tag of Object.keys(tagData)) { | ||||
|       const filteredPosts = allBlogs.filter((post) => | ||||
|         post.tags.map((t) => slug(t)).includes(tag) | ||||
|       ) | ||||
|       const filteredPosts = allBlogs.filter((post) => post.tags.map((t) => slug(t)).includes(tag)) | ||||
|       const rss = generateRss(config, filteredPosts, `tags/${tag}/${page}`) | ||||
|       const rssPath = path.join(outputFolder, 'tags', tag) | ||||
|       mkdirSync(rssPath, { recursive: true }) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user