diff --git a/app/apple-icon.jpg b/app/apple-icon.jpg new file mode 100644 index 0000000..f006174 Binary files /dev/null and b/app/apple-icon.jpg differ diff --git a/app/article/[[...categories]]/page.tsx b/app/article/[[...categories]]/page.tsx index 83750c7..6a2e25e 100644 --- a/app/article/[[...categories]]/page.tsx +++ b/app/article/[[...categories]]/page.tsx @@ -3,6 +3,7 @@ import { ArticleCard } from '~/components/Post/ArticleCard/index.tsx'; import { getPostsMetadata } from '~/lib/post.ts'; import styles from './page.module.css'; import type { FC } from 'react'; +import type { Metadata } from 'next'; type CategoriesParams = { categories?: string[]; @@ -43,6 +44,17 @@ export const generateStaticParams = () => { return params; }; +export const generateMetadata = async ({ + params, +}: PageProps): Promise => { + const currentCategories = (await params).categories || []; + + return { + title: `Articles${currentCategories.length > 0 ? ` - ${currentCategories.join(', ')}` : ''}`, + description: 'Here you can find all the articles available on the website.', + }; +}; + const Page: FC = async ({ params }) => { const currentCategories = (await params).categories || []; const postsMetadata = await getPostsMetadata(currentCategories[0]); diff --git a/app/article/post/[article]/page.tsx b/app/article/post/[article]/page.tsx index 6e7c695..11d4887 100644 --- a/app/article/post/[article]/page.tsx +++ b/app/article/post/[article]/page.tsx @@ -4,6 +4,7 @@ import { getAllPosts } from '~/lib/post.ts'; import { ArticleHeader } from '~/components/Post/ArticleHeader/index.tsx'; import styles from './page.module.css'; import type { FC } from 'react'; +import type { Metadata } from 'next'; import type { PostFrontmatter } from '~/types/frontmatter'; import '~/styles/markdown.css'; @@ -24,6 +25,24 @@ export async function generateStaticParams() { }); } +export async function generateMetadata({ + params, +}: PageProps): Promise { + const article = (await params).article; + const slugs = ['post', article]; + + const mdxResult = await getContent(slugs); + + if (!mdxResult) notFound(); + + const { frontmatter } = mdxResult; + + return { + title: frontmatter.title, + description: frontmatter.description, + }; +} + const Page: FC = async ({ params }) => { const article = (await params).article; const slugs = ['post', article]; diff --git a/app/icon.svg b/app/icon.svg new file mode 100644 index 0000000..2710636 --- /dev/null +++ b/app/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/layout.tsx b/app/layout.tsx index 55a2fe7..1e9332a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,8 +3,14 @@ import { GeistSans } from 'geist/font/sans'; import { GeistMono } from 'geist/font/mono'; import { Header } from '~/components/Sections/Header/index.tsx'; import type { FC, PropsWithChildren } from 'react'; +import type { Metadata } from 'next'; import '~/styles/globals.css'; +const metadata: Metadata = { + title: 'Nodejs-Loaders', + description: 'A collection of loaders for Node.js', +}; + const RootLayout: FC = ({ children }) => ( @@ -14,4 +20,5 @@ const RootLayout: FC = ({ children }) => ( ); +export { metadata }; export default RootLayout; diff --git a/app/page.tsx b/app/page.tsx index 13a66b2..eba8938 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,5 @@ import { Hero } from '~/components/Landing/Hero/index.tsx'; -import { LatestArticleSection } from '~/components/Landing/LatestArticleSection/index.tsx'; +import { LatestArticleSection } from '~/components/Landing/LastestArticleSection/index.tsx'; import type { FC } from 'react'; const Page: FC = () => ( diff --git a/package-lock.json b/package-lock.json index 0ca0a44..0e4151f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "dependencies": { "@radix-ui/react-avatar": "~1.1.2", "classnames": "~2.5.1", - "next": "15.1.6", + "next": "15.1.7", "next-mdx-remote": "~5.0.0", "react": "19.0.0", "react-dom": "19.0.0" @@ -20,7 +20,7 @@ "@nodejs-loaders/css-module": "1.0.1", "@nodejs-loaders/tsx": "1.0.2", "@testing-library/react": "~16.2.0", - "@types/node": "~22.12.0", + "@types/node": "~22.13.1", "@types/react": "~19.0.8", "@types/react-dom": "~19.0.3", "autoprefixer": "~10.4.20", @@ -1290,15 +1290,15 @@ } }, "node_modules/@next/env": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.6.tgz", - "integrity": "sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.7.tgz", + "integrity": "sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.6.tgz", - "integrity": "sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.7.tgz", + "integrity": "sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==", "cpu": [ "arm64" ], @@ -1312,9 +1312,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.6.tgz", - "integrity": "sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.7.tgz", + "integrity": "sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==", "cpu": [ "x64" ], @@ -1328,9 +1328,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.6.tgz", - "integrity": "sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.7.tgz", + "integrity": "sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==", "cpu": [ "arm64" ], @@ -1344,9 +1344,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.6.tgz", - "integrity": "sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.7.tgz", + "integrity": "sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==", "cpu": [ "arm64" ], @@ -1360,9 +1360,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.6.tgz", - "integrity": "sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.7.tgz", + "integrity": "sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==", "cpu": [ "x64" ], @@ -1376,9 +1376,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.6.tgz", - "integrity": "sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.7.tgz", + "integrity": "sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==", "cpu": [ "x64" ], @@ -1392,9 +1392,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.6.tgz", - "integrity": "sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.7.tgz", + "integrity": "sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==", "cpu": [ "arm64" ], @@ -1408,9 +1408,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.6.tgz", - "integrity": "sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.7.tgz", + "integrity": "sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==", "cpu": [ "x64" ], @@ -1822,9 +1822,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", - "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "version": "22.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", + "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -4723,12 +4723,12 @@ } }, "node_modules/next": { - "version": "15.1.6", - "resolved": "https://registry.npmjs.org/next/-/next-15.1.6.tgz", - "integrity": "sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==", + "version": "15.1.7", + "resolved": "https://registry.npmjs.org/next/-/next-15.1.7.tgz", + "integrity": "sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==", "license": "MIT", "dependencies": { - "@next/env": "15.1.6", + "@next/env": "15.1.7", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", @@ -4743,14 +4743,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.1.6", - "@next/swc-darwin-x64": "15.1.6", - "@next/swc-linux-arm64-gnu": "15.1.6", - "@next/swc-linux-arm64-musl": "15.1.6", - "@next/swc-linux-x64-gnu": "15.1.6", - "@next/swc-linux-x64-musl": "15.1.6", - "@next/swc-win32-arm64-msvc": "15.1.6", - "@next/swc-win32-x64-msvc": "15.1.6", + "@next/swc-darwin-arm64": "15.1.7", + "@next/swc-darwin-x64": "15.1.7", + "@next/swc-linux-arm64-gnu": "15.1.7", + "@next/swc-linux-arm64-musl": "15.1.7", + "@next/swc-linux-x64-gnu": "15.1.7", + "@next/swc-linux-x64-musl": "15.1.7", + "@next/swc-win32-arm64-msvc": "15.1.7", + "@next/swc-win32-x64-msvc": "15.1.7", "sharp": "^0.33.5" }, "peerDependencies": { diff --git a/package.json b/package.json index fb80442..e4ff160 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "@radix-ui/react-avatar": "~1.1.2", "classnames": "~2.5.1", - "next": "15.1.6", + "next": "15.1.7", "next-mdx-remote": "~5.0.0", "react": "19.0.0", "react-dom": "19.0.0" @@ -33,7 +33,7 @@ "@nodejs-loaders/css-module": "1.0.1", "@nodejs-loaders/tsx": "1.0.2", "@testing-library/react": "~16.2.0", - "@types/node": "~22.12.0", + "@types/node": "~22.13.1", "@types/react": "~19.0.8", "@types/react-dom": "~19.0.3", "autoprefixer": "~10.4.20",