Sources/Confidence/Backport.swift (61 lines of code) (raw):

import Foundation extension URL { public struct Backport { var base: URL } public var backport: Backport { Backport(base: self) } } extension URL.Backport { public var path: String { if #available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) { return self.base.path(percentEncoded: false) } else { return self.base.path } } public func appending<S>(components: S...) -> URL where S: StringProtocol { if #available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *) { return components.reduce(self.base) { acc, cur in return acc.appending(component: cur) } } else { return components.reduce(self.base) { acc, cur in return acc.appendingPathComponent(String(cur)) } } } } extension Date { public struct Backport { } static public var backport: Backport.Type { Backport.self } } extension Date.Backport { static public var now: Date { if #available(macOS 12, iOS 15, tvOS 15, watchOS 8, *) { return Date.now } else { return Date() } } static public var nowISOString: String { if #available(macOS 12, iOS 15, tvOS 15, watchOS 8, *) { return toISOString(date: Date.now) } else { return toISOString(date: Date()) } } static public func toISOString(date: Date) -> String { if #available(macOS 12, iOS 15, tvOS 15, watchOS 8, *) { return date.ISO8601Format() } else { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US_POSIX") dateFormatter.timeZone = TimeZone(abbreviation: "GMT") dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" return dateFormatter.string(from: date).appending("Z") } } }