1
0
mirror of https://github.com/kamranahmedse/developer-roadmap.git synced 2025-08-19 23:53:24 +02:00
This commit is contained in:
Arik Chakma
2025-08-18 13:48:44 +06:00
parent e8d9a761d6
commit e94d6a8daf
64 changed files with 848 additions and 882 deletions

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-career-path';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'career-path';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/career-path`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-lifecycle';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'lifecycle';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/lifecycle`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-skills';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'skills';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/skills`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-tools';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'tools';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/tools`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-ai';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-ai';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-ai`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-business-analytics';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-business-analytics';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-business-analytics`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,28 +1,28 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-computer-science';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-computer-science';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-computer-science`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-cyber-security';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-cyber-security';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-cyber-security`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-data-analytics';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-data-analytics';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-data-analytics`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-data-engineering';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-data-engineering';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-data-engineering`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-machine-learning';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-machine-learning';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-machine-learning`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-software-engineering';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-software-engineering';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-software-engineering`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'ai-data-scientist-vs-statistics';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-statistics';
const roadmapId = 'ai-data-scientist';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/ai-data-scientist/vs-statistics`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-developer-skills';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'developer-skills';
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/backend/developer-skills`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-developer-tools';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'developer-tools';
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/backend/developer-tools`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,33 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-frameworks';
const guide = await getGuideById(guideId).catch(() => null);
if (!guide) {
return Astro.redirect('/404');
}
const { frontmatter: guideData } = guide!;
const guideId = 'frameworks';
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/backend/frameworks`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,29 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-job-description';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo?.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={replaceVariables(guideData?.seo?.title)}
description={replaceVariables(guideData?.seo?.description)}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
</BaseLayout>

View File

