Build Information
Successful build of FoliBusAPI, reference main (8cca9e), with Swift 6.3 for macOS (SPM) on 15 Sep 2026 15:03:31 UTC.
Swift 6 data race errors: 0
Build Command
env DEVELOPER_DIR=/Applications/Xcode-26.5.0.app xcrun swift build --arch arm64Build Log
========================================
RunAll
========================================
Builder version: 5.0.2
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/serotonincrash/FoliBusAPI.git
Reference: main
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/serotonincrash/FoliBusAPI
* branch main -> FETCH_HEAD
* [new branch] main -> origin/main
HEAD is now at 8cca9ec Merge pull request #24 from serotonincrash/dev
Cloned https://github.com/serotonincrash/FoliBusAPI.git
Revision (git rev-parse @):
8cca9ec2014f3d418096b1a9bab9cdf4724de550
SPI manifest file found: $PWD/.spi.yml
SUCCESS checkout https://github.com/serotonincrash/FoliBusAPI.git at main
========================================
ResolveProductDependencies
========================================
Resolving dependencies ...
{
"identity": ".resolve-product-dependencies",
"name": "resolve-dependencies",
"url": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
"version": "unspecified",
"path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
"traits": [
"default"
],
"dependencies": [
{
"identity": "folibusapi",
"name": "FoliBusAPI",
"url": "https://github.com/serotonincrash/FoliBusAPI.git",
"version": "unspecified",
"path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies/.build/checkouts/FoliBusAPI",
"traits": [
"default"
],
"dependencies": [
]
}
]
}
Fetching https://github.com/serotonincrash/FoliBusAPI.git
[1/2007] Fetching folibusapi
Fetched https://github.com/serotonincrash/FoliBusAPI.git from cache (1.37s)
Creating working copy for https://github.com/serotonincrash/FoliBusAPI.git
Working copy of https://github.com/serotonincrash/FoliBusAPI.git resolved at main (8cca9ec)
warning: '.resolve-product-dependencies': dependency 'folibusapi' is not used by any target
Found 0 product dependencies
========================================
Build
========================================
Selected platform: macosSpm
Swift version: 6.3
Building package at path: $PWD
https://github.com/serotonincrash/FoliBusAPI.git
Running build ...
env DEVELOPER_DIR=/Applications/Xcode-26.5.0.app xcrun swift build --arch arm64
Building for debugging...
[0/3] Write sources
[2/3] Write swift-version-69A768CDF2A0BEE1.txt
[4/61] Emitting module FoliBusAPI
[5/67] Compiling FoliBusAPI FoliDiskCache+Validation.swift
[6/67] Compiling FoliBusAPI FoliDiskCache.swift
[7/67] Compiling FoliBusAPI FoliRefreshTracker.swift
[8/67] Compiling FoliBusAPI CacheBehavior.swift
[9/67] Compiling FoliBusAPI CacheTimeout.swift
[10/67] Compiling FoliBusAPI FoliClient+Requesting.swift
[11/67] Compiling FoliBusAPI FoliClient.swift
[12/67] Compiling FoliBusAPI FoliClient+Calendars.swift
[13/67] Compiling FoliBusAPI FoliClient+GeoJSON.swift
[14/67] Compiling FoliBusAPI FoliClient+Routes.swift
[15/67] Compiling FoliBusAPI FoliClient+Shapes.swift
[16/67] Compiling FoliBusAPI FoliClient+StopTimes.swift
[17/67] Compiling FoliBusAPI FoliClient+Stops.swift
[18/67] Compiling FoliBusAPI FoliAgencyList.swift
[19/67] Compiling FoliBusAPI FoliAlert.swift
[20/67] Compiling FoliBusAPI FoliAlertCategory.swift
[21/67] Compiling FoliBusAPI FoliAlertsResponse.swift
[22/67] Compiling FoliBusAPI FoliTripCancellation.swift
[23/67] Compiling FoliBusAPI FoliArrival.swift
[24/67] Compiling FoliBusAPI FoliArrivalResponse.swift
[25/67] Compiling FoliBusAPI FoliCalendar.swift
[26/67] Compiling FoliBusAPI FoliCalendarList.swift
[27/67] Compiling FoliBusAPI FoliCalendarDate.swift
[28/67] Compiling FoliBusAPI FoliCalendarDatesList.swift
[29/67] Compiling FoliBusAPI FoliGeoJSON.swift
[30/67] Compiling FoliBusAPI FoliStop.swift
[31/67] Compiling FoliBusAPI FoliStopList.swift
[32/67] Compiling FoliBusAPI FoliStopTime.swift
[33/67] Compiling FoliBusAPI FoliTrip.swift
[34/67] Compiling FoliBusAPI FoliVehicleLocation.swift
[35/67] Compiling FoliBusAPI FoliVehicleMonitoringResponse.swift
[36/67] Compiling FoliBusAPI FoliDedup.swift
[37/67] Compiling FoliBusAPI FoliRequester.swift
[38/67] Compiling FoliBusAPI FoliTransport.swift
[39/67] Compiling FoliBusAPI FoliClient+Agencies.swift
[40/67] Compiling FoliBusAPI FoliClient+Alerts.swift
[41/67] Compiling FoliBusAPI FoliClient+Arrivals.swift
[42/67] Compiling FoliBusAPI FoliClient+CalendarDates.swift
[43/67] Compiling FoliBusAPI FoliClient+Trips.swift
[44/67] Compiling FoliBusAPI FoliClient+VehicleMonitoring.swift
[45/67] Compiling FoliBusAPI FoliIndexes.swift
[46/67] Compiling FoliBusAPI FoliClient+Configuration.swift
[47/67] Compiling FoliBusAPI FoliBusAPI.swift
[48/67] Compiling FoliBusAPI FoliAgency.swift
[49/67] Compiling FoliBusAPI FoliCache+Convenience.swift
[50/67] Compiling FoliBusAPI FoliCache.swift
[51/67] Compiling FoliBusAPI FoliClient+Caching.swift
[52/67] Compiling FoliBusAPI FoliDiskCache+Loading.swift
[53/67] Compiling FoliBusAPI FoliDiskCache+Metadata.swift
[54/67] Compiling FoliBusAPI FoliDiskCache+Paths.swift
[55/67] Compiling FoliBusAPI FoliDiskCache+Saving.swift
[56/67] Compiling FoliBusAPI FoliGeoJSONLayer.swift
[57/67] Compiling FoliBusAPI FoliRoute.swift
[58/67] Compiling FoliBusAPI FoliRouteList.swift
[59/67] Compiling FoliBusAPI FoliShapePoint.swift
[60/67] Compiling FoliBusAPI FoliShapePointList.swift
[61/67] Compiling FoliBusAPI DedupeKey.swift
[62/67] Compiling FoliBusAPI FoliAPIError.swift
[63/67] Compiling FoliBusAPI FoliCacheError.swift
[64/67] Compiling FoliBusAPI FoliModels.swift
[65/67] Compiling FoliBusAPI GTFSDateParser.swift
[66/67] Compiling FoliBusAPI Resource.swift
[67/67] Compiling FoliBusAPI FoliStop+Collections.swift
[68/83] Compiling FoliBusUI FoliService+VehicleMonitoring.swift
[69/83] Compiling FoliBusUI FoliService+Stops.swift
[70/83] Compiling FoliBusUI FoliService+Trips.swift
[71/83] Compiling FoliBusUI FoliService+GeoJSON.swift
[72/83] Compiling FoliBusUI FoliService+Routes.swift
[73/83] Compiling FoliBusUI FoliService+Shapes.swift
[74/83] Compiling FoliBusUI FoliService+StopTimes.swift
[75/83] Emitting module FoliBusUI
[76/83] Compiling FoliBusUI FoliService+CalendarDates.swift
[77/83] Compiling FoliBusUI FoliService+Calendars.swift
[78/83] Compiling FoliBusUI FoliService+Alerts.swift
[79/83] Compiling FoliBusUI FoliService+Arrivals.swift
[80/83] Compiling FoliBusUI Exports.swift
[81/83] Compiling FoliBusUI FoliService+Agencies.swift
[82/83] Compiling FoliBusUI FoliService.swift
[83/83] Compiling FoliBusUI FoliRoute+SwiftUI.swift
[84/84] Compiling FoliBusUI FoliClient+Environment.swift
Build complete! (11.87s)
Build complete.
{
"dependencies" : [
],
"manifest_display_name" : "FoliBusAPI",
"name" : "FoliBusAPI",
"path" : "/Users/admin/builder/spi-builder-workspace",
"platforms" : [
{
"name" : "ios",
"version" : "17.0"
},
{
"name" : "macos",
"version" : "14.0"
},
{
"name" : "watchos",
"version" : "10.0"
},
{
"name" : "tvos",
"version" : "17.0"
}
],
"products" : [
{
"name" : "FoliBusAPI",
"targets" : [
"FoliBusAPI"
],
"type" : {
"library" : [
"automatic"
]
}
},
{
"name" : "FoliBusUI",
"targets" : [
"FoliBusUI"
],
"type" : {
"library" : [
"automatic"
]
}
}
],
"targets" : [
{
"c99name" : "FoliBusUI",
"module_type" : "SwiftTarget",
"name" : "FoliBusUI",
"path" : "Sources/FoliBusUI",
"product_memberships" : [
"FoliBusUI"
],
"sources" : [
"Exports.swift",
"Extensions/FoliService+Agencies.swift",
"Extensions/FoliService+Alerts.swift",
"Extensions/FoliService+Arrivals.swift",
"Extensions/FoliService+CalendarDates.swift",
"Extensions/FoliService+Calendars.swift",
"Extensions/FoliService+GeoJSON.swift",
"Extensions/FoliService+Routes.swift",
"Extensions/FoliService+Shapes.swift",
"Extensions/FoliService+StopTimes.swift",
"Extensions/FoliService+Stops.swift",
"Extensions/FoliService+Trips.swift",
"Extensions/FoliService+VehicleMonitoring.swift",
"FoliService.swift",
"Models/FoliRoute+SwiftUI.swift",
"Providers/FoliClient+Environment.swift"
],
"target_dependencies" : [
"FoliBusAPI"
],
"type" : "library"
},
{
"c99name" : "FoliBusAPITests",
"module_type" : "SwiftTarget",
"name" : "FoliBusAPITests",
"path" : "Tests/FoliBusAPITests",
"sources" : [
"AgencyCalendarShapeDecodingTests.swift",
"CacheBehaviorEndToEndTests.swift",
"ConcurrencyBehaviorTests.swift",
"CorrectnessFixesTests.swift",
"DedupCancellationTests.swift",
"DiskCacheCorruptionTests.swift",
"DiskCachePathTests.swift",
"EndpointCompatibilityTests.swift",
"FoliBusAPITests.swift",
"FoliServiceTests.swift",
"IndexMergeTests.swift",
"NewAPIDecodingTests.swift",
"ReExportTests.swift",
"ResponseWrapperTests.swift",
"Support/MockTransport.swift",
"TransportIntegrationTests.swift"
],
"target_dependencies" : [
"FoliBusAPI",
"FoliBusUI"
],
"type" : "test"
},
{
"c99name" : "FoliBusAPI",
"module_type" : "SwiftTarget",
"name" : "FoliBusAPI",
"path" : "Sources/FoliBusAPI",
"product_memberships" : [
"FoliBusAPI",
"FoliBusUI"
],
"sources" : [
"Client/Caching/FoliCache+Convenience.swift",
"Client/Caching/FoliCache.swift",
"Client/Caching/FoliClient+Caching.swift",
"Client/Caching/FoliDiskCache+Loading.swift",
"Client/Caching/FoliDiskCache+Metadata.swift",
"Client/Caching/FoliDiskCache+Paths.swift",
"Client/Caching/FoliDiskCache+Saving.swift",
"Client/Caching/FoliDiskCache+Validation.swift",
"Client/Caching/FoliDiskCache.swift",
"Client/Caching/FoliRefreshTracker.swift",
"Client/Caching/Helpers/CacheBehavior.swift",
"Client/Caching/Helpers/CacheTimeout.swift",
"Client/Core/FoliClient+Requesting.swift",
"Client/Core/FoliClient.swift",
"Client/Core/FoliDedup.swift",
"Client/Core/FoliRequester.swift",
"Client/Core/FoliTransport.swift",
"Client/Data Retrieval/FoliClient+Agencies.swift",
"Client/Data Retrieval/FoliClient+Alerts.swift",
"Client/Data Retrieval/FoliClient+Arrivals.swift",
"Client/Data Retrieval/FoliClient+CalendarDates.swift",
"Client/Data Retrieval/FoliClient+Calendars.swift",
"Client/Data Retrieval/FoliClient+GeoJSON.swift",
"Client/Data Retrieval/FoliClient+Routes.swift",
"Client/Data Retrieval/FoliClient+Shapes.swift",
"Client/Data Retrieval/FoliClient+StopTimes.swift",
"Client/Data Retrieval/FoliClient+Stops.swift",
"Client/Data Retrieval/FoliClient+Trips.swift",
"Client/Data Retrieval/FoliClient+VehicleMonitoring.swift",
"Client/Indexes/FoliIndexes.swift",
"Client/Providers/FoliClient+Configuration.swift",
"FoliBusAPI.swift",
"Models/Agency/FoliAgency.swift",
"Models/Agency/FoliAgencyList.swift",
"Models/Alert/FoliAlert.swift",
"Models/Alert/FoliAlertCategory.swift",
"Models/Alert/FoliAlertsResponse.swift",
"Models/Alert/FoliTripCancellation.swift",
"Models/Arrival/FoliArrival.swift",
"Models/Arrival/FoliArrivalResponse.swift",
"Models/Calendar/FoliCalendar.swift",
"Models/Calendar/FoliCalendarList.swift",
"Models/CalendarDate/FoliCalendarDate.swift",
"Models/CalendarDate/FoliCalendarDatesList.swift",
"Models/GeoJSON/FoliGeoJSON.swift",
"Models/GeoJSON/FoliGeoJSONLayer.swift",
"Models/Route/FoliRoute.swift",
"Models/Route/FoliRouteList.swift",
"Models/Shape/FoliShapePoint.swift",
"Models/Shape/FoliShapePointList.swift",
"Models/Shared/DedupeKey.swift",
"Models/Shared/FoliAPIError.swift",
"Models/Shared/FoliCacheError.swift",
"Models/Shared/FoliModels.swift",
"Models/Shared/GTFSDateParser.swift",
"Models/Shared/Resource.swift",
"Models/Stop/FoliStop+Collections.swift",
"Models/Stop/FoliStop.swift",
"Models/Stop/FoliStopList.swift",
"Models/StopTime/FoliStopTime.swift",
"Models/Trip/FoliTrip.swift",
"Models/VehicleLocation/FoliVehicleLocation.swift",
"Models/VehicleLocation/FoliVehicleMonitoringResponse.swift"
],
"type" : "library"
}
],
"tools_version" : "6.0"
}
✅ Doc result (pending) reported
========================================
GenerateDocs
========================================
Generating docs at path: $PWD/.docs/serotonincrash/folibusapi/main
Repository: serotonincrash/FoliBusAPI
Swift version used: 6.3
Target: FoliBusAPI
Extracting symbol information for 'FoliBusAPI'...
Finished extracting symbol information for 'FoliBusAPI'. (28.17s)
Building documentation for 'FoliBusAPI'...
warning: 'hasValidCache(for:)' doesn't exist at '/FoliBusAPI/Foli/CacheBehavior/cachedOrFetch'
--> ../Client/Caching/Helpers/CacheBehavior.swift:44:15-44:34
42 | /// known to be out of date. If revalidation is merely inconclusive (a
43 | /// transient network error), the stale entry is served instead, matching
44 + /// ``hasValidCache(for:)``.
45 | case cachedOrFetch
46 |
warning: 'requester' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:9:9-9:18
7 | /// dedicated extracted types:
8 | ///
9 + /// - ``requester`` (``FoliRequester``) owns transport, JSON decoding, and URL construction.
10 | /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 | /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
warning: 'FoliRequester' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:9:24-9:37
7 | /// dedicated extracted types:
8 | ///
9 + /// - ``requester`` (``FoliRequester``) owns transport, JSON decoding, and URL construction.
10 | /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 | /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
warning: 'dedup' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:10:9-10:14
8 | ///
9 | /// - ``requester`` (``FoliRequester``) owns transport, JSON decoding, and URL construction.
10 + /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 | /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
12 | /// - ``refreshTracker`` (``FoliRefreshTracker``) tracks background stale-while-revalidate tasks.
warning: 'FoliDedup' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:10:20-10:29
8 | ///
9 | /// - ``requester`` (``FoliRequester``) owns transport, JSON decoding, and URL construction.
10 + /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 | /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
12 | /// - ``refreshTracker`` (``FoliRefreshTracker``) tracks background stale-while-revalidate tasks.
warning: 'indexes' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:11:9-11:16
9 | /// - ``requester`` (``FoliRequester``) owns transport, JSON decoding, and URL construction.
10 | /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 + /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
12 | /// - ``refreshTracker`` (``FoliRefreshTracker``) tracks background stale-while-revalidate tasks.
13 | ///
warning: 'FoliIndexes' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:11:22-11:33
9 | /// - ``requester`` (``FoliRequester``) owns transport, JSON decoding, and URL construction.
10 | /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 + /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
12 | /// - ``refreshTracker`` (``FoliRefreshTracker``) tracks background stale-while-revalidate tasks.
13 | ///
warning: 'refreshTracker' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:12:9-12:23
10 | /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 | /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
12 + /// - ``refreshTracker`` (``FoliRefreshTracker``) tracks background stale-while-revalidate tasks.
13 | ///
14 | /// ## Direct usage
warning: 'FoliRefreshTracker' doesn't exist at '/FoliBusAPI/FoliClient'
--> ../Client/Core/FoliClient.swift:12:29-12:47
10 | /// - ``dedup`` (``FoliDedup``) coalesces concurrent identical requests.
11 | /// - ``indexes`` (``FoliIndexes``) maintains O(1) entity lookup dictionaries.
12 + /// - ``refreshTracker`` (``FoliRefreshTracker``) tracks background stale-while-revalidate tasks.
13 | ///
14 | /// ## Direct usage
warning: 'fetchVehicleLocations(for:)' is ambiguous at '/FoliBusAPI/FoliClient'
--> ../Client/Data Retrieval/FoliClient+VehicleMonitoring.swift:27:22-27:49
25 | /// Vehicles without a position fix are omitted from the result.
26 | ///
27 + /// - SeeAlso: ``fetchVehicleLocations(for:)`` for filtering by line reference.
| ├─suggestion: Insert '-(String)' for 'func fetchVehicleLocations(for lineRef: String) async throws -> [Foli.VehicleLocation]'
| ╰─suggestion: Insert '-([String])' for 'func fetchVehicleLocations(for lineRefs: [String]) async throws -> [Foli.VehicleLocation]'
28 | func fetchVehicleLocations() async throws -> [Foli.VehicleLocation] {
29 | let response = try await fetchVehicleMonitoring()
warning: 'DiskCache' doesn't exist at '/FoliBusAPI/Foli'
--> CachingStrategies.md:16:31-16:40
14 | ### Disk cache
15 |
16 + The package ships with ``Foli/DiskCache``, an actor-isolated file-based cache that stores serialized resources under the application support directory. The cache is initialized automatically when you create a ``FoliClient`` with any cache behavior other than `.noCache`. Because a silently-downgraded cache can mask real environment problems (e.g. sandbox restrictions), ``FoliClient``'s initializers `throw` if disk-cache initialization fails — you decide how to react, rather than the client falling back invisibly. Pass `cacheBehavior: .noCache` if you don't want a disk cache at all; that path never attempts disk-cache initialization and therefore can't throw for that reason.
17 |
18 | Cache entries that fail to decode — file corruption, or model changes across package updates — are treated as cache misses: the poisoned file is removed and the next fetch re-populates it. All cache network traffic (dataset revalidation) flows through the client's configured transport, so injected mock transports fully isolate tests from the network.
warning: 'FoliRequester' doesn't exist at '/FoliBusAPI'
--> FoliBusAPI.md:14:256-14:269
12 | - SwiftUI-oriented service access through `FoliService` (in the `FoliBusUI` target) and client providers
13 |
14 + The package is built around ``FoliClient``, an actor that coordinates request execution, caching, in-flight deduplication, and in-memory lookup indexes. Rather than owning all of this logic directly, `FoliClient` delegates to dedicated extracted types: ``FoliRequester`` (transport, URL construction, and JSON decoding), ``FoliDedup`` (request coalescing), ``FoliIndexes`` (entity lookup dictionaries), and ``FoliRefreshTracker`` (background refresh bookkeeping). The ``FoliBusAPI`` static facade provides a convenient entry point backed by a configurable provider — replace it at app launch via ``FoliBusAPI/configure(_:)`` or reset it between tests via ``FoliBusAPI/reset()``.
15 |
16 | ## Architecture
warning: 'FoliDedup' doesn't exist at '/FoliBusAPI'
--> FoliBusAPI.md:14:324-14:333
12 | - SwiftUI-oriented service access through `FoliService` (in the `FoliBusUI` target) and client providers
13 |
14 + The package is built around ``FoliClient``, an actor that coordinates request execution, caching, in-flight deduplication, and in-memory lookup indexes. Rather than owning all of this logic directly, `FoliClient` delegates to dedicated extracted types: ``FoliRequester`` (transport, URL construction, and JSON decoding), ``FoliDedup`` (request coalescing), ``FoliIndexes`` (entity lookup dictionaries), and ``FoliRefreshTracker`` (background refresh bookkeeping). The ``FoliBusAPI`` static facade provides a convenient entry point backed by a configurable provider — replace it at app launch via ``FoliBusAPI/configure(_:)`` or reset it between tests via ``FoliBusAPI/reset()``.
| ├─suggestion: Replace 'FoliDedup' with 'Foli'
| ├─suggestion: Replace 'FoliDedup' with 'FoliBusAPI'
| ╰─suggestion: Replace 'FoliDedup' with 'FoliClient'
15 |
16 | ## Architecture
warning: 'FoliIndexes' doesn't exist at '/FoliBusAPI'
--> FoliBusAPI.md:14:360-14:371
12 | - SwiftUI-oriented service access through `FoliService` (in the `FoliBusUI` target) and client providers
13 |
14 + The package is built around ``FoliClient``, an actor that coordinates request execution, caching, in-flight deduplication, and in-memory lookup indexes. Rather than owning all of this logic directly, `FoliClient` delegates to dedicated extracted types: ``FoliRequester`` (transport, URL construction, and JSON decoding), ``FoliDedup`` (request coalescing), ``FoliIndexes`` (entity lookup dictionaries), and ``FoliRefreshTracker`` (background refresh bookkeeping). The ``FoliBusAPI`` static facade provides a convenient entry point backed by a configurable provider — replace it at app launch via ``FoliBusAPI/configure(_:)`` or reset it between tests via ``FoliBusAPI/reset()``.
| ╰─suggestion: Replace 'FoliIndexes' with 'Foli'
15 |
16 | ## Architecture
warning: 'FoliRefreshTracker' doesn't exist at '/FoliBusAPI'
--> FoliBusAPI.md:14:410-14:428
12 | - SwiftUI-oriented service access through `FoliService` (in the `FoliBusUI` target) and client providers
13 |
14 + The package is built around ``FoliClient``, an actor that coordinates request execution, caching, in-flight deduplication, and in-memory lookup indexes. Rather than owning all of this logic directly, `FoliClient` delegates to dedicated extracted types: ``FoliRequester`` (transport, URL construction, and JSON decoding), ``FoliDedup`` (request coalescing), ``FoliIndexes`` (entity lookup dictionaries), and ``FoliRefreshTracker`` (background refresh bookkeeping). The ``FoliBusAPI`` static facade provides a convenient entry point backed by a configurable provider — replace it at app launch via ``FoliBusAPI/configure(_:)`` or reset it between tests via ``FoliBusAPI/reset()``.
15 |
16 | ## Architecture
warning: 'FoliService' doesn't exist at '/FoliBusAPI/GettingStarted'
--> GettingStarted.md:94:76-94:87
92 | ## SwiftUI integration
93 |
94 + If you're integrating into SwiftUI, inject a client provider and use the ``FoliService`` property wrapper to resolve a client from the environment.
95 |
96 | ```swift
warning: 'FoliDedup' doesn't exist at '/FoliBusAPI/RealTimeData'
--> RealTimeData.md:306:70-306:79
304 | ## Deduplication
305 |
306 + All real-time fetch methods are automatically deduplicated through ``FoliDedup``. When multiple callers request the same resource concurrently, only one network request is made.
307 |
308 | ### How deduplication works
warning: Symbol links can only resolve symbols
--> TransportAndTesting.md:9:69-9:82
7 | - production code can use the `FoliClient(session:cacheBehavior:cacheTTL:)` convenience initializer that injects a `URLSession` for regular networking
8 | - tests inject a lightweight mock transport
9 + - request construction, response validation, and decoding live in ``FoliRequester``, which ``FoliClient`` delegates to
| ╰─suggestion: Use a '<doc:>' style reference.
10 |
11 | ## Production usage
warning: Symbol links can only resolve symbols
--> TransportAndTesting.md:78:72-78:85
76 | ## FoliRequester
77 |
78 + Request construction, response validation, and JSON decoding live in ``FoliRequester``, a `Sendable` value type that owns the transport, decoder, and four base URLs. Because `FoliRequester` is not actor-isolated, JSON decoding for large GTFS payloads (routes, stops, trips) runs on the cooperative thread pool rather than blocking `FoliClient`'s executor. `FoliClient` holds a `requester` reference and forwards its request methods.
| ╰─suggestion: Use a '<doc:>' style reference.
79 |
80 | The request methods accept an optional `headers` parameter for per-call request customization. For example, the alerts endpoint declares `Accept-Encoding: gzip` via this parameter rather than hard-coding it in the transport layer.
Finished building documentation for 'FoliBusAPI' (0.84s)
Generated documentation archive at:
/Users/admin/builder/spi-builder-workspace/.docs/serotonincrash/folibusapi/main
Fetching https://github.com/swiftlang/swift-docc-plugin
[1/2345] Fetching swift-docc-plugin
Fetched https://github.com/swiftlang/swift-docc-plugin from cache (1.35s)
Computing version for https://github.com/swiftlang/swift-docc-plugin
Computed https://github.com/swiftlang/swift-docc-plugin at 1.5.0 (3.58s)
Fetching https://github.com/swiftlang/swift-docc-symbolkit
[1/3822] Fetching swift-docc-symbolkit
Fetched https://github.com/swiftlang/swift-docc-symbolkit from cache (1.24s)
Computing version for https://github.com/swiftlang/swift-docc-symbolkit
Computed https://github.com/swiftlang/swift-docc-symbolkit at 1.0.0 (1.95s)
Creating working copy for https://github.com/swiftlang/swift-docc-plugin
Working copy of https://github.com/swiftlang/swift-docc-plugin resolved at 1.5.0
Creating working copy for https://github.com/swiftlang/swift-docc-symbolkit
Working copy of https://github.com/swiftlang/swift-docc-symbolkit resolved at 1.0.0
Building for debugging...
[0/8] Write sources
[1/8] Write snippet-extract-tool-entitlement.plist
[1/8] Write sources
[4/8] Write swift-version-69A768CDF2A0BEE1.txt
[6/54] Compiling SymbolKit Names.swift
[7/54] Compiling SymbolKit SPI.swift
[8/54] Compiling SymbolKit Snippet.swift
[9/54] Compiling SymbolKit Extension.swift
[10/58] Emitting module SymbolKit
[11/58] Compiling SymbolKit Mixin+Equals.swift
[12/58] Compiling SymbolKit Mixin+Hash.swift
[13/58] Compiling SymbolKit Mixin.swift
[14/58] Compiling SymbolKit LineList.swift
[15/58] Compiling SymbolKit Position.swift
[16/58] Compiling Snippets SnippetLanguage.swift
[17/58] Emitting module Snippets
[18/58] Compiling Snippets SnippetParser.swift
[19/58] Compiling Snippets Snippet.swift
[20/58] Compiling SymbolKit SemanticVersion.swift
[21/58] Compiling SymbolKit AccessControl.swift
[22/58] Compiling SymbolKit Availability.swift
[23/58] Compiling SymbolKit AvailabilityItem.swift
[24/58] Compiling SymbolKit Domain.swift
[25/58] Compiling SymbolKit Identifier.swift
[26/58] Compiling SymbolKit KindIdentifier.swift
[27/58] Compiling SymbolKit Location.swift
[28/58] Compiling SymbolKit Mutability.swift
[29/58] Compiling SymbolKit SourceRange.swift
[30/58] Compiling SymbolKit Metadata.swift
[31/58] Compiling SymbolKit Module.swift
[32/58] Compiling SymbolKit OperatingSystem.swift
[33/58] Compiling SymbolKit Platform.swift
[34/58] Compiling SymbolKit DeclarationFragments.swift
[35/58] Compiling SymbolKit Fragment.swift
[36/58] Compiling SymbolKit FragmentKind.swift
[37/58] Compiling SymbolKit FunctionParameter.swift
[38/58] Compiling SymbolKit FunctionSignature.swift
[39/58] Compiling SymbolKit Relationship.swift
[40/58] Compiling SymbolKit RelationshipKind.swift
[41/58] Compiling SymbolKit SourceOrigin.swift
[42/58] Compiling SymbolKit GenericConstraints.swift
[43/58] Compiling SymbolKit Swift.swift
[44/58] Compiling SymbolKit Symbol.swift
[45/58] Compiling SymbolKit SymbolKind.swift
[46/58] Compiling SymbolKit SymbolGraph.swift
[47/58] Compiling SymbolKit GraphCollector.swift
[48/58] Compiling SymbolKit GenericConstraint.swift
[49/58] Compiling SymbolKit GenericParameter.swift
[50/58] Compiling SymbolKit Generics.swift
[51/58] Compiling SymbolKit Namespace.swift
[52/58] Compiling SymbolKit UnifiedSymbol+Encodable.swift
[53/58] Compiling SymbolKit UnifiedSymbol.swift
[54/58] Compiling SymbolKit UnifiedSymbolGraph+Encodable.swift
[55/58] Compiling SymbolKit UnifiedSymbolGraph.swift
[56/62] Compiling snippet_extract SnippetBuildCommand.swift
[57/62] Compiling snippet_extract URL+Status.swift
[58/62] Emitting module snippet_extract
[59/62] Compiling snippet_extract SymbolGraph+Snippet.swift
[59/62] Write Objects.LinkFileList
[60/62] Linking snippet-extract-tool
[61/62] Applying snippet-extract-tool
Build of product 'snippet-extract' complete! (4.61s)
Building for debugging...
[0/1] Write swift-version-69A768CDF2A0BEE1.txt
Build of target: 'FoliBusAPI' complete! (0.26s)
Target: FoliBusUI
Extracting symbol information for 'FoliBusUI'...
Finished extracting symbol information for 'FoliBusUI'. (16.92s)
Building documentation for 'FoliBusUI'...
warning: 'Foli' doesn't exist at '/FoliBusUI/FoliService/fetchAgency(id:)'
--> ../Extensions/FoliService+Agencies.swift:16:21-16:25
14 | /// - Parameter agencyId: The agency ID to fetch.
15 | /// - Returns: The agency if found.
16 + /// - Throws: ``Foli/APIError/notFound`` if no agency matches the ID.
17 | func fetchAgency(id agencyId: String) async throws -> Foli.Agency {
18 | guard let agency = try await client.agency(for: agencyId) else {
warning: 'Foli' doesn't exist at '/FoliBusUI/FoliService/fetchCalendar(forServiceId:)'
--> ../Extensions/FoliService+Calendars.swift:16:21-16:25
14 | /// - Parameter serviceId: The service ID to fetch.
15 | /// - Returns: The calendar if found.
16 + /// - Throws: ``Foli/APIError/notFound`` if no calendar matches the service ID.
17 | func fetchCalendar(forServiceId serviceId: String) async throws -> Foli.Calendar {
18 | guard let calendar = try await client.calendar(for: serviceId) else {
warning: 'Foli' doesn't exist at '/FoliBusUI/FoliService/fetchRoute(id:)'
--> ../Extensions/FoliService+Routes.swift:24:21-24:25
22 | /// - Parameter routeId: The route ID to fetch.
23 | /// - Returns: The route if found.
24 + /// - Throws: ``Foli/APIError/notFound`` if no route matches the ID.
25 | func fetchRoute(id routeId: String) async throws -> Foli.Route {
26 | guard let route = try await client.route(for: routeId) else {
warning: 'Foli' doesn't exist at '/FoliBusUI/FoliService/fetchStop(id:)'
--> ../Extensions/FoliService+Stops.swift:24:21-24:25
22 | /// - Parameter stopId: The stop ID to fetch.
23 | /// - Returns: The stop if found.
24 + /// - Throws: ``Foli/APIError/notFound`` if no stop matches the ID.
25 | func fetchStop(id stopId: String) async throws -> Foli.Stop {
26 | guard let stop = try await client.stop(for: stopId) else {
warning: 'FoliClientProviding' doesn't exist at '/FoliBusUI'
--> FoliBusUI.md:59:5-59:24
57 | ### Environment
58 |
59 + - ``FoliClientProviding``
60 | - ``DefaultFoliClientProvider``
61 |
warning: 'DefaultFoliClientProvider' doesn't exist at '/FoliBusUI'
--> FoliBusUI.md:60:5-60:30
58 |
59 | - ``FoliClientProviding``
60 + - ``DefaultFoliClientProvider``
61 |
62 | ### Model Extensions
warning: 'Foli' doesn't exist at '/FoliBusUI'
--> FoliBusUI.md:64:5-64:9
62 | ### Model Extensions
63 |
64 + - ``Foli/Route/color``
| ├─suggestion: Replace 'Foli' with 'FoliBusAPI'
| ╰─suggestion: Replace 'Foli' with 'FoliService'
65 | - ``Foli/Route/textColor``
66 |
warning: 'Foli' doesn't exist at '/FoliBusUI'
--> FoliBusUI.md:65:5-65:9
63 |
64 | - ``Foli/Route/color``
65 + - ``Foli/Route/textColor``
| ├─suggestion: Replace 'Foli' with 'FoliBusAPI'
| ╰─suggestion: Replace 'Foli' with 'FoliService'
66 |
67 | ### Articles
warning: 'Foli' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:5:196-5:200
3 | ## Overview
4 |
5 + `FoliBusUI` is the SwiftUI layer of the package. It provides the ``FoliService`` property wrapper, the `\.foliClientProvider` environment key, and SwiftUI-friendly extensions on models such as ``Foli/Route/color``. Together they make it easy to load transit data into views while keeping client configuration at the app root.
6 |
7 | ## Set up the environment
warning: 'FoliClient' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:9:83-9:93
7 | ## Set up the environment
8 |
9 + Configure a provider at the root of your app so every view can resolve the same ``FoliClient`` instance through the environment.
10 |
11 | ```swift
warning: 'FoliClientProviding' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:34:43-34:62
32 | ```
33 |
34 + `DefaultFoliClientProvider` conforms to ``FoliClientProviding`` and reuses a single client, so you don't create a new client for every view.
35 |
36 | ## Use @FoliService in views
warning: 'Foli' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:181:3-181:7
179 | ### Route colors
180 |
181 + ``Foli/Route`` exposes `color` and `textColor` as SwiftUI ``Color`` values when the route includes hex colors.
182 |
183 | ```swift
warning: 'Color' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:181:61-181:66
179 | ### Route colors
180 |
181 + ``Foli/Route`` exposes `color` and `textColor` as SwiftUI ``Color`` values when the route includes hex colors.
182 |
183 | ```swift
warning: 'FoliClient' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:244:3-244:13
242 | ## Error handling in views
243 |
244 + ``FoliClient`` throws ``Foli/APIError`` for network, decoding, and lookup failures, and ``Foli/CacheError`` for cache-specific problems such as a `.cacheMiss` with ``Foli/CacheBehavior/cachedOnly``. In views you usually want to present a friendly message:
245 |
246 | ```swift
warning: 'Foli' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:244:25-244:29
242 | ## Error handling in views
243 |
244 + ``FoliClient`` throws ``Foli/APIError`` for network, decoding, and lookup failures, and ``Foli/CacheError`` for cache-specific problems such as a `.cacheMiss` with ``Foli/CacheBehavior/cachedOnly``. In views you usually want to present a friendly message:
245 |
246 | ```swift
warning: 'Foli' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:244:91-244:95
242 | ## Error handling in views
243 |
244 + ``FoliClient`` throws ``Foli/APIError`` for network, decoding, and lookup failures, and ``Foli/CacheError`` for cache-specific problems such as a `.cacheMiss` with ``Foli/CacheBehavior/cachedOnly``. In views you usually want to present a friendly message:
245 |
246 | ```swift
warning: 'Foli' doesn't exist at '/FoliBusUI/SwiftUIIntegration'
--> SwiftUIIntegration.md:244:167-244:171
242 | ## Error handling in views
243 |
244 + ``FoliClient`` throws ``Foli/APIError`` for network, decoding, and lookup failures, and ``Foli/CacheError`` for cache-specific problems such as a `.cacheMiss` with ``Foli/CacheBehavior/cachedOnly``. In views you usually want to present a friendly message:
245 |
246 | ```swift
warning: 'FoliClient' doesn't exist at '/FoliBusUI/SwiftUICore/EnvironmentValues'
--> ../Providers/FoliClient+Environment.swift:6:64-6:74
4 | // MARK: - SwiftUI Environment Support
5 |
6 + /// SwiftUI environment integration for resolving configured ``FoliClient`` providers.
| ╰─suggestion: Replace 'FoliClient' with 'foliClientProvider'
7 | extension EnvironmentValues {
8 |
Finished building documentation for 'FoliBusUI' (0.09s)
Generated documentation archive at:
/Users/admin/builder/spi-builder-workspace/.docs/serotonincrash/folibusapi/main
Building for debugging...
[0/3] Write swift-version-69A768CDF2A0BEE1.txt
Build of product 'snippet-extract' complete! (0.21s)
Building for debugging...
[0/1] Write swift-version-69A768CDF2A0BEE1.txt
Build of target: 'FoliBusUI' complete! (0.25s)
Successfully merged into /Users/admin/builder/spi-builder-workspace/.docs-staging/serotonincrash/folibusapi/main/index/index.json
Successfully merged into /Users/admin/builder/spi-builder-workspace/.docs-staging/serotonincrash/folibusapi/main/linkable-paths.json
1430
9 /Users/admin/builder/spi-builder-workspace/.docs/serotonincrash/folibusapi/main
✅ Doc result (uploading) reported
========================================
SyncDocs
========================================
Doc archive source directory: $PWD/.docs/serotonincrash/folibusapi/main
File count: 1430
Doc size: 9.0MB
Preparing doc bundle ...
Using presigned URL upload - AWS credentials not required
Uploading -serotonincrash-folibusapi-main-e106d7e7.zip to presigned URL
Starting upload of 2070989 bytes...
Upload completed successfully
Done.