fix: filter out draft item from glob result (#5612)
* fix: filter out draft item from glob result * test: rss should ignore draft * build: add changeset * build: major version * feat: add `drafts` option * Add README docs Co-authored-by: Chris Swithinbank <swithinbank@gmail.com>
This commit is contained in:
parent
9674cf56c5
commit
68c20be66b
4 changed files with 98 additions and 0 deletions
5
.changeset/modern-dodos-invent.md
Normal file
5
.changeset/modern-dodos-invent.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@astrojs/rss': major
|
||||||
|
---
|
||||||
|
|
||||||
|
Filter out draft in RSS generation
|
|
@ -50,6 +50,8 @@ rss({
|
||||||
site: import.meta.env.SITE,
|
site: import.meta.env.SITE,
|
||||||
// list of `<item>`s in output xml
|
// list of `<item>`s in output xml
|
||||||
items: import.meta.glob('./**/*.md'),
|
items: import.meta.glob('./**/*.md'),
|
||||||
|
// include draft posts in the feed (default: false)
|
||||||
|
drafts: true,
|
||||||
// (optional) absolute path to XSL stylesheet in your project
|
// (optional) absolute path to XSL stylesheet in your project
|
||||||
stylesheet: '/rss-styles.xsl',
|
stylesheet: '/rss-styles.xsl',
|
||||||
// (optional) inject custom xml
|
// (optional) inject custom xml
|
||||||
|
@ -102,6 +104,12 @@ type RSSFeedItem = {
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### drafts
|
||||||
|
|
||||||
|
Type: `boolean (optional)`
|
||||||
|
|
||||||
|
Set `drafts: true` to include [draft posts](https://docs.astro.build/en/guides/markdown-content/#draft-pages) in the feed output. By default, this option is `false` and draft posts are not included.
|
||||||
|
|
||||||
### stylesheet
|
### stylesheet
|
||||||
|
|
||||||
Type: `string (optional)`
|
Type: `string (optional)`
|
||||||
|
|
|
@ -28,6 +28,8 @@ type RSSOptions = {
|
||||||
stylesheet?: string | boolean;
|
stylesheet?: string | boolean;
|
||||||
/** Specify custom data in opening of file */
|
/** Specify custom data in opening of file */
|
||||||
customData?: string;
|
customData?: string;
|
||||||
|
/** Whether to include drafts or not */
|
||||||
|
drafts?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
type RSSFeedItem = {
|
type RSSFeedItem = {
|
||||||
|
@ -43,6 +45,8 @@ type RSSFeedItem = {
|
||||||
content?: string;
|
content?: string;
|
||||||
/** Append some other XML-valid data to this item */
|
/** Append some other XML-valid data to this item */
|
||||||
customData?: string;
|
customData?: string;
|
||||||
|
/** Whether draft or not */
|
||||||
|
draft?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
type GenerateRSSArgs = {
|
type GenerateRSSArgs = {
|
||||||
|
@ -72,6 +76,7 @@ function mapGlobResult(items: GlobResult): Promise<RSSFeedItem[]> {
|
||||||
pubDate: frontmatter.pubDate,
|
pubDate: frontmatter.pubDate,
|
||||||
description: frontmatter.description,
|
description: frontmatter.description,
|
||||||
customData: frontmatter.customData,
|
customData: frontmatter.customData,
|
||||||
|
draft: frontmatter.draft,
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
@ -87,6 +92,9 @@ export default async function getRSS(rssOptions: RSSOptions) {
|
||||||
|
|
||||||
if (isGlobResult(items)) {
|
if (isGlobResult(items)) {
|
||||||
items = await mapGlobResult(items);
|
items = await mapGlobResult(items);
|
||||||
|
if (!rssOptions.drafts) {
|
||||||
|
items = items.filter((item) => !item.draft);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -44,6 +44,8 @@ const web1FeedItemWithContent = {
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
const validXmlResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItem.title}]]></title><link>${site}${phpFeedItem.link}/</link><guid>${site}${phpFeedItem.link}/</guid><description><![CDATA[${phpFeedItem.description}]]></description><pubDate>${new Date(phpFeedItem.pubDate).toUTCString()}</pubDate></item><item><title><![CDATA[${web1FeedItem.title}]]></title><link>${site}${web1FeedItem.link}/</link><guid>${site}${web1FeedItem.link}/</guid><description><![CDATA[${web1FeedItem.description}]]></description><pubDate>${new Date(web1FeedItem.pubDate).toUTCString()}</pubDate></item></channel></rss>`;
|
const validXmlResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItem.title}]]></title><link>${site}${phpFeedItem.link}/</link><guid>${site}${phpFeedItem.link}/</guid><description><![CDATA[${phpFeedItem.description}]]></description><pubDate>${new Date(phpFeedItem.pubDate).toUTCString()}</pubDate></item><item><title><![CDATA[${web1FeedItem.title}]]></title><link>${site}${web1FeedItem.link}/</link><guid>${site}${web1FeedItem.link}/</guid><description><![CDATA[${web1FeedItem.description}]]></description><pubDate>${new Date(web1FeedItem.pubDate).toUTCString()}</pubDate></item></channel></rss>`;
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
|
const validXmlWithoutWeb1FeedResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItem.title}]]></title><link>${site}${phpFeedItem.link}/</link><guid>${site}${phpFeedItem.link}/</guid><description><![CDATA[${phpFeedItem.description}]]></description><pubDate>${new Date(phpFeedItem.pubDate).toUTCString()}</pubDate></item></channel></rss>`;
|
||||||
|
// prettier-ignore
|
||||||
const validXmlWithContentResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItemWithContent.title}]]></title><link>${site}${phpFeedItemWithContent.link}/</link><guid>${site}${phpFeedItemWithContent.link}/</guid><description><![CDATA[${phpFeedItemWithContent.description}]]></description><pubDate>${new Date(phpFeedItemWithContent.pubDate).toUTCString()}</pubDate><content:encoded><![CDATA[${phpFeedItemWithContent.content}]]></content:encoded></item><item><title><![CDATA[${web1FeedItemWithContent.title}]]></title><link>${site}${web1FeedItemWithContent.link}/</link><guid>${site}${web1FeedItemWithContent.link}/</guid><description><![CDATA[${web1FeedItemWithContent.description}]]></description><pubDate>${new Date(web1FeedItemWithContent.pubDate).toUTCString()}</pubDate><content:encoded><![CDATA[${web1FeedItemWithContent.content}]]></content:encoded></item></channel></rss>`;
|
const validXmlWithContentResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItemWithContent.title}]]></title><link>${site}${phpFeedItemWithContent.link}/</link><guid>${site}${phpFeedItemWithContent.link}/</guid><description><![CDATA[${phpFeedItemWithContent.description}]]></description><pubDate>${new Date(phpFeedItemWithContent.pubDate).toUTCString()}</pubDate><content:encoded><![CDATA[${phpFeedItemWithContent.content}]]></content:encoded></item><item><title><![CDATA[${web1FeedItemWithContent.title}]]></title><link>${site}${web1FeedItemWithContent.link}/</link><guid>${site}${web1FeedItemWithContent.link}/</guid><description><![CDATA[${web1FeedItemWithContent.description}]]></description><pubDate>${new Date(web1FeedItemWithContent.pubDate).toUTCString()}</pubDate><content:encoded><![CDATA[${web1FeedItemWithContent.content}]]></content:encoded></item></channel></rss>`;
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
const validXmlWithCustomDataResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItemWithCustomData.title}]]></title><link>${site}${phpFeedItemWithCustomData.link}/</link><guid>${site}${phpFeedItemWithCustomData.link}/</guid><description><![CDATA[${phpFeedItemWithCustomData.description}]]></description><pubDate>${new Date(phpFeedItemWithCustomData.pubDate).toUTCString()}</pubDate>${phpFeedItemWithCustomData.customData}</item><item><title><![CDATA[${web1FeedItemWithContent.title}]]></title><link>${site}${web1FeedItemWithContent.link}/</link><guid>${site}${web1FeedItemWithContent.link}/</guid><description><![CDATA[${web1FeedItemWithContent.description}]]></description><pubDate>${new Date(web1FeedItemWithContent.pubDate).toUTCString()}</pubDate><content:encoded><![CDATA[${web1FeedItemWithContent.content}]]></content:encoded></item></channel></rss>`;
|
const validXmlWithCustomDataResult = `<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title><![CDATA[${title}]]></title><description><![CDATA[${description}]]></description><link>${site}/</link><item><title><![CDATA[${phpFeedItemWithCustomData.title}]]></title><link>${site}${phpFeedItemWithCustomData.link}/</link><guid>${site}${phpFeedItemWithCustomData.link}/</guid><description><![CDATA[${phpFeedItemWithCustomData.description}]]></description><pubDate>${new Date(phpFeedItemWithCustomData.pubDate).toUTCString()}</pubDate>${phpFeedItemWithCustomData.customData}</item><item><title><![CDATA[${web1FeedItemWithContent.title}]]></title><link>${site}${web1FeedItemWithContent.link}/</link><guid>${site}${web1FeedItemWithContent.link}/</guid><description><![CDATA[${web1FeedItemWithContent.description}]]></description><pubDate>${new Date(web1FeedItemWithContent.pubDate).toUTCString()}</pubDate><content:encoded><![CDATA[${web1FeedItemWithContent.content}]]></content:encoded></item></channel></rss>`;
|
||||||
|
@ -195,6 +197,81 @@ describe('rss', () => {
|
||||||
})
|
})
|
||||||
).to.be.rejected;
|
).to.be.rejected;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should filter out draft', async () => {
|
||||||
|
const globResult = {
|
||||||
|
'./posts/php.md': () =>
|
||||||
|
new Promise((resolve) =>
|
||||||
|
resolve({
|
||||||
|
url: phpFeedItem.link,
|
||||||
|
frontmatter: {
|
||||||
|
title: phpFeedItem.title,
|
||||||
|
pubDate: phpFeedItem.pubDate,
|
||||||
|
description: phpFeedItem.description,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
),
|
||||||
|
'./posts/nested/web1.md': () =>
|
||||||
|
new Promise((resolve) =>
|
||||||
|
resolve({
|
||||||
|
url: web1FeedItem.link,
|
||||||
|
frontmatter: {
|
||||||
|
title: web1FeedItem.title,
|
||||||
|
pubDate: web1FeedItem.pubDate,
|
||||||
|
description: web1FeedItem.description,
|
||||||
|
draft: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
const { body } = await rss({
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
items: globResult,
|
||||||
|
site,
|
||||||
|
});
|
||||||
|
|
||||||
|
chai.expect(body).xml.to.equal(validXmlWithoutWeb1FeedResult);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should respect drafts option', async () => {
|
||||||
|
const globResult = {
|
||||||
|
'./posts/php.md': () =>
|
||||||
|
new Promise((resolve) =>
|
||||||
|
resolve({
|
||||||
|
url: phpFeedItem.link,
|
||||||
|
frontmatter: {
|
||||||
|
title: phpFeedItem.title,
|
||||||
|
pubDate: phpFeedItem.pubDate,
|
||||||
|
description: phpFeedItem.description,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
),
|
||||||
|
'./posts/nested/web1.md': () =>
|
||||||
|
new Promise((resolve) =>
|
||||||
|
resolve({
|
||||||
|
url: web1FeedItem.link,
|
||||||
|
frontmatter: {
|
||||||
|
title: web1FeedItem.title,
|
||||||
|
pubDate: web1FeedItem.pubDate,
|
||||||
|
description: web1FeedItem.description,
|
||||||
|
draft: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
const { body } = await rss({
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
items: globResult,
|
||||||
|
site,
|
||||||
|
drafts: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
chai.expect(body).xml.to.equal(validXmlResult);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('errors', () => {
|
describe('errors', () => {
|
||||||
|
|
Loading…
Reference in a new issue