diff --git a/website/components/layout/index.tsx b/website/components/layout/index.tsx new file mode 100644 index 000000000..d8a27fecf --- /dev/null +++ b/website/components/layout/index.tsx @@ -0,0 +1,9 @@ +const Layout = (args) => { + return ( + <> +
{args.children}
+ + ) +} + +export default Layout diff --git a/website/next.config.js b/website/next.config.js index 3a8a89775..305b391cf 100644 --- a/website/next.config.js +++ b/website/next.config.js @@ -1,5 +1,8 @@ const withMDX = require('@next/mdx')({ extension: /\.mdx?$/, + options: { + providerImportSource: '@mdx-js/react', + }, }) /** @type {import('next').NextConfig} */ diff --git a/website/package-lock.json b/website/package-lock.json index c51a61cec..e19ed2127 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -17,6 +17,7 @@ "eslint": "8.27.0", "eslint-config-next": "13.0.2", "next": "13.0.2", + "next-mdx-remote": "^4.2.0", "prettier": "^2.7.1", "react": "18.2.0", "react-dom": "18.2.0", @@ -538,6 +539,11 @@ "@types/unist": "*" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -3713,6 +3719,25 @@ } } }, + "node_modules/next-mdx-remote": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.2.0.tgz", + "integrity": "sha512-X5RhD7f7b78pH2abbuusObSGgII5l54OdusS/2iXljN7WN1cel6ToLlZeCZcyxx9cR4wmBGQYGongIttDYNmAA==", + "dependencies": { + "@mdx-js/mdx": "^2.0.0", + "@mdx-js/react": "^2.0.0", + "vfile": "^5.3.0", + "vfile-matter": "^3.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "peerDependencies": { + "react": ">=16.x <=18.x", + "react-dom": ">=16.x <=18.x" + } + }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -4937,6 +4962,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-matter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", + "integrity": "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==", + "dependencies": { + "@types/js-yaml": "^4.0.0", + "is-buffer": "^2.0.0", + "js-yaml": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vfile-message": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", @@ -5452,6 +5491,11 @@ "@types/unist": "*" } }, + "@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -7657,6 +7701,17 @@ "use-sync-external-store": "1.2.0" } }, + "next-mdx-remote": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/next-mdx-remote/-/next-mdx-remote-4.2.0.tgz", + "integrity": "sha512-X5RhD7f7b78pH2abbuusObSGgII5l54OdusS/2iXljN7WN1cel6ToLlZeCZcyxx9cR4wmBGQYGongIttDYNmAA==", + "requires": { + "@mdx-js/mdx": "^2.0.0", + "@mdx-js/react": "^2.0.0", + "vfile": "^5.3.0", + "vfile-matter": "^3.0.1" + } + }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -8459,6 +8514,16 @@ "vfile": "^5.0.0" } }, + "vfile-matter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", + "integrity": "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==", + "requires": { + "@types/js-yaml": "^4.0.0", + "is-buffer": "^2.0.0", + "js-yaml": "^4.0.0" + } + }, "vfile-message": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", diff --git a/website/package.json b/website/package.json index d18f78b48..bfa881180 100644 --- a/website/package.json +++ b/website/package.json @@ -19,6 +19,7 @@ "eslint": "8.27.0", "eslint-config-next": "13.0.2", "next": "13.0.2", + "next-mdx-remote": "^4.2.0", "prettier": "^2.7.1", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/website/pages/[slug].tsx b/website/pages/[slug].tsx new file mode 100644 index 000000000..915c55de6 --- /dev/null +++ b/website/pages/[slug].tsx @@ -0,0 +1,50 @@ +import type { GetStaticPaths, GetStaticProps } from 'next' +import { serialize } from 'next-mdx-remote/serialize' +import fs from 'fs' +import { MDXRemote, MDXRemoteSerializeResult } from 'next-mdx-remote' +import path from 'path' +import Layout from '../components/layout' + +type PropsPage = { + mdx: MDXRemoteSerializeResult +} + +const PostPage = ({ mdx: mdx }: PropsPage) => { + return ( + + + + ) +} + +export default PostPage + +type ParsedUrlQuery = { + slug: string +} + +export const getStaticPaths: GetStaticPaths = async () => { + return { + paths: fs.readdirSync(path.join('docs')).map((filename) => ({ + params: { + slug: filename.replace('.mdx', ''), + }, + })), + fallback: false, + } +} + +export const getStaticProps: GetStaticProps = async (args) => { + if (!args.params) { + return { notFound: true } + } + return { + props: { + slug: args.params.slug, + mdx: await serialize( + fs.readFileSync(path.join('docs', args.params.slug + '.mdx'), 'utf-8'), + { parseFrontmatter: true } + ), + }, + } +}