mirror of
https://github.com/facebook/docusaurus.git
synced 2025-12-26 01:33:02 +00:00
Some checks failed
Argos CI / take-screenshots (push) Has been cancelled
Build Hash Router / Build Hash Router (push) Has been cancelled
Canary Release / Publish Canary (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Continuous Releases / Continuous Releases (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (20) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (20.0) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (22) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (24) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 (25.1) (push) Has been cancelled
E2E Tests / E2E — Yarn v1 Windows (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (node-modules, -s) (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (node-modules, -st) (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (pnp, -s) (push) Has been cancelled
E2E Tests / E2E — Yarn Berry (pnp, -st) (push) Has been cancelled
E2E Tests / E2E — npm (push) Has been cancelled
E2E Tests / E2E — pnpm (push) Has been cancelled
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
import {applyTrailingSlash} from '@docusaurus/utils-common';
|
|
import {normalizeUrl} from '@docusaurus/utils';
|
|
import type {LastModOption, SitemapItem} from './types';
|
|
import type {DocusaurusConfig, RouteConfig, VcsConfig} from '@docusaurus/types';
|
|
import type {PluginOptions} from './options';
|
|
|
|
async function getRouteLastUpdatedAt(
|
|
route: RouteConfig,
|
|
vcs: Pick<VcsConfig, 'getFileLastUpdateInfo'>,
|
|
): Promise<number | null | undefined> {
|
|
// Important to bail-out early here
|
|
// This can lead to duplicated VCS calls and performance problems
|
|
// See https://github.com/facebook/docusaurus/pull/11211
|
|
if (route.metadata?.lastUpdatedAt === null) {
|
|
return null;
|
|
}
|
|
if (route.metadata?.lastUpdatedAt) {
|
|
return route.metadata?.lastUpdatedAt;
|
|
}
|
|
if (route.metadata?.sourceFilePath) {
|
|
const lastUpdateInfo = await vcs.getFileLastUpdateInfo(
|
|
route.metadata?.sourceFilePath,
|
|
);
|
|
return lastUpdateInfo?.timestamp ?? null;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
type LastModFormatter = (timestamp: number) => string;
|
|
|
|
const LastmodFormatters: Record<LastModOption, LastModFormatter> = {
|
|
date: (timestamp) => new Date(timestamp).toISOString().split('T')[0]!,
|
|
datetime: (timestamp) => new Date(timestamp).toISOString(),
|
|
};
|
|
|
|
function formatLastmod(timestamp: number, lastmodOption: LastModOption) {
|
|
const format = LastmodFormatters[lastmodOption];
|
|
return format(timestamp);
|
|
}
|
|
|
|
async function getRouteLastmod({
|
|
route,
|
|
lastmod,
|
|
vcs,
|
|
}: {
|
|
route: RouteConfig;
|
|
lastmod: LastModOption | null;
|
|
vcs: Pick<VcsConfig, 'getFileLastUpdateInfo'>;
|
|
}): Promise<string | null> {
|
|
if (lastmod === null) {
|
|
return null;
|
|
}
|
|
const lastUpdatedAt = (await getRouteLastUpdatedAt(route, vcs)) ?? null;
|
|
return lastUpdatedAt ? formatLastmod(lastUpdatedAt, lastmod) : null;
|
|
}
|
|
|
|
export async function createSitemapItem({
|
|
route,
|
|
siteConfig,
|
|
options,
|
|
}: {
|
|
route: RouteConfig;
|
|
siteConfig: DocusaurusConfig;
|
|
options: PluginOptions;
|
|
}): Promise<SitemapItem> {
|
|
const {changefreq, priority, lastmod} = options;
|
|
return {
|
|
url: normalizeUrl([
|
|
siteConfig.url,
|
|
applyTrailingSlash(route.path, {
|
|
trailingSlash: siteConfig.trailingSlash,
|
|
baseUrl: siteConfig.baseUrl,
|
|
}),
|
|
]),
|
|
changefreq,
|
|
priority,
|
|
lastmod: await getRouteLastmod({
|
|
route,
|
|
lastmod,
|
|
vcs: siteConfig.future.experimental_vcs,
|
|
}),
|
|
};
|
|
}
|