@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.
- package/Package.swift +214 -0
- package/README.md +10 -2
- 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 +61 -0
- 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/FoundationBridge/Bundle.swift +119 -0
- 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 +29 -0
- 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/Locale.swift +86 -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 +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- 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 +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- 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 +237 -0
- 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 +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- 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 +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- 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 +409 -0
- 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 +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -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 +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- 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/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- 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 +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- 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 +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Key-value observation (`object.observe(\.property) { object, change in }`)
|
|
2
|
+
// without the Objective-C runtime. On Apple platforms a setter of an
|
|
3
|
+
// `@objc dynamic` property tells its observers; corelibs Foundation has no
|
|
4
|
+
// KVO at all, and its classes' setters (`Progress.completedUnitCount`) are out
|
|
5
|
+
// of reach. So an observation polls: once per frame (1/60 s, on the
|
|
6
|
+
// executor's clock, so headless runs stay deterministic) it reads the key
|
|
7
|
+
// path on the main actor and calls the handler when the value differs from
|
|
8
|
+
// the last one it saw. That is what KVO does, a frame late at most, and
|
|
9
|
+
// changes made and undone within one frame are not seen. Values compare with
|
|
10
|
+
// `==` when they are `Equatable`, by identity when they are objects, and
|
|
11
|
+
// otherwise by their description. `.prior` is accepted; no prior
|
|
12
|
+
// notification is sent. ButtonKit follows a `Progress` this way.
|
|
13
|
+
|
|
14
|
+
import Foundation
|
|
15
|
+
import SwiftUI
|
|
16
|
+
|
|
17
|
+
/// What an observation's change carries.
|
|
18
|
+
public struct NSKeyValueObservingOptions: OptionSet, Sendable, Hashable {
|
|
19
|
+
public let rawValue: UInt
|
|
20
|
+
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
21
|
+
|
|
22
|
+
/// The change carries the new value.
|
|
23
|
+
public static let new = NSKeyValueObservingOptions(rawValue: 1 << 0)
|
|
24
|
+
/// The change carries the old value.
|
|
25
|
+
public static let old = NSKeyValueObservingOptions(rawValue: 1 << 1)
|
|
26
|
+
/// The handler is called at once with the current value.
|
|
27
|
+
public static let initial = NSKeyValueObservingOptions(rawValue: 1 << 2)
|
|
28
|
+
/// Accepted; no notification is sent before a change.
|
|
29
|
+
public static let prior = NSKeyValueObservingOptions(rawValue: 1 << 3)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// The kind of change: a polled property was always set.
|
|
33
|
+
public enum NSKeyValueChange: UInt, Sendable {
|
|
34
|
+
case setting = 1, insertion, removal, replacement
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/// A change an observation reports.
|
|
38
|
+
public struct NSKeyValueObservedChange<Value> {
|
|
39
|
+
public typealias Kind = NSKeyValueChange
|
|
40
|
+
public let kind: Kind
|
|
41
|
+
/// The value after the change, with `.new` (or `.initial`).
|
|
42
|
+
public let newValue: Value?
|
|
43
|
+
/// The value before the change, with `.old`.
|
|
44
|
+
public let oldValue: Value?
|
|
45
|
+
public let indexes: IndexSet?
|
|
46
|
+
/// Always false: no prior notification is sent.
|
|
47
|
+
public let isPrior: Bool
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// An observation in progress; it ends when invalidated or released, or
|
|
51
|
+
/// when the observed object goes away.
|
|
52
|
+
public final class NSKeyValueObservation: NSObject, @unchecked Sendable {
|
|
53
|
+
private var timer: _ExecutorTimer?
|
|
54
|
+
|
|
55
|
+
init(timer: _ExecutorTimer) {
|
|
56
|
+
self.timer = timer
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/// Stops the observation.
|
|
60
|
+
public func invalidate() {
|
|
61
|
+
timer?.invalidate()
|
|
62
|
+
timer = nil
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
deinit { timer?.invalidate() }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/// The types `observe(_:options:changeHandler:)` is offered on: every `NSObject`.
|
|
69
|
+
public protocol _KeyValueCodingAndObserving {}
|
|
70
|
+
extension NSObject: _KeyValueCodingAndObserving {}
|
|
71
|
+
|
|
72
|
+
extension _KeyValueCodingAndObserving where Self: AnyObject {
|
|
73
|
+
/// Calls `changeHandler` when the value at `keyPath` changes (seen by
|
|
74
|
+
/// polling once per frame on the main actor; see the file comment).
|
|
75
|
+
public func observe<Value>(_ keyPath: KeyPath<Self, Value>, options: NSKeyValueObservingOptions = [],
|
|
76
|
+
changeHandler: @escaping (Self, NSKeyValueObservedChange<Value>) -> Void) -> NSKeyValueObservation {
|
|
77
|
+
let poller = _KeyValuePoller(object: self, keyPath: keyPath, options: options, handler: changeHandler)
|
|
78
|
+
if options.contains(.initial) { poller.report(old: nil, new: poller.last) }
|
|
79
|
+
let timer = _ExecutorTimer(interval: 1.0 / 60, repeats: true) { timer in
|
|
80
|
+
if !poller.poll() { timer.invalidate() }
|
|
81
|
+
}
|
|
82
|
+
return NSKeyValueObservation(timer: timer)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// One observation's state: the object (held weakly), the last value seen and the handler.
|
|
87
|
+
final class _KeyValuePoller<Root: AnyObject, Value>: @unchecked Sendable {
|
|
88
|
+
weak var object: Root?
|
|
89
|
+
let keyPath: KeyPath<Root, Value>
|
|
90
|
+
let options: NSKeyValueObservingOptions
|
|
91
|
+
let handler: (Root, NSKeyValueObservedChange<Value>) -> Void
|
|
92
|
+
var last: Value
|
|
93
|
+
|
|
94
|
+
init(object: Root, keyPath: KeyPath<Root, Value>, options: NSKeyValueObservingOptions,
|
|
95
|
+
handler: @escaping (Root, NSKeyValueObservedChange<Value>) -> Void) {
|
|
96
|
+
self.object = object
|
|
97
|
+
self.keyPath = keyPath
|
|
98
|
+
self.options = options
|
|
99
|
+
self.handler = handler
|
|
100
|
+
last = object[keyPath: keyPath]
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// Reads the value and reports a change; false once the object is gone.
|
|
104
|
+
func poll() -> Bool {
|
|
105
|
+
guard let object else { return false }
|
|
106
|
+
let value = object[keyPath: keyPath]
|
|
107
|
+
if !_keyValueEqual(value, last) {
|
|
108
|
+
let old = last
|
|
109
|
+
last = value
|
|
110
|
+
report(old: old, new: value)
|
|
111
|
+
}
|
|
112
|
+
return true
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
func report(old: Value?, new: Value) {
|
|
116
|
+
guard let object else { return }
|
|
117
|
+
handler(object, NSKeyValueObservedChange(kind: .setting,
|
|
118
|
+
newValue: options.contains(.new) ? new : nil,
|
|
119
|
+
oldValue: options.contains(.old) ? old : nil,
|
|
120
|
+
indexes: nil, isPrior: false))
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// Whether two observed values are the same (see the file comment).
|
|
125
|
+
func _keyValueEqual<Value>(_ a: Value, _ b: Value) -> Bool {
|
|
126
|
+
if let a = a as? any Equatable { return a._keyValueIsEqual(to: b) }
|
|
127
|
+
if type(of: a as Any) is AnyClass {
|
|
128
|
+
return (a as AnyObject) === (b as AnyObject)
|
|
129
|
+
}
|
|
130
|
+
return String(reflecting: a) == String(reflecting: b)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
extension Equatable {
|
|
134
|
+
fileprivate func _keyValueIsEqual(to other: Any) -> Bool {
|
|
135
|
+
guard let other = other as? Self else { return false }
|
|
136
|
+
return self == other
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Opening URLs, and the text that holds them: `OpenURLAction` and
|
|
2
|
+
// `EnvironmentValues.openURL`, `Link`, and `Text(AttributedString)`. These
|
|
3
|
+
// need Foundation's `URL` and `AttributedString`, so they live here; the
|
|
4
|
+
// SwiftUI shim keeps the string-based hook a text's links call
|
|
5
|
+
// (`EnvironmentValues._openLink`, Text.swift).
|
|
6
|
+
//
|
|
7
|
+
// The system action opens the URL on the page: in a new tab (an `openURL`
|
|
8
|
+
// host request). An app that sets its own action (Ice Cubes routes mentions,
|
|
9
|
+
// hashtags and posts through one) gets every link tap first.
|
|
10
|
+
|
|
11
|
+
import Foundation
|
|
12
|
+
import SwiftUI
|
|
13
|
+
|
|
14
|
+
public struct OpenURLAction: Sendable {
|
|
15
|
+
public struct Result: Sendable {
|
|
16
|
+
enum Kind: Sendable { case handled, discarded, systemAction(URL?) }
|
|
17
|
+
let kind: Kind
|
|
18
|
+
public static let handled = Result(kind: .handled)
|
|
19
|
+
public static let discarded = Result(kind: .discarded)
|
|
20
|
+
public static let systemAction = Result(kind: .systemAction(nil))
|
|
21
|
+
public static func systemAction(_ url: URL) -> Result { Result(kind: .systemAction(url)) }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let handler: @MainActor @Sendable (URL) -> Result
|
|
25
|
+
|
|
26
|
+
public init(handler: @escaping @MainActor @Sendable (URL) -> Result) {
|
|
27
|
+
self.handler = handler
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// The page's own action: open the URL in a new tab, or hand a URL in
|
|
31
|
+
/// one of the app's own schemes to its `onOpenURL` handlers (OpenURLHandlers.swift).
|
|
32
|
+
static let system = OpenURLAction { url in
|
|
33
|
+
if _OpenURLHandlers.deliver(url) { return .handled }
|
|
34
|
+
_Runtime.shared._openLinkOnPage(url.absoluteString)
|
|
35
|
+
return .handled
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@MainActor public func callAsFunction(_ url: URL) {
|
|
39
|
+
callAsFunction(url) { _ in }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@MainActor public func callAsFunction(_ url: URL, completion: @escaping (Bool) -> Void) {
|
|
43
|
+
switch handler(url).kind {
|
|
44
|
+
case .handled: completion(true)
|
|
45
|
+
case .discarded: completion(false)
|
|
46
|
+
case .systemAction(let other):
|
|
47
|
+
_ = Self.system.handler(other ?? url)
|
|
48
|
+
completion(true)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private struct OpenURLKey: EnvironmentKey {
|
|
54
|
+
static var defaultValue: OpenURLAction? { nil }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
extension EnvironmentValues {
|
|
58
|
+
/// What opens a URL: a link in a `Text`, a `Link`, or a call. Setting it
|
|
59
|
+
/// also routes the links of the texts below to it.
|
|
60
|
+
public var openURL: OpenURLAction {
|
|
61
|
+
get { self[OpenURLKey.self] ?? .system }
|
|
62
|
+
set {
|
|
63
|
+
self[OpenURLKey.self] = newValue
|
|
64
|
+
_openLink = { string in
|
|
65
|
+
if let url = URL(string: string) { newValue(url) }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// A control that opens a URL: its label, tinted, as a button.
|
|
72
|
+
public struct Link<Label: View>: View {
|
|
73
|
+
let destination: URL
|
|
74
|
+
let label: Label
|
|
75
|
+
@Environment(\.openURL) private var openURL
|
|
76
|
+
|
|
77
|
+
public init(destination: URL, @ViewBuilder label: () -> Label) {
|
|
78
|
+
self.destination = destination
|
|
79
|
+
self.label = label()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public var body: some View {
|
|
83
|
+
let open = openURL
|
|
84
|
+
let destination = destination
|
|
85
|
+
return Button { open(destination) } label: { label }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
extension Link where Label == Text {
|
|
90
|
+
public init(_ titleKey: LocalizedStringKey, destination: URL) {
|
|
91
|
+
self.init(destination: destination) { Text(titleKey) }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@_disfavoredOverload
|
|
95
|
+
public init<S: StringProtocol>(_ title: S, destination: URL) {
|
|
96
|
+
self.init(destination: destination) { Text(title) }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
extension Text {
|
|
101
|
+
/// The attributed string's runs as styled text: Markdown's emphasis as
|
|
102
|
+
/// bold and italic, code as monospaced, strikethrough, links (which call
|
|
103
|
+
/// the environment's `openURL` when tapped), and the SwiftUI attributes
|
|
104
|
+
/// (TextAttributes.swift).
|
|
105
|
+
/// Disfavored: a string literal is a `LocalizedStringKey`, not this.
|
|
106
|
+
@_disfavoredOverload
|
|
107
|
+
public init(_ attributedContent: AttributedString) {
|
|
108
|
+
var result: Text?
|
|
109
|
+
for run in attributedContent.runs {
|
|
110
|
+
var piece = Text(verbatim: String(attributedContent[run.range].characters))
|
|
111
|
+
if let intent = run.inlinePresentationIntent {
|
|
112
|
+
if intent.contains(.stronglyEmphasized) { piece = piece.bold() }
|
|
113
|
+
if intent.contains(.emphasized) { piece = piece.italic() }
|
|
114
|
+
if intent.contains(.code) { piece = piece.monospaced() }
|
|
115
|
+
if intent.contains(.strikethrough) { piece = piece.strikethrough() }
|
|
116
|
+
}
|
|
117
|
+
if let kern = run.kern { piece = piece.kerning(kern) }
|
|
118
|
+
if let tracking = run.tracking { piece = piece.tracking(tracking) }
|
|
119
|
+
if let offset = run.baselineOffset { piece = piece.baselineOffset(offset) }
|
|
120
|
+
if let color = run.foregroundColor { piece = piece.foregroundColor(color) }
|
|
121
|
+
if let font = run.font { piece = piece.font(font) }
|
|
122
|
+
if let link = run.link { piece = piece._link(link.absoluteString) }
|
|
123
|
+
result = result.map { $0 + piece } ?? piece
|
|
124
|
+
}
|
|
125
|
+
self = result ?? Text(verbatim: "")
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// `ListFormatter`, which corelibs Foundation lacks: joins items into a
|
|
2
|
+
// phrase ("A, B, and C"). The browser build has English list patterns only,
|
|
3
|
+
// whatever the locale: "A", "A and B", "A, B, and C".
|
|
4
|
+
|
|
5
|
+
import Foundation
|
|
6
|
+
|
|
7
|
+
open class ListFormatter: Formatter, @unchecked Sendable {
|
|
8
|
+
/// Formats each item; without it, an item is its description.
|
|
9
|
+
open var itemFormatter: Formatter?
|
|
10
|
+
open var locale: Locale! = .current
|
|
11
|
+
|
|
12
|
+
/// The strings joined into a list.
|
|
13
|
+
open class func localizedString(byJoining strings: [String]) -> String {
|
|
14
|
+
switch strings.count {
|
|
15
|
+
case 0: return ""
|
|
16
|
+
case 1: return strings[0]
|
|
17
|
+
case 2: return "\(strings[0]) and \(strings[1])"
|
|
18
|
+
default: return strings.dropLast().joined(separator: ", ") + ", and " + strings[strings.count - 1]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// The items, each formatted by `itemFormatter`, joined into a list.
|
|
23
|
+
open func string(from items: [Any]) -> String? {
|
|
24
|
+
let strings = items.map { item in itemFormatter?.string(for: item) ?? String(describing: item) }
|
|
25
|
+
return Self.localizedString(byJoining: strings)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
open override func string(for obj: Any?) -> String? {
|
|
29
|
+
guard let items = obj as? [Any] else { return nil }
|
|
30
|
+
return string(from: items)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// `Locale.current` for the browser. swift-foundation has no way to set the
|
|
2
|
+
// current locale on WASI: `LocaleCache.preferences()` returns a hard-coded
|
|
3
|
+
// `en_001` (there are no CFPreferences and it does not read `LANG`), so a
|
|
4
|
+
// French user would get English formatting whatever the browser says.
|
|
5
|
+
//
|
|
6
|
+
// The CLI links full-Foundation apps with
|
|
7
|
+
// `--wrap=$s20FoundationEssentials11LocaleCacheV11preferencesAA0C11PreferencesV_SbtyF`
|
|
8
|
+
// (and the same for `Locale.preferredLanguages`), so the one call to that
|
|
9
|
+
// function, from `_currentAndCache`, lands here instead and reads the locale
|
|
10
|
+
// the host chose (`SB_LOCALE`, a BCP 47 tag among the app's shipped locales).
|
|
11
|
+
//
|
|
12
|
+
// This depends on the SDK's swift-foundation: the struct below mirrors
|
|
13
|
+
// `LocalePreferences` field for field (the non-framework build at Swift 6.4,
|
|
14
|
+
// 60 bytes on wasm32), and the method is on a class so the cache pointer rides
|
|
15
|
+
// in Swift's `self` slot like the original's. The SDK is pinned by the CLI
|
|
16
|
+
// (`SWIFT_VERSION`), and CI checks French formatting in a full-mode build, so
|
|
17
|
+
// a layout change in a future SDK shows up as a failed check, not a silent one.
|
|
18
|
+
// See docs/ops-protocol.md, "Phase 11".
|
|
19
|
+
|
|
20
|
+
#if os(WASI)
|
|
21
|
+
import Foundation
|
|
22
|
+
|
|
23
|
+
/// Mirror of `FoundationEssentials.LocalePreferences` (`package struct`, non-framework fields).
|
|
24
|
+
public struct _LocalePreferencesMirror {
|
|
25
|
+
public enum MeasurementUnit: Int { case centimeters, inches }
|
|
26
|
+
public enum TemperatureUnit: Int { case fahrenheit, celsius }
|
|
27
|
+
public enum CalendarIdentifier: Int { case gregorian }
|
|
28
|
+
public var metricUnits: Bool?
|
|
29
|
+
public var languages: [String]?
|
|
30
|
+
public var locale: String?
|
|
31
|
+
public var collationOrder: String?
|
|
32
|
+
public var firstWeekday: [CalendarIdentifier: Int]?
|
|
33
|
+
public var minDaysInFirstWeek: [CalendarIdentifier: Int]?
|
|
34
|
+
public var numberSymbols: [UInt32: String]?
|
|
35
|
+
public var country: String?
|
|
36
|
+
public var measurementUnits: MeasurementUnit?
|
|
37
|
+
public var temperatureUnit: TemperatureUnit?
|
|
38
|
+
public var force24Hour: Bool?
|
|
39
|
+
public var force12Hour: Bool?
|
|
40
|
+
public init() {}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// The locale the host asked for, as ICU (`fr_FR`) and BCP 47 (`fr-FR`) identifiers; nil when unset.
|
|
44
|
+
func _requestedLocale() -> (icu: String, bcp47: String)? {
|
|
45
|
+
guard let raw = ProcessInfo.processInfo.environment["SB_LOCALE"]?.trimmingCharacters(in: .whitespaces), !raw.isEmpty else { return nil }
|
|
46
|
+
let parts = raw.split(whereSeparator: { $0 == "-" || $0 == "_" }).map(String.init)
|
|
47
|
+
guard let language = parts.first, (2...3).contains(language.count), language.allSatisfy(\.isLetter) else { return nil }
|
|
48
|
+
var icu = [language.lowercased()]
|
|
49
|
+
var bcp = [language.lowercased()]
|
|
50
|
+
for part in parts.dropFirst() {
|
|
51
|
+
if part.count == 4, part.allSatisfy(\.isLetter) {
|
|
52
|
+
let script = part.prefix(1).uppercased() + part.dropFirst().lowercased()
|
|
53
|
+
icu.append(script); bcp.append(script)
|
|
54
|
+
} else if part.count == 2 && part.allSatisfy(\.isLetter) || part.count == 3 && part.allSatisfy(\.isNumber) {
|
|
55
|
+
icu.append(part.uppercased()); bcp.append(part.uppercased())
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return (icu.joined(separator: "_"), bcp.joined(separator: "-"))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// Stands in for the `LocaleCache` instance: Swift passes `self` in its own
|
|
62
|
+
/// slot (an explicit trailing parameter on wasm) and a class method is what
|
|
63
|
+
/// puts it there. `self` is the cache's storage and is never touched.
|
|
64
|
+
public final class _LocaleCacheHandle {
|
|
65
|
+
@_silgen_name("__wrap_$s20FoundationEssentials11LocaleCacheV11preferencesAA0C11PreferencesV_SbtyF")
|
|
66
|
+
public func _preferences() -> (_LocalePreferencesMirror, Bool) {
|
|
67
|
+
var prefs = _LocalePreferencesMirror()
|
|
68
|
+
if let locale = _requestedLocale() {
|
|
69
|
+
prefs.locale = locale.icu
|
|
70
|
+
prefs.languages = [locale.bcp47]
|
|
71
|
+
} else {
|
|
72
|
+
prefs.locale = "en_001"
|
|
73
|
+
prefs.languages = ["en-001"]
|
|
74
|
+
}
|
|
75
|
+
return (prefs, true)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// Stands in for the `Locale` metatype of the static `preferredLanguages` getter.
|
|
80
|
+
public final class _LocaleMetatypeHandle {
|
|
81
|
+
@_silgen_name("__wrap_$s20FoundationEssentials6LocaleV18preferredLanguagesSaySSGvgZ")
|
|
82
|
+
public func _preferredLanguages() -> [String] {
|
|
83
|
+
[_requestedLocale()?.bcp47 ?? "en-001"]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
#endif
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Foundation's localized-string types that Linux's and WASI's Foundation
|
|
2
|
+
// lack: `LocalizedStringResource` (what App Intents titles, `Text` and
|
|
3
|
+
// `Tab` take), `String.LocalizationValue` and `String(localized:)`.
|
|
4
|
+
//
|
|
5
|
+
// A value is a key as Xcode writes it in a string catalog (`"%lld posts"` for
|
|
6
|
+
// `"\(count) posts"`) with its arguments; `String(localized:)` looks the key
|
|
7
|
+
// up in the app's string tables and formats it (SwiftUI's
|
|
8
|
+
// Localization/Localization.swift), falling back to the default value, then
|
|
9
|
+
// to the key itself.
|
|
10
|
+
|
|
11
|
+
import Foundation
|
|
12
|
+
import SwiftUI
|
|
13
|
+
|
|
14
|
+
extension String {
|
|
15
|
+
/// A localizable string: its key, with a specifier per interpolation, and the interpolated values.
|
|
16
|
+
public struct LocalizationValue: Hashable, Sendable, Codable, ExpressibleByStringInterpolation, CustomStringConvertible {
|
|
17
|
+
/// The key, with `%%` for a literal percent sign when it has arguments.
|
|
18
|
+
let key: String
|
|
19
|
+
let arguments: [_LocalizationArgument]
|
|
20
|
+
|
|
21
|
+
public init(_ value: String) { key = value; arguments = [] }
|
|
22
|
+
public init(stringLiteral value: String) { key = value; arguments = [] }
|
|
23
|
+
public init(stringInterpolation: StringInterpolation) {
|
|
24
|
+
key = stringInterpolation.key
|
|
25
|
+
arguments = stringInterpolation.arguments
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// The text unlocalized: the key with its arguments filled in.
|
|
29
|
+
public var description: String { _Localization.formatted(key: key, arguments: arguments) }
|
|
30
|
+
|
|
31
|
+
/// Interpolations add Foundation's specifiers: `%@` for strings, `%lld` for `Int`, `%lf` for `Double`…
|
|
32
|
+
public struct StringInterpolation: StringInterpolationProtocol {
|
|
33
|
+
var key = ""
|
|
34
|
+
var arguments: [_LocalizationArgument] = []
|
|
35
|
+
public init(literalCapacity: Int, interpolationCount: Int) {}
|
|
36
|
+
|
|
37
|
+
mutating func add(_ argument: _LocalizationArgument, _ specifier: String) {
|
|
38
|
+
key += specifier
|
|
39
|
+
arguments.append(argument)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public mutating func appendLiteral(_ literal: String) { key += literal.replacingOccurrences(of: "%", with: "%%") }
|
|
43
|
+
public mutating func appendInterpolation(_ string: String) { add(.string(string), "%@") }
|
|
44
|
+
public mutating func appendInterpolation<T>(_ value: T) { add(.string(String(describing: value)), "%@") }
|
|
45
|
+
public mutating func appendInterpolation<T: _FormatSpecifiable>(_ value: T) { add(value._localizationArgument, T._specifier) }
|
|
46
|
+
public mutating func appendInterpolation<T>(_ value: T, specifier: String) {
|
|
47
|
+
add((value as? any _FormatSpecifiable)?._localizationArgument ?? .string(String(describing: value)), specifier)
|
|
48
|
+
}
|
|
49
|
+
public mutating func appendInterpolation<F: FormatStyle>(_ value: F.FormatInput, format: F) where F.FormatOutput == String {
|
|
50
|
+
add(.string(format.format(value)), "%@")
|
|
51
|
+
}
|
|
52
|
+
public mutating func appendInterpolation(_ resource: LocalizedStringResource) { add(.string(String(localized: resource)), "%@") }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public init(localized keyAndValue: String.LocalizationValue, table: String? = nil, bundle: Bundle? = nil,
|
|
57
|
+
locale: Locale = .current, comment: StaticString? = nil) {
|
|
58
|
+
self = _Localization.string(key: keyAndValue.key, arguments: keyAndValue.arguments, table: table,
|
|
59
|
+
bundlePath: (bundle ?? .main).bundlePath)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public init(localized key: StaticString, defaultValue: String.LocalizationValue, table: String? = nil,
|
|
63
|
+
bundle: Bundle? = nil, locale: Locale = .current, comment: StaticString? = nil) {
|
|
64
|
+
self = _Localization.string(key: "\(key)", arguments: defaultValue.arguments, table: table,
|
|
65
|
+
bundlePath: (bundle ?? .main).bundlePath, defaultValue: defaultValue.key)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@_disfavoredOverload
|
|
69
|
+
public init(localized resource: LocalizedStringResource) {
|
|
70
|
+
let bundlePath = switch resource.bundle {
|
|
71
|
+
case .main: Bundle.main.bundlePath
|
|
72
|
+
case .atURL(let url): url.path
|
|
73
|
+
}
|
|
74
|
+
self = _Localization.string(key: resource.key, arguments: resource.defaultValue.arguments, table: resource.table,
|
|
75
|
+
bundlePath: bundlePath, defaultValue: resource.defaultValue.key)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// A string to localize later, with where to find its translation.
|
|
80
|
+
public struct LocalizedStringResource: Hashable, Sendable, Codable, ExpressibleByStringInterpolation, CustomStringConvertible {
|
|
81
|
+
public typealias StringInterpolation = String.LocalizationValue.StringInterpolation
|
|
82
|
+
|
|
83
|
+
/// Where the translation lives. Every bundle is the app's in the browser.
|
|
84
|
+
public enum BundleDescription: Hashable, Sendable, Codable {
|
|
85
|
+
case main
|
|
86
|
+
case atURL(URL)
|
|
87
|
+
public static func forClass(_ aClass: AnyClass) -> BundleDescription { .main }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public var key: String
|
|
91
|
+
public var defaultValue: String.LocalizationValue
|
|
92
|
+
public var table: String?
|
|
93
|
+
public var locale: Locale
|
|
94
|
+
public var bundle: BundleDescription
|
|
95
|
+
|
|
96
|
+
public init(_ keyAndValue: String.LocalizationValue, table: String? = nil, locale: Locale = .current,
|
|
97
|
+
bundle: BundleDescription = .main, comment: StaticString? = nil) {
|
|
98
|
+
self.key = keyAndValue.key
|
|
99
|
+
self.defaultValue = keyAndValue
|
|
100
|
+
self.table = table
|
|
101
|
+
self.locale = locale
|
|
102
|
+
self.bundle = bundle
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public init(_ key: StaticString, defaultValue: String.LocalizationValue, table: String? = nil,
|
|
106
|
+
locale: Locale = .current, bundle: BundleDescription = .main, comment: StaticString? = nil) {
|
|
107
|
+
self.key = "\(key)"
|
|
108
|
+
self.defaultValue = defaultValue
|
|
109
|
+
self.table = table
|
|
110
|
+
self.locale = locale
|
|
111
|
+
self.bundle = bundle
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public init(stringLiteral value: String) { self.init(String.LocalizationValue(value)) }
|
|
115
|
+
public init(stringInterpolation: StringInterpolation) {
|
|
116
|
+
self.init(String.LocalizationValue(stringInterpolation: stringInterpolation))
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// The text, as `String(localized:)` resolves it.
|
|
120
|
+
public var description: String { String(localized: self) }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
extension Text {
|
|
124
|
+
@_disfavoredOverload
|
|
125
|
+
public init(_ resource: LocalizedStringResource) {
|
|
126
|
+
self.init(verbatim: String(localized: resource))
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// A key from another table (`Localizable` by default) or bundle (a package's `Bundle.module`).
|
|
130
|
+
public init(_ key: LocalizedStringKey, tableName: String?, bundle: Bundle? = nil, comment: StaticString? = nil) {
|
|
131
|
+
self.init(key, _table: tableName, bundlePath: (bundle ?? .main).bundlePath)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
public init(_ key: LocalizedStringKey, bundle: Bundle?, comment: StaticString? = nil) {
|
|
135
|
+
self.init(key, _table: nil, bundlePath: (bundle ?? .main).bundlePath)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/// A key with a comment for translators (`Text("Water", comment: "…")`).
|
|
139
|
+
public init(_ key: LocalizedStringKey, comment: StaticString?) {
|
|
140
|
+
self.init(key, _table: nil, bundlePath: Bundle.main.bundlePath)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/// `NSLocalizedString` with one of this module's bundles, which is what a
|
|
145
|
+
/// package's `Bundle.module` is in the browser build (Foundation's takes
|
|
146
|
+
/// Foundation's `Bundle`; calls without a bundle still go to it).
|
|
147
|
+
public func NSLocalizedString(_ key: String, tableName: String? = nil, bundle: Bundle, value: String = "", comment: String) -> String {
|
|
148
|
+
bundle.localizedString(forKey: key, value: value, table: tableName)
|
|
149
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Locks for code that imports only Foundation. On Apple platforms Foundation
|
|
2
|
+
// brings Darwin along, `os_unfair_lock` with it, so a package's
|
|
3
|
+
// `#if os(iOS)` branch locks with it after `import Foundation` alone
|
|
4
|
+
// (SwiftSoup's `Mutex`); these come from the shim's os module. On WASI, the
|
|
5
|
+
// libc module leaves out `pthread.h`, so a POSIX branch (`#if canImport(Darwin)
|
|
6
|
+
// … #else pthread_mutex_lock`) finds no functions: here are the mutex ones,
|
|
7
|
+
// for the page's single thread, where a lock is never contended.
|
|
8
|
+
|
|
9
|
+
@_exported import struct os.os_unfair_lock
|
|
10
|
+
@_exported import typealias os.os_unfair_lock_t
|
|
11
|
+
@_exported import typealias os.os_unfair_lock_s
|
|
12
|
+
@_exported import func os.os_unfair_lock_lock
|
|
13
|
+
@_exported import func os.os_unfair_lock_unlock
|
|
14
|
+
@_exported import func os.os_unfair_lock_trylock
|
|
15
|
+
@_exported import func os.os_unfair_lock_assert_owner
|
|
16
|
+
@_exported import func os.os_unfair_lock_assert_not_owner
|
|
17
|
+
|
|
18
|
+
#if os(WASI)
|
|
19
|
+
import WASILibc
|
|
20
|
+
|
|
21
|
+
@discardableResult
|
|
22
|
+
public func pthread_mutex_init(_ mutex: UnsafeMutablePointer<pthread_mutex_t>?, _ attributes: UnsafePointer<pthread_mutexattr_t>?) -> Int32 { 0 }
|
|
23
|
+
|
|
24
|
+
@discardableResult
|
|
25
|
+
public func pthread_mutex_destroy(_ mutex: UnsafeMutablePointer<pthread_mutex_t>?) -> Int32 { 0 }
|
|
26
|
+
|
|
27
|
+
@discardableResult
|
|
28
|
+
public func pthread_mutex_lock(_ mutex: UnsafeMutablePointer<pthread_mutex_t>?) -> Int32 { 0 }
|
|
29
|
+
|
|
30
|
+
@discardableResult
|
|
31
|
+
public func pthread_mutex_trylock(_ mutex: UnsafeMutablePointer<pthread_mutex_t>?) -> Int32 { 0 }
|
|
32
|
+
|
|
33
|
+
@discardableResult
|
|
34
|
+
public func pthread_mutex_unlock(_ mutex: UnsafeMutablePointer<pthread_mutex_t>?) -> Int32 { 0 }
|
|
35
|
+
|
|
36
|
+
@discardableResult
|
|
37
|
+
public func pthread_mutexattr_init(_ attributes: UnsafeMutablePointer<pthread_mutexattr_t>?) -> Int32 { 0 }
|
|
38
|
+
|
|
39
|
+
@discardableResult
|
|
40
|
+
public func pthread_mutexattr_destroy(_ attributes: UnsafeMutablePointer<pthread_mutexattr_t>?) -> Int32 { 0 }
|
|
41
|
+
|
|
42
|
+
@discardableResult
|
|
43
|
+
public func pthread_mutexattr_settype(_ attributes: UnsafeMutablePointer<pthread_mutexattr_t>?, _ type: Int32) -> Int32 { 0 }
|
|
44
|
+
|
|
45
|
+
/// `PTHREAD_MUTEX_RECURSIVE` and friends, which the libc module leaves out with `pthread.h`.
|
|
46
|
+
public var PTHREAD_MUTEX_NORMAL: Int32 { 0 }
|
|
47
|
+
public var PTHREAD_MUTEX_RECURSIVE: Int32 { 1 }
|
|
48
|
+
public var PTHREAD_MUTEX_ERRORCHECK: Int32 { 2 }
|
|
49
|
+
public var PTHREAD_MUTEX_DEFAULT: Int32 { 0 }
|
|
50
|
+
#endif
|