@swiftbrowser/swift 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/Package.swift +214 -0
  2. package/README.md +10 -2
  3. package/Sources/AVFoundation/AVFoundation.swift +131 -0
  4. package/Sources/AVFoundation/Asset.swift +487 -0
  5. package/Sources/AVFoundation/AudioSession.swift +144 -0
  6. package/Sources/AVFoundation/CMTime.swift +303 -0
  7. package/Sources/AVFoundation/Capture.swift +688 -0
  8. package/Sources/AVFoundation/Player.swift +749 -0
  9. package/Sources/AVFoundation/PlayerView.swift +117 -0
  10. package/Sources/AVKit/AVKit.swift +132 -0
  11. package/Sources/Accelerate/Accelerate.swift +122 -0
  12. package/Sources/AppIntents/AppIntents.swift +144 -0
  13. package/Sources/AppIntents/Parameters.swift +220 -0
  14. package/Sources/AppIntents/Shortcuts.swift +159 -0
  15. package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
  16. package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
  17. package/Sources/AuthenticationServices/Authorization.swift +251 -0
  18. package/Sources/Charts/Charts.swift +61 -0
  19. package/Sources/Combine/AnyCancellable.swift +65 -0
  20. package/Sources/Combine/AnyPublisher.swift +148 -0
  21. package/Sources/Combine/AnySubscriber.swift +230 -0
  22. package/Sources/Combine/Cancellable.swift +35 -0
  23. package/Sources/Combine/Codable.swift +29 -0
  24. package/Sources/Combine/CombineIdentifier.swift +45 -0
  25. package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
  26. package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
  27. package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
  28. package/Sources/Combine/CurrentValueSubject.swift +252 -0
  29. package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
  30. package/Sources/Combine/Future.swift +228 -0
  31. package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
  32. package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
  33. package/Sources/Combine/Helpers/ConduitList.swift +59 -0
  34. package/Sources/Combine/Helpers/DebugHook.swift +177 -0
  35. package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
  36. package/Sources/Combine/Helpers/Locking.swift +30 -0
  37. package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
  38. package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
  39. package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
  40. package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
  41. package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
  42. package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
  43. package/Sources/Combine/Helpers/Utils.swift +30 -0
  44. package/Sources/Combine/Helpers/Violations.swift +33 -0
  45. package/Sources/Combine/ImmediateScheduler.swift +178 -0
  46. package/Sources/Combine/LICENSE +21 -0
  47. package/Sources/Combine/NotificationPublisher.swift +48 -0
  48. package/Sources/Combine/ObjectWillChange.swift +46 -0
  49. package/Sources/Combine/PassthroughSubject.swift +222 -0
  50. package/Sources/Combine/Publisher+Subscribe.swift +53 -0
  51. package/Sources/Combine/Publishers/Deferred.swift +48 -0
  52. package/Sources/Combine/Publishers/Empty.swift +54 -0
  53. package/Sources/Combine/Publishers/Fail.swift +42 -0
  54. package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
  55. package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
  56. package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
  57. package/Sources/Combine/Publishers/Just.swift +313 -0
  58. package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
  59. package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
  60. package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
  61. package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
  62. package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
  63. package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
  64. package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
  65. package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
  66. package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
  67. package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
  68. package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
  69. package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
  70. package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
  71. package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
  72. package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
  73. package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
  74. package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
  75. package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
  76. package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
  77. package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
  78. package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
  79. package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
  80. package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
  81. package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
  82. package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
  83. package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
  84. package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
  85. package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
  86. package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
  87. package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
  88. package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
  89. package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
  90. package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
  91. package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
  92. package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
  93. package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
  94. package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
  95. package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
  96. package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
  97. package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
  98. package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
  99. package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
  100. package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
  101. package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
  102. package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
  103. package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
  104. package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
  105. package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
  106. package/Sources/Combine/Publishers/Publishers.swift +13 -0
  107. package/Sources/Combine/Publishers/Record.swift +237 -0
  108. package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
  109. package/Sources/Combine/Result.swift +46 -0
  110. package/Sources/Combine/Scheduler.swift +89 -0
  111. package/Sources/Combine/Schedulers.swift +211 -0
  112. package/Sources/Combine/Subject+Void.swift +17 -0
  113. package/Sources/Combine/Subscriber+Void.swift +20 -0
  114. package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
  115. package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
  116. package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
  117. package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
  118. package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
  119. package/Sources/Combine/Subscription.swift +22 -0
  120. package/Sources/Combine/Subscriptions.swift +42 -0
  121. package/Sources/Combine/SwiftUIObservation.swift +10 -0
  122. package/Sources/Combine/_Introspection.swift +107 -0
  123. package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
  124. package/Sources/Compression/Compression.swift +365 -0
  125. package/Sources/Compression/Deflate.swift +407 -0
  126. package/Sources/Compression/Zlib.swift +179 -0
  127. package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
  128. package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
  129. package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
  130. package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
  131. package/Sources/CoreImage/CIColor.swift +41 -0
  132. package/Sources/CoreImage/CIContext.swift +31 -0
  133. package/Sources/CoreImage/CIDetector.swift +57 -0
  134. package/Sources/CoreImage/CIFilter.swift +243 -0
  135. package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
  136. package/Sources/CoreImage/CIImage.swift +162 -0
  137. package/Sources/CoreImage/QRCode.swift +393 -0
  138. package/Sources/CoreLocation/Coordinate.swift +30 -0
  139. package/Sources/CoreLocation/Location.swift +65 -0
  140. package/Sources/CoreML/Evaluation.swift +414 -0
  141. package/Sources/CoreML/FeatureValue.swift +266 -0
  142. package/Sources/CoreML/Model.swift +269 -0
  143. package/Sources/CoreML/MultiArray.swift +92 -0
  144. package/Sources/CoreML/Specification.swift +233 -0
  145. package/Sources/CoreText/CoreText.swift +64 -0
  146. package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
  147. package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
  148. package/Sources/CryptoKit/CryptoKit.swift +375 -0
  149. package/Sources/CryptoKit/Curve25519.swift +317 -0
  150. package/Sources/CryptoKit/P256.swift +321 -0
  151. package/Sources/FoundationBridge/AppStorage.swift +165 -0
  152. package/Sources/FoundationBridge/AssetResources.swift +90 -0
  153. package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
  154. package/Sources/FoundationBridge/AsyncImage.swift +116 -0
  155. package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
  156. package/Sources/FoundationBridge/Bundle.swift +119 -0
  157. package/Sources/FoundationBridge/CombineExports.swift +8 -0
  158. package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
  159. package/Sources/FoundationBridge/Dispatch.swift +458 -0
  160. package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
  161. package/Sources/FoundationBridge/FileImporter.swift +128 -0
  162. package/Sources/FoundationBridge/FileSystem.swift +68 -0
  163. package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
  164. package/Sources/FoundationBridge/HostResolution.swift +31 -0
  165. package/Sources/FoundationBridge/ItemProvider.swift +655 -0
  166. package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
  167. package/Sources/FoundationBridge/Links.swift +127 -0
  168. package/Sources/FoundationBridge/ListFormatter.swift +32 -0
  169. package/Sources/FoundationBridge/Locale.swift +86 -0
  170. package/Sources/FoundationBridge/Localization.swift +149 -0
  171. package/Sources/FoundationBridge/Locks.swift +50 -0
  172. package/Sources/FoundationBridge/Markdown.swift +527 -0
  173. package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
  174. package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
  175. package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
  176. package/Sources/FoundationBridge/Operation.swift +195 -0
  177. package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
  178. package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
  179. package/Sources/FoundationBridge/SceneStorage.swift +78 -0
  180. package/Sources/FoundationBridge/SecurityExports.swift +8 -0
  181. package/Sources/FoundationBridge/Selector.swift +226 -0
  182. package/Sources/FoundationBridge/StringComparators.swift +17 -0
  183. package/Sources/FoundationBridge/Table.swift +211 -0
  184. package/Sources/FoundationBridge/TextAttributes.swift +42 -0
  185. package/Sources/FoundationBridge/Timer.swift +53 -0
  186. package/Sources/FoundationBridge/UITextChecker.swift +30 -0
  187. package/Sources/FoundationBridge/URLSession.swift +718 -0
  188. package/Sources/FoundationBridge/UserDefaults.swift +183 -0
  189. package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
  190. package/Sources/FoundationBridge/WebSocket.swift +187 -0
  191. package/Sources/FoundationModels/FoundationModels.swift +1098 -0
  192. package/Sources/ImageIO/GIF.swift +72 -0
  193. package/Sources/ImageIO/ImageIO.swift +248 -0
  194. package/Sources/ImageIO/ImageTypes.swift +28 -0
  195. package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
  196. package/Sources/LocalAuthentication/LAContext.swift +86 -0
  197. package/Sources/MapKit/Geometry.swift +223 -0
  198. package/Sources/MapKit/Map.swift +638 -0
  199. package/Sources/MapKit/MapView.swift +229 -0
  200. package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
  201. package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
  202. package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
  203. package/Sources/OSLog/OSLog.swift +6 -0
  204. package/Sources/Photos/Photos.swift +572 -0
  205. package/Sources/PhotosUI/PhotosPicker.swift +248 -0
  206. package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
  207. package/Sources/QuickLook/QuickLook.swift +168 -0
  208. package/Sources/SafariServices/SafariServices.swift +106 -0
  209. package/Sources/Security/Security.swift +332 -0
  210. package/Sources/StoreKit/AppStore.swift +207 -0
  211. package/Sources/StoreKit/Products.swift +280 -0
  212. package/Sources/StoreKit/RequestReview.swift +28 -0
  213. package/Sources/StoreKit/StoreKit1.swift +486 -0
  214. package/Sources/StoreKit/StoreViews.swift +428 -0
  215. package/Sources/StoreKit/Transactions.swift +197 -0
  216. package/Sources/SwiftData/Macros.swift +58 -0
  217. package/Sources/SwiftData/ModelActor.swift +38 -0
  218. package/Sources/SwiftData/ModelContainer.swift +129 -0
  219. package/Sources/SwiftData/ModelContext.swift +451 -0
  220. package/Sources/SwiftData/PersistentModel.swift +238 -0
  221. package/Sources/SwiftData/Properties.swift +261 -0
  222. package/Sources/SwiftData/Query.swift +256 -0
  223. package/Sources/SwiftData/Schema.swift +192 -0
  224. package/Sources/SwiftData/Store.swift +146 -0
  225. package/Sources/SwiftData/StringPredicates.swift +125 -0
  226. package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
  227. package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
  228. package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
  229. package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
  230. package/Sources/SwiftDataMacros/Plugin.swift +18 -0
  231. package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
  232. package/Sources/SwiftUI/API/Accessibility.swift +181 -0
  233. package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
  234. package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
  235. package/Sources/SwiftUI/API/Alert.swift +221 -0
  236. package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
  237. package/Sources/SwiftUI/API/Animation.swift +285 -0
  238. package/Sources/SwiftUI/API/App.swift +87 -0
  239. package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
  240. package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
  241. package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
  242. package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
  243. package/Sources/SwiftUI/API/Canvas.swift +337 -0
  244. package/Sources/SwiftUI/API/Color.swift +237 -0
  245. package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
  246. package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
  247. package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
  248. package/Sources/SwiftUI/API/Commands.swift +106 -0
  249. package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
  250. package/Sources/SwiftUI/API/ContentShape.swift +33 -0
  251. package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
  252. package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
  253. package/Sources/SwiftUI/API/Controls.swift +300 -0
  254. package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
  255. package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
  256. package/Sources/SwiftUI/API/Decorations.swift +92 -0
  257. package/Sources/SwiftUI/API/EditMode.swift +212 -0
  258. package/Sources/SwiftUI/API/Effects.swift +388 -0
  259. package/Sources/SwiftUI/API/Entry.swift +8 -0
  260. package/Sources/SwiftUI/API/Environment.swift +439 -0
  261. package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
  262. package/Sources/SwiftUI/API/Focus.swift +137 -0
  263. package/Sources/SwiftUI/API/Font.swift +131 -0
  264. package/Sources/SwiftUI/API/Gauge.swift +290 -0
  265. package/Sources/SwiftUI/API/Geometry.swift +89 -0
  266. package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
  267. package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
  268. package/Sources/SwiftUI/API/GestureState.swift +65 -0
  269. package/Sources/SwiftUI/API/Gestures.swift +342 -0
  270. package/Sources/SwiftUI/API/Glass.swift +127 -0
  271. package/Sources/SwiftUI/API/Grid.swift +188 -0
  272. package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
  273. package/Sources/SwiftUI/API/KeyPress.swift +54 -0
  274. package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
  275. package/Sources/SwiftUI/API/Layout.swift +220 -0
  276. package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
  277. package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
  278. package/Sources/SwiftUI/API/Lists.swift +331 -0
  279. package/Sources/SwiftUI/API/Menu.swift +58 -0
  280. package/Sources/SwiftUI/API/Modifiers.swift +313 -0
  281. package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
  282. package/Sources/SwiftUI/API/Namespace.swift +44 -0
  283. package/Sources/SwiftUI/API/Navigation.swift +386 -0
  284. package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
  285. package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
  286. package/Sources/SwiftUI/API/OnChange.swift +48 -0
  287. package/Sources/SwiftUI/API/Path.swift +543 -0
  288. package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
  289. package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
  290. package/Sources/SwiftUI/API/Picker.swift +185 -0
  291. package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
  292. package/Sources/SwiftUI/API/Popover.swift +41 -0
  293. package/Sources/SwiftUI/API/Preferences.swift +262 -0
  294. package/Sources/SwiftUI/API/Presentation.swift +122 -0
  295. package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
  296. package/Sources/SwiftUI/API/Primitives.swift +517 -0
  297. package/Sources/SwiftUI/API/Publishers.swift +107 -0
  298. package/Sources/SwiftUI/API/Redaction.swift +75 -0
  299. package/Sources/SwiftUI/API/RowActions.swift +84 -0
  300. package/Sources/SwiftUI/API/Scenes.swift +131 -0
  301. package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
  302. package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
  303. package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
  304. package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
  305. package/Sources/SwiftUI/API/Shape.swift +214 -0
  306. package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
  307. package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
  308. package/Sources/SwiftUI/API/Sharing.swift +193 -0
  309. package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
  310. package/Sources/SwiftUI/API/State.swift +144 -0
  311. package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
  312. package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
  313. package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
  314. package/Sources/SwiftUI/API/TabContent.swift +841 -0
  315. package/Sources/SwiftUI/API/Table.swift +382 -0
  316. package/Sources/SwiftUI/API/Tabs.swift +263 -0
  317. package/Sources/SwiftUI/API/Tasks.swift +35 -0
  318. package/Sources/SwiftUI/API/Text.swift +386 -0
  319. package/Sources/SwiftUI/API/TextDates.swift +61 -0
  320. package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
  321. package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
  322. package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
  323. package/Sources/SwiftUI/API/Timeline.swift +212 -0
  324. package/Sources/SwiftUI/API/Toolbar.swift +251 -0
  325. package/Sources/SwiftUI/API/Transfer.swift +145 -0
  326. package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
  327. package/Sources/SwiftUI/API/Video.swift +64 -0
  328. package/Sources/SwiftUI/API/View.swift +215 -0
  329. package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
  330. package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
  331. package/Sources/SwiftUI/API/Windows.swift +25 -0
  332. package/Sources/SwiftUI/Charts/Axis.swift +325 -0
  333. package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
  334. package/Sources/SwiftUI/Charts/Chart.swift +660 -0
  335. package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
  336. package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
  337. package/Sources/SwiftUI/Charts/Marks.swift +204 -0
  338. package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
  339. package/Sources/SwiftUI/Charts/Scales.swift +326 -0
  340. package/Sources/SwiftUI/Localization/Localization.swift +498 -0
  341. package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
  342. package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
  343. package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
  344. package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
  345. package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
  346. package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
  347. package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
  348. package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
  349. package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
  350. package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
  351. package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
  352. package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
  353. package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
  354. package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
  355. package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
  356. package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
  357. package/Sources/Symbols/Symbols.swift +25 -0
  358. package/Sources/Translation/Translation.swift +423 -0
  359. package/Sources/UIKit/Activity.swift +213 -0
  360. package/Sources/UIKit/Alerts.swift +69 -0
  361. package/Sources/UIKit/AppDelegate.swift +222 -0
  362. package/Sources/UIKit/Appearance.swift +84 -0
  363. package/Sources/UIKit/ColorConversions.swift +70 -0
  364. package/Sources/UIKit/Controls.swift +225 -0
  365. package/Sources/UIKit/Device.swift +200 -0
  366. package/Sources/UIKit/Feedback.swift +65 -0
  367. package/Sources/UIKit/Font.swift +307 -0
  368. package/Sources/UIKit/Graphics.swift +204 -0
  369. package/Sources/UIKit/HostingController.swift +185 -0
  370. package/Sources/UIKit/Identity.swift +24 -0
  371. package/Sources/UIKit/Introspectable.swift +510 -0
  372. package/Sources/UIKit/Pasteboard.swift +363 -0
  373. package/Sources/UIKit/PhotoAlbum.swift +81 -0
  374. package/Sources/UIKit/RemoteNotifications.swift +15 -0
  375. package/Sources/UIKit/Representable.swift +288 -0
  376. package/Sources/UIKit/SafeArea.swift +12 -0
  377. package/Sources/UIKit/SceneDelegates.swift +132 -0
  378. package/Sources/UIKit/Scenes.swift +40 -0
  379. package/Sources/UIKit/ScrollView.swift +157 -0
  380. package/Sources/UIKit/ShortcutItems.swift +67 -0
  381. package/Sources/UIKit/SymbolConfiguration.swift +124 -0
  382. package/Sources/UIKit/TargetAction.swift +123 -0
  383. package/Sources/UIKit/TextPaste.swift +161 -0
  384. package/Sources/UIKit/TextView.swift +538 -0
  385. package/Sources/UIKit/UIKit.swift +292 -0
  386. package/Sources/UIKit/UIView.swift +855 -0
  387. package/Sources/UIKit/ViewTranslation.swift +311 -0
  388. package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
  389. package/Sources/UserNotifications/Content.swift +370 -0
  390. package/Sources/UserNotifications/NotificationCenter.swift +309 -0
  391. package/Sources/WeatherKit/WeatherKit.swift +228 -0
  392. package/Sources/WebKit/WebKit.swift +245 -0
  393. package/Sources/os/os.swift +376 -0
  394. package/Sources/zlib/zlib.swift +6 -0
  395. package/index.d.ts +2 -0
  396. package/index.mjs +16 -0
  397. package/manifest.d.mts +2 -0
  398. package/manifest.mjs +39 -0
  399. package/package.json +30 -4
  400. package/sync-sources.mjs +33 -0