@@ -1,33 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-languages';
const guide = await getGuideById(guideId).catch(() => null);
if (!guide) {
return Astro.redirect('/404');
}
const { frontmatter: guideData } = guide!;
const guideId = 'languages';
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/backend/languages`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-project-ideas';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'project-ideas';
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/backend/project-ideas`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,33 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'backend-technologies';
const guide = await getGuideById(guideId).catch(() => null);
if (!guide) {
return Astro.redirect('/404');
}
const { frontmatter: guideData } = guide!;
const guideId = 'technologies';
const roadmapId = 'backend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -5,7 +5,8 @@ import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'career-path';
const guide = await getOfficialGuide(guideId, 'data-analyst');
const roadmapId = 'data-analyst';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guide?.seo?.ogImageUrl ||
@@ -13,13 +14,15 @@ const ogImageUrl =
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={`/data-analyst/career-path`}
canonicalUrl={guide?.seo?.canonicalUrl || ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} client:load />

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'data-analyst-how-to-become';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'how-to-become';
const roadmapId = 'data-analyst';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/data-analyst/how-to-become`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'data-analyst-vs-data-engineer';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-data-engineer';
const roadmapId = 'data-analyst';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/data-analyst/vs-data-engineer`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-automation-tools';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'automation-tools';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-automation';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'automation';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-best-practices';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'best-practices';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-career-path';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'career-path';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={replaceVariables(guideData.seo.title)}
description={replaceVariables(guideData.seo.description)}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,32 +1,32 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
export const prerender = false;
const guideId = 'devops-engineer';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-vs-sre';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { replaceVariables } from '../../lib/markdown';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'how-to-become-devops-engineer';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-job-description';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'job-description';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-lifecycle';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'lifecycle';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-principles';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'principles';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-shift-left-testing';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'shift-left-testing';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { replaceVariables } from '../../lib/markdown';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-skills';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'skills';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-test-automation';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'test-automation';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-tools';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'tools';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-vs-agile';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-agile';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-vs-developer';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-developer';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={replaceVariables(guideData.seo.title)}
description={replaceVariables(guideData.seo.description)}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-vs-devsecops';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-devsecops';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { replaceVariables } from '../../lib/markdown';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'devops-vs-full-stack';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-full-stack';
const roadmapId = 'devops';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { replaceVariables } from '../../lib/markdown';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'frontend-developer-skills';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'developer-skills';
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { replaceVariables } from '../../lib/markdown';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'frontend-frameworks';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'frameworks';
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'how-to-become-frontend-developer';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'frontend-job-description';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'job-description';
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo?.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={replaceVariables(guideData?.seo?.title)}
description={replaceVariables(guideData?.seo?.description)}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { replaceVariables } from '../../lib/markdown';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'frontend-languages';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'languages';
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,32 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'frontend-technologies';
const guide = await getGuideById(guideId).catch(() => null);
if (!guide) {
return Astro.redirect('/404');
}
const { frontmatter: guideData } = guide!;
const guideId = 'technologies';
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'frontend-web-developer-portfolio';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'web-developer-portfolio';
const roadmapId = 'frontend';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'full-stack-developer-skills';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'developer-skills';
const roadmapId = 'full-stack';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'full-stack-how-to-become';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'how-to-become';
const roadmapId = 'full-stack';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'full-stack-job-description';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'job-description';
const roadmapId = 'full-stack';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'full-stack-vs-backend';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-backend';
const roadmapId = 'full-stack';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'full-stack-vs-software-engineer';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-software-engineer';
const roadmapId = 'full-stack';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,30 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'golang-rest-api';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'rest-api';
const roadmapId = 'golang';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl ?? ''}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'go-vs-java';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-java';
const roadmapId = 'golang';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl ?? ''}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,47 +0,0 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getAllGuides, type GuideFileType } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { replaceVariables } from '../../lib/markdown';
export const prerender = true;
export interface Props {
guide: GuideFileType;
}
export async function getStaticPaths() {
const guides = (await getAllGuides()).filter(
(guide) => !guide.frontmatter.excludedBySlug,
);
return guides.map((guide) => ({
params: { guideId: guide.id },
props: { guide },
}));
}
const { guideId } = Astro.params;
const { guide } = Astro.props;
const { frontmatter: guideData, author } = guide;
const ogImageUrl =
guideData.seo.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/guides/${guideId}`}
canonicalUrl={guideData.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'java-developer-skills';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'developer-skills';
const roadmapId = 'java';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'java-vs-javascript';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-javascript';
const roadmapId = 'java';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'java-vs-python';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-python';
const roadmapId = 'java';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={guideData.excludedBySlug}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner" />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'javascript-vs-typescript';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-typescript';
const roadmapId = 'javascript';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/javascript/vs-typescript`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'sql-hard-to-learn';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'hard-to-learn';
const roadmapId = 'sql';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/sql/hard-to-learn`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner"></div>
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'sql-how-long-to-learn';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'how-long-to-learn';
const roadmapId = 'sql';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/sql/how-long-to-learn`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<div slot="changelog-banner"></div>
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,30 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'sql-vs-mysql';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-mysql';
const roadmapId = 'sql';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/sql/vs-mysql`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>

View File

@@ -1,29 +1,31 @@
---
import GuideContent from '../../components/Guide/GuideContent.astro';
import { GuideContent } from '../../components/Guide/GuideContent';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
import { getOpenGraphImageUrl } from '../../lib/open-graph';
import { getOfficialGuide } from '../../queries/official-guide';
const guideId = 'sql-vs-python';
const guide = await getGuideById(guideId);
const { frontmatter: guideData } = guide!;
const guideId = 'vs-python';
const roadmapId = 'sql';
const guide = await getOfficialGuide(guideId, roadmapId);
const ogImageUrl =
guideData.seo.ogImageUrl ||
guide?.seo?.ogImageUrl ||
getOpenGraphImageUrl({
group: 'guide',
resourceId: guideId,
});
const permalink = `/${roadmapId}/${guideId}`;
---
<BaseLayout
title={guideData.seo.title}
description={guideData.seo.description}
permalink={`/sql/vs-python`}
canonicalUrl={guideData.canonicalUrl}
title={guide?.seo?.metaTitle ?? guide?.title ?? ''}
description={guide?.seo?.metaDescription ?? guide?.description ?? ''}
permalink={permalink}
canonicalUrl={guide?.seo?.canonicalUrl}
ogImageUrl={ogImageUrl}
>
<GuideContent guide={guide!} />
<GuideContent guide={guide!} client:load />
<div slot='changelog-banner'></div>
</BaseLayout>