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
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
84 lines
2.5 KiB
JavaScript
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;
|
|
}
|