1
0
Fork 0

refactor: use mdx for content

- less dependencies
- no need for gray-matter
- no need for extra utils and interactions with filesystem
This commit is contained in:
Vojtěch Mareš 2023-01-11 15:45:51 +01:00
parent b1aa7f7550
commit 6daa1a6d03
19 changed files with 603 additions and 644 deletions

View file

@ -1,117 +0,0 @@
import Image from "next/image";
import TrainingType from "@/types/training";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
type Props = {
training: TrainingType;
};
export const Training = ({ training }: Props) => {
const formatter = new Intl.NumberFormat("cs", {
style: "currency",
currency: "CZK",
maximumFractionDigits: 0,
});
return (
<>
<div className="pb-14 sm:pb-20 lg:pb-32">
<div className="bg-black pt-16 pb-16">
<Container className="flex justify-around">
<Image
src={training.logo}
className="h-32 w-32 rounded-full"
width="1500"
height="1500"
alt=""
/>
<h2 className="ml-4 text-center font-display self-center text-4xl tracking-tight text-white sm:text-6xl">
Školení {training.name}
</h2>
</Container>
</div>
<Container>
<div className="mt-12 md:grid md:grid-cols-5 md:gap-x-4 md:gap-y-4">
<div className="md:col-span-3">
<div
className="prose prose-slate prose-h1:text-2xl prose-h1:font-medium prose-h2:text-xl prose-h2:font-medium prose-h3:text-lg prose-h3:font-medium prose-li:my-0"
dangerouslySetInnerHTML={{ __html: training.content }}
/>
</div>
<div className="mt-8 md:col-span-2 md:mt-0">
{training.days === 2 ? (
<div className=" mb-8 rounded-lg bg-blue-50 p-4 shadow">
<div className="flex">
<div className="flex-shrink-0">
{/* <ExclamationTriangleIcon className="h-5 w-5 text-yellow-400" aria-hidden="true" /> */}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
className="h-5 w-5 text-blue-400"
>
<path
fillRule="evenodd"
d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z"
clipRule="evenodd"
/>
</svg>
</div>
<div className="ml-3">
<p className="text-blue-600">
Toto školení je{" "}
<span className="font-medium">
dvoudenní.
</span>
</p>
</div>
</div>
</div>
) : (
<></>
)}
<div className="mt-8 overflow-hidden rounded-lg bg-slate-50 shadow md:mt-0">
<div className="px-4 py-5 sm:px-6">
<h3 className="text-lg font-medium leading-6 text-black">
Cena za školení
</h3>
</div>
<div className="border-t border-slate-100 px-4 py-5">
<dl className="sm:divide-y sm:divide-slate-400">
<div className="py-4 sm:grid sm:grid-cols-2 sm:gap-4 sm:py-5 sm:px-6">
<dt className="font-medium text-slate-700">
Veřejný termín
</dt>
<dd className="mt-1 text-black sm:mt-0">
{formatter.format(training.priceOpen)} bez DPH
</dd>
</div>
<div className="py-4 sm:grid sm:grid-cols-2 sm:gap-4 sm:py-5 sm:px-6">
<dt className="font-medium text-slate-700">
Firemní školení
</dt>
<dd className="mt-1 text-black sm:mt-0">
{formatter.format(training.priceCompany)} bez DPH
</dd>
</div>
</dl>
</div>
</div>
<div className="mt-8">
<Button
variant="solid"
color="amber"
className="w-full text-lg font-medium"
href="mailto:iam@vojtechmares.com"
>
Nezávazně poptat
</Button>
</div>
</div>
</div>
</Container>
</div>
</>
);
};

View file

@ -0,0 +1,135 @@
import Head from "next/head";
import Image from "next/image";
import { Header } from "@/components/layout/Header";
import { Footer } from "@/components/layout/Footer";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
type Props = {
content: any;
meta: any;
}
export default function TrainingLayout({ content, meta }: Props) {
const formatter = new Intl.NumberFormat("cs", {
style: "currency",
currency: "CZK",
maximumFractionDigits: 0,
});
return (
<>
<Head>
<title>
Školení {meta.name} | Vojtěch Mareš - DevOps konzultant, lektor,
engineer
</title>
<meta
name="description"
content={`Školení ${meta.name} | Vojtěch Mareš - DevOps konzultant, lektor, engineer`}
/>
</Head>
<main>
<Header />
<div className="pb-14 sm:pb-20 lg:pb-32">
<div className="bg-black pt-16 pb-16">
<Container className="flex justify-around">
<Image
src={meta.logo}
className="h-32 w-32 rounded-full"
width="1500"
height="1500"
alt=""
/>
<h2 className="ml-4 text-center font-display self-center text-4xl tracking-tight text-white sm:text-6xl">
Školení {meta.name}
</h2>
</Container>
</div>
<Container>
<div className="mt-12 md:grid md:grid-cols-5 md:gap-x-4 md:gap-y-4">
<div className="md:col-span-3">
<div className="prose prose-slate prose-h1:text-2xl prose-h1:font-medium prose-h2:text-xl prose-h2:font-medium prose-h3:text-lg prose-h3:font-medium prose-li:my-0">
{content}
</div>
</div>
<div className="mt-8 md:col-span-2 md:mt-0">
{meta.days === 2 ? (
<div className=" mb-8 rounded-lg bg-blue-50 p-4 shadow">
<div className="flex">
<div className="flex-shrink-0">
{/* <ExclamationTriangleIcon className="h-5 w-5 text-yellow-400" aria-hidden="true" /> */}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
className="h-5 w-5 text-blue-400"
>
<path
fillRule="evenodd"
d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z"
clipRule="evenodd"
/>
</svg>
</div>
<div className="ml-3">
<p className="text-blue-600">
Toto školení je{" "}
<span className="font-medium">
dvoudenní.
</span>
</p>
</div>
</div>
</div>
) : (
<></>
)}
<div className="mt-8 overflow-hidden rounded-lg bg-slate-50 shadow md:mt-0">
<div className="px-4 py-5 sm:px-6">
<h3 className="text-lg font-medium leading-6 text-black">
Cena za školení
</h3>
</div>
<div className="border-t border-slate-100 px-4 py-5">
<dl className="sm:divide-y sm:divide-slate-400">
<div className="py-4 sm:grid sm:grid-cols-2 sm:gap-4 sm:py-5 sm:px-6">
<dt className="font-medium text-slate-700">
Veřejný termín
</dt>
<dd className="mt-1 text-black sm:mt-0">
{formatter.format(meta.price.open)} bez DPH
</dd>
</div>
<div className="py-4 sm:grid sm:grid-cols-2 sm:gap-4 sm:py-5 sm:px-6">
<dt className="font-medium text-slate-700">
Firemní školení
</dt>
<dd className="mt-1 text-black sm:mt-0">
{formatter.format(meta.price.company)} bez DPH
</dd>
</div>
</dl>
</div>
</div>
<div className="mt-8">
<Button
variant="solid"
color="amber"
className="w-full text-lg font-medium"
href="mailto:iam@vojtechmares.com"
>
Nezávazně poptat
</Button>
</div>
</div>
</div>
</Container>
</div>
</main>
<Footer />
</>
);
};

