[3.x] Support pages with more output file extensions (Convert RSS feed to a Hyde page)#2530
Merged
emmadesilva merged 6 commits intoJul 13, 2026
Merged
Conversation
The RSS feed is now a route: registered as an in-memory page behind Features::hasRss(), compiled through the standard build, and skipped when a user-defined page already claims the configured feed route key. The contents resolve the RssFeedGenerator from the service container at compile time so the implementation can be swapped with a container rebind. The configured hyde.rss.filename is used verbatim as the output path, preserving support for filenames outside the default recognized non-HTML extensions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Removes the GenerateRssFeed post-build task now that the feed page is compiled through the standard build, and rewires the build:rss command to build the registered page (or a new instance when the route is not registered, preserving the old task behavior where the explicit command generates the feed regardless of the feature conditions) through the StaticPageBuilder. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Covers the feature-gated route registration including the post and site URL requirements, configured filenames used verbatim for any extension, compilation through the build command including build manifest and route list presence, the container rebind customization tier, user-defined pages suppressing the generated page through both booting callbacks and extensions, and the realtime compiler serving the feed with the XML content type. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e conversion Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
These tests create posts while the monorepo test environment configures a site URL, so the feed page would now appear in their exact collection assertions. The feed route registration itself is covered by RssFeedPageTest. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## v3/non-html-pages #2530 +/- ##
=====================================================
Coverage 100.00% 100.00%
- Complexity 1742 1747 +5
=====================================================
Files 175 175
Lines 4349 4359 +10
=====================================================
+ Hits 4349 4359 +10 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed (mirrors part A): RssFeedPage extends InMemoryPage lives next to its generator, resolves RssFeedGenerator from the container in compile() (rebind verified by test), registers in HydeCoreExtension::discoverPages() behind Features::hasRss() with the user-override skip check, and hides itself from navigation and the sitemap. GenerateRssFeed is removed, build:rss builds the registered route's page via StaticPageBuilder, and BuildTaskService now has no feature-gated tasks left (the Features import went with it).
Two deliberate divergences from the sitemap, both recorded in the epic:
Verification: RssFeedPageTest (14 tests) covers the three-way feature gating (URL, posts, config), custom and verbatim filenames, rebind, both D5 override paths end-to-end, and build-manifest/route:list presence; a realtime-compiler test serves feed.xml with application/xml. Full regression protocol ran clean against the part-A merge baseline: Unit failure lists identical, Feature lists identical after one real fallout (PageCollectionTest/RouteCollectionTest create posts, so the feed page appeared in their exact-collection assertions — they now disable RSS in setUp() like they already did the sitemap), FeatureHyde and Realtime Compiler suites fully pass, HydeStan reports no errors, and the CLI smoke shows both SitemapPage and RssFeedPage in route:list with build:rss producing valid feed XML. Release notes and UPGRADE.md were extended to cover both halves of the conversion.