summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Swithinbank2023-05-12 23:53:55 +0200
committerGitHub2023-05-12 23:53:55 +0200
commite22dd76136f9749bb5d43f96241385faccfc90a1 (patch)
tree48ca67c0dbfac4c46d75d1dfb8944c6d66e5f0d8
parent623b577319b1dea2d6c42f1b680139fb858d85d6 (diff)
downloadIT.starlight-e22dd76136f9749bb5d43f96241385faccfc90a1.tar.gz
IT.starlight-e22dd76136f9749bb5d43f96241385faccfc90a1.tar.bz2
IT.starlight-e22dd76136f9749bb5d43f96241385faccfc90a1.zip
Add support for generating sitemap (#40)
-rw-r--r--.changeset/lovely-papayas-sip.md5
-rw-r--r--docs/astro.config.mjs1
-rw-r--r--packages/starlight/components/HeadSEO.astro2
-rw-r--r--packages/starlight/index.ts3
-rw-r--r--packages/starlight/integrations/sitemap.ts22
-rw-r--r--packages/starlight/package.json1
-rw-r--r--pnpm-lock.yaml39
7 files changed, 72 insertions, 1 deletions
diff --git a/.changeset/lovely-papayas-sip.md b/.changeset/lovely-papayas-sip.md
new file mode 100644
index 00000000..e67cef5b
--- /dev/null
+++ b/.changeset/lovely-papayas-sip.md
@@ -0,0 +1,5 @@
+---
+"@astrojs/starlight": patch
+---
+
+Generate sitemaps for Starlight sites
diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs
index 721600ac..908dd922 100644
--- a/docs/astro.config.mjs
+++ b/docs/astro.config.mjs
@@ -3,6 +3,7 @@ import starlight from '@astrojs/starlight';
// https://astro.build/config
export default defineConfig({
+ site: 'https://starlight.astro.build',
integrations: [
starlight({
title: 'Starlight Docs',
diff --git a/packages/starlight/components/HeadSEO.astro b/packages/starlight/components/HeadSEO.astro
index 3b300355..25bab249 100644
--- a/packages/starlight/components/HeadSEO.astro
+++ b/packages/starlight/components/HeadSEO.astro
@@ -40,6 +40,8 @@ const description = data.description || config.description;
href={import.meta.env.BASE_URL + 'favicon.svg'}
type="image/svg+xml"
/>
+{/* Link to sitemap, but only when `site` is set. */}
+{Astro.site && <link rel="sitemap" href="/sitemap-index.xml" />}
<!-- OpenGraph Tags -->
<meta property="og:title" content={title} />
diff --git a/packages/starlight/index.ts b/packages/starlight/index.ts
index d25960d1..f08b9179 100644
--- a/packages/starlight/index.ts
+++ b/packages/starlight/index.ts
@@ -9,6 +9,7 @@ import { spawn } from 'node:child_process';
import { dirname, relative } from 'node:path';
import { fileURLToPath } from 'node:url';
import { starlightAsides } from './integrations/asides';
+import { starlightSitemap } from './integrations/sitemap';
import {
StarlightUserConfig,
StarlightConfig,
@@ -63,7 +64,7 @@ export default function StarlightIntegration(
},
};
- return [Starlight, mdx()];
+ return [starlightSitemap(userConfig), Starlight, mdx()];
}
function resolveVirtualModuleId(id: string) {
diff --git a/packages/starlight/integrations/sitemap.ts b/packages/starlight/integrations/sitemap.ts
new file mode 100644
index 00000000..47604ccc
--- /dev/null
+++ b/packages/starlight/integrations/sitemap.ts
@@ -0,0 +1,22 @@
+import sitemap, { SitemapOptions } from '@astrojs/sitemap';
+import type { StarlightConfig } from '../types';
+
+/**
+ * A wrapped version of the `@astrojs/sitemap` integration configured based
+ * on Starlight i18n config.
+ */
+export function starlightSitemap(opts: StarlightConfig) {
+ const sitemapConfig: SitemapOptions = {};
+ if (opts.isMultilingual) {
+ sitemapConfig.i18n = {
+ defaultLocale: opts.defaultLocale.locale! || 'root',
+ locales: Object.fromEntries(
+ Object.entries(opts.locales).map(([locale, config]) => [
+ locale,
+ config?.lang!,
+ ])
+ ),
+ };
+ }
+ return sitemap(sitemapConfig);
+}
diff --git a/packages/starlight/package.json b/packages/starlight/package.json
index 509ddfdb..c35269d8 100644
--- a/packages/starlight/package.json
+++ b/packages/starlight/package.json
@@ -36,6 +36,7 @@
},
"dependencies": {
"@astrojs/mdx": "^0.19.1",
+ "@astrojs/sitemap": "^1.3.1",
"@pagefind/default-ui": "^0.12.0",
"@types/mdast": "^3.0.11",
"bcp-47": "^2.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d397e16d..a504f326 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,6 +28,9 @@ importers:
'@astrojs/mdx':
specifier: ^0.19.1
version: 0.19.1(astro@2.4.3)(rollup@3.21.5)
+ '@astrojs/sitemap':
+ specifier: ^1.3.1
+ version: 1.3.1
'@pagefind/default-ui':
specifier: ^0.12.0
version: 0.12.0
@@ -158,6 +161,13 @@ packages:
dependencies:
prismjs: 1.29.0
+ /@astrojs/sitemap@1.3.1:
+ resolution: {integrity: sha512-4ZBug4ml+2Nl5/Uh4VSja8Kij/DU7/RaNMciXCNm1EzQkP/jm+nqMG1liDDcQK5zXPAoLeaat06IbhNlruvQjg==}
+ dependencies:
+ sitemap: 7.1.1
+ zod: 3.21.4
+ dev: false
+
/@astrojs/telemetry@2.1.1:
resolution: {integrity: sha512-4pRhyeQr0MLB5PKYgkdu+YE8sSpMbHL8dUuslBWBIdgcYjtD1SufPMBI8pgXJ+xlwrQJHKKfK2X1KonHYuOS9A==}
engines: {node: '>=16.12.0'}
@@ -1015,6 +1025,10 @@ packages:
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
dev: true
+ /@types/node@17.0.45:
+ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+ dev: false
+
/@types/node@18.15.11:
resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==}
@@ -1028,6 +1042,12 @@ packages:
/@types/resolve@1.20.2:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+ /@types/sax@1.2.4:
+ resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==}
+ dependencies:
+ '@types/node': 18.15.11
+ dev: false
+
/@types/semver@6.2.3:
resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==}
dev: true
@@ -1116,6 +1136,10 @@ packages:
normalize-path: 3.0.0
picomatch: 2.3.1
+ /arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+ dev: false
+
/argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
@@ -3742,6 +3766,10 @@ packages:
dependencies:
suf-log: 2.5.3
+ /sax@1.2.4:
+ resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+ dev: false
+
/section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
@@ -3816,6 +3844,17 @@ packages:
/sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ /sitemap@7.1.1:
+ resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==}
+ engines: {node: '>=12.0.0', npm: '>=5.6.0'}
+ hasBin: true
+ dependencies:
+ '@types/node': 17.0.45
+ '@types/sax': 1.2.4
+ arg: 5.0.2
+ sax: 1.2.4
+ dev: false
+
/slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}