View file

@ -1,135 +0,0 @@
import Image from "next/image";
import clsx from "clsx";
import TrainingType from "@/types/training";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
type TrainingDetailProps = {
training: TrainingType;
className?: string;
props?: any[];
};
const TrainingDetail = ({
training,
className,
...props
}: TrainingDetailProps) => {
return (
<div
className={clsx(
className,
"rounded-3xl py-8 px-6 shadow sm:px-8",
training.featured ? "bg-amber-500 py-8" : "",
training.featured ? "hover:bg-amber-600" : "md:ring-1 md:hover:ring-slate-700 md:ring-transparent",
"transition ease-in-out duration-300 md:hover:-translate-y-1 md:hover:scale-110 "
)}
{...props}
>
<Image
src={training.logo}
className="h-32 w-32 rounded-full"
width="1500"
height="1500"
alt=""
/>
<div className="mt-6 flex justify-between">
<div className="flex">
<h3 className="font-display text-xl font-medium text-white">
{training.name}
</h3>
{training.new ? (
<>
<span className="border-1 ml-2 rounded-full border border-orange-800 bg-orange-100 px-2 py-1 text-xs font-medium text-orange-800">
new!
</span>
</>
) : (
<></>
)}
</div>
<p className="text-md max-w-2xl text-white">
{training.days} {training.days === 1 ? "den" : "dny"}
</p>
</div>
<p
className="text-md mt-4 text-slate-100"
>
{training.description.split(" ").splice(0, 40).join(" ") + "..."}
</p>
<Button
href={"/skoleni/" + training.slug}
variant={training.featured ? "solid" : "outline"}
color="white"
className="mt-8 w-full"
>
Zjistit více
</Button>
</div>
);
};
type TrainingListProps = {
trainingList: TrainingType[];
};
const TrainingListMobile = ({ trainingList }: TrainingListProps) => {
return (
<div className="-mx-4 mt-20 flex flex-col gap-y-10 overflow-hidden sm:-mx-6 sm:px-6 lg:hidden">
{trainingList.map((training) => (
<div
key={training.slug}
className={clsx(training.featured ? "order-first lg:order-none" : "")}
>
<TrainingDetail training={training} className="mx-auto max-w-2xl" />
</div>
))}
</div>
);
};
const TrainingListDesktop = ({ trainingList }: TrainingListProps) => {
return (
<div className="hidden lg:mt-20 lg:block">
<div className="grid grid-cols-3 gap-x-8 gap-y-8">
{trainingList.map((training) => (
<div
key={training.slug}
className={clsx(
training.featured ? "order-first lg:order-none" : ""
)}
>
<TrainingDetail training={training} className="relative" />
</div>
))}
</div>
</div>
);
};
export const TrainingListGrid = ({ trainingList }: TrainingListProps) => {
return (
<>
<section
id="training-list"
aria-label="Seznam školení"
className="bg-black pt-16 pb-14 sm:pb-20 sm:pt-24 lg:pb-32"
>
<Container>
<div className="mx-auto max-w-2xl md:text-center">
<h2 className="font-display text-3xl tracking-tight text-white sm:text-4xl">
Moje školení
</h2>
<p className="mt-4 text-lg tracking-tight text-slate-400">
Od veřejného cloudu přes on-premise po serverless, se vším vám
poradím.
</p>
</div>
<TrainingListMobile trainingList={trainingList} />
<TrainingListDesktop trainingList={trainingList} />
</Container>
</section>
</>
);
};

View file

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

View file

