diff --git a/fixtures/endfield/game8-events-2026-08-23.expected.json b/fixtures/endfield/game8-events-2026-08-23.expected.json new file mode 100644 index 0000000..253153f --- /dev/null +++ b/fixtures/endfield/game8-events-2026-08-23.expected.json @@ -0,0 +1,170 @@ +[ + { + "id": "endfield:fletched-irontip-sign-in:2026-09-02", + "game": "endfield", + "title": "Fletched Irontip Sign-In", + "type": "login", + "summary": "Sign-in to get extra pulls for Typhoeus!", + "startsAt": "2026-09-02T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:snow-over-deep-woods:2026-09-02", + "game": "endfield", + "title": "Snow Over Deep Woods", + "type": "other", + "summary": "Explore Snowy Forest and complete missions to get various rewards!", + "startsAt": "2026-09-02T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:trial-of-the-bow:2026-09-09", + "game": "endfield", + "title": "Trial of the Bow", + "type": "challenge", + "summary": "Equip Arrow Chips to complete trainings and exercises for rewards!", + "startsAt": "2026-09-09T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:aic-support-chubby-lung-attacks:2026-09-16", + "game": "endfield", + "title": "AIC Support: Chubby Lung Attacks", + "type": "other", + "summary": "Participate in AIC Factory production and trade support goods for rewards!", + "startsAt": "2026-09-16T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:echoing-bell-of-an-old-city:2026-09-24", + "game": "endfield", + "title": "Echoing Bell of an Old City", + "type": "other", + "summary": "Explore Suiming and complete missions to get various rewards!", + "startsAt": "2026-09-24T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:purry-big-feline-rawr:2026-09-24", + "game": "endfield", + "title": "Purry Big Feline! RAWR!", + "type": "other", + "summary": null, + "startsAt": "2026-09-24T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:orbipom-merge:2026-10-01", + "game": "endfield", + "title": "OrbiPom! MERGE!", + "type": "other", + "summary": "Merge identical OrbiPom to complete your collection and find the Golden Endmin!", + "startsAt": "2026-10-01T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + }, + { + "id": "endfield:runners-steeplechase:2026-10-01", + "game": "endfield", + "title": "Runners' Steeplechase", + "type": "other", + "summary": "Gather Chubby Lung Balloons along the course and reach the finish line to obtain rewards!", + "startsAt": "2026-10-01T00:00:00.000Z", + "startPrecision": "day", + "endsAt": null, + "endPrecision": "unknown", + "regionScoped": false, + "regionEnds": null, + "sourceUrl": "https://game8.co/games/Arknights-Endfield/archives/535443", + "sourceId": "endfield-game8-events", + "status": "published", + "confidence": 0.75, + "extractionMethod": "parser", + "version": 1, + "firstSeenAt": "2026-08-14T00:00:00.000Z", + "updatedAt": "2026-08-14T00:00:00.000Z" + } +] diff --git a/fixtures/endfield/game8-events-2026-08-23.html b/fixtures/endfield/game8-events-2026-08-23.html new file mode 100644 index 0000000..645cc0a --- /dev/null +++ b/fixtures/endfield/game8-events-2026-08-23.html @@ -0,0 +1,1789 @@ +All Events and Schedule | Arknights: Endfield|Game8 + + + + + + + + +

What can you do as a free member?

Member benefits illustration

Create your free account today and unlock all our premium features and tools to enhance your gaming experience.

Member benefits illustration

Create your free account today and save articles to your watchlist and get notified when they're updated with new information.

Member benefits illustration

Create your free account today and save your favorite games for quick access later, synced across all your devices.

Member benefits illustration

By creating a Game8 account and logging in, you'll receive instant notifications when someone replies to your posts.

Comment rating feature illustration

By creating a Game8 account and logging in, you can make use of convenient features in the comments section, such as rating and sorting comments.

Premium archive feature illustration

By creating a Game8 account and logging in, you can access Premium articles that are exclusively available to members.

Map tool feature illustration

By creating a Game8 account and logging in, the items you checked on the map tool will be saved.

Site Interface

Guest
Free Member
Article Watchlist
Game Bookmarks
Cross-device Sync
Light/Dark Theme Toggle
User Profiles
Direct Feedback
Comment Rating
Comment Notification
Premium Articles

Game Tools

Guest
Free Member
Interactive Map Access
Interactive Map Pins
Interactive Map Comments
Interactive Map Pins Cross-Device
Check List
Event Choice Checker
Deck Builder Cross-Device
Message Board Notification
Message Board Cross-Device
Build Planner
Stat Calculator
Diagnostic Tool
Weapon/Armor Wishlist
Team Builder
Character Scoring
Tier List Maker

Want more information?Learn more

+
Arknights: Endfield

All Events and Schedule

+ + +Add to Watchlist (5)
+

✪ Check Game8 Endfield Twitter for daily tips!
★ Exclusive: Endfield's Connection to Arknights
✰ New in Ver 1.5: 1.5 Livestream | 1.5 Release Date
★ 1.5: Typhoeus (Banner | Info) & Purrchena
✰ 1.4 P1: Arcane ( Builds | Teams | Banner )
★ 1.4 P2: Liino ( Builds | Teams | Banner )

+ +
Arknights Endfield All Events and Schedule
+ +

Check out all of Arknights: Endfield's current event schedule, upcoming, and past events here!

+ + + + + + + + + + + + + + + + + +
Jump to a Free Rewards Page!
All Endfield CodesPre-Register Rewards
Daily Sign-In EventAll Web Events
All Events
+ + +

Arknights Endfield Events Calendar

All Endfield Events and Dates

+
+

Arknights Endfield Current Events

Endfield 1.4 Events Schedule

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+Echoes of War
(Version 1.4)
07/16
+
+
+Bedazzling Dawnstar Sign-In
(Version 1.4)
08/09/26 - 09/02/26
+
+
+The Rooted Realm
(Version 1.4)
08/09/26 - 08/30/26
+
+
+Sanity Supply
(Version 1.4)
08/26/26 - 09/02/2026
+

Upcoming Endfield Events

Endfield 1.5 Upcoming Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventSchedule & Summary
+ Arknights Endfield Fletched Irontip Sign-In Guide Fletched Irontip Sign-In + + +Period: 09/02/2026 - TBA
Sign-in to get extra pulls for Typhoeus!
+ Arknights Endfield Snow Over Deep Woods Guide Snow Over Deep Woods + + +Period: 09/02/2026 - TBA
Explore Snowy Forest and complete missions to get various rewards!
+ Arknights Endfield Trial of the Bow Guide Trial of the Bow + + +Period: 09/09/26 - TBA
Equip Arrow Chips to complete trainings and exercises for rewards!
+ + Arknights Endfield AIC Support: Chubby Lung Attacks AIC Production Event  Guide AIC Support: Chubby Lung Attacks + +Period: 09/16/2026 - TBA
Participate in AIC Factory production and trade support goods for rewards!
+ + Arknights Endfield Echoing Bell of an Old City Guide Event  Guide Echoing Bell of an Old City + +Period: 09/24/2026 - TBA
Explore Suiming and complete missions to get various rewards!
+ + Arknights Endfield Purry Big Feline! RAWR! Giveaway Event  Guide Purry Big Feline! RAWR! + +Period: 09/24/2026 - TBA
Complete the event to get the 5-star operator Purrchena and the 5-star sword Dessert Moment.
+ Arknights Endfield Runners Runners' Steeplechase + + +Period: 10/01/2026 - TBA
Gather Chubby Lung Balloons along the course and reach the finish line to obtain rewards!
+ + Arknights Endfield OrbiPom! MERGE! Web Event  Guide OrbiPom! MERGE! + +Period: 10/01/2026 - TBA
Merge identical OrbiPom to complete your collection and find the Golden Endmin!
+ Arknights Endfield Ridgeline Flows of Autumn Sign-In Guide Ridgeline Flows of Autumn Sign-In + + +Period: TBA
Log into the game every day to claim sign-in rewards!
+

Arknights Endfield Permanent Events

All Permanent Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+Awakening Sign-In
(Version 1.0)
01/22
+
+
+New Horizons
(Version 1.0)
01/22
+
+
+Authority Level Rewards
(Version 1.0)
01/22
+
+
+Protocol Reconnection
(Version 1.0)
+
+
+
+Operator Progression Booster
(Version 1.2)
04/17
+

Awakening Sign-In Event

+ + + + + + + + +
Arknights Endfield Awakening Sign-In Beginner Event  Guide
DurationPermanently Available
+ +

Once you unlock the Event Center, log into the game for 14 days.

+ +

Awakening Sign-In Guide

+

New Horizons Beginner Event

+ + + + + + + + +
Arknights Endfield New Horizons Beginner Event  Guide
DurationPermanently Available
+ +

Complete the designated main missions to earn pulls on the New Horizons Headhunting Banner!

+ +

New Horizons Guide

+

Authority Level Rewards Event

+ + + + + + + + +
Arknights Endfield Authority Level Rewards Beginner Event  Guide
DurationPermanently Available
+ +

Claim exclusive rewards upon reaching specific Authority Levels!

+ +

Authority Level Rewards Guide

+

Protocol Reconnection Event

+ + + + + + + + +
Arknights Endfield Protocol Reconnection Sign In  Guide
DurationPermanently Available
+ +

Log into the game every day after returning to Arknights: Endfield to receive welcome back gifts!

+ +

Protocol Reconnection Guide

+

Operator Progression Booster Event

+ + + + + + + + +
Arknights Endfield Operator Progression Booster Beginner Event  Guide
DurationPermanently Available
+ +

Permanent Booster for Beginners that refunds a great amount of materials while upgrading.

+ +

Operator Progression Booster Guide

+

Other Endfield Event Guides

Other Event Guides

+ + + + + + + + +
Other Event Guides
Arknights Endfield All Web Event GuidesAll Web Event GuidesDaily Sign-In GuideDaily Sign-In Event Guide
+

Past Endfield Events

All Endfield Past Events

+ + + + + + + + + + + + + + + + + + + + + + + + + +
VersionPast Events
Ver 1.4 + +◆ Jul. 16 - Fortune Connect-and-Win Celebration Event
+ + + +◆ Jul. 16 - Gaze North to the Rift Sign-In Sign In
+ + + +◆ Jul. 16 - Tribute of Companionship Celebration Event
+ + + +◆ Jul. 30 - Heat Rage! Mega Arena! Challenge Event
+ + + +◆ Jul. 16 - Gaze Towards the Northern Exclusion Guide Event
+ + + +
Ver 1.3 + +◆ Jul. 02 - Carly's Fairytale of Wuling Camera Event
+ + + +◆ Jun. 26 - Peacekeeper's Nocturne Sign-In Sign In
+ + + +◆ Jun. 12 - Trial Algorithmics Reward Event
+ + + +◆ Jun. 12 - Contingency Readiness Sanity Event
+ + + +◆ Jun. 05 - One with Her Fists Sign-In Sign In
+ + + +◆ Jun. 05 - Search for Sword Vault Dale Guide Event
+ + + +
Ver 1.2 + +◆ May. 14 - Curious Use of Xiranite Guide Event
+ + + +◆ May. 14 - Supply - Wuling Super Chef Fun and Games Event
+ + + +◆ May. 14 - Shimmering Moment Sign-In
+ + + +◆ May. 29 - Curios and Myths Sign-In Sign In
+ + + +◆ May. 01 - Party Together Pastry Tower Web Event
+ + + +◆ Apr. 28 - AIC Support - Palm-Top Savior AIC Production Event
+ + + +◆ Apr. 24 - Etchings of Our Cosmic Dreams Space Exploration Event
+ + + +◆ Apr. 17 - Blitz of Verdance Sign-In
+ + + +◆ Apr. 17 - Subduer of the Blighted Sea Guide Event
+ + + +
Ver 1.1 + +◆ Apr. 09 - Survival Training Challenge Event
+ + + + + ◆ Apr. 01 - Journey of the Long-Ear Celebration Event
+ + +◆ Mar. 29 - Pearl of the Pack Sign-In
+ + + +◆ Mar. 29 - Cleanse and Rinse Fun and Games Event
+ + + +◆ Mar. 19 - Supply Exploration Day Supply Event
+ + + +◆ Mar. 12 - Quietly Flows the Spring Guide Event
+ + + +◆ Mar. 12 - Gently Flows Qingbo Sign-In
+ + + +
Ver 1.0 + +◆ Mar. 02 - Sanity Discount
+ + + + + ◆ Feb. 24 - Spectral Splendor Sign In
+ + +◆ Feb. 16 - Steps to Sweet Success Mail Event
+ + + +◆ Feb. 15 - A Spring Note, Warmly Crafted Web Event
+ + + +◆ Feb. 07 - Glittering Life at Wuling Guide Event
+ + + +◆ Feb. 07 - Carly's Fairytale of the Valley Camera Event
+ + + + + ◆ Feb. 07 - Messenger Express Sign In
+ + + + ◆ Jan. 22 - Firewalker's Trail Sign In
+ + +◆ Jan. 16 - Voyage to the Stars Web Event
+ + + +◆ Jan. 07 - Final Prep Orders Web Event
+ + + +
+

Arknights: Endfield Related Guides

+

Arknights Endfield - Back to Top
Arknights: Endfield Wiki Front

+

Guides by Category

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Arknights: Endfield Categories
Arknights Endfield Characters PartialCharactersArknights Endfield - News and Game InfoNews and Game Info
Arknights Endfield - BannersBannersArknights Endfield - Events Events and Schedule
Arknights Endfield WeaponsWeaponsArknights Endfield - Gear PartialGear
Arknights Endfield - ItemsItemsArknights Endfield - MissionsMissions
Arknights Endfield Blueprints Partial BannerBlueprintsArknights Endfield - AIC FactoryAIC (Factory)
Arknights Endfield - MapsInteractive MapArknights Endfield - Umbral MonumentUmbral Monument
Arknights Endfield - Etchspace SalvageEtchspace SalvageArknights Endfield - Delver of the CrypticDelver of the Cryptic
Arknights Endfield - Contingency ContractContingency ContractArknights Endfield - Regional DevelopmentRegional Development
Arknights Endfield - BossesBossesArknights Endfield - EnemiesEnemies
Arknights Endfield - Tips and TricksTips and TricksArknights Endfield - AchievementsAchievements
Arknights Endfield - Message BoardMessage Board
+

Exclusive Guides

+
Arknights Endfield - Premium Article
+ +

Premium Articles

+ + +

All Tier Lists and Meta Guides

+ + + + + + + + + + + + + + + + +
Arknights Endfield Tier List and Best CharactersCharacters Tier ListReroll GuideReroll Guide and Tier ListArknights Endfield Best Team CompsBest Team Comps
Arknights Endfield Team Building Guide Team Building GuideArknights Endfield - All Character BuildsAll Character BuildsArknights Endfield - Best Weapons Tier ListWeapons Tier List
Arknights Endfield All Stats and ExplanationAll Stats and ExplanationArknights Endfield - Best Weapons for Each CharacterBest Weapons Per CharacterBest Gear and Gear Sets for Each Character - Arknights EndfieldBest Gear Sets Per Character
+

All Helpful Tools

+ + + + + + +
Tier List MakerTier List MakerArknights Endfield Team Builder ToolTeam Builder ToolArknights Endfield Essence CheckerWeapon Essence Checker
+

All Recommended Guides

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Arknights Endfield Gacha System, Rates, and Pity ExplainedGacha System ExplainedArknights Endfield - Protocol Pass Details and DifferencesProtocol Pass DetailsArknights Endfield Server Status and Reset Times Server Status and Times
Arknights Endfield Bugs and IssuesBugs and Known IssuesArknights Endfield All Weapon Supply Guides All Weapon Supply GuidesArknights Endfield - Imminent IncursionImminent Incursion Guide
Arknights Endfield - How to Farm Plants and Unlock PlantingHow to Farm Plants and Unlock PlantingArknights Endfield - All Races In-Game All Races In-GameArknights Endfield Is Amiya in EndfieldIs Amiya in Endfield?
Arknights Endfield Explosives Guide - Blueprints and How to Make Industrial Explosives Explosives GuideArknights Endfield - Best Banner To Pull On Best Banner To Pull OnArknights Endfield All Protocol Space LocationsAll Protocol Space Locations
Arknights Endfield How to Upgrade and Artifice GearHow to Upgrade GearArknights Endfield Gear System Crafting GuideGear System Crafting GuideArknights Endfield - Metastorage Transfer GuideMetastorage Transfer Guide
Arknights Endfield Essence Guide and How to FarmEssence Guide: How to Farm EssenceArknights Endfield - How to Upgrade EssenceHow to Upgrade EssenceArknights Endfield - All Dried Originium Slug LocationsAll Dried Originium Slug Locations
Arknights Endfield - Best Characters for Each OutpostBest Characters for Each OutpostArknights Endfield How to Farm T-CredsHow to Farm T-CredsArknights: Endfield Best Clue Room CharactersBest Clue Room Characters
Arknights Endfield - Best Characters for OMV DijiangBest Characters for OMV DijiangArknights Endfield Trial of Swordmancy Release DateTrial of Swordmancy GuideArknights Endfield Crisis Fragment Release DateCrisis Fragment Guide and Rewards
Arknights Endfield All Cosmetics All CosmeticsArknights Endfield - How to Find Route 13 How to Find Route 13
+

Comment

3 Дмитрий 293 Дмитрий 293 about 1 month

WFFC0BV9H9REWPB3

2 Walkthrough Team Walkthrough Team@Game8 7 months

Hi! We have the SKPORT Community Sign-In Event in our Daily Sign-In Event Guide: https://game8.co/games/Arknights-Endfield/archives/574950 +We'll feature more events as they release, so make sure to sign up and bookmark the page to be notified of any updates. Thanks!

    + + + + + + + + + + +

    Premium Articles

    + + +

    Rankings

    +

    All rights reserved

    + + +
    Guide Index
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/src/ingest/parsers/game8.ts b/src/ingest/parsers/game8.ts index cf99f0f..15f7eb9 100644 --- a/src/ingest/parsers/game8.ts +++ b/src/ingest/parsers/game8.ts @@ -362,15 +362,19 @@ const DATED_YEAR = String.raw`(?:\d{1,2}/\d{1,2}/\d{2,4}|[A-Za-z]+\.?\s+\d{1,2}, /** * A leading range, whose end may be a date or a stated non-date such as - * "Permanent" or "End of 4.6". Those words are listed rather than matched - * loosely, so a real description is never mistaken for a range end. + * "Permanent", "TBA" or "End of 4.6". Those words are listed rather than + * matched loosely, so a real description is never mistaken for a range end. + * + * The list must track `parseOpenRange`'s: a shape that reader dates but this + * one does not strip still yields the event, with the leftover end tacked onto + * the front of its summary — "- TBA Sign-in to get extra pulls for Typhoeus!". */ const RANGE_PREFIX = new RegExp( String.raw`^\s*` + ONE_DATE + String.raw`(?:\s*[-\u2013\u2014]\s*(?:` + ONE_DATE + - String.raw`|permanent|tbd|ongoing|end of [\d.]+)|\s+` + + String.raw`|permanent|tba|tbd|ongoing|end of [\d.]+)|\s+` + DATED_YEAR + String.raw`)?\s*`, "i", diff --git a/test/adapters/game8.test.ts b/test/adapters/game8.test.ts index dc1f8d5..82d82e8 100644 --- a/test/adapters/game8.test.ts +++ b/test/adapters/game8.test.ts @@ -31,6 +31,10 @@ const CASES: Array<{ adapter: Adapter; fixture: string }> = [ { adapter: adapter("wuwa-game8-events"), fixture: "fixtures/wuwa/game8-events-2026-08-14" }, { adapter: adapter("zzz-game8-events"), fixture: "fixtures/zzz/game8-events-2026-08-14" }, { adapter: adapter("endfield-game8-events"), fixture: "fixtures/endfield/game8-events-2026-08-14" }, + // The same page a version later. 1.4's upcoming table held one dated row; + // 1.5's holds nine, every one of them ending "- TBA". Both are pinned because + // they are different shapes, not different data. + { adapter: adapter("endfield-game8-events"), fixture: "fixtures/endfield/game8-events-2026-08-23" }, { adapter: adapter("endfield-wikigg-events"), fixture: "fixtures/endfield/wikigg-events-2026-08-14" }, { adapter: adapter("p5x-game8-events"), fixture: "fixtures/p5x/game8-events-2026-08-17" }, { adapter: adapter("arknights-akwiki-events"), fixture: "fixtures/arknights/akwiki-events-2026-08-17" }, @@ -59,7 +63,7 @@ async function runAdapter(adapter: Adapter, fixture: string) { }); } -describe.each(CASES)("$adapter.id", ({ adapter, fixture }) => { +describe.each(CASES)("$adapter.id $fixture", ({ adapter, fixture }) => { test("matches the checked-in expected output", async () => { const events = await runAdapter(adapter, fixture); const expected = await Bun.file(`${fixture}.expected.json`).json(); @@ -175,6 +179,35 @@ describe("nte fixture specifics", () => { }); }); +describe("endfield fixture specifics", () => { + const fixture = "fixtures/endfield/game8-events-2026-08-23"; + + test("reads an upcoming version whose ends are unannounced", async () => { + // Game8 published the whole 1.5 schedule as "Period: 09/02/2026 - TBA". + // Nine rows; the ninth reads "Period: TBA" with no start at all, so it is + // undatable and dropped rather than guessed. + const events = await runAdapter(adapter("endfield-game8-events"), fixture); + expect(events).toHaveLength(8); + + const signIn = events.find((e) => e.title === "Fletched Irontip Sign-In"); + expect(signIn?.startsAt).toBe("2026-09-02T00:00:00.000Z"); + expect(signIn?.endsAt).toBeNull(); + expect(events.map((e) => e.title)).not.toContain( + "Ridgeline Flows of Autumn Sign-In", + ); + }); + + test("keeps the unannounced end out of the summary", async () => { + // The range is structure, not prose. Left in, "- TBA" reaches the reader as + // the opening words of every blurb on the page. + const events = await runAdapter(adapter("endfield-game8-events"), fixture); + expect( + events.find((e) => e.title === "Fletched Irontip Sign-In")?.summary, + ).toBe("Sign-in to get extra pulls for Typhoeus!"); + for (const e of events) expect(e.summary ?? "").not.toMatch(/\bTBA\b/i); + }); +}); + describe("inferType", () => { const cases: Array<[string, EventType]> = [ ["Overflowing Abundance Rerun", "rerun"],