@@ -0,0 +1,257 @@
1
+ // `import AuthenticationServices` for the browser: signing in through a web
2
+ // page that redirects back to the app. On iOS, `ASWebAuthenticationSession`
3
+ // (and SwiftUI's `WebAuthenticationSession` over it) shows the provider's
4
+ // page in a Safari sheet and catches the redirect to the app's URL scheme
5
+ // (`myapp://?code=…`). A web page can do neither, so:
6
+ //
7
+ // 1. The page opens the provider's page in a popup window (a `webAuth` host
8
+ // request). When the browser blocks the popup (it only allows one shortly
9
+ // after a tap), the page asks the viewer to continue, and opens it from
10
+ // that click.
11
+ // 2. The provider redirects the window to the page's own callback page, not
12
+ // to `myapp://`: the shim swaps the app's scheme for that page in OAuth
13
+ // redirect parameters, in this authorize URL and in the app's URLSession
14
+ // requests alike (FoundationBridge's WebAuthRedirects.swift).
15
+ // 3. The callback page hands its URL to the app's page, which answers the
16
+ // request with it and closes the window. The session rebuilds
17
+ // `myapp://?code=…` from it, and the app gets what it gets on iOS.
18
+ //
19
+ // Closing the window is the viewer cancelling:
20
+ // `ASWebAuthenticationSessionError.canceledLogin`. A popup shares the
21
+ // browser's cookies, so an ephemeral session is not ephemeral; a page cannot
22
+ // add headers to a window's navigation, so `additionalHeaderFields` are not
23
+ // sent; a callback to an `https` host (`Callback.https`) cannot be caught.
24
+ // Passkeys and saved passwords compile but find no credential
25
+ // (Authorization.swift); Sign in with Apple and the rest of the framework are
26
+ // not here (docs/ops-protocol.md, "Signing in").
27
+
28
+ import Foundation
29
+ import FoundationBridge
30
+ import SwiftUI
31
+ import UIKit
32
+
33
+ public let ASWebAuthenticationSessionErrorDomain = "com.apple.AuthenticationServices.WebAuthenticationSession"
34
+
35
+ /// Why a web authentication session ended without a callback, with Apple's codes.
36
+ public struct ASWebAuthenticationSessionError: Error, Hashable, Sendable, CustomNSError {
37
+ public enum Code: Int, Sendable {
38
+ /// The viewer closed the sign-in window (or no page could ask them).
39
+ case canceledLogin = 1
40
+ case presentationContextNotProvided = 2
41
+ /// The page could not open the sign-in window.
42
+ case presentationContextInvalid = 3
43
+ }
44
+
45
+ public let code: Code
46
+ public init(_ code: Code) { self.code = code }
47
+
48
+ public static let canceledLogin = Code.canceledLogin
49
+ public static let presentationContextNotProvided = Code.presentationContextNotProvided
50
+ public static let presentationContextInvalid = Code.presentationContextInvalid
51
+
52
+ public static var errorDomain: String { ASWebAuthenticationSessionErrorDomain }
53
+ public var errorCode: Int { code.rawValue }
54
+ public var errorUserInfo: [String: Any] { [:] }
55
+ }
56
+
57
+ /// `catch ASWebAuthenticationSessionError.canceledLogin`, as with an imported error.
58
+ public func ~= (code: ASWebAuthenticationSessionError.Code, error: any Error) -> Bool {
59
+ (error as? ASWebAuthenticationSessionError)?.code == code
60
+ }
61
+
62
+ /// What a session presents over on iOS; the page needs none.
63
+ public typealias ASPresentationAnchor = UIWindow
64
+
65
+ /// Supplies the window a session presents over. The browser opens its own
66
+ /// window, so the anchor is never asked for.
67
+ public protocol ASWebAuthenticationPresentationContextProviding: AnyObject {
68
+ @MainActor func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor
69
+ }
70
+
71
+ /// A sign-in through the provider's web page, in a popup window (see the top of this file).
72
+ open class ASWebAuthenticationSession: NSObject {
73
+ public typealias CompletionHandler = (URL?, (any Error)?) -> Void
74
+
75
+ /// How the provider's redirect is recognized as the end of the sign-in.
76
+ public struct Callback: Sendable {
77
+ enum Kind: Sendable, Equatable { case scheme(String), https(host: String, path: String) }
78
+ let kind: Kind
79
+
80
+ /// A redirect to `scheme:`, which the page receives at its callback page.
81
+ public static func customScheme(_ customScheme: String) -> Callback { Callback(kind: .scheme(customScheme)) }
82
+ /// A redirect to an `https` URL on the app's own domain. Another site's
83
+ /// window cannot be read, so the browser never sees it arrive.
84
+ public static func https(host: String, path: String) -> Callback { Callback(kind: .https(host: host, path: path)) }
85
+
86
+ public func matchesURL(_ url: URL) -> Bool {
87
+ switch kind {
88
+ case .scheme(let scheme): url.scheme?.lowercased() == scheme.lowercased()
89
+ case .https(let host, let path): url.scheme?.lowercased() == "https" && url.host?.lowercased() == host.lowercased() && url.path == path
90
+ }
91
+ }
92
+
93
+ var scheme: String? { if case .scheme(let scheme) = kind { scheme } else { nil } }
94
+ }
95
+
96
+ let url: URL
97
+ let callback: Callback?
98
+ let completionHandler: CompletionHandler
99
+
100
+ /// Asked for an anchor on iOS; never consulted in the browser.
101
+ open weak var presentationContextProvider: (any ASWebAuthenticationPresentationContextProviding)?
102
+ /// Kept; a popup shares the browser's cookies whatever it says.
103
+ open var prefersEphemeralWebBrowserSession = false
104
+ /// Kept; a page cannot add headers to a window's navigation.
105
+ open var additionalHeaderFields: [String: String]?
106
+
107
+ private var started = false
108
+ private var finished = false
109
+
110
+ public init(url URL: URL, callbackURLScheme: String?, completionHandler: @escaping CompletionHandler) {
111
+ self.url = URL
112
+ self.callback = callbackURLScheme.map { Callback.customScheme($0) }
113
+ self.completionHandler = completionHandler
114
+ }
115
+
116
+ public init(url URL: URL, callback: Callback, completionHandler: @escaping CompletionHandler) {
117
+ self.url = URL
118
+ self.callback = callback
119
+ self.completionHandler = completionHandler
120
+ }
121
+
122
+ /// Whether `start()` would start: once per session.
123
+ open var canStart: Bool { !started }
124
+
125
+ /// Asks the page to open the sign-in window. The completion handler runs
126
+ /// on the main actor with the app's callback URL, or an error. False when
127
+ /// the session has started already or the URL is not a web page.
128
+ @MainActor @discardableResult
129
+ open func start() -> Bool {
130
+ guard !started, let scheme = url.scheme?.lowercased(), scheme == "http" || scheme == "https" else { return false }
131
+ started = true
132
+ let url = url, callback = callback, ephemeral = prefersEphemeralWebBrowserSession
133
+ Task { @MainActor in
134
+ do {
135
+ let result = try await _WebAuthPage.authenticate(url: url, callbackScheme: callback?.scheme, ephemeral: ephemeral)
136
+ finish(result, nil)
137
+ } catch {
138
+ finish(nil, error)
139
+ }
140
+ }
141
+ return true
142
+ }
143
+
144
+ /// Closes the sign-in window. The completion handler is not called.
145
+ @MainActor
146
+ open func cancel() {
147
+ guard started, !finished else { return }
148
+ finished = true
149
+ _WebAuthPage.cancel()
150
+ }
151
+
152
+ @MainActor private func finish(_ url: URL?, _ error: (any Error)?) {
153
+ guard !finished else { return }
154
+ finished = true
155
+ completionHandler(url, error)
156
+ }
157
+ }
158
+
159
+ // MARK: - SwiftUI
160
+
161
+ /// SwiftUI's sign-in action (`@Environment(\.webAuthenticationSession)`):
162
+ /// `authenticate` opens the provider's page in a popup and returns the
163
+ /// app's callback URL (see the top of this file).
164
+ @MainActor
165
+ public struct WebAuthenticationSession {
166
+ /// The browser session the sign-in window uses; the browser's own either way.
167
+ public struct BrowserSession: Hashable, Sendable {
168
+ let ephemeral: Bool
169
+ public static let ephemeral = BrowserSession(ephemeral: true)
170
+ public static let shared = BrowserSession(ephemeral: false)
171
+ }
172
+
173
+ nonisolated init() {}
174
+
175
+ /// Signs in at `url`; returns the provider's redirect to `callbackURLScheme`.
176
+ /// Throws `ASWebAuthenticationSessionError` (`.canceledLogin` when the
177
+ /// viewer closes the window).
178
+ public func authenticate(using url: URL, callbackURLScheme: String, preferredBrowserSession: BrowserSession? = nil) async throws -> URL {
179
+ try await _WebAuthPage.authenticate(url: url, callbackScheme: callbackURLScheme, ephemeral: preferredBrowserSession?.ephemeral ?? false)
180
+ }
181
+
182
+ /// As above; the header fields are not sent (a page cannot add headers to a window's navigation).
183
+ public func authenticate(using url: URL, callbackURLScheme: String, preferredBrowserSession: BrowserSession? = nil,
184
+ additionalHeaderFields: [String: String]) async throws -> URL {
185
+ try await authenticate(using: url, callbackURLScheme: callbackURLScheme, preferredBrowserSession: preferredBrowserSession)
186
+ }
187
+
188
+ public func authenticate(using url: URL, callback: ASWebAuthenticationSession.Callback, preferredBrowserSession: BrowserSession? = nil,
189
+ additionalHeaderFields: [String: String]) async throws -> URL {
190
+ try await _WebAuthPage.authenticate(url: url, callbackScheme: callback.scheme, ephemeral: preferredBrowserSession?.ephemeral ?? false)
191
+ }
192
+ }
193
+
194
+ private struct WebAuthenticationSessionKey: EnvironmentKey {
195
+ static var defaultValue: WebAuthenticationSession { WebAuthenticationSession() }
196
+ }
197
+
198
+ extension EnvironmentValues {
199
+ /// The sign-in action: a popup window on the page.
200
+ public var webAuthenticationSession: WebAuthenticationSession {
201
+ get { self[WebAuthenticationSessionKey.self] }
202
+ }
203
+ }
204
+
205
+ // MARK: - The page
206
+
207
+ /// The `webAuth` host request both APIs send (docs/ops-protocol.md, "Signing in").
208
+ @MainActor
209
+ enum _WebAuthPage {
210
+ /// Sends a request to the page; tests replace it with a fake page.
211
+ static var transport: @MainActor (_JSON) async throws -> _JSON = { params in
212
+ try await _Runtime.shared._hostRequest(kind: "webAuth", params: params)
213
+ }
214
+
215
+ /// Opens `url` (its app-scheme redirect swapped for the callback page) in
216
+ /// the page's sign-in window and returns the app's callback URL.
217
+ static func authenticate(url: URL, callbackScheme: String?, ephemeral: Bool) async throws -> URL {
218
+ guard let scheme = url.scheme?.lowercased(), scheme == "http" || scheme == "https" else {
219
+ throw ASWebAuthenticationSessionError(.presentationContextInvalid)
220
+ }
221
+ if let callbackScheme { _WebAuthRedirects.register(scheme: callbackScheme) }
222
+ var params: [String: _JSON] = [
223
+ "action": .string("start"),
224
+ "url": .string(_WebAuthRedirects.rewriting(url: url).absoluteString),
225
+ "callbackPage": .string(_WebAuthRedirects.callbackPage),
226
+ ]
227
+ if let callbackScheme { params["callbackScheme"] = .string(callbackScheme) }
228
+ if ephemeral { params["ephemeral"] = .bool(true) }
229
+ let value: _JSON
230
+ do {
231
+ value = try await withTaskCancellationHandler {
232
+ try await transport(.object(params))
233
+ } onCancel: {
234
+ Task { @MainActor in cancel() }
235
+ }
236
+ } catch let failure as _HostRequestError {
237
+ throw error(from: failure.message)
238
+ }
239
+ guard case .object(let fields) = value, case .string(let received)? = fields["url"],
240
+ let result = URL(string: _WebAuthRedirects.appURL(fromCallback: received) ?? received)
241
+ else { throw ASWebAuthenticationSessionError(.presentationContextInvalid) }
242
+ return result
243
+ }
244
+
245
+ /// Asks the page to close the sign-in window; the pending `authenticate` fails as cancelled.
246
+ static func cancel() {
247
+ Task { @MainActor in _ = try? await transport(.object(["action": .string("cancel")])) }
248
+ }
249
+
250
+ /// The page reports a closed window (or a dismissed prompt) as `cancelled: …`;
251
+ /// headless runs without a fixture as `headless: …`, which is the same to the app.
252
+ static func error(from message: String) -> ASWebAuthenticationSessionError {
253
+ let lowered = message.lowercased()
254
+ if lowered.hasPrefix("cancel") || lowered.hasPrefix("headless") { return ASWebAuthenticationSessionError(.canceledLogin) }
255
+ return ASWebAuthenticationSessionError(.presentationContextInvalid)
256
+ }
257
+ }
@@ -0,0 +1,251 @@
1
+ // Passkeys and saved passwords (`ASAuthorizationController`, and SwiftUI's
2
+ // `AuthorizationController` over it), so an app that offers them compiles
3
+ // and runs. In a browser a passkey is WebAuthn, which only answers for the
4
+ // page's own domain; an app's relying party (`example.com` in Apple's Food
5
+ // Truck) is another site, so no request can succeed. Every request ends in
6
+ // `ASAuthorizationError.notHandled`, as on a device with no credential to
7
+ // offer: the app's own sign-up (a password form, say) is the way in
8
+ // (docs/ops-protocol.md, "Signing in").
9
+
10
+ import Foundation
11
+ import SwiftUI
12
+
13
+ public let ASAuthorizationErrorDomain = "com.apple.AuthenticationServices.AuthorizationError"
14
+
15
+ /// Why an authorization failed, with Apple's codes.
16
+ public struct ASAuthorizationError: Error, Hashable, Sendable, CustomNSError, LocalizedError {
17
+ public enum Code: Int, Sendable {
18
+ case unknown = 1000
19
+ case canceled = 1001
20
+ case invalidResponse = 1002
21
+ /// No credential provider handled the requests: always, in the browser.
22
+ case notHandled = 1003
23
+ case failed = 1004
24
+ case notInteractive = 1005
25
+ case matchedExcludedCredential = 1006
26
+ }
27
+
28
+ public let code: Code
29
+ public init(_ code: Code) { self.code = code }
30
+
31
+ public static let unknown = Code.unknown
32
+ public static let canceled = Code.canceled
33
+ public static let invalidResponse = Code.invalidResponse
34
+ public static let notHandled = Code.notHandled
35
+ public static let failed = Code.failed
36
+ public static let notInteractive = Code.notInteractive
37
+ public static let matchedExcludedCredential = Code.matchedExcludedCredential
38
+
39
+ public static var errorDomain: String { ASAuthorizationErrorDomain }
40
+ public var errorCode: Int { code.rawValue }
41
+ public var errorUserInfo: [String: Any] { [:] }
42
+ public var errorDescription: String? {
43
+ code == .notHandled ? "No passkey or saved password is available in the browser." : "The authorization failed (\(code.rawValue))."
44
+ }
45
+ }
46
+
47
+ /// `catch ASAuthorizationError.canceled`, as with an imported error.
48
+ public func ~= (code: ASAuthorizationError.Code, error: any Error) -> Bool {
49
+ (error as? ASAuthorizationError)?.code == code
50
+ }
51
+
52
+ /// A request for a credential, made by a provider.
53
+ open class ASAuthorizationRequest: NSObject, @unchecked Sendable {
54
+ public let provider: any ASAuthorizationProvider
55
+ init(provider: any ASAuthorizationProvider) { self.provider = provider }
56
+ }
57
+
58
+ public protocol ASAuthorizationProvider: NSObjectProtocol {}
59
+
60
+ /// Requests for passkeys of a relying party.
61
+ open class ASAuthorizationPlatformPublicKeyCredentialProvider: NSObject, ASAuthorizationProvider, @unchecked Sendable {
62
+ public let relyingPartyIdentifier: String
63
+ public init(relyingPartyIdentifier: String) { self.relyingPartyIdentifier = relyingPartyIdentifier }
64
+
65
+ open func createCredentialAssertionRequest(challenge: Data) -> ASAuthorizationPlatformPublicKeyCredentialAssertionRequest {
66
+ ASAuthorizationPlatformPublicKeyCredentialAssertionRequest(provider: self, challenge: challenge)
67
+ }
68
+
69
+ open func createCredentialRegistrationRequest(challenge: Data, name: String, userID: Data) -> ASAuthorizationPlatformPublicKeyCredentialRegistrationRequest {
70
+ ASAuthorizationPlatformPublicKeyCredentialRegistrationRequest(provider: self, challenge: challenge, name: name, userID: userID)
71
+ }
72
+ }
73
+
74
+ open class ASAuthorizationPlatformPublicKeyCredentialAssertionRequest: ASAuthorizationRequest, @unchecked Sendable {
75
+ public var challenge: Data
76
+ public var relyingPartyIdentifier: String
77
+ init(provider: ASAuthorizationPlatformPublicKeyCredentialProvider, challenge: Data) {
78
+ self.challenge = challenge
79
+ self.relyingPartyIdentifier = provider.relyingPartyIdentifier
80
+ super.init(provider: provider)
81
+ }
82
+ }
83
+
84
+ open class ASAuthorizationPlatformPublicKeyCredentialRegistrationRequest: ASAuthorizationRequest, @unchecked Sendable {
85
+ public var challenge: Data
86
+ public var relyingPartyIdentifier: String
87
+ public var name: String
88
+ public var userID: Data
89
+ init(provider: ASAuthorizationPlatformPublicKeyCredentialProvider, challenge: Data, name: String, userID: Data) {
90
+ self.challenge = challenge
91
+ self.relyingPartyIdentifier = provider.relyingPartyIdentifier
92
+ self.name = name
93
+ self.userID = userID
94
+ super.init(provider: provider)
95
+ }
96
+ }
97
+
98
+ /// Requests for a saved password.
99
+ open class ASAuthorizationPasswordProvider: NSObject, ASAuthorizationProvider, @unchecked Sendable {
100
+ override public init() {}
101
+ open func createRequest() -> ASAuthorizationPasswordRequest { ASAuthorizationPasswordRequest(provider: self) }
102
+ }
103
+
104
+ open class ASAuthorizationPasswordRequest: ASAuthorizationRequest, @unchecked Sendable {}
105
+
106
+ public protocol ASAuthorizationCredential: NSObjectProtocol, Sendable {}
107
+
108
+ /// A saved password.
109
+ open class ASPasswordCredential: NSObject, ASAuthorizationCredential, @unchecked Sendable {
110
+ public let user: String
111
+ public let password: String
112
+ public init(user: String, password: String) {
113
+ self.user = user
114
+ self.password = password
115
+ }
116
+ }
117
+
118
+ /// A passkey sign-in.
119
+ open class ASAuthorizationPlatformPublicKeyCredentialAssertion: NSObject, ASAuthorizationCredential, @unchecked Sendable {
120
+ public let userID: Data
121
+ public let credentialID: Data
122
+ public let rawClientDataJSON: Data
123
+ public let rawAuthenticatorData: Data
124
+ public let signature: Data
125
+ init(userID: Data, credentialID: Data, rawClientDataJSON: Data, rawAuthenticatorData: Data, signature: Data) {
126
+ self.userID = userID
127
+ self.credentialID = credentialID
128
+ self.rawClientDataJSON = rawClientDataJSON
129
+ self.rawAuthenticatorData = rawAuthenticatorData
130
+ self.signature = signature
131
+ }
132
+ }
133
+
134
+ /// A new passkey.
135
+ open class ASAuthorizationPlatformPublicKeyCredentialRegistration: NSObject, ASAuthorizationCredential, @unchecked Sendable {
136
+ public let credentialID: Data
137
+ public let rawClientDataJSON: Data
138
+ public let rawAttestationObject: Data?
139
+ init(credentialID: Data, rawClientDataJSON: Data, rawAttestationObject: Data?) {
140
+ self.credentialID = credentialID
141
+ self.rawClientDataJSON = rawClientDataJSON
142
+ self.rawAttestationObject = rawAttestationObject
143
+ }
144
+ }
145
+
146
+ /// A way of signing in the app handles itself (`ASAuthorizationController.customAuthorizationMethods`).
147
+ public struct ASAuthorizationCustomMethod: RawRepresentable, Hashable, Sendable {
148
+ public let rawValue: String
149
+ public init(rawValue: String) { self.rawValue = rawValue }
150
+ public init(_ rawValue: String) { self.rawValue = rawValue }
151
+ public static let videoSubscriberAccount = ASAuthorizationCustomMethod("ASAuthorizationCustomMethodVideoSubscriberAccount")
152
+ public static let restorePurchase = ASAuthorizationCustomMethod("ASAuthorizationCustomMethodRestorePurchase")
153
+ public static let other = ASAuthorizationCustomMethod("ASAuthorizationCustomMethodOther")
154
+ }
155
+
156
+ /// What an `AuthorizationController` request ended with.
157
+ public enum ASAuthorizationResult: Sendable {
158
+ case password(ASPasswordCredential)
159
+ case passkeyAssertion(ASAuthorizationPlatformPublicKeyCredentialAssertion)
160
+ case passkeyRegistration(ASAuthorizationPlatformPublicKeyCredentialRegistration)
161
+ case customMethod(ASAuthorizationCustomMethod)
162
+ }
163
+
164
+ /// A finished authorization: the credential and the provider that gave it.
165
+ open class ASAuthorization: NSObject, @unchecked Sendable {
166
+ public let provider: any ASAuthorizationProvider
167
+ public let credential: any ASAuthorizationCredential
168
+ init(provider: any ASAuthorizationProvider, credential: any ASAuthorizationCredential) {
169
+ self.provider = provider
170
+ self.credential = credential
171
+ }
172
+ }
173
+
174
+ public protocol ASAuthorizationControllerDelegate: NSObjectProtocol {
175
+ @MainActor func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization)
176
+ @MainActor func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: any Error)
177
+ }
178
+
179
+ extension ASAuthorizationControllerDelegate {
180
+ public func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {}
181
+ public func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: any Error) {}
182
+ }
183
+
184
+ public protocol ASAuthorizationControllerPresentationContextProviding: NSObjectProtocol {
185
+ @MainActor func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor
186
+ }
187
+
188
+ /// Runs authorization requests; in the browser each run fails with
189
+ /// `.notHandled` (see the top of this file).
190
+ @MainActor
191
+ open class ASAuthorizationController: NSObject {
192
+ /// How requests are shown: `.preferImmediatelyAvailableCredentials`
193
+ /// fails at once when there is nothing to offer, as here.
194
+ public struct RequestOptions: OptionSet, Sendable {
195
+ public let rawValue: UInt
196
+ public init(rawValue: UInt) { self.rawValue = rawValue }
197
+ public static let preferImmediatelyAvailableCredentials = RequestOptions(rawValue: 1 << 0)
198
+ }
199
+
200
+ public let authorizationRequests: [ASAuthorizationRequest]
201
+ public weak var delegate: (any ASAuthorizationControllerDelegate)?
202
+ public weak var presentationContextProvider: (any ASAuthorizationControllerPresentationContextProviding)?
203
+ public var customAuthorizationMethods: [ASAuthorizationCustomMethod] = []
204
+
205
+ public init(authorizationRequests: [ASAuthorizationRequest]) {
206
+ self.authorizationRequests = authorizationRequests
207
+ }
208
+
209
+ open func performRequests() { finish() }
210
+ open func performRequests(options: RequestOptions) { finish() }
211
+ open func performAutoFillAssistedRequests() {}
212
+ open func cancel() {
213
+ delegate?.authorizationController(controller: self, didCompleteWithError: ASAuthorizationError(.canceled))
214
+ }
215
+
216
+ private func finish() {
217
+ // Asynchronously, as the system sheet would answer.
218
+ Task { @MainActor in
219
+ delegate?.authorizationController(controller: self, didCompleteWithError: ASAuthorizationError(.notHandled))
220
+ }
221
+ }
222
+ }
223
+
224
+ /// SwiftUI's async front for `ASAuthorizationController`
225
+ /// (`@Environment(\.authorizationController)`).
226
+ public struct AuthorizationController: Sendable {
227
+ public init() {}
228
+
229
+ @MainActor public func performRequests(_ requests: [ASAuthorizationRequest], options: ASAuthorizationController.RequestOptions = []) async throws -> ASAuthorizationResult {
230
+ throw ASAuthorizationError(.notHandled)
231
+ }
232
+
233
+ @MainActor public func performRequest(_ request: ASAuthorizationRequest, options: ASAuthorizationController.RequestOptions = []) async throws -> ASAuthorizationResult {
234
+ throw ASAuthorizationError(.notHandled)
235
+ }
236
+
237
+ @MainActor public func performAutoFillAssistedRequests(_ requests: [ASAuthorizationRequest]) async throws -> ASAuthorizationResult {
238
+ throw ASAuthorizationError(.notHandled)
239
+ }
240
+ }
241
+
242
+ private struct AuthorizationControllerKey: EnvironmentKey {
243
+ static let defaultValue = AuthorizationController()
244
+ }
245
+
246
+ extension EnvironmentValues {
247
+ public var authorizationController: AuthorizationController {
248
+ get { self[AuthorizationControllerKey.self] }
249
+ set { self[AuthorizationControllerKey.self] = newValue }
250
+ }
251
+ }
@@ -0,0 +1,61 @@
1
+ // Swift Charts for SwiftBrowser. The marks, axes and `Chart` itself are
2
+ // defined in the SwiftUI target (Sources/SwiftUI/Charts); this module
3
+ // re-exports them and adds the pieces that need Foundation's `Date` and
4
+ // `Calendar`. See docs/ops-protocol.md, "Phase 7".
5
+
6
+ @_exported import SwiftUI
7
+
8
+ import Foundation
9
+
10
+ /// Dates plot as seconds since 1970; the chart treats them as UTC
11
+ /// (`Calendar.current` is UTC in the browser).
12
+ extension Date: Plottable {
13
+ public var _plottableValue: _PlottableValue { .date(timeIntervalSince1970) }
14
+
15
+ public init?(_plottableValue value: _PlottableValue) {
16
+ guard case .date(let seconds) = value else { return nil }
17
+ self.init(timeIntervalSince1970: seconds)
18
+ }
19
+ }
20
+
21
+ /// Calendar bins over a date range: `DateBins(unit: .hour, by: 3, range:)`.
22
+ /// `thresholds` are the bin boundaries, from the range's start (aligned to
23
+ /// `unit`) in steps of `by` units up to and including the first boundary at or
24
+ /// after the range's end.
25
+ public struct DateBins: Sendable {
26
+ public let unit: Calendar.Component
27
+ public let stride: Int
28
+ public let range: ClosedRange<Date>
29
+ public let thresholds: [Date]
30
+
31
+ public init(unit: Calendar.Component, by stride: Int = 1, range: ClosedRange<Date>,
32
+ calendar: Calendar = .current) {
33
+ self.unit = unit
34
+ self.stride = max(1, stride)
35
+ self.range = range
36
+ var thresholds: [Date] = []
37
+ var date = calendar.dateInterval(of: unit, for: range.lowerBound)?.start ?? range.lowerBound
38
+ while thresholds.count < 10_000 {
39
+ thresholds.append(date)
40
+ if date >= range.upperBound { break }
41
+ guard let next = calendar.date(byAdding: unit, value: self.stride, to: date), next > date else { break }
42
+ date = next
43
+ }
44
+ self.thresholds = thresholds
45
+ }
46
+
47
+ /// Bins over the dates' span.
48
+ public init(unit: Calendar.Component, by stride: Int = 1, dates: [Date], calendar: Calendar = .current) {
49
+ let lower = dates.min() ?? Date(timeIntervalSince1970: 0)
50
+ let upper = dates.max() ?? lower
51
+ self.init(unit: unit, by: stride, range: lower...upper, calendar: calendar)
52
+ }
53
+
54
+ /// The bin a date falls in (an index into `thresholds`), clamped to the bins.
55
+ public func index(for date: Date) -> Int {
56
+ let bins = max(thresholds.count - 1, 1)
57
+ var index = 0
58
+ for (i, threshold) in thresholds.enumerated() where date >= threshold { index = i }
59
+ return min(index, bins - 1)
60
+ }
61
+ }
@@ -0,0 +1,65 @@
1
+ //
2
+ // AnyCancellable.swift
3
+ //
4
+ //
5
+ // Created by Sergej Jaskiewicz on 26.06.2019.
6
+ //
7
+
8
+ /// A type-erasing cancellable object that executes a provided closure when canceled.
9
+ ///
10
+ /// Subscriber implementations can use this type to provide a “cancellation token” that
11
+ /// makes it possible for a caller to cancel a publisher, but not to use the
12
+ /// `Subscription` object to request items.
13
+ ///
14
+ /// An `AnyCancellable` instance automatically calls `cancel()` when deinitialized.
15
+ public final class AnyCancellable: Cancellable, Hashable {
16
+
17
+ private var _cancel: (() -> Void)?
18
+
19
+ /// Initializes the cancellable object with the given cancel-time closure.
20
+ ///
21
+ /// - Parameter cancel: A closure that the `cancel()` method executes.
22
+ public init(_ cancel: @escaping () -> Void) {
23
+ _cancel = cancel
24
+ }
25
+
26
+ public init<OtherCancellable: Cancellable>(_ canceller: OtherCancellable) {
27
+ _cancel = canceller.cancel
28
+ }
29
+
30
+ public func cancel() {
31
+ _cancel?()
32
+ _cancel = nil
33
+ }
34
+
35
+ public static func == (lhs: AnyCancellable, rhs: AnyCancellable) -> Bool {
36
+ return ObjectIdentifier(lhs) == ObjectIdentifier(rhs)
37
+ }
38
+
39
+ public func hash(into hasher: inout Hasher) {
40
+ hasher.combine(ObjectIdentifier(self))
41
+ }
42
+
43
+ deinit {
44
+ _cancel?()
45
+ }
46
+ }
47
+
48
+ extension AnyCancellable {
49
+
50
+ /// Stores this type-erasing cancellable instance in the specified collection.
51
+ ///
52
+ /// - Parameter collection: The collection in which to store this `AnyCancellable`.
53
+ public func store<Cancellables: RangeReplaceableCollection>(
54
+ in collection: inout Cancellables
55
+ ) where Cancellables.Element == AnyCancellable {
56
+ collection.append(self)
57
+ }
58
+
59
+ /// Stores this type-erasing cancellable instance in the specified collection.
60
+ ///
61
+ /// - Parameter collection: The collection in which to store this `AnyCancellable`.
62
+ public func store(in set: inout Set<AnyCancellable>) {
63
+ set.insert(self)
64
+ }
65
+ }