0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-01-06 22:10:10 -05:00

fix(sitemap): url when rest parameter is used in page file names (#9975)

* fix(sitemap): url when rest parameter is used in page file names

* Update .changeset/sour-ties-sparkle.md

Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>

* Apply suggestions from code review

---------

Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>
Co-authored-by: Emanuele Stoppa <my.burning@gmail.com>
This commit is contained in:
Piotr Losiak 2024-02-21 08:43:22 +01:00 committed by GitHub
parent 9001d063ae
commit ec7d2ebbd9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 77 additions and 0 deletions

View file

@ -0,0 +1,5 @@
---
"@astrojs/sitemap": patch
---
Fixes URL generation for routes that rest parameters and start with `/`

View file

@ -98,6 +98,8 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => {
.map((p) => {
if (p.pathname !== '' && !finalSiteUrl.pathname.endsWith('/'))
finalSiteUrl.pathname += '/';
if (p.pathname.startsWith('/'))
p.pathname = p.pathname.slice(1);
const fullPath = finalSiteUrl.pathname + p.pathname;
return new URL(fullPath, finalSiteUrl).href;
});

View file

@ -0,0 +1,24 @@
import {before, describe, it} from "node:test";
import {loadFixture, readXML} from "./test-utils.js";
import assert from "node:assert/strict";
describe('Dynamic with rest parameter', () => {
/** @type {import('./test-utils.js').Fixture} */
let fixture;
before(async () => {
fixture = await loadFixture({
root: './fixtures/dynamic',
});
await fixture.build();
});
it('Should generate correct urls', async () => {
const data = await readXML(fixture.readFile('/sitemap-0.xml'));
const urls = data.urlset.url.map((url) => url.loc[0]);
assert.ok(urls.includes('http://example.com/'));
assert.ok(urls.includes('http://example.com/blog/'));
assert.ok(urls.includes('http://example.com/test/'));
});
})

View file

@ -0,0 +1,7 @@
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
integrations: [sitemap()],
site: 'http://example.com'
})

View file

@ -0,0 +1,9 @@
{
"name": "@test/sitemap-dynamic",
"version": "0.0.0",
"private": true,
"dependencies": {
"astro": "workspace:*",
"@astrojs/sitemap": "workspace:*"
}
}

View file

@ -0,0 +1,21 @@
---
export async function getStaticPaths() {
return [
{
params: {
slug: undefined,
}
},
{
params: {
slug: '/blog'
}
},
{
params: {
slug: '/test'
}
}
];
}
---

View file

@ -4577,6 +4577,15 @@ importers:
specifier: 0.6.2
version: 0.6.2
packages/integrations/sitemap/test/fixtures/dynamic:
dependencies:
'@astrojs/sitemap':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../../astro
packages/integrations/sitemap/test/fixtures/ssr:
dependencies:
'@astrojs/sitemap':