The live-invalidation release: screens that stay current by themselves.
⚠️ Breaking (0.x SemVer). The hand-written SwiftUILocalizableoverload mirrors are replaced by a complete generated surface:defaultTitle:→defaultValue:onTextFieldinits,any Localizable→some Localizableparameters, andContentUnavailableView'sdefaultValue:argument order changed. See the full changelog for every entry and migration note.
Highlights
- Live ViewModel invalidation —
@ViewModel(options: [.live]): any bound view re-fetches automatically when another actor commits a change to the data it was served from. No polling, no manual invalidation; degrades to fetch-once where no live connection is configured, so adopting it on a shipped screen is purely additive. Server side:useLiveInvalidation(on:)+liveTransaction { }(transactional writes that notify clients only on commit). Transport is replaceable via theInvalidationChannelseam. - Client credentials —
ClientCredentialProvider(+ stockBearerCredentialProvider) attaches authentication headers to every request, consulted per-request so rotating tokens just work;ClientCredentialMiddleware+ServerCredentialVerifieron the Vapor side. - Generated
Localizableoverload surface — every SwiftUI control that renders text now has a complete, generatedLocalizableoverload set, kept honest by a CI staleness gate. withServedFluentTestApp(FOSTestingVapor) — test streaming/SSE endpoints over a real socket on an ephemeral port.- Fixed:
X-FOS-Versionattaches exactly once per served response.
Full changelog: https://github.com/foscomputerservices/FOSUtilities/blob/0.6.0/CHANGELOG.md