diff --git a/.changeset/chatty-parrots-compare.md b/.changeset/chatty-parrots-compare.md new file mode 100644 index 000000000000..f273c4ed1817 --- /dev/null +++ b/.changeset/chatty-parrots-compare.md @@ -0,0 +1,5 @@ +--- +'@astrojs/sitemap': patch +--- + +Fix sitemap generation with a base path diff --git a/packages/integrations/sitemap/src/index.ts b/packages/integrations/sitemap/src/index.ts index 99448b9a1349..e6e45ddd1dd6 100644 --- a/packages/integrations/sitemap/src/index.ts +++ b/packages/integrations/sitemap/src/index.ts @@ -79,6 +79,8 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { } let pageUrls = pages.map((p) => { + if (p.pathname !== '' && !finalSiteUrl.pathname.endsWith('/')) + finalSiteUrl.pathname += '/'; const path = finalSiteUrl.pathname + p.pathname; return new URL(path, finalSiteUrl).href; }); diff --git a/packages/integrations/sitemap/test/trailing-slash.test.js b/packages/integrations/sitemap/test/trailing-slash.test.js index b5b7dd6c15a3..a393fb9f12f5 100644 --- a/packages/integrations/sitemap/test/trailing-slash.test.js +++ b/packages/integrations/sitemap/test/trailing-slash.test.js @@ -59,6 +59,22 @@ describe('Trailing slash', () => { const urls = data.urlset.url; expect(urls[0].loc[0]).to.equal('http://example.com/one'); }); + describe('with base path', () => { + before(async () => { + fixture = await loadFixture({ + root: './fixtures/trailing-slash/', + trailingSlash: 'never', + base: '/base', + }); + await fixture.build(); + }); + + it('URLs do not end with trailing slash', async () => { + const data = await readXML(fixture.readFile('/sitemap-0.xml')); + const urls = data.urlset.url; + expect(urls[0].loc[0]).to.equal('http://example.com/base/one'); + }); + }); }); describe('trailingSlash: always', () => { @@ -75,5 +91,21 @@ describe('Trailing slash', () => { const urls = data.urlset.url; expect(urls[0].loc[0]).to.equal('http://example.com/one/'); }); + describe('with base path', () => { + before(async () => { + fixture = await loadFixture({ + root: './fixtures/trailing-slash/', + trailingSlash: 'always', + base: '/base', + }); + await fixture.build(); + }); + + it('URLs end with trailing slash', async () => { + const data = await readXML(fixture.readFile('/sitemap-0.xml')); + const urls = data.urlset.url; + expect(urls[0].loc[0]).to.equal('http://example.com/base/one/'); + }); + }); }); });