Files
ESPDocs/app/sitemap.js
T
Lucas RayanandClaude Sonnet 5.5 fe1802f818
CI / Lint e auditorias (push) Successful in 48s
CI / Trivy (dependências e segredos) (push) Successful in 12s
CI / Imagem Docker (linux/arm64) (push) Successful in 3m41s
Release / Plano (reaproveitar a imagem?) (push) Successful in 6s
Release / ci (push) Skipped
Release / Publica a imagem (linux/arm64) (push) Successful in 16s
Release / Cria a release no Gitea (push) Successful in 6s
fix: book canonical, fr/de pin warnings, pin grouping per locale, SEO checks
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 23:58:11 -03:00

84 lines
2.5 KiB
JavaScript

import seriesData from "@/public/series.json";
import frameworksData from "@/public/frameworks.json";
import { SITE } from "@/lib/seo";
import { ENABLED_LOCALES, getLocalizedHref } from "@/i18n/links";
const LANG_MAP = {
pt: "pt-BR",
en: "en",
es: "es-419",
fr: "fr",
de: "de",
"zh-CN": "zh-CN",
};
/**
* Sitemap gerado a partir dos próprios dados do site e dos idiomas ativos.
* Inclui URLs apenas para ENABLED_LOCALES, com hreflang/alternates correspondentes.
* O livro só entra para a versão em português.
*/
export default function sitemap() {
const dataRevisao = new Date("2026-08-25T00:00:00.000Z");
const fixas = [
{ rota: "", prioridade: 1.0, frequencia: "weekly" },
{ rota: "/series", prioridade: 0.9, frequencia: "weekly" },
{ rota: "/comparacao", prioridade: 0.9, frequencia: "weekly" },
{ rota: "/diagnostico", prioridade: 0.9, frequencia: "weekly" },
{ rota: "/seletor", prioridade: 0.8, frequencia: "monthly" },
{ rota: "/frameworks", prioridade: 0.8, frequencia: "monthly" },
{ rota: "/componentes", prioridade: 0.8, frequencia: "weekly" },
{ rota: "/livro", prioridade: 0.7, frequencia: "monthly", apenasPt: true },
{ rota: "/glossario", prioridade: 0.7, frequencia: "monthly" },
{ rota: "/catalogo", prioridade: 0.6, frequencia: "weekly" },
{ rota: "/sobre", prioridade: 0.4, frequencia: "yearly" },
];
const series = Object.keys(seriesData).map((chave) => ({
rota: `/series/${chave}`,
prioridade: 0.9,
frequencia: "monthly",
}));
const frameworks = Object.keys(frameworksData).map((chave) => ({
rota: `/frameworks/${encodeURIComponent(chave)}`,
prioridade: 0.6,
frequencia: "monthly",
}));
const todasRotas = [...fixas, ...series, ...frameworks];
const entries = [];
for (const item of todasRotas) {
for (const loc of ENABLED_LOCALES) {
if (item.apenasPt && loc !== "pt") continue;
const href = getLocalizedHref(`/pt${item.rota}`, loc);
const url = `${SITE.url}${href}`;
const languages = {};
for (const l of ENABLED_LOCALES) {
if (item.apenasPt && l !== "pt") continue;
languages[LANG_MAP[l] || l] = `${SITE.url}${getLocalizedHref(`/pt${item.rota}`, l)}`;
}
// x-default: quem não casa com nenhum idioma cai no inglês (como na raiz).
if (!item.apenasPt && ENABLED_LOCALES.includes("en")) {
languages["x-default"] = `${SITE.url}${getLocalizedHref(`/pt${item.rota}`, "en")}`;
}
entries.push({
url,
lastModified: dataRevisao,
changeFrequency: item.frequencia,
priority: item.prioridade,
alternates: {
languages,
},
});
}
}
return entries;
}