diff --git a/.changeset/slow-cats-argue.md b/.changeset/slow-cats-argue.md new file mode 100644 index 000000000000..a3ad7ca6885d --- /dev/null +++ b/.changeset/slow-cats-argue.md @@ -0,0 +1,7 @@ +--- +"@astrojs/sitemap": patch +--- + +Revert https://github.com/withastro/astro/pull/9846 + +The feature to customize the file name of the sitemap was reverted due to some internal issues with one of the dependencies. With an non-deterministic behaviour, the sitemap file was sometime emitted with incorrect syntax. diff --git a/packages/integrations/sitemap/src/index.ts b/packages/integrations/sitemap/src/index.ts index 5d2a271d2cb9..11f19f5dea6e 100644 --- a/packages/integrations/sitemap/src/index.ts +++ b/packages/integrations/sitemap/src/index.ts @@ -1,14 +1,12 @@ import type { AstroConfig, AstroIntegration } from 'astro'; -import path, { resolve } from 'node:path'; +import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { EnumChangefreq, LinkItem as LinkItemBase, SitemapItemLoose } from 'sitemap'; -import { SitemapAndIndexStream, SitemapStream, streamToPromise } from 'sitemap'; +import { simpleSitemapAndIndex } from 'sitemap'; import { ZodError } from 'zod'; import { generateSitemap } from './generate-sitemap.js'; import { validateOptions } from './validate-options.js'; -import { createWriteStream } from 'node:fs'; -import { Readable } from 'node:stream'; export { EnumChangefreq as ChangeFreqEnum } from 'sitemap'; export type ChangeFreq = `${EnumChangefreq}`; @@ -35,8 +33,6 @@ export type SitemapOptions = lastmod?: Date; priority?: number; - prefix?: string; - // called for each sitemap item just before to save them on disk, sync or async serialize?(item: SitemapItem): SitemapItem | Promise | undefined; } @@ -48,6 +44,7 @@ function formatConfigErrorMessage(err: ZodError) { } const PKG_NAME = '@astrojs/sitemap'; +const OUTFILE = 'sitemap-index.xml'; const STATUS_CODE_PAGES = new Set(['404', '500']); function isStatusCodePage(pathname: string): boolean { @@ -80,8 +77,7 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { const opts = validateOptions(config.site, options); - const { filter, customPages, serialize, entryLimit, prefix = 'sitemap-' } = opts; - const OUTFILE = `${prefix}index.xml`; + const { filter, customPages, serialize, entryLimit } = opts; let finalSiteUrl: URL; if (config.site) { @@ -171,22 +167,13 @@ const createPlugin = (options?: SitemapOptions): AstroIntegration => { } } const destDir = fileURLToPath(dir); - - const sms = new SitemapAndIndexStream({ + await simpleSitemapAndIndex({ + hostname: finalSiteUrl.href, + destinationDir: destDir, + sourceData: urlData, limit: entryLimit, - getSitemapStream: (i) => { - const sitemapStream = new SitemapStream({ hostname: finalSiteUrl.href }); - const fileName = `${prefix}${i}.xml`; - - const ws = sitemapStream.pipe(createWriteStream(resolve(destDir + fileName))); - - return [new URL(fileName, finalSiteUrl.href).toString(), sitemapStream, ws]; - }, + gzip: false, }); - - sms.pipe(createWriteStream(resolve(destDir + OUTFILE))); - await streamToPromise(Readable.from(urlData).pipe(sms)); - sms.end(); logger.info(`\`${OUTFILE}\` created at \`${path.relative(process.cwd(), destDir)}\``); } catch (err) { if (err instanceof ZodError) { diff --git a/packages/integrations/sitemap/src/schema.ts b/packages/integrations/sitemap/src/schema.ts index da629fc0c690..a7682e881a05 100644 --- a/packages/integrations/sitemap/src/schema.ts +++ b/packages/integrations/sitemap/src/schema.ts @@ -34,13 +34,6 @@ export const SitemapOptionsSchema = z changefreq: z.nativeEnum(ChangeFreq).optional(), lastmod: z.date().optional(), priority: z.number().min(0).max(1).optional(), - - prefix: z - .string() - .regex(/^[a-zA-Z\-_]+$/gm, { - message: 'Only English alphabet symbols, hyphen and underscore allowed', - }) - .optional(), }) .strict() .default(SITEMAP_CONFIG_DEFAULTS); diff --git a/packages/integrations/sitemap/test/prefix.test.js b/packages/integrations/sitemap/test/prefix.test.js deleted file mode 100644 index 16ec44e9f3c4..000000000000 --- a/packages/integrations/sitemap/test/prefix.test.js +++ /dev/null @@ -1,72 +0,0 @@ -import assert from 'node:assert/strict'; -import { before, describe, it } from 'node:test'; -import { sitemap } from './fixtures/static/deps.mjs'; -import { loadFixture, readXML } from './test-utils.js'; - -describe('Prefix support', () => { - /** @type {import('./test-utils.js').Fixture} */ - let fixture; - const prefix = 'test-'; - - describe('Static', () => { - before(async () => { - fixture = await loadFixture({ - root: './fixtures/static/', - integrations: [ - sitemap(), - sitemap({ - prefix, - }), - ], - }); - await fixture.build(); - }); - - it('Content is same', async () => { - const data = await readXML(fixture.readFile('/sitemap-0.xml')); - const prefixData = await readXML(fixture.readFile(`/${prefix}0.xml`)); - assert.deepEqual(prefixData, data); - }); - - it('Index file load correct sitemap', async () => { - const data = await readXML(fixture.readFile('/sitemap-index.xml')); - const sitemapUrl = data.sitemapindex.sitemap[0].loc[0]; - assert.strictEqual(sitemapUrl, 'http://example.com/sitemap-0.xml'); - - const prefixData = await readXML(fixture.readFile(`/${prefix}index.xml`)); - const prefixSitemapUrl = prefixData.sitemapindex.sitemap[0].loc[0]; - assert.strictEqual(prefixSitemapUrl, `http://example.com/${prefix}0.xml`); - }); - }); - - describe('SSR', () => { - before(async () => { - fixture = await loadFixture({ - root: './fixtures/ssr/', - integrations: [ - sitemap(), - sitemap({ - prefix, - }), - ], - }); - await fixture.build(); - }); - - it('Content is same', async () => { - const data = await readXML(fixture.readFile('/client/sitemap-0.xml')); - const prefixData = await readXML(fixture.readFile(`/client/${prefix}0.xml`)); - assert.deepEqual(prefixData, data); - }); - - it('Index file load correct sitemap', async () => { - const data = await readXML(fixture.readFile('/client/sitemap-index.xml')); - const sitemapUrl = data.sitemapindex.sitemap[0].loc[0]; - assert.strictEqual(sitemapUrl, 'http://example.com/sitemap-0.xml'); - - const prefixData = await readXML(fixture.readFile(`/client/${prefix}index.xml`)); - const prefixSitemapUrl = prefixData.sitemapindex.sitemap[0].loc[0]; - assert.strictEqual(prefixSitemapUrl, `http://example.com/${prefix}0.xml`); - }); - }); -});