feat(servicos): ofertas no topo de /servicos, capa por assunto e diagramas
/servicos abre com as 3 ofertas e depois outros serviços; H1 de criação de sites e de engenharia com o nome da oferta; capa de cada serviço pelo assunto (SEV fora do próprio case cai de ~11 para 2 imagens); diagrama de fluxo em SVG nos serviços sem case; cases com o que o cliente passou a poder fazer e contato logo depois de Como ficou; FAQ num componente só; lastmod por rota; ProfessionalService com areaServed.
This commit is contained in:
1 parent
e63f3c2ebd
commit
fc44a69fb3
41 files changed
+2486
-550
No files matched your search
+43
-4
@@ -1,4 +1,9 @@
|
||||
import { caseStudies, servicePages, siteUrl } from "@/lib/site-content";
|
||||
import {
|
||||
caseStudies,
|
||||
pageUpdatedAt,
|
||||
servicePages,
|
||||
siteUrl,
|
||||
} from "@/lib/site-content";
|
||||
import sitemap from "./sitemap";
|
||||
|
||||
/** O mapa do site lista a home, as páginas fixas, cada serviço e cada case, sem repetir endereço. */
|
||||
@@ -26,8 +31,42 @@ describe("sitemap", () => {
|
||||
expect(urls.some((url) => /not-found|nada/.test(url))).toBe(false);
|
||||
});
|
||||
|
||||
it("gives every entry the same fixed date, so the sitemap is equal on every build", () => {
|
||||
const dates = sitemap().map((entry) => String(entry.lastModified));
|
||||
expect(new Set(dates).size).toBe(1);
|
||||
it("gives every route the modification date of its own content, equal on every build", () => {
|
||||
const day = (value: Date | string | undefined) =>
|
||||
new Date(value ?? "").toISOString().slice(0, 10);
|
||||
const byUrl = new Map(
|
||||
sitemap().map((entry) => [entry.url, day(entry.lastModified)]),
|
||||
);
|
||||
|
||||
expect(byUrl.get(siteUrl)).toBe(pageUpdatedAt.home);
|
||||
expect(byUrl.get(`${siteUrl}/curriculo`)).toBe(pageUpdatedAt.curriculo);
|
||||
expect(byUrl.get(`${siteUrl}/privacidade`)).toBe(pageUpdatedAt.privacidade);
|
||||
expect(byUrl.get(`${siteUrl}/servicos`)).toBe(pageUpdatedAt.servicos);
|
||||
expect(byUrl.get(`${siteUrl}/cases`)).toBe(pageUpdatedAt.cases);
|
||||
expect(byUrl.get(`${siteUrl}/ia`)).toBe(pageUpdatedAt.ia);
|
||||
for (const { slug, updatedAt } of servicePages) {
|
||||
expect(byUrl.get(`${siteUrl}/servicos/${slug}`)).toBe(updatedAt);
|
||||
}
|
||||
for (const { id, updatedAt } of caseStudies) {
|
||||
expect(byUrl.get(`${siteUrl}/cases/${id}`)).toBe(updatedAt);
|
||||
}
|
||||
|
||||
// não é uma data única copiada para todas as rotas, e não vem do relógio: duas chamadas dão o mesmo resultado
|
||||
expect(new Set(byUrl.values()).size).toBeGreaterThan(1);
|
||||
expect(sitemap()).toEqual(sitemap());
|
||||
});
|
||||
|
||||
it("keeps every content date a real calendar day (AAAA-MM-DD) that is not in the future", () => {
|
||||
const days = [
|
||||
...Object.values(pageUpdatedAt),
|
||||
...servicePages.map(({ updatedAt }) => updatedAt),
|
||||
...caseStudies.map(({ updatedAt }) => updatedAt),
|
||||
];
|
||||
for (const value of days) {
|
||||
expect(value).toMatch(/^\d{4}-\d{2}-\d{2}$/);
|
||||
const parsed = new Date(`${value}T00:00:00Z`);
|
||||
expect(parsed.toISOString().slice(0, 10)).toBe(value);
|
||||
expect(parsed.getTime()).toBeLessThanOrEqual(Date.now());
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user