@swiftbrowser/swift 0.1.0 → 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.
- package/Package.swift +200 -9
- package/README.md +7 -9
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +0 -4
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +24 -72
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +104 -28
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +105 -7
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Toolbar.swift +52 -16
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -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
|
+
}
|
|
@@ -5,11 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
@_exported import SwiftUI
|
|
7
7
|
|
|
8
|
-
#if canImport(FoundationEssentials)
|
|
9
|
-
import FoundationEssentials
|
|
10
|
-
#else
|
|
11
8
|
import Foundation
|
|
12
|
-
#endif
|
|
13
9
|
|
|
14
10
|
/// Dates plot as seconds since 1970; the chart treats them as UTC
|
|
15
11
|
/// (`Calendar.current` is UTC in the browser).
|
|
@@ -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
|
+
}
|