Skip to content

Commit

Permalink
fix(sitemap): url when rest parameter is used in page file names (#9975)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
3 people authored Feb 21, 2024
1 parent 9001d06 commit ec7d2eb
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/sour-ties-sparkle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@astrojs/sitemap": patch
---

Fixes URL generation for routes that rest parameters and start with `/`
2 changes: 2 additions & 0 deletions packages/integrations/sitemap/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
});
Expand Down
24 changes: 24 additions & 0 deletions packages/integrations/sitemap/test/dynamic-path.test.js
Original file line number Diff line number Diff line change
@@ -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/'));
});
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';

export default defineConfig({
integrations: [sitemap()],
site: 'http://example.com'
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@test/sitemap-dynamic",
"version": "0.0.0",
"private": true,
"dependencies": {
"astro": "workspace:*",
"@astrojs/sitemap": "workspace:*"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
export async function getStaticPaths() {
return [
{
params: {
slug: undefined,
}
},
{
params: {
slug: '/blog'
}
},
{
params: {
slug: '/test'
}
}
];
}
---
9 changes: 9 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit ec7d2eb

Please sign in to comment.