diff --git a/.eslintrc.json b/.eslintrc.json
index b52d0e9..7bc2c7b 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -78,7 +78,8 @@
{
"cases": {
"camelCase": true,
- "pascalCase": true
+ "pascalCase": true,
+ "kebabCase": true
}
}
]
diff --git a/_posts/another-example.md b/_posts/another-example.md
new file mode 100644
index 0000000..281bbfb
--- /dev/null
+++ b/_posts/another-example.md
@@ -0,0 +1,27 @@
+---
+title: Another example
+description: A very small example of a blog post with a title and a description.
+date: '2022-01-17'
+coverImage: '/blog/coverdefault.png'
+author:
+ name: 'Michael B'
+ picture: '/blog/author/Avatar1.svg'
+ogImage:
+ url: '/blog/Blog.png'
+---
+
+## A header
+
+This is a small example of a blog post.
+Can you make it bigger?
+I'm sure you can!
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id pulvinar velit, ut dignissim nibh. Nullam commodo pharetra sem. Donec in erat diam. Donec efficitur arcu sagittis felis vulputate feugiat in in enim. Sed ultricies tincidunt eros, et mattis erat hendrerit nec. Cras congue nec augue non imperdiet. Proin tincidunt luctus erat sit amet lobortis. Sed urna erat, ornare vel suscipit id, pharetra vel elit.
+
+Suspendisse fringilla sit amet lorem nec semper. Curabitur aliquet ultrices rhoncus. Morbi facilisis, nibh eu dapibus maximus, lectus ante porttitor ante, quis dictum ipsum dui in velit. Pellentesque sapien enim, laoreet eu aliquam non, pellentesque in dui. Curabitur tristique magna lacus, ac pulvinar ex aliquam luctus. Etiam volutpat faucibus purus. Integer non euismod diam. Nam tincidunt vulputate nulla, a porta est accumsan non. Morbi et suscipit arcu. Cras placerat turpis eu mauris placerat, quis commodo ipsum iaculis. Vivamus turpis diam, posuere id ligula a, rhoncus volutpat risus. Fusce accumsan magna vitae odio molestie ultrices. Donec efficitur tellus ut leo posuere, vitae porttitor ipsum consectetur. Mauris tempor odio non laoreet luctus. Curabitur finibus vestibulum justo nec auctor.
+
+## A second header
+
+Integer egestas nulla non ultricies ultricies. Nulla et ultrices odio. Etiam eget tempor ipsum. Pellentesque sit amet commodo est. Praesent tincidunt faucibus orci. Proin at aliquet orci. Sed eget ultrices ligula. Maecenas bibendum, leo quis suscipit posuere, tellus libero maximus nibh, vel bibendum eros leo non nulla. Proin quis gravida leo. Cras efficitur mi congue lacus viverra placerat quis in leo. Nam faucibus est sollicitudin, suscipit erat ac, ultrices metus. Fusce sagittis vulputate turpis eget laoreet.
+
+### A smaller header
diff --git a/_posts/example-post.md b/_posts/example-post.md
new file mode 100644
index 0000000..eae9b55
--- /dev/null
+++ b/_posts/example-post.md
@@ -0,0 +1,27 @@
+---
+title: A small example
+description: A very small example
+date: '2022-01-17'
+author:
+ name: Michael B
+ picture: '/blog/author/Avatar1.svg'
+coverImage: '/blog/coverdefault.png'
+ogImage:
+ url: '/blog/Blog.png'
+---
+
+## A header
+
+This is a small example of a blog post.
+Can you make it bigger?
+I'm sure you can!
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id pulvinar velit, ut dignissim nibh. Nullam commodo pharetra sem. Donec in erat diam. Donec efficitur arcu sagittis felis vulputate feugiat in in enim. Sed ultricies tincidunt eros, et mattis erat hendrerit nec. Cras congue nec augue non imperdiet. Proin tincidunt luctus erat sit amet lobortis. Sed urna erat, ornare vel suscipit id, pharetra vel elit.
+
+Suspendisse fringilla sit amet lorem nec semper. Curabitur aliquet ultrices rhoncus. Morbi facilisis, nibh eu dapibus maximus, lectus ante porttitor ante, quis dictum ipsum dui in velit. Pellentesque sapien enim, laoreet eu aliquam non, pellentesque in dui. Curabitur tristique magna lacus, ac pulvinar ex aliquam luctus. Etiam volutpat faucibus purus. Integer non euismod diam. Nam tincidunt vulputate nulla, a porta est accumsan non. Morbi et suscipit arcu. Cras placerat turpis eu mauris placerat, quis commodo ipsum iaculis. Vivamus turpis diam, posuere id ligula a, rhoncus volutpat risus. Fusce accumsan magna vitae odio molestie ultrices. Donec efficitur tellus ut leo posuere, vitae porttitor ipsum consectetur. Mauris tempor odio non laoreet luctus. Curabitur finibus vestibulum justo nec auctor.
+
+## A second header
+
+Integer egestas nulla non ultricies ultricies. Nulla et ultrices odio. Etiam eget tempor ipsum. Pellentesque sit amet commodo est. Praesent tincidunt faucibus orci. Proin at aliquet orci. Sed eget ultrices ligula. Maecenas bibendum, leo quis suscipit posuere, tellus libero maximus nibh, vel bibendum eros leo non nulla. Proin quis gravida leo. Cras efficitur mi congue lacus viverra placerat quis in leo. Nam faucibus est sollicitudin, suscipit erat ac, ultrices metus. Fusce sagittis vulputate turpis eget laoreet.
+
+### A smaller header
diff --git a/_posts/lorem-ipsum1.md b/_posts/lorem-ipsum1.md
new file mode 100644
index 0000000..fd77deb
--- /dev/null
+++ b/_posts/lorem-ipsum1.md
@@ -0,0 +1,27 @@
+---
+title: Lorem Ipsum 1
+description: A very small example
+date: '2022-01-17'
+author:
+ name: Michael B
+ picture: '/blog/author/Avatar1.svg'
+coverImage: '/cardServer.svg'
+ogImage:
+ url: '/blog/Blog.png'
+---
+
+## A header
+
+This is a small example of a blog post.
+Can you make it bigger?
+I'm sure you can!
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id pulvinar velit, ut dignissim nibh. Nullam commodo pharetra sem. Donec in erat diam. Donec efficitur arcu sagittis felis vulputate feugiat in in enim. Sed ultricies tincidunt eros, et mattis erat hendrerit nec. Cras congue nec augue non imperdiet. Proin tincidunt luctus erat sit amet lobortis. Sed urna erat, ornare vel suscipit id, pharetra vel elit.
+
+Suspendisse fringilla sit amet lorem nec semper. Curabitur aliquet ultrices rhoncus. Morbi facilisis, nibh eu dapibus maximus, lectus ante porttitor ante, quis dictum ipsum dui in velit. Pellentesque sapien enim, laoreet eu aliquam non, pellentesque in dui. Curabitur tristique magna lacus, ac pulvinar ex aliquam luctus. Etiam volutpat faucibus purus. Integer non euismod diam. Nam tincidunt vulputate nulla, a porta est accumsan non. Morbi et suscipit arcu. Cras placerat turpis eu mauris placerat, quis commodo ipsum iaculis. Vivamus turpis diam, posuere id ligula a, rhoncus volutpat risus. Fusce accumsan magna vitae odio molestie ultrices. Donec efficitur tellus ut leo posuere, vitae porttitor ipsum consectetur. Mauris tempor odio non laoreet luctus. Curabitur finibus vestibulum justo nec auctor.
+
+## A second header
+
+Integer egestas nulla non ultricies ultricies. Nulla et ultrices odio. Etiam eget tempor ipsum. Pellentesque sit amet commodo est. Praesent tincidunt faucibus orci. Proin at aliquet orci. Sed eget ultrices ligula. Maecenas bibendum, leo quis suscipit posuere, tellus libero maximus nibh, vel bibendum eros leo non nulla. Proin quis gravida leo. Cras efficitur mi congue lacus viverra placerat quis in leo. Nam faucibus est sollicitudin, suscipit erat ac, ultrices metus. Fusce sagittis vulputate turpis eget laoreet.
+
+### A smaller header
diff --git a/components/Blog.tsx b/components/Blog.tsx
new file mode 100644
index 0000000..7acb6fb
--- /dev/null
+++ b/components/Blog.tsx
@@ -0,0 +1,44 @@
+/* eslint-disable unicorn/prevent-abbreviations */
+
+import { format, parseISO } from 'date-fns';
+
+import Link from 'next/link';
+import PostType from 'types/post';
+import React from 'react';
+
+type Properties = {
+ posts: PostType[];
+};
+
+const Blog = (props: Properties): JSX.Element => {
+ const { posts } = props;
+
+ return (
+
+
Welcome on the SupaNexTail blog
+
+ {posts.map((post) => (
+
+
+ {post.date && format(parseISO(post.date), 'MMMM dd, yyyy')}
+
+
+ {post.description}
+
+
+ Read More
+
+
+
+ ))}
+
+ );
+};
+
+export default Blog;
diff --git a/components/blog/avatar.tsx b/components/blog/avatar.tsx
new file mode 100644
index 0000000..cf0057f
--- /dev/null
+++ b/components/blog/avatar.tsx
@@ -0,0 +1,23 @@
+import Image from 'next/image';
+
+type Properties = {
+ name: string;
+ picture: string;
+};
+
+const Avatar = ({ name, picture }: Properties): JSX.Element => {
+ return (
+
+ );
+};
+
+export default Avatar;
diff --git a/components/blog/container.tsx b/components/blog/container.tsx
new file mode 100644
index 0000000..c5c11a0
--- /dev/null
+++ b/components/blog/container.tsx
@@ -0,0 +1,11 @@
+import { FunctionComponent, ReactNode } from 'react';
+
+type Properties = {
+ children?: ReactNode;
+};
+
+const Container: FunctionComponent = ({ children }: Properties) => {
+ return {children}
;
+};
+
+export default Container;
diff --git a/components/blog/cover-image.tsx b/components/blog/cover-image.tsx
new file mode 100644
index 0000000..81bda02
--- /dev/null
+++ b/components/blog/cover-image.tsx
@@ -0,0 +1,33 @@
+import Image from 'next/image';
+import Link from 'next/link';
+
+type Properties = {
+ title: string;
+ src: string;
+ slug?: string;
+};
+
+const CoverImage = ({ title, src, slug }: Properties): JSX.Element => {
+ const image = (
+
+ );
+ return (
+
+ {slug ? (
+
+
{image}
+
+ ) : (
+ image
+ )}
+
+ );
+};
+
+export default CoverImage;
diff --git a/components/blog/date-formatter.tsx b/components/blog/date-formatter.tsx
new file mode 100644
index 0000000..df75bcc
--- /dev/null
+++ b/components/blog/date-formatter.tsx
@@ -0,0 +1,12 @@
+import { format, parseISO } from 'date-fns';
+
+type Properties = {
+ dateString: string;
+};
+
+const DateFormatter = ({ dateString }: Properties): JSX.Element => {
+ const date = parseISO(dateString);
+ return {format(date, 'LLLL d, yyyy')} ;
+};
+
+export default DateFormatter;
diff --git a/components/blog/header.tsx b/components/blog/header.tsx
new file mode 100644
index 0000000..5e690c5
--- /dev/null
+++ b/components/blog/header.tsx
@@ -0,0 +1,13 @@
+import Link from 'next/link';
+
+const Header = (): JSX.Element => {
+ return (
+
+ );
+};
+
+export default Header;
diff --git a/components/blog/hero-post.tsx b/components/blog/hero-post.tsx
new file mode 100644
index 0000000..a6b2a88
--- /dev/null
+++ b/components/blog/hero-post.tsx
@@ -0,0 +1,49 @@
+import Author from 'types/author';
+import Avatar from './avatar';
+import CoverImage from './cover-image';
+import DateFormatter from './date-formatter';
+import Link from 'next/link';
+
+type Properties = {
+ title: string;
+ coverImage: string;
+ date: string;
+ excerpt: string;
+ author: Author;
+ slug: string;
+};
+
+const HeroPost = ({
+ title,
+ coverImage,
+ date,
+ excerpt,
+ author,
+ slug,
+}: Properties): JSX.Element => {
+ return (
+
+ );
+};
+
+export default HeroPost;
diff --git a/components/blog/more-stories.tsx b/components/blog/more-stories.tsx
new file mode 100644
index 0000000..38fd6cd
--- /dev/null
+++ b/components/blog/more-stories.tsx
@@ -0,0 +1,34 @@
+import Post from 'types/post';
+import PostPreview from './post-preview';
+
+type Properties = {
+ posts: Post[];
+};
+
+const MoreStories = ({ posts }: Properties): JSX.Element => {
+ return (
+
+
+ More Stories
+
+
+ {posts.map(
+ (post) =>
+ post && (
+
+ )
+ )}
+
+
+ );
+};
+
+export default MoreStories;
diff --git a/components/blog/post-body.tsx b/components/blog/post-body.tsx
new file mode 100644
index 0000000..31e416d
--- /dev/null
+++ b/components/blog/post-body.tsx
@@ -0,0 +1,13 @@
+type Properties = {
+ content: string;
+};
+
+const PostBody = ({ content }: Properties): JSX.Element => {
+ return (
+
+ );
+};
+
+export default PostBody;
diff --git a/components/blog/post-header.tsx b/components/blog/post-header.tsx
new file mode 100644
index 0000000..3b03eb6
--- /dev/null
+++ b/components/blog/post-header.tsx
@@ -0,0 +1,41 @@
+import Author from 'types/author';
+import Avatar from './avatar';
+import CoverImage from './cover-image';
+import DateFormatter from './date-formatter';
+import PostTitle from './post-title';
+
+type Properties = {
+ title: string;
+ coverImage: string;
+ date: string;
+ author: Author;
+};
+
+const PostHeader = ({
+ title,
+ coverImage,
+ date,
+ author,
+}: Properties): JSX.Element => {
+ return (
+ <>
+ {title}
+
+
+
+
+
+ >
+ );
+};
+
+export default PostHeader;
diff --git a/components/blog/post-preview.tsx b/components/blog/post-preview.tsx
new file mode 100644
index 0000000..2028c9b
--- /dev/null
+++ b/components/blog/post-preview.tsx
@@ -0,0 +1,43 @@
+import Author from 'types/author';
+import Avatar from './avatar';
+import CoverImage from './cover-image';
+import DateFormatter from './date-formatter';
+import Link from 'next/link';
+
+type Properties = {
+ title: string;
+ coverImage: string;
+ date: string;
+ excerpt: string;
+ author: Author;
+ slug: string;
+};
+
+const PostPreview = ({
+ title,
+ coverImage,
+ date,
+ excerpt,
+ author,
+ slug,
+}: Properties): JSX.Element => {
+ return (
+
+
+
+
+
+
+
+
+
{excerpt}
+
+
+ );
+};
+
+export default PostPreview;
diff --git a/components/blog/post-title.tsx b/components/blog/post-title.tsx
new file mode 100644
index 0000000..0c3af42
--- /dev/null
+++ b/components/blog/post-title.tsx
@@ -0,0 +1,15 @@
+import { ReactNode } from 'react';
+
+type Properties = {
+ children?: ReactNode;
+};
+
+const PostTitle = ({ children }: Properties): JSX.Element => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default PostTitle;
diff --git a/components/blog/section-separator.tsx b/components/blog/section-separator.tsx
new file mode 100644
index 0000000..1a333af
--- /dev/null
+++ b/components/blog/section-separator.tsx
@@ -0,0 +1,5 @@
+const SectionSeparator = (): JSX.Element => {
+ return ;
+};
+
+export default SectionSeparator;
diff --git a/lib/api.ts b/lib/api.ts
new file mode 100644
index 0000000..be2edfd
--- /dev/null
+++ b/lib/api.ts
@@ -0,0 +1,47 @@
+import fs from 'fs'
+import { join } from 'path'
+import matter from 'gray-matter'
+
+const postsDirectory = join(process.cwd(), '_posts')
+
+export function getPostSlugs() {
+ return fs.readdirSync(postsDirectory)
+}
+
+export function getPostBySlug(slug: string, fields: string[] = []) {
+ const realSlug = slug.replace(/\.md$/, '')
+ const fullPath = join(postsDirectory, `${realSlug}.md`)
+ const fileContents = fs.readFileSync(fullPath, 'utf8')
+ const { data, content } = matter(fileContents)
+
+ type Items = {
+ [key: string]: string
+ }
+
+ const items: Items = {}
+
+ // Ensure only the minimal needed data is exposed
+ fields.forEach((field) => {
+ if (field === 'slug') {
+ items[field] = realSlug
+ }
+ if (field === 'content') {
+ items[field] = content
+ }
+
+ if (typeof data[field] !== 'undefined') {
+ items[field] = data[field]
+ }
+ })
+
+ return items
+}
+
+export function getAllPosts(fields: string[] = []) {
+ const slugs = getPostSlugs()
+ const posts = slugs
+ .map((slug) => getPostBySlug(slug, fields))
+ // sort posts by date in descending order
+ .sort((post1, post2) => (post1.date > post2.date ? -1 : 1))
+ return posts
+}
diff --git a/lib/markdownToHtml.ts b/lib/markdownToHtml.ts
new file mode 100644
index 0000000..857577f
--- /dev/null
+++ b/lib/markdownToHtml.ts
@@ -0,0 +1,7 @@
+import html from 'remark-html';
+import { remark } from 'remark';
+
+export default async function markdownToHtml(markdown: string) {
+ const result = await remark().use(html).process(markdown);
+ return result.toString();
+}
diff --git a/package.json b/package.json
index a3b7c57..84f3d5b 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,9 @@
"axios": "^0.24.0",
"cors": "^2.8.5",
"daisyui": "^1.20.0",
+ "date-fns": "^2.28.0",
"express-rate-limit": "^6.0.1",
+ "gray-matter": "^4.0.3",
"micro": "^9.3.4",
"next": ">=12.0.7",
"next-seo": "^4.28.1",
@@ -30,6 +32,8 @@
"react-feather": "^2.0.9",
"react-icons": "^4.3.1",
"react-toastify": "^8.1.0",
+ "remark": "^14.0.2",
+ "remark-html": "^15.0.1",
"stripe": "^8.195.0"
},
"devDependencies": {
diff --git a/pages/blog.tsx b/pages/blog.tsx
new file mode 100644
index 0000000..f860cd5
--- /dev/null
+++ b/pages/blog.tsx
@@ -0,0 +1,59 @@
+import Container from 'components/blog/container';
+import { GetStaticProps } from 'next/types';
+import Head from 'next/head';
+import HeroPost from 'components/blog/hero-post';
+import Layout from 'components/Layout';
+import MoreStories from 'components/blog/more-stories';
+import Post from '../types/post';
+import { getAllPosts } from '../lib/api';
+
+type Properties = {
+ allPosts: Post[];
+};
+
+const Index = ({ allPosts }: Properties) => {
+ const heroPost = allPosts[0];
+ const morePosts = allPosts.slice(1);
+ return (
+
+ <>
+
+ {`${
+ process.env.NEXT_PUBLIC_TITLE ? process.env.NEXT_PUBLIC_TITLE : ''
+ } | Blog`}
+
+
+ {heroPost && (
+
+ )}
+ {morePosts.length > 0 && }
+
+ >
+
+ );
+};
+
+export default Index;
+
+// eslint-disable-next-line unicorn/prevent-abbreviations
+export const getStaticProps = (): GetStaticProps => {
+ const allPosts = getAllPosts([
+ 'title',
+ 'date',
+ 'slug',
+ 'author',
+ 'coverImage',
+ 'excerpt',
+ ]);
+
+ return {
+ props: { allPosts },
+ };
+};
diff --git a/pages/blog/[slug].tsx b/pages/blog/[slug].tsx
new file mode 100644
index 0000000..627957d
--- /dev/null
+++ b/pages/blog/[slug].tsx
@@ -0,0 +1,100 @@
+import { getAllPosts, getPostBySlug } from 'lib/api';
+
+import Container from 'components/blog/container';
+import ErrorPage from 'next/error';
+import Head from 'next/head';
+import Header from 'components/blog/header';
+import Layout from 'components/Layout';
+import PostBody from 'components/blog/post-body';
+import PostHeader from 'components/blog/post-header';
+import PostTitle from 'components/blog/post-title';
+import PostType from 'types/post';
+import markdownToHtml from 'lib/markdownToHtml';
+import { useRouter } from 'next/router';
+
+type Props = {
+ post: PostType;
+ morePosts: PostType[];
+ preview?: boolean;
+};
+
+const Post = ({ post, morePosts, preview }: Props) => {
+ const router = useRouter();
+ if (!router.isFallback && !post?.slug) {
+ return ;
+ }
+ return (
+
+
+ {router.isFallback ? (
+ Loading…
+ ) : (
+ <>
+
+
+
+ {post.title} | Next.js Blog Example with{' '}
+ {process.env.NEXT_PUBLIC_TITLE}
+
+
+
+
+
+
+
+ >
+ )}
+
+
+ );
+};
+
+export default Post;
+
+type Params = {
+ params: {
+ slug: string;
+ };
+};
+
+export async function getStaticProps({ params }: Params) {
+ const post = getPostBySlug(params.slug, [
+ 'title',
+ 'date',
+ 'slug',
+ 'author',
+ 'content',
+ 'ogImage',
+ 'coverImage',
+ ]);
+ const content = await markdownToHtml(post.content || '');
+
+ return {
+ props: {
+ post: {
+ ...post,
+ content,
+ },
+ },
+ };
+}
+
+export async function getStaticPaths() {
+ const posts = getAllPosts(['slug']);
+
+ return {
+ paths: posts.map((post) => {
+ return {
+ params: {
+ slug: post.slug,
+ },
+ };
+ }),
+ fallback: false,
+ };
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d8137da..3e9ccda 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -19,6 +19,7 @@ specifiers:
axios: ^0.24.0
cors: ^2.8.5
daisyui: ^1.20.0
+ date-fns: ^2.28.0
eslint: ^8.5.0
eslint-config-airbnb: ^19.0.4
eslint-config-next: ^12.0.7
@@ -34,6 +35,7 @@ specifiers:
eslint-plugin-sonarjs: ^0.11.0
eslint-plugin-unicorn: ^40.0.0
express-rate-limit: ^6.0.1
+ gray-matter: ^4.0.3
micro: ^9.3.4
next: '>=12.0.7'
next-seo: ^4.28.1
@@ -44,6 +46,8 @@ specifiers:
react-feather: ^2.0.9
react-icons: ^4.3.1
react-toastify: ^8.1.0
+ remark: ^14.0.2
+ remark-html: ^15.0.1
stripe: ^8.195.0
tailwindcss: ^3.0.7
typescript: ^4.5.4
@@ -59,7 +63,9 @@ dependencies:
axios: 0.24.0
cors: 2.8.5
daisyui: 1.20.0
+ date-fns: 2.28.0
express-rate-limit: 6.0.1
+ gray-matter: 4.0.3
micro: 9.3.4
next: 12.0.7_react-dom@17.0.2+react@17.0.2
next-seo: 4.28.1_d837ce8f3acb2f60f8b7454672a9bcea
@@ -68,6 +74,8 @@ dependencies:
react-feather: 2.0.9_react@17.0.2
react-icons: 4.3.1_react@17.0.2
react-toastify: 8.1.0_react-dom@17.0.2+react@17.0.2
+ remark: 14.0.2
+ remark-html: 15.0.1
stripe: 8.195.0
devDependencies:
@@ -1034,6 +1042,12 @@ packages:
resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==}
dev: true
+ /@types/debug/4.1.7:
+ resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==}
+ dependencies:
+ '@types/ms': 0.7.31
+ dev: false
+
/@types/engine.io/3.1.7:
resolution: {integrity: sha512-qNjVXcrp+1sS8YpRUa714r0pgzOwESdW5UjHL7D/2ZFdBX0BXUXtg1LUrp+ylvqbvMcMWUy73YpRoxPN2VoKAQ==}
dependencies:
@@ -1063,6 +1077,12 @@ packages:
'@types/serve-static': 1.13.10
dev: true
+ /@types/hast/2.3.4:
+ resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==}
+ dependencies:
+ '@types/unist': 2.0.6
+ dev: false
+
/@types/istanbul-lib-coverage/2.0.3:
resolution: {integrity: sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==}
dev: true
@@ -1087,6 +1107,16 @@ packages:
resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=}
dev: true
+ /@types/mdast/3.0.10:
+ resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==}
+ dependencies:
+ '@types/unist': 2.0.6
+ dev: false
+
+ /@types/mdurl/1.0.2:
+ resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
+ dev: false
+
/@types/micro/7.3.6:
resolution: {integrity: sha512-rZHvZ3+Ev3cGJJSy/wtSiXZmafU8guI07PHXf4ku9sQLfDuFALHMCiV+LuH4VOaeMMMnRs8nqxU392gxfn661g==}
dependencies:
@@ -1100,6 +1130,10 @@ packages:
resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==}
dev: true
+ /@types/ms/0.7.31:
+ resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
+ dev: false
+
/@types/node/17.0.4:
resolution: {integrity: sha512-6xwbrW4JJiJLgF+zNypN5wr2ykM9/jHcL7rQ8fZe2vuftggjzZeRSM4OwRc6Xk8qWjwJ99qVHo/JgOGmomWRog==}
@@ -1168,6 +1202,10 @@ packages:
resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
dev: true
+ /@types/unist/2.0.6:
+ resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
+ dev: false
+
/@types/websocket/1.0.4:
resolution: {integrity: sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==}
dependencies:
@@ -1441,6 +1479,12 @@ packages:
resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==}
dev: true
+ /argparse/1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: false
+
/argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
@@ -1561,6 +1605,10 @@ packages:
object.assign: 4.1.2
dev: true
+ /bail/2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+ dev: false
+
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
@@ -1742,6 +1790,10 @@ packages:
/caniuse-lite/1.0.30001279:
resolution: {integrity: sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==}
+ /ccount/2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+ dev: false
+
/chalk/2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
engines: {node: '>=4'}
@@ -1766,6 +1818,18 @@ packages:
supports-color: 7.2.0
dev: true
+ /character-entities-html4/2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+ dev: false
+
+ /character-entities-legacy/3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+ dev: false
+
+ /character-entities/2.0.1:
+ resolution: {integrity: sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ==}
+ dev: false
+
/chokidar/3.5.1:
resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==}
engines: {node: '>= 8.10.0'}
@@ -1849,6 +1913,10 @@ packages:
engines: {node: '>=0.1.90'}
dev: true
+ /comma-separated-tokens/2.0.2:
+ resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==}
+ dev: false
+
/commander/8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
engines: {node: '>= 12'}
@@ -2024,6 +2092,11 @@ packages:
engines: {node: '>= 6'}
dev: false
+ /date-fns/2.28.0:
+ resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==}
+ engines: {node: '>=0.11'}
+ dev: false
+
/debug/2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
dependencies:
@@ -2045,7 +2118,12 @@ packages:
optional: true
dependencies:
ms: 2.1.2
- dev: true
+
+ /decode-named-character-reference/1.0.1:
+ resolution: {integrity: sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w==}
+ dependencies:
+ character-entities: 2.0.1
+ dev: false
/deep-is/0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
@@ -2081,6 +2159,11 @@ packages:
engines: {node: '>= 0.6'}
dev: false
+ /dequal/2.0.2:
+ resolution: {integrity: sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==}
+ engines: {node: '>=6'}
+ dev: false
+
/des.js/1.0.1:
resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==}
dependencies:
@@ -2107,6 +2190,11 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dev: true
+ /diff/5.0.0:
+ resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
+ engines: {node: '>=0.3.1'}
+ dev: false
+
/diffie-hellman/5.0.3:
resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
dependencies:
@@ -2618,6 +2706,12 @@ packages:
eslint-visitor-keys: 3.1.0
dev: true
+ /esprima/4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
/esquery/1.4.0:
resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
engines: {node: '>=0.10'}
@@ -2689,6 +2783,17 @@ packages:
type: 2.5.0
dev: false
+ /extend-shallow/2.0.1:
+ resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 0.1.1
+ dev: false
+
+ /extend/3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ dev: false
+
/extract-zip/2.0.1:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
@@ -2924,6 +3029,16 @@ packages:
/graceful-fs/4.2.8:
resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==}
+ /gray-matter/4.0.3:
+ resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
+ engines: {node: '>=6.0'}
+ dependencies:
+ js-yaml: 3.14.1
+ kind-of: 6.0.3
+ section-matter: 1.0.0
+ strip-bom-string: 1.0.0
+ dev: false
+
/has-bigints/1.0.1:
resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==}
@@ -2967,6 +3082,38 @@ packages:
minimalistic-assert: 1.0.1
dev: false
+ /hast-util-is-element/2.1.2:
+ resolution: {integrity: sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==}
+ dependencies:
+ '@types/hast': 2.3.4
+ '@types/unist': 2.0.6
+ dev: false
+
+ /hast-util-sanitize/4.0.0:
+ resolution: {integrity: sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ==}
+ dependencies:
+ '@types/hast': 2.3.4
+ dev: false
+
+ /hast-util-to-html/8.0.3:
+ resolution: {integrity: sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==}
+ dependencies:
+ '@types/hast': 2.3.4
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.2
+ hast-util-is-element: 2.1.2
+ hast-util-whitespace: 2.0.0
+ html-void-elements: 2.0.1
+ property-information: 6.1.1
+ space-separated-tokens: 2.0.1
+ stringify-entities: 4.0.2
+ unist-util-is: 5.1.1
+ dev: false
+
+ /hast-util-whitespace/2.0.0:
+ resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==}
+ dev: false
+
/he/1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
@@ -2984,6 +3131,10 @@ packages:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
dev: true
+ /html-void-elements/2.0.1:
+ resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
+ dev: false
+
/http-errors/1.6.2:
resolution: {integrity: sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=}
engines: {node: '>= 0.6'}
@@ -3148,6 +3299,11 @@ packages:
call-bind: 1.0.2
has-tostringtag: 1.0.0
+ /is-buffer/2.0.5:
+ resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
+ engines: {node: '>=4'}
+ dev: false
+
/is-builtin-module/3.1.0:
resolution: {integrity: sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==}
engines: {node: '>=6'}
@@ -3177,6 +3333,11 @@ packages:
hasBin: true
dev: true
+ /is-extendable/0.1.1:
+ resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/is-extglob/2.1.1:
resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
engines: {node: '>=0.10.0'}
@@ -3216,6 +3377,11 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ /is-plain-obj/4.0.0:
+ resolution: {integrity: sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==}
+ engines: {node: '>=12'}
+ dev: false
+
/is-regex/1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
@@ -3335,6 +3501,14 @@ packages:
/js-tokens/4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ /js-yaml/3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: false
+
/js-yaml/4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
@@ -3382,6 +3556,16 @@ packages:
object.assign: 4.1.2
dev: true
+ /kind-of/6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /kleur/4.1.4:
+ resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==}
+ engines: {node: '>=6'}
+ dev: false
+
/language-subtag-registry/0.3.21:
resolution: {integrity: sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==}
dev: true
@@ -3444,6 +3628,10 @@ packages:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true
+ /longest-streak/3.0.1:
+ resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==}
+ dev: false
+
/loose-envify/1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
@@ -3472,6 +3660,68 @@ packages:
safe-buffer: 5.2.1
dev: false
+ /mdast-util-definitions/5.1.0:
+ resolution: {integrity: sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ '@types/unist': 2.0.6
+ unist-util-visit: 3.1.0
+ dev: false
+
+ /mdast-util-from-markdown/1.2.0:
+ resolution: {integrity: sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ '@types/unist': 2.0.6
+ decode-named-character-reference: 1.0.1
+ mdast-util-to-string: 3.1.0
+ micromark: 3.0.10
+ micromark-util-decode-numeric-character-reference: 1.0.0
+ micromark-util-decode-string: 1.0.2
+ micromark-util-normalize-identifier: 1.0.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ unist-util-stringify-position: 3.0.0
+ uvu: 0.5.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-to-hast/12.1.0:
+ resolution: {integrity: sha512-dHfCt9Yh05AXEeghoziB3DjJV8oCIKdQmBJOPoAT1NlgMDBy+/MQn7Pxfq0jI8YRO1IfzcnmA/OU3FVVn/E5Sg==}
+ dependencies:
+ '@types/hast': 2.3.4
+ '@types/mdast': 3.0.10
+ '@types/mdurl': 1.0.2
+ mdast-util-definitions: 5.1.0
+ mdurl: 1.0.1
+ micromark-util-sanitize-uri: 1.0.0
+ unist-builder: 3.0.0
+ unist-util-generated: 2.0.0
+ unist-util-position: 4.0.1
+ unist-util-visit: 4.1.0
+ dev: false
+
+ /mdast-util-to-markdown/1.2.6:
+ resolution: {integrity: sha512-doJZmTEGagHypWvJ8ltinmwUsT9ZaNgNIQW6Gl7jNdsI1QZkTHTimYW561Niy2s8AEPAqEgV0dIh2UOVlSXUJA==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ '@types/unist': 2.0.6
+ longest-streak: 3.0.1
+ mdast-util-to-string: 3.1.0
+ micromark-util-decode-string: 1.0.2
+ unist-util-visit: 4.1.0
+ zwitch: 2.0.2
+ dev: false
+
+ /mdast-util-to-string/3.1.0:
+ resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==}
+ dev: false
+
+ /mdurl/1.0.1:
+ resolution: {integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=}
+ dev: false
+
/merge-stream/2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
dev: false
@@ -3492,6 +3742,182 @@ packages:
raw-body: 2.3.2
dev: false
+ /micromark-core-commonmark/1.0.6:
+ resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==}
+ dependencies:
+ decode-named-character-reference: 1.0.1
+ micromark-factory-destination: 1.0.0
+ micromark-factory-label: 1.0.2
+ micromark-factory-space: 1.0.0
+ micromark-factory-title: 1.0.2
+ micromark-factory-whitespace: 1.0.0
+ micromark-util-character: 1.1.0
+ micromark-util-chunked: 1.0.0
+ micromark-util-classify-character: 1.0.0
+ micromark-util-html-tag-name: 1.0.0
+ micromark-util-normalize-identifier: 1.0.0
+ micromark-util-resolve-all: 1.0.0
+ micromark-util-subtokenize: 1.0.2
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ uvu: 0.5.3
+ dev: false
+
+ /micromark-factory-destination/1.0.0:
+ resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==}
+ dependencies:
+ micromark-util-character: 1.1.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-factory-label/1.0.2:
+ resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==}
+ dependencies:
+ micromark-util-character: 1.1.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ uvu: 0.5.3
+ dev: false
+
+ /micromark-factory-space/1.0.0:
+ resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==}
+ dependencies:
+ micromark-util-character: 1.1.0
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-factory-title/1.0.2:
+ resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==}
+ dependencies:
+ micromark-factory-space: 1.0.0
+ micromark-util-character: 1.1.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ uvu: 0.5.3
+ dev: false
+
+ /micromark-factory-whitespace/1.0.0:
+ resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==}
+ dependencies:
+ micromark-factory-space: 1.0.0
+ micromark-util-character: 1.1.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-util-character/1.1.0:
+ resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==}
+ dependencies:
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-util-chunked/1.0.0:
+ resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==}
+ dependencies:
+ micromark-util-symbol: 1.0.1
+ dev: false
+
+ /micromark-util-classify-character/1.0.0:
+ resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==}
+ dependencies:
+ micromark-util-character: 1.1.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-util-combine-extensions/1.0.0:
+ resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==}
+ dependencies:
+ micromark-util-chunked: 1.0.0
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-util-decode-numeric-character-reference/1.0.0:
+ resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==}
+ dependencies:
+ micromark-util-symbol: 1.0.1
+ dev: false
+
+ /micromark-util-decode-string/1.0.2:
+ resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==}
+ dependencies:
+ decode-named-character-reference: 1.0.1
+ micromark-util-character: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.0.0
+ micromark-util-symbol: 1.0.1
+ dev: false
+
+ /micromark-util-encode/1.0.1:
+ resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==}
+ dev: false
+
+ /micromark-util-html-tag-name/1.0.0:
+ resolution: {integrity: sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==}
+ dev: false
+
+ /micromark-util-normalize-identifier/1.0.0:
+ resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==}
+ dependencies:
+ micromark-util-symbol: 1.0.1
+ dev: false
+
+ /micromark-util-resolve-all/1.0.0:
+ resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==}
+ dependencies:
+ micromark-util-types: 1.0.2
+ dev: false
+
+ /micromark-util-sanitize-uri/1.0.0:
+ resolution: {integrity: sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==}
+ dependencies:
+ micromark-util-character: 1.1.0
+ micromark-util-encode: 1.0.1
+ micromark-util-symbol: 1.0.1
+ dev: false
+
+ /micromark-util-subtokenize/1.0.2:
+ resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==}
+ dependencies:
+ micromark-util-chunked: 1.0.0
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ uvu: 0.5.3
+ dev: false
+
+ /micromark-util-symbol/1.0.1:
+ resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==}
+ dev: false
+
+ /micromark-util-types/1.0.2:
+ resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==}
+ dev: false
+
+ /micromark/3.0.10:
+ resolution: {integrity: sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==}
+ dependencies:
+ '@types/debug': 4.1.7
+ debug: 4.3.2
+ decode-named-character-reference: 1.0.1
+ micromark-core-commonmark: 1.0.6
+ micromark-factory-space: 1.0.0
+ micromark-util-character: 1.1.0
+ micromark-util-chunked: 1.0.0
+ micromark-util-combine-extensions: 1.0.0
+ micromark-util-decode-numeric-character-reference: 1.0.0
+ micromark-util-encode: 1.0.1
+ micromark-util-normalize-identifier: 1.0.0
+ micromark-util-resolve-all: 1.0.0
+ micromark-util-sanitize-uri: 1.0.0
+ micromark-util-subtokenize: 1.0.2
+ micromark-util-symbol: 1.0.1
+ micromark-util-types: 1.0.2
+ uvu: 0.5.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
/micromatch/4.0.4:
resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==}
engines: {node: '>=8.6'}
@@ -3536,12 +3962,16 @@ packages:
/minimist/1.2.5:
resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==}
+ /mri/1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: false
+
/ms/2.0.0:
resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=}
/ms/2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
- dev: true
/ms/2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -4124,6 +4554,10 @@ packages:
signal-exit: 3.0.5
dev: true
+ /property-information/6.1.1:
+ resolution: {integrity: sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==}
+ dev: false
+
/proxy-from-env/1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: true
@@ -4335,6 +4769,45 @@ packages:
engines: {node: '>=8'}
dev: true
+ /remark-html/15.0.1:
+ resolution: {integrity: sha512-7ta5UPRqj8nP0GhGMYUAghZ/DRno7dgq7alcW90A7+9pgJsXzGJlFgwF8HOP1b1tMgT3WwbeANN+CaTimMfyNQ==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ hast-util-sanitize: 4.0.0
+ hast-util-to-html: 8.0.3
+ mdast-util-to-hast: 12.1.0
+ unified: 10.1.1
+ dev: false
+
+ /remark-parse/10.0.1:
+ resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ mdast-util-from-markdown: 1.2.0
+ unified: 10.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-stringify/10.0.2:
+ resolution: {integrity: sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ mdast-util-to-markdown: 1.2.6
+ unified: 10.1.1
+ dev: false
+
+ /remark/14.0.2:
+ resolution: {integrity: sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA==}
+ dependencies:
+ '@types/mdast': 3.0.10
+ remark-parse: 10.0.1
+ remark-stringify: 10.0.2
+ unified: 10.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
/resolve-from/4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -4389,6 +4862,13 @@ packages:
queue-microtask: 1.2.3
dev: true
+ /sade/1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: false
+
/safe-buffer/5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
@@ -4413,6 +4893,14 @@ packages:
object-assign: 4.1.1
dev: false
+ /section-matter/1.0.0:
+ resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
+ engines: {node: '>=4'}
+ dependencies:
+ extend-shallow: 2.0.1
+ kind-of: 6.0.3
+ dev: false
+
/semver/5.7.1:
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
hasBin: true
@@ -4549,6 +5037,10 @@ packages:
whatwg-url: 7.1.0
dev: false
+ /space-separated-tokens/2.0.1:
+ resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==}
+ dev: false
+
/spdx-correct/3.1.1:
resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==}
dependencies:
@@ -4571,6 +5063,10 @@ packages:
resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==}
dev: true
+ /sprintf-js/1.0.3:
+ resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=}
+ dev: false
+
/stack-utils/2.0.5:
resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==}
engines: {node: '>=10'}
@@ -4647,12 +5143,24 @@ packages:
safe-buffer: 5.2.1
dev: false
+ /stringify-entities/4.0.2:
+ resolution: {integrity: sha512-MTxTVcEkorNtBbNpoFJPEh0kKdM6+QbMjLbaxmvaPMmayOXdr/AIVIIJX7FReUVweRBFJfZepK4A4AKgwuFpMQ==}
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+ dev: false
+
/strip-ansi/6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
dependencies:
ansi-regex: 5.0.1
+ /strip-bom-string/1.0.0:
+ resolution: {integrity: sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
/strip-bom/3.0.0:
resolution: {integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=}
engines: {node: '>=4'}
@@ -4804,6 +5312,10 @@ packages:
punycode: 2.1.1
dev: false
+ /trough/2.0.2:
+ resolution: {integrity: sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==}
+ dev: false
+
/tsconfig-paths/3.11.0:
resolution: {integrity: sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==}
dependencies:
@@ -4886,6 +5398,72 @@ packages:
has-symbols: 1.0.2
which-boxed-primitive: 1.0.2
+ /unified/10.1.1:
+ resolution: {integrity: sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==}
+ dependencies:
+ '@types/unist': 2.0.6
+ bail: 2.0.2
+ extend: 3.0.2
+ is-buffer: 2.0.5
+ is-plain-obj: 4.0.0
+ trough: 2.0.2
+ vfile: 5.3.0
+ dev: false
+
+ /unist-builder/3.0.0:
+ resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==}
+ dependencies:
+ '@types/unist': 2.0.6
+ dev: false
+
+ /unist-util-generated/2.0.0:
+ resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==}
+ dev: false
+
+ /unist-util-is/5.1.1:
+ resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==}
+ dev: false
+
+ /unist-util-position/4.0.1:
+ resolution: {integrity: sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==}
+ dev: false
+
+ /unist-util-stringify-position/3.0.0:
+ resolution: {integrity: sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==}
+ dependencies:
+ '@types/unist': 2.0.6
+ dev: false
+
+ /unist-util-visit-parents/4.1.1:
+ resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==}
+ dependencies:
+ '@types/unist': 2.0.6
+ unist-util-is: 5.1.1
+ dev: false
+
+ /unist-util-visit-parents/5.1.0:
+ resolution: {integrity: sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==}
+ dependencies:
+ '@types/unist': 2.0.6
+ unist-util-is: 5.1.1
+ dev: false
+
+ /unist-util-visit/3.1.0:
+ resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==}
+ dependencies:
+ '@types/unist': 2.0.6
+ unist-util-is: 5.1.1
+ unist-util-visit-parents: 4.1.1
+ dev: false
+
+ /unist-util-visit/4.1.0:
+ resolution: {integrity: sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==}
+ dependencies:
+ '@types/unist': 2.0.6
+ unist-util-is: 5.1.1
+ unist-util-visit-parents: 5.1.0
+ dev: false
+
/unpipe/1.0.0:
resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=}
engines: {node: '>= 0.8'}
@@ -4928,6 +5506,17 @@ packages:
which-typed-array: 1.1.7
dev: false
+ /uvu/0.5.3:
+ resolution: {integrity: sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ dequal: 2.0.2
+ diff: 5.0.0
+ kleur: 4.1.4
+ sade: 1.8.1
+ dev: false
+
/v8-compile-cache/2.3.0:
resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
dev: true
@@ -4944,6 +5533,22 @@ packages:
engines: {node: '>= 0.8'}
dev: false
+ /vfile-message/3.1.0:
+ resolution: {integrity: sha512-4QJbBk+DkPEhBXq3f260xSaWtjE4gPKOfulzfMFF8ZNwaPZieWsg3iVlcmF04+eebzpcpeXOOFMfrYzJHVYg+g==}
+ dependencies:
+ '@types/unist': 2.0.6
+ unist-util-stringify-position: 3.0.0
+ dev: false
+
+ /vfile/5.3.0:
+ resolution: {integrity: sha512-Tj44nY/48OQvarrE4FAjUfrv7GZOYzPbl5OD65HxVKwLJKMPU7zmfV8cCgCnzKWnSfYG2f3pxu+ALqs7j22xQQ==}
+ dependencies:
+ '@types/unist': 2.0.6
+ is-buffer: 2.0.5
+ unist-util-stringify-position: 3.0.0
+ vfile-message: 3.1.0
+ dev: false
+
/vm-browserify/1.1.2:
resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
dev: false
@@ -5066,3 +5671,7 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
dev: false
+
+ /zwitch/2.0.2:
+ resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==}
+ dev: false
diff --git a/public/blog/author/Avatar1.svg b/public/blog/author/Avatar1.svg
new file mode 100644
index 0000000..e636e37
--- /dev/null
+++ b/public/blog/author/Avatar1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/blog/author/Avatar2.svg b/public/blog/author/Avatar2.svg
new file mode 100644
index 0000000..4d7358a
--- /dev/null
+++ b/public/blog/author/Avatar2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/blog/coverdefault.png b/public/blog/coverdefault.png
new file mode 100644
index 0000000..bb0cd98
Binary files /dev/null and b/public/blog/coverdefault.png differ
diff --git a/types/author.ts b/types/author.ts
new file mode 100644
index 0000000..dc545c7
--- /dev/null
+++ b/types/author.ts
@@ -0,0 +1,6 @@
+type Author = {
+ name: string;
+ picture: string;
+};
+
+export default Author;
diff --git a/types/post.ts b/types/post.ts
new file mode 100644
index 0000000..c56077a
--- /dev/null
+++ b/types/post.ts
@@ -0,0 +1,16 @@
+import Author from './author';
+
+type PostType = {
+ slug: string;
+ title: string;
+ date: string;
+ coverImage: string;
+ author: Author;
+ excerpt: string;
+ ogImage: {
+ url: string;
+ };
+ content: string;
+};
+
+export default PostType;