@ -1,51 +0,0 @@
import fs from "fs";
import { join } from "path";
import matter from "gray-matter";
const trainingDir = join(process.cwd(), "content/training");
export const getTrainingSlugs = () => {
return fs.readdirSync(trainingDir);
};
export const getTrainingBySlug = (slug: string, fields: string[] = []) => {
const realSlug = slug.replace(/\.md$/, "");
const fullPath = join(trainingDir, `${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 const getAllTraining = (fields: string[] = []) => {
const slugs = getTrainingSlugs();
const trainingList = slugs
.map((slug) => getTrainingBySlug(slug, fields))
.sort((tr1, tr2) => {
const tr1w = parseInt(tr1.weight);
const tr2w = parseInt(tr2.weight);
return tr1w > tr2w ? -1 : 1;
});
return trainingList;
};

View file

@ -1,9 +0,0 @@
import { remark } from "remark";
import html from "remark-html";
const markdownToHTML = async (markdown: string) => {
const result = await remark().use(html).process(markdown);
return result.toString();
};
export default markdownToHTML;

View file

@ -1,3 +1,16 @@
const withMDX = require("@next/mdx")({
extension: /\.mdx?$/,
options: {
// If you use remark-gfm, you'll need to use next.config.mjs
// as the package is ESM only
// https://github.com/remarkjs/remark-gfm#install
remarkPlugins: [],
rehypePlugins: [],
// If you use `MDXProvider`, uncomment the following line.
// providerImportSource: "@mdx-js/react",
},
});
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
@ -5,7 +18,8 @@ const nextConfig = {
experimental: { experimental: {
newNextLinkBehavior: true, newNextLinkBehavior: true,
scrollRestoration: true, scrollRestoration: true,
} },
} pageExtensions: ["js", "jsx", "ts", "tsx", "md", "mdx"],
};
module.exports = nextConfig; module.exports = withMDX(nextConfig);

View file

@ -13,14 +13,14 @@
}, },
"dependencies": { "dependencies": {
"@headlessui/react": "^1.7.4", "@headlessui/react": "^1.7.4",
"@mdx-js/loader": "^2.2.1",
"@mdx-js/react": "^2.2.1",
"@next/mdx": "^13.1.1",
"@tailwindcss/typography": "^0.5.8", "@tailwindcss/typography": "^0.5.8",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"gray-matter": "^4.0.3",
"next": "13.1.1", "next": "13.1.1",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0"
"remark": "^14.0.2",
"remark-html": "^15.0.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.20.2", "@babel/core": "^7.20.2",

View file

@ -1,95 +0,0 @@
import Head from "next/head";
import { useRouter } from "next/router";
import ErrorPage from "next/error";
import TrainingType from "@/types/training";
import { getAllTraining, getTrainingBySlug } from "@/lib/cms/training";
import markdownToHTML from "@/lib/markdownToHTML";
import { Header } from "@/components/layout/Header";
import { Footer } from "@/components/layout/Footer";
import { Training } from "@/components/trainingpage/Training";
type Props = {
training: TrainingType;
featuredTrainingList: TrainingType[];
};
const TrainingPage = ({ training, featuredTrainingList }: Props) => {
const router = useRouter();
console.log(!router.isFallback);
console.log(!training?.slug);
console.log(typeof training.draft === "undefined");
// if ((!router.isFallback && !training?.slug) || typeof training.draft === 'undefined') {
// return <ErrorPage statusCode={404} />
// }
return (
<>
<Head>
<title>
Školení {training.name} | Vojtěch Mareš - DevOps konzultant, lektor,
engineer
</title>
<meta
name="description"
content={`Školení ${training.name} | Vojtěch Mareš - DevOps konzultant, lektor, engineer`}
/>
</Head>
<main>
<Header />
<Training training={training} />
</main>
<Footer />
</>
);
};
export default TrainingPage;
type Params = {
params: {
slug: string;
};
};
export const getStaticProps = async ({ params }: Params) => {
const training = getTrainingBySlug(params.slug, [
"name",
"content",
"priceOpen",
"priceCompany",
"days",
"logo",
"content",
"draft",
"new",
"featured",
]);
const content = await markdownToHTML(training.content || "");
return {
props: {
training: {
...training,
content,
},
},
};
};
export const getStaticPaths = async () => {
const trainingList = getAllTraining(["slug"]);
return {
paths: trainingList.map((training) => {
return {
params: {
slug: training.slug,
},
};
}),
fallback: false,
};
};

View file

@ -1,13 +1,19 @@
--- import TrainingLayout from "@/components/trainingpage/TrainingLayout";
name: ArgoCD import logoArgo from "@/images/logos/tools/argo.png";
priceOpen: 5900
priceCompany: 24000 export const meta = {
logo: /images/logos/argo.png name: "ArgoCD",
description: "ArgoCD je GitOps nastroj kterym nasazujeme aplikace do Kubernetes. Pracuje na zaklade deklaraticnich konfiguracnich souboru, ktete si stahuje z Gitu. To znamena, ze vse co commitneme do repozitare, se na nasadi do Kubernetes. O vsech zmenach: co, kdy, kdo udelal budeme mit prehledne zaznami v Gitu." price: {
days: 1 open: 5900,
new: true company: 24000,
weight: 49 },
--- logo: logoArgo,
description:
"ArgoCD je GitOps nastroj kterym nasazujeme aplikace do Kubernetes. Pracuje na zaklade deklaraticnich konfiguracnich souboru, ktete si stahuje z Gitu. To znamena, ze vse co commitneme do repozitare, se na nasadi do Kubernetes. O vsech zmenach: co, kdy, kdo udelal budeme mit prehledne zaznami v Gitu.",
days: 1,
featured: true,
weight: 49,
};
# Popis technologie # Popis technologie
@ -37,3 +43,7 @@ Zakladni znalost Kubernetes
Technické požadavky Technické požadavky
Webový prohlížeč Webový prohlížeč
Přístup na internet Přístup na internet
export default ({ children }) => (
<TrainingLayout content={children} meta={meta} />
);

View file

@ -1,12 +1,18 @@
--- import TrainingLayout from "@/components/trainingpage/TrainingLayout";
name: Git import logoGit from "@/images/logos/tools/git.png";
priceOpen: 5900
priceCompany: 24000 export const meta = {
logo: /images/logos/git.png name: "Git",
description: "Git je moderní verzovaci nástroj, který se stal de facto standardem mezi vývojáři. Používají jej na denní bázy jednotlivci, startupy i korporace. Git vám nabízí jednoduchou kolaboraci na projektu s více lidmi a práci na více částech současně aniž byste si zasahovali do rozdělaných věcí nebo je jinak narušovali. Spolupráci na vývoji projektu ještě zlepšuje Gitlab, což je kolaborativni platforma na návrh, vývoj a provozování software (více o Gitlabu v samostatném kurzu)." price: {
days: 1 open: 5900,
weight: 1 company: 24000,
--- },
logo: logoGit,
description:
"Git je moderní verzovaci nástroj, který se stal de facto standardem mezi vývojáři. Používají jej na denní bázy jednotlivci, startupy i korporace. Git vám nabízí jednoduchou kolaboraci na projektu s více lidmi a práci na více částech současně aniž byste si zasahovali do rozdělaných věcí nebo je jinak narušovali. Spolupráci na vývoji projektu ještě zlepšuje Gitlab, což je kolaborativni platforma na návrh, vývoj a provozování software (více o Gitlabu v samostatném kurzu).",
days: 1,
weight: 1,
};
# Co je to Git? # Co je to Git?
@ -40,3 +46,7 @@ Základní znalost Gitu výhodou
Nainstalovaný Git Nainstalovaný Git
Přístup na internet - ideálně bez korporátní proxy, případně nastavenou proxy v prohlížeči Přístup na internet - ideálně bez korporátní proxy, případně nastavenou proxy v prohlížeči
export default ({ children }) => (
<TrainingLayout content={children} meta={meta} />
);

View file

@ -1,56 +0,0 @@
import Head from "next/head";
import { Header } from "@/components/layout/Header";
import { Footer } from "@/components/layout/Footer";
import { getAllTraining } from "@/lib/cms/training";
import TrainingType from "@/types/training";
import { TrainingListGrid } from "@/components/trainingpage/TrainingListGrid";
export const getStaticProps = async () => {
const allTraining = getAllTraining([
"name",
"slug",
"logo",
"description",
"days",
"weight",
"featured",
"new",
"draft",
]);
return {
props: { allTraining },
};
};
type Props = {
allTraining: TrainingType[];
};
const TrainingList = ({ allTraining }: Props) => {
// remove drafts
const trainingList = allTraining.filter((val) => !val.draft);
return (
<>
<Head>
<title>
Moje školení | Vojtěch Mareš - DevOps konzultant, lektor, engineer
</title>
<meta
name="description"
content="Moje školení | Vojtěch Mareš - DevOps konzultant, lektor, engineer"
/>
</Head>
<main>
<Header />
<TrainingListGrid trainingList={trainingList} />
</main>
<Footer />
</>
);
};
export default TrainingList;

View file

@ -1,13 +1,19 @@
--- import logoKubernetes from "@/images/logos/tools/kubernetes.png";
name: Kubernetes import TrainingLayout from "@/components/trainingpage/TrainingLayout";
priceOpen: 11900
priceCompany: 44000 export const meta = {
logo: /images/logos/kubernetes.png name: "Kubernetes",
description: "Kubernetes jsou dnes nejrozšířenější platformou na hostování Docker kontejnerů a jsou podporovány velkými hráči na trhu (Google, Amazon, Microsoft) skrz Cloud Native Computing Foundation. Kubernetes pro provoz používají všechny velikosti firem, od startupu po korporace." price: {
days: 2 open: 11900,
featured: true company: 44000,
weight: 50 },
--- logo: logoKubernetes,
description:
"Kubernetes jsou dnes nejrozšířenější platformou na hostování Docker kontejnerů a jsou podporovány velkými hráči na trhu (Google, Amazon, Microsoft) skrz Cloud Native Computing Foundation. Kubernetes pro provoz používají všechny velikosti firem, od startupu po korporace.",
days: 2,
featured: true,
weight: 50,
};
# Popis technologie # Popis technologie
@ -40,3 +46,7 @@ Základy práce v terminálu
Technické požadavky Technické požadavky
Nainstalovaný Kubernetes Nainstalovaný Kubernetes
Přístup na internet - ideálně bez korporátní proxy, případně nastavenou proxy v prohlížeči Přístup na internet - ideálně bez korporátní proxy, případně nastavenou proxy v prohlížeči
export default ({ children }) => (
<TrainingLayout content={children} meta={meta} />
);

View file

@ -1,17 +1,19 @@
--- import TrainingLayout from "@/components/trainingpage/TrainingLayout";
name: Terraform import logoTerraform from "@/images/logos/tools/terraform.png";
priceOpen: 5900
priceCompany: 24000
logo: /images/logos/terraform.png
description: "Terraform je nástroj, který se používá ke správě infrastruktury v cloudu, jak veřejném (AWS, Azure, GCP), tak privátním (OpenStack, VMware vSphere).
Terraform Vám umožní spravovat infrastruktutru jako kód, to znamená verzovanou v Gitu, přidávání resources pomocí merge (pull) requestů a mnoho dalších výhod. Infrastrukturu můžete dále nasadit do testovacího prostředí přesně tak, jako je v produkci bez zbytečného úsilí. O všech komponentách máte přehled a můžete predikovat ceny. Konec klikání infrastruktury, zkuste Terraform. export const meta = {
name: "Terraform",
Terraform umožnuje spravovat více cloudových providerů současne, zároveň umožnuje pracovat s hibridními cloudy (část v privátním cloudu, část ve veřejném)." price: {
days: 1 open: 5900,
featured: true company: 24000,
weight: 31 },
--- logo: logoTerraform,
description:
"Terraform je nástroj, který se používá ke správě infrastruktury v cloudu, jak veřejném (AWS, Azure, GCP), tak privátním (OpenStack, VMware vSphere). Terraform Vám umožní spravovat infrastruktutru jako kód, to znamená verzovanou v Gitu, přidávání resources pomocí merge (pull) requestů a mnoho dalších výhod. Infrastrukturu můžete dále nasadit do testovacího prostředí přesně tak, jako je v produkci bez zbytečného úsilí. O všech komponentách máte přehled a můžete predikovat ceny. Konec klikání infrastruktury, zkuste Terraform. Terraform umožnuje spravovat více cloudových providerů současne, zároveň umožnuje pracovat s hibridními cloudy (část v privátním cloudu, část ve veřejném).",
days: 1,
featured: true,
weight: 31,
};
# Co to je Terraform a k čemu se používá? # Co to je Terraform a k čemu se používá?
@ -51,3 +53,7 @@ Základy práce v terminálu
Nainstalovaný Terraform Nainstalovaný Terraform
Přístup na internet (ideálně bez korporatni proxy) Přístup na internet (ideálně bez korporatni proxy)
Vlastní účet v DigitalOceanu výhodou Vlastní účet v DigitalOceanu výhodou
export default ({ children }) => (
<TrainingLayout content={children} meta={meta} />
);

483
pnpm-lock.yaml generated
View file

@ -3,6 +3,9 @@ lockfileVersion: 5.4
specifiers: specifiers:
'@babel/core': ^7.20.2 '@babel/core': ^7.20.2
'@headlessui/react': ^1.7.4 '@headlessui/react': ^1.7.4
'@mdx-js/loader': ^2.2.1
'@mdx-js/react': ^2.2.1
'@next/mdx': ^13.1.1
'@tailwindcss/typography': ^0.5.8 '@tailwindcss/typography': ^0.5.8
'@testing-library/react': ^13.4.0 '@testing-library/react': ^13.4.0
'@types/node': ^18.11.17 '@types/node': ^18.11.17
@ -14,7 +17,6 @@ specifiers:
eslint: 8.31.0 eslint: 8.31.0
eslint-config-next: ^13.0.4 eslint-config-next: ^13.0.4
eslint-config-prettier: ^8.5.0 eslint-config-prettier: ^8.5.0
gray-matter: ^4.0.3
jsdom: ^21.0.0 jsdom: ^21.0.0
next: 13.1.1 next: 13.1.1
postcss: ^8.4.19 postcss: ^8.4.19
@ -22,8 +24,6 @@ specifiers:
prettier-plugin-tailwindcss: ^0.2.0 prettier-plugin-tailwindcss: ^0.2.0
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0 react-dom: 18.2.0
remark: ^14.0.2
remark-html: ^15.0.1
tailwindcss: ^3.2.4 tailwindcss: ^3.2.4
typescript: ^4.9.3 typescript: ^4.9.3
vite: ^4.0.2 vite: ^4.0.2
@ -31,14 +31,14 @@ specifiers:
dependencies: dependencies:
'@headlessui/react': 1.7.4_biqbaboplfbrettd7655fr4n2y '@headlessui/react': 1.7.4_biqbaboplfbrettd7655fr4n2y
'@mdx-js/loader': 2.2.1
'@mdx-js/react': 2.2.1_react@18.2.0
'@next/mdx': 13.1.1_vvg67iglxhejglpl7nsv3pjzui
'@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4 '@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4
clsx: 1.2.1 clsx: 1.2.1
gray-matter: 4.0.3
next: 13.1.1_mqvh5p7ejg4taogoj6tpk3gd5a next: 13.1.1_mqvh5p7ejg4taogoj6tpk3gd5a
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0_react@18.2.0 react-dom: 18.2.0_react@18.2.0
remark: 14.0.2
remark-html: 15.0.1
devDependencies: devDependencies:
'@babel/core': 7.20.2 '@babel/core': 7.20.2
@ -660,6 +660,51 @@ packages:
'@jridgewell/resolve-uri': 3.1.0 '@jridgewell/resolve-uri': 3.1.0
'@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/sourcemap-codec': 1.4.14
/@mdx-js/loader/2.2.1:
resolution: {integrity: sha512-J4E8A5H+xtk4otZiEZ5AXl61Tj04Avm5MqLQazITdI3+puVXVnTTuZUKM1oNHTtfDIfOl0uMt+o/Ij+x6Fvf+g==}
peerDependencies:
webpack: '>=4'
dependencies:
'@mdx-js/mdx': 2.2.1
source-map: 0.7.4
transitivePeerDependencies:
- supports-color
dev: false
/@mdx-js/mdx/2.2.1:
resolution: {integrity: sha512-hZ3ex7exYLJn6FfReq8yTvA6TE53uW9UHJQM9IlSauOuS55J9y8RtA7W+dzp6Yrzr00/U1sd7q+Wf61q6SfiTQ==}
dependencies:
'@types/estree-jsx': 1.0.0
'@types/mdx': 2.0.3
estree-util-build-jsx: 2.2.2
estree-util-is-identifier-name: 2.0.1
estree-util-to-js: 1.1.0
estree-walker: 3.0.2
hast-util-to-estree: 2.1.0
markdown-extensions: 1.1.1
periscopic: 3.0.4
remark-mdx: 2.2.1
remark-parse: 10.0.1
remark-rehype: 10.1.0
unified: 10.1.2
unist-util-position-from-estree: 1.1.1
unist-util-stringify-position: 3.0.2
unist-util-visit: 4.1.1
vfile: 5.3.6
transitivePeerDependencies:
- supports-color
dev: false
/@mdx-js/react/2.2.1_react@18.2.0:
resolution: {integrity: sha512-YdXcMcEnqZhzql98RNrqYo9cEhTTesBiCclEtoiQUbJwx87q9453GTapYU6kJ8ZZ2ek1Vp25SiAXEFy5O/eAPw==}
peerDependencies:
react: '>=16'
dependencies:
'@types/mdx': 2.0.3
'@types/react': 18.0.26
react: 18.2.0
dev: false
/@next/env/13.1.1: /@next/env/13.1.1:
resolution: {integrity: sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw==} resolution: {integrity: sha512-vFMyXtPjSAiOXOywMojxfKIqE3VWN5RCAx+tT3AS3pcKjMLFTCJFUWsKv8hC+87Z1F4W3r68qTwDFZIFmd5Xkw==}
dev: false dev: false
@ -670,6 +715,17 @@ packages:
glob: 7.1.7 glob: 7.1.7
dev: true dev: true
/@next/mdx/13.1.1_vvg67iglxhejglpl7nsv3pjzui:
resolution: {integrity: sha512-a588olt++s7vcuhlgrNOBpZUqlbr9vr94NjA3ixM9AgL8fnwJ/GgxEMsrcsp2gPw91lzBlumBfjK6Lc3k3m23Q==}
peerDependencies:
'@mdx-js/loader': '>=0.15.0'
'@mdx-js/react': '*'
dependencies:
'@mdx-js/loader': 2.2.1
'@mdx-js/react': 2.2.1_react@18.2.0
source-map: 0.7.4
dev: false
/@next/swc-android-arm-eabi/13.1.1: /@next/swc-android-arm-eabi/13.1.1:
resolution: {integrity: sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==} resolution: {integrity: sha512-qnFCx1kT3JTWhWve4VkeWuZiyjG0b5T6J2iWuin74lORCupdrNukxkq9Pm+Z7PsatxuwVJMhjUoYz7H4cWzx2A==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
@ -872,6 +928,12 @@ packages:
engines: {node: '>= 10'} engines: {node: '>= 10'}
dev: true dev: true
/@types/acorn/4.0.6:
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
dependencies:
'@types/estree': 1.0.0
dev: false
/@types/aria-query/4.2.2: /@types/aria-query/4.2.2:
resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==}
dev: true dev: true
@ -892,6 +954,16 @@ packages:
'@types/ms': 0.7.31 '@types/ms': 0.7.31
dev: false dev: false
/@types/estree-jsx/1.0.0:
resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==}
dependencies:
'@types/estree': 1.0.0
dev: false
/@types/estree/1.0.0:
resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
dev: false
/@types/hast/2.3.4: /@types/hast/2.3.4:
resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==}
dependencies: dependencies:
@ -912,6 +984,10 @@ packages:
'@types/unist': 2.0.6 '@types/unist': 2.0.6
dev: false dev: false
/@types/mdx/2.0.3:
resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==}
dev: false
/@types/ms/0.7.31: /@types/ms/0.7.31:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: false dev: false
@ -922,7 +998,6 @@ packages:
/@types/prop-types/15.7.5: /@types/prop-types/15.7.5:
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
dev: true
/@types/react-dom/18.0.9: /@types/react-dom/18.0.9:
resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==} resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==}
@ -936,11 +1011,9 @@ packages:
'@types/prop-types': 15.7.5 '@types/prop-types': 15.7.5
'@types/scheduler': 0.16.2 '@types/scheduler': 0.16.2
csstype: 3.1.1 csstype: 3.1.1
dev: true
/@types/scheduler/0.16.2: /@types/scheduler/0.16.2:
resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
dev: true
/@types/unist/2.0.6: /@types/unist/2.0.6:
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
@ -1060,7 +1133,6 @@ packages:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies: dependencies:
acorn: 8.8.1 acorn: 8.8.1
dev: true
/acorn-node/1.8.2: /acorn-node/1.8.2:
resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
@ -1087,7 +1159,6 @@ packages:
resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
hasBin: true hasBin: true
dev: true
/agent-base/6.0.2: /agent-base/6.0.2:
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
@ -1140,12 +1211,6 @@ packages:
/arg/5.0.2: /arg/5.0.2:
resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
/argparse/1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
sprintf-js: 1.0.3
dev: false
/argparse/2.0.1: /argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true dev: true
@ -1218,6 +1283,11 @@ packages:
resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
dev: true dev: true
/astring/1.8.4:
resolution: {integrity: sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==}
hasBin: true
dev: false
/asynckit/0.4.0: /asynckit/0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: true dev: true
@ -1374,6 +1444,10 @@ packages:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
dev: false dev: false
/character-reference-invalid/2.0.1:
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
dev: false
/check-error/1.0.2: /check-error/1.0.2:
resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==}
dev: true dev: true
@ -1481,7 +1555,6 @@ packages:
/csstype/3.1.1: /csstype/3.1.1:
resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
dev: true
/damerau-levenshtein/1.0.8: /damerau-levenshtein/1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
@ -2054,6 +2127,7 @@ packages:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
dev: true
/esquery/1.4.0: /esquery/1.4.0:
resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
@ -2074,18 +2148,48 @@ packages:
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
dev: true dev: true
/estree-util-attach-comments/2.1.0:
resolution: {integrity: sha512-rJz6I4L0GaXYtHpoMScgDIwM0/Vwbu5shbMeER596rB2D1EWF6+Gj0e0UKzJPZrpoOc87+Q2kgVFHfjAymIqmw==}
dependencies:
'@types/estree': 1.0.0
dev: false
/estree-util-build-jsx/2.2.2:
resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==}
dependencies:
'@types/estree-jsx': 1.0.0
estree-util-is-identifier-name: 2.0.1
estree-walker: 3.0.2
dev: false
/estree-util-is-identifier-name/2.0.1:
resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==}
dev: false
/estree-util-to-js/1.1.0:
resolution: {integrity: sha512-490lbfCcpLk+ofK6HCgqDfYs4KAfq6QVvDw3+Bm1YoKRgiOjKiKYGAVQE1uwh7zVxBgWhqp4FDtp5SqunpUk1A==}
dependencies:
'@types/estree-jsx': 1.0.0
astring: 1.8.4
source-map: 0.7.4
dev: false
/estree-util-visit/1.2.0:
resolution: {integrity: sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==}
dependencies:
'@types/estree-jsx': 1.0.0
'@types/unist': 2.0.6
dev: false
/estree-walker/3.0.2:
resolution: {integrity: sha512-C03BvXCQIH/po+PNPONx/zSM9ziPr9weX8xNhYb/IJtdJ9z+L4z9VKPTB+UTHdmhnIopA2kc419ueyVyHVktwA==}
dev: false
/esutils/2.0.3: /esutils/2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/extend-shallow/2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
dependencies:
is-extendable: 0.1.1
dev: false
/extend/3.0.2: /extend/3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
dev: false dev: false
@ -2328,16 +2432,6 @@ packages:
resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
dev: true dev: true
/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.2: /has-bigints/1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
dev: true dev: true
@ -2375,32 +2469,26 @@ packages:
dependencies: dependencies:
function-bind: 1.1.1 function-bind: 1.1.1
/hast-util-is-element/2.1.2: /hast-util-to-estree/2.1.0:
resolution: {integrity: sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==} resolution: {integrity: sha512-Vwch1etMRmm89xGgz+voWXvVHba2iiMdGMKmaMfYt35rbVtFDq8JNwwAIvi8zHMkO6Gvqo9oTMwJTmzVRfXh4g==}
dependencies: dependencies:
'@types/estree': 1.0.0
'@types/estree-jsx': 1.0.0
'@types/hast': 2.3.4 '@types/hast': 2.3.4
'@types/unist': 2.0.6 '@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.3 comma-separated-tokens: 2.0.3
hast-util-is-element: 2.1.2 estree-util-attach-comments: 2.1.0
estree-util-is-identifier-name: 2.0.1
hast-util-whitespace: 2.0.0 hast-util-whitespace: 2.0.0
html-void-elements: 2.0.1 mdast-util-mdx-expression: 1.3.1
mdast-util-mdxjs-esm: 1.3.0
property-information: 6.2.0 property-information: 6.2.0
space-separated-tokens: 2.0.2 space-separated-tokens: 2.0.2
stringify-entities: 4.0.3 style-to-object: 0.3.0
unist-util-is: 5.1.1 unist-util-position: 4.0.3
zwitch: 2.0.4
transitivePeerDependencies:
- supports-color
dev: false dev: false
/hast-util-whitespace/2.0.0: /hast-util-whitespace/2.0.0:
@ -2418,10 +2506,6 @@ packages:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
dev: true dev: true
/html-void-elements/2.0.1:
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
dev: false
/http-proxy-agent/5.0.0: /http-proxy-agent/5.0.0:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
@ -2479,6 +2563,10 @@ packages:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
dev: true dev: true
/inline-style-parser/0.1.1:
resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
dev: false
/internal-slot/1.0.3: /internal-slot/1.0.3:
resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2488,6 +2576,17 @@ packages:
side-channel: 1.0.4 side-channel: 1.0.4
dev: true dev: true
/is-alphabetical/2.0.1:
resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
dev: false
/is-alphanumerical/2.0.1:
resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
dependencies:
is-alphabetical: 2.0.1
is-decimal: 2.0.1
dev: false
/is-arguments/1.1.1: /is-arguments/1.1.1:
resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2538,17 +2637,16 @@ packages:
has-tostringtag: 1.0.0 has-tostringtag: 1.0.0
dev: true dev: true
/is-decimal/2.0.1:
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
dev: false
/is-docker/2.2.1: /is-docker/2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
hasBin: true hasBin: true
dev: true dev: true
/is-extendable/0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
dev: false
/is-extglob/2.1.1: /is-extglob/2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -2564,6 +2662,10 @@ packages:
dependencies: dependencies:
is-extglob: 2.1.1 is-extglob: 2.1.1
/is-hexadecimal/2.0.1:
resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
dev: false
/is-map/2.0.2: /is-map/2.0.2:
resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
dev: true dev: true
@ -2598,6 +2700,12 @@ packages:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
dev: true dev: true
/is-reference/3.0.1:
resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==}
dependencies:
'@types/estree': 1.0.0
dev: false
/is-regex/1.1.4: /is-regex/1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2702,14 +2810,6 @@ packages:
/js-tokens/4.0.0: /js-tokens/4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 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: /js-yaml/4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true hasBin: true
@ -2801,11 +2901,6 @@ packages:
object.assign: 4.1.4 object.assign: 4.1.4
dev: true 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.5: /kleur/4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -2906,6 +3001,11 @@ packages:
semver: 6.3.0 semver: 6.3.0
dev: true dev: true
/markdown-extensions/1.1.1:
resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
engines: {node: '>=0.10.0'}
dev: false
/mdast-util-definitions/5.1.1: /mdast-util-definitions/5.1.1:
resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==} resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==}
dependencies: dependencies:
@ -2933,6 +3033,55 @@ packages:
- supports-color - supports-color
dev: false dev: false
/mdast-util-mdx-expression/1.3.1:
resolution: {integrity: sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==}
dependencies:
'@types/estree-jsx': 1.0.0
'@types/hast': 2.3.4
'@types/mdast': 3.0.10
mdast-util-from-markdown: 1.2.0
mdast-util-to-markdown: 1.4.0
transitivePeerDependencies:
- supports-color
dev: false
/mdast-util-mdx-jsx/2.1.0:
resolution: {integrity: sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==}
dependencies:
'@types/estree-jsx': 1.0.0
'@types/hast': 2.3.4
'@types/mdast': 3.0.10
ccount: 2.0.1
mdast-util-to-markdown: 1.4.0
parse-entities: 4.0.0
stringify-entities: 4.0.3
unist-util-remove-position: 4.0.1
unist-util-stringify-position: 3.0.2
vfile-message: 3.1.3
dev: false
/mdast-util-mdx/2.0.0:
resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==}
dependencies:
mdast-util-mdx-expression: 1.3.1
mdast-util-mdx-jsx: 2.1.0
mdast-util-mdxjs-esm: 1.3.0
transitivePeerDependencies:
- supports-color
dev: false
/mdast-util-mdxjs-esm/1.3.0:
resolution: {integrity: sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==}
dependencies:
'@types/estree-jsx': 1.0.0
'@types/hast': 2.3.4
'@types/mdast': 3.0.10
mdast-util-from-markdown: 1.2.0
mdast-util-to-markdown: 1.4.0
transitivePeerDependencies:
- supports-color
dev: false
/mdast-util-to-hast/12.2.4: /mdast-util-to-hast/12.2.4:
resolution: {integrity: sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==} resolution: {integrity: sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==}
dependencies: dependencies:
@ -2988,6 +3137,64 @@ packages:
uvu: 0.5.6 uvu: 0.5.6
dev: false dev: false
/micromark-extension-mdx-expression/1.0.3:
resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==}
dependencies:
micromark-factory-mdx-expression: 1.0.6
micromark-factory-space: 1.0.0
micromark-util-character: 1.1.0
micromark-util-events-to-acorn: 1.2.0
micromark-util-symbol: 1.0.1
micromark-util-types: 1.0.2
uvu: 0.5.6
dev: false
/micromark-extension-mdx-jsx/1.0.3:
resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==}
dependencies:
'@types/acorn': 4.0.6
estree-util-is-identifier-name: 2.0.1
micromark-factory-mdx-expression: 1.0.6
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.6
vfile-message: 3.1.3
dev: false
/micromark-extension-mdx-md/1.0.0:
resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==}
dependencies:
micromark-util-types: 1.0.2
dev: false
/micromark-extension-mdxjs-esm/1.0.3:
resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==}
dependencies:
micromark-core-commonmark: 1.0.6
micromark-util-character: 1.1.0
micromark-util-events-to-acorn: 1.2.0
micromark-util-symbol: 1.0.1
micromark-util-types: 1.0.2
unist-util-position-from-estree: 1.1.1
uvu: 0.5.6
vfile-message: 3.1.3
dev: false
/micromark-extension-mdxjs/1.0.0:
resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==}
dependencies:
acorn: 8.8.1
acorn-jsx: 5.3.2_acorn@8.8.1
micromark-extension-mdx-expression: 1.0.3
micromark-extension-mdx-jsx: 1.0.3
micromark-extension-mdx-md: 1.0.0
micromark-extension-mdxjs-esm: 1.0.3
micromark-util-combine-extensions: 1.0.0
micromark-util-types: 1.0.2
dev: false
/micromark-factory-destination/1.0.0: /micromark-factory-destination/1.0.0:
resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==}
dependencies: dependencies:
@ -3005,6 +3212,19 @@ packages:
uvu: 0.5.6 uvu: 0.5.6
dev: false dev: false
/micromark-factory-mdx-expression/1.0.6:
resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==}
dependencies:
micromark-factory-space: 1.0.0
micromark-util-character: 1.1.0
micromark-util-events-to-acorn: 1.2.0
micromark-util-symbol: 1.0.1
micromark-util-types: 1.0.2
unist-util-position-from-estree: 1.1.1
uvu: 0.5.6
vfile-message: 3.1.3
dev: false
/micromark-factory-space/1.0.0: /micromark-factory-space/1.0.0:
resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==}
dependencies: dependencies:
@ -3078,6 +3298,18 @@ packages:
resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==}
dev: false dev: false
/micromark-util-events-to-acorn/1.2.0:
resolution: {integrity: sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==}
dependencies:
'@types/acorn': 4.0.6
'@types/estree': 1.0.0
estree-util-visit: 1.2.0
micromark-util-types: 1.0.2
uvu: 0.5.6
vfile-location: 4.0.1
vfile-message: 3.1.3
dev: false
/micromark-util-html-tag-name/1.1.0: /micromark-util-html-tag-name/1.1.0:
resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==}
dev: false dev: false
@ -3391,6 +3623,19 @@ packages:
callsites: 3.1.0 callsites: 3.1.0
dev: true dev: true
/parse-entities/4.0.0:
resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==}
dependencies:
'@types/unist': 2.0.6
character-entities: 2.0.2
character-entities-legacy: 3.0.0
character-reference-invalid: 2.0.1
decode-named-character-reference: 1.0.2
is-alphanumerical: 2.0.1
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
dev: false
/parse5/7.1.2: /parse5/7.1.2:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
dependencies: dependencies:
@ -3432,6 +3677,13 @@ packages:
resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
dev: true dev: true
/periscopic/3.0.4:
resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==}
dependencies:
estree-walker: 3.0.2
is-reference: 3.0.1
dev: false
/picocolors/1.0.0: /picocolors/1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
@ -3663,14 +3915,13 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/remark-html/15.0.1: /remark-mdx/2.2.1:
resolution: {integrity: sha512-7ta5UPRqj8nP0GhGMYUAghZ/DRno7dgq7alcW90A7+9pgJsXzGJlFgwF8HOP1b1tMgT3WwbeANN+CaTimMfyNQ==} resolution: {integrity: sha512-R9wcN+/THRXTKyRBp6Npo/mcbGA2iT3N4G8qUqLA5pOEg7kBidHv8K2hHidCMYZ6DXmwK18umu0K4cicgA2PPQ==}
dependencies: dependencies:
'@types/mdast': 3.0.10 mdast-util-mdx: 2.0.0
hast-util-sanitize: 4.0.0 micromark-extension-mdxjs: 1.0.0
hast-util-to-html: 8.0.3 transitivePeerDependencies:
mdast-util-to-hast: 12.2.4 - supports-color
unified: 10.1.2
dev: false dev: false
/remark-parse/10.0.1: /remark-parse/10.0.1:
@ -3683,25 +3934,15 @@ packages:
- supports-color - supports-color
dev: false dev: false
/remark-stringify/10.0.2: /remark-rehype/10.1.0:
resolution: {integrity: sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==} resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
dependencies: dependencies:
'@types/hast': 2.3.4
'@types/mdast': 3.0.10 '@types/mdast': 3.0.10
mdast-util-to-markdown: 1.4.0 mdast-util-to-hast: 12.2.4
unified: 10.1.2 unified: 10.1.2
dev: false 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.2
transitivePeerDependencies:
- supports-color
dev: false
/require-directory/2.1.1: /require-directory/2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3788,14 +4029,6 @@ packages:
dependencies: dependencies:
loose-envify: 1.4.0 loose-envify: 1.4.0
/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/6.3.0: /semver/6.3.0:
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
hasBin: true hasBin: true
@ -3858,12 +4091,13 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/space-separated-tokens/2.0.2: /source-map/0.7.4:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
engines: {node: '>= 8'}
dev: false dev: false
/sprintf-js/1.0.3: /space-separated-tokens/2.0.2:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
dev: false dev: false
/string-width/4.2.3: /string-width/4.2.3:
@ -3918,11 +4152,6 @@ packages:
ansi-regex: 5.0.1 ansi-regex: 5.0.1
dev: true dev: true
/strip-bom-string/1.0.0:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
engines: {node: '>=0.10.0'}
dev: false
/strip-bom/3.0.0: /strip-bom/3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3939,6 +4168,12 @@ packages:
acorn: 8.8.1 acorn: 8.8.1
dev: true dev: true
/style-to-object/0.3.0:
resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==}
dependencies:
inline-style-parser: 0.1.1
dev: false
/styled-jsx/5.1.1_3lzqd2prgnu7gkxqqdmtvzna5u: /styled-jsx/5.1.1_3lzqd2prgnu7gkxqqdmtvzna5u:
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
@ -4188,12 +4423,25 @@ packages:
resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==} resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==}
dev: false dev: false
/unist-util-position-from-estree/1.1.1:
resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==}
dependencies:
'@types/unist': 2.0.6
dev: false
/unist-util-position/4.0.3: /unist-util-position/4.0.3:
resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==} resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==}
dependencies: dependencies:
'@types/unist': 2.0.6 '@types/unist': 2.0.6
dev: false dev: false
/unist-util-remove-position/4.0.1:
resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==}
dependencies:
'@types/unist': 2.0.6
unist-util-visit: 4.1.1
dev: false
/unist-util-stringify-position/3.0.2: /unist-util-stringify-position/3.0.2:
resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==}
dependencies: dependencies:
@ -4266,6 +4514,13 @@ packages:
convert-source-map: 1.9.0 convert-source-map: 1.9.0
dev: true dev: true
/vfile-location/4.0.1:
resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==}
dependencies:
'@types/unist': 2.0.6
vfile: 5.3.6
dev: false
/vfile-message/3.1.3: /vfile-message/3.1.3:
resolution: {integrity: sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==} resolution: {integrity: sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==}
dependencies: dependencies:

View file

@ -1,18 +0,0 @@
type TrainingType = {
name: string;
slug: string;
priceOpen: number;
priceCompany: number;
logo: string;
days: number;
description: string;
content: string;
trainingHubId?: string;
draft?: true;
new?: true;
featured?: true;
weight: number; // custom sorting
};
export default TrainingType;