diff --git a/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts b/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts index ec517902..230fa6be 100644 --- a/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts +++ b/packages/next-sitemap/src/builders/__tests__/url-set-builder/create-url-set.test.ts @@ -135,6 +135,40 @@ describe('UrlSetBuilder', () => { ]) }) + test('createUrlSet: With async exclusion', async () => { + const sleep = (ms: number) => + new Promise((resolve) => setTimeout(resolve, ms)) + const builder = new UrlSetBuilder( + { + ...sampleConfig, + exclude: async () => { + await sleep(10) + return ['/', '/page-0', '/page-2'] + }, + }, + sampleManifest + ) + + await expect(builder.createUrlSet()).resolves.toStrictEqual([ + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-1', + alternateRefs: [], + trailingSlash: false, + }, + { + changefreq: 'daily', + lastmod: expect.any(String), + priority: 0.7, + loc: 'https://example.com/page-3', + alternateRefs: [], + trailingSlash: false, + }, + ]) + }) + test('createUrlSet: Without trailing slash', async () => { const builder = new UrlSetBuilder( { diff --git a/packages/next-sitemap/src/builders/url-set-builder.ts b/packages/next-sitemap/src/builders/url-set-builder.ts index eea2949f..0281fe3c 100644 --- a/packages/next-sitemap/src/builders/url-set-builder.ts +++ b/packages/next-sitemap/src/builders/url-set-builder.ts @@ -87,8 +87,13 @@ export class UrlSetBuilder { } // Remove the urls based on this.config?.exclude array - if (this.config?.exclude && this.config?.exclude.length > 0) { - urlSet = removeIfMatchPattern(urlSet, this.config?.exclude) + if (this.config?.exclude) { + if (typeof this.config.exclude === 'function') { + const asyncExcludes = await this.config.exclude() + urlSet = removeIfMatchPattern(urlSet, asyncExcludes) + } else { + urlSet = removeIfMatchPattern(urlSet, this.config?.exclude) + } } urlSet = [...new Set(urlSet)] diff --git a/packages/next-sitemap/src/interface.ts b/packages/next-sitemap/src/interface.ts index 09f4acb0..797ba0ff 100644 --- a/packages/next-sitemap/src/interface.ts +++ b/packages/next-sitemap/src/interface.ts @@ -132,7 +132,7 @@ export interface IConfig { * Apart from this option next-sitemap also offers a custom transform option which could be used to exclude urls that match specific patterns * @example ['/page-0', '/page-*', '/private/*'] */ - exclude?: string[] + exclude?: string[] | (() => Promise) alternateRefs?: Array