@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,407 @@
|
|
|
1
|
+
// DEFLATE (RFC 1951), the format behind `COMPRESSION_ZLIB` and zlib's
|
|
2
|
+
// `inflate`, computed in Swift: a complete decoder (stored, fixed and dynamic
|
|
3
|
+
// Huffman blocks) and an encoder that writes one fixed-Huffman block over a
|
|
4
|
+
// hash-chain LZ77 search (or stored blocks when that would be larger). The
|
|
5
|
+
// encoder's output is valid DEFLATE that any inflater reads; it is not as
|
|
6
|
+
// small as zlib's, which also builds dynamic Huffman tables. The zlib (RFC
|
|
7
|
+
// 1950) and gzip (RFC 1952) wrappers and their checksums are here too.
|
|
8
|
+
|
|
9
|
+
enum _Deflate {
|
|
10
|
+
enum Failure: Error, Equatable {
|
|
11
|
+
/// The input ended before the stream did: more input may complete it.
|
|
12
|
+
case truncated
|
|
13
|
+
/// The input is not a valid stream (or its checksum does not match).
|
|
14
|
+
case invalid
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/// The wrapper around the DEFLATE data.
|
|
18
|
+
enum Format: Equatable {
|
|
19
|
+
/// Bare DEFLATE, as Apple's `COMPRESSION_ZLIB` and zlib's negative window bits.
|
|
20
|
+
case raw
|
|
21
|
+
/// RFC 1950: a two-byte header and an Adler-32 trailer.
|
|
22
|
+
case zlib
|
|
23
|
+
/// RFC 1952: a gzip member header and a CRC-32 and length trailer.
|
|
24
|
+
case gzip
|
|
25
|
+
/// zlib or gzip, whichever the header says (zlib's window bits + 32).
|
|
26
|
+
case automatic
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// MARK: Decoding
|
|
30
|
+
|
|
31
|
+
/// Decodes one stream at the start of `input`; returns the output and the
|
|
32
|
+
/// index of the first byte after the stream (its trailer included).
|
|
33
|
+
static func inflate(_ input: [UInt8], format: Format = .raw) throws(Failure) -> (output: [UInt8], end: Int) {
|
|
34
|
+
var format = format
|
|
35
|
+
var start = 0
|
|
36
|
+
if format == .automatic {
|
|
37
|
+
guard input.count >= 2 else { throw .truncated }
|
|
38
|
+
format = input[0] == 0x1f && input[1] == 0x8b ? .gzip : .zlib
|
|
39
|
+
}
|
|
40
|
+
switch format {
|
|
41
|
+
case .zlib:
|
|
42
|
+
guard input.count >= 2 else { throw .truncated }
|
|
43
|
+
let cmf = Int(input[0]), flg = Int(input[1])
|
|
44
|
+
// Method 8 (deflate), a window of at most 32K, a valid check, no preset dictionary.
|
|
45
|
+
guard cmf & 0x0f == 8, cmf >> 4 <= 7, (cmf << 8 | flg) % 31 == 0, flg & 0x20 == 0 else { throw .invalid }
|
|
46
|
+
start = 2
|
|
47
|
+
case .gzip:
|
|
48
|
+
start = try gzipHeaderLength(input)
|
|
49
|
+
case .raw, .automatic:
|
|
50
|
+
break
|
|
51
|
+
}
|
|
52
|
+
var inflater = Inflater(input: input, position: start)
|
|
53
|
+
try inflater.run()
|
|
54
|
+
var end = inflater.position
|
|
55
|
+
let output = inflater.output
|
|
56
|
+
switch format {
|
|
57
|
+
case .zlib:
|
|
58
|
+
guard end + 4 <= input.count else { throw .truncated }
|
|
59
|
+
let expected = input[end..<end + 4].reduce(UInt32(0)) { $0 << 8 | UInt32($1) }
|
|
60
|
+
guard expected == adler32(output) else { throw .invalid }
|
|
61
|
+
end += 4
|
|
62
|
+
case .gzip:
|
|
63
|
+
guard end + 8 <= input.count else { throw .truncated }
|
|
64
|
+
let crc = littleEndian32(input, end), size = littleEndian32(input, end + 4)
|
|
65
|
+
guard crc == crc32(output), size == UInt32(truncatingIfNeeded: output.count) else { throw .invalid }
|
|
66
|
+
end += 8
|
|
67
|
+
case .raw, .automatic:
|
|
68
|
+
break
|
|
69
|
+
}
|
|
70
|
+
return (output, end)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
static func littleEndian32(_ bytes: [UInt8], _ at: Int) -> UInt32 {
|
|
74
|
+
UInt32(bytes[at]) | UInt32(bytes[at + 1]) << 8 | UInt32(bytes[at + 2]) << 16 | UInt32(bytes[at + 3]) << 24
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/// The length of the gzip member header at the start of `input`.
|
|
78
|
+
static func gzipHeaderLength(_ input: [UInt8]) throws(Failure) -> Int {
|
|
79
|
+
func need(_ count: Int) throws(Failure) { if count > input.count { throw .truncated } }
|
|
80
|
+
try need(10)
|
|
81
|
+
guard input[0] == 0x1f, input[1] == 0x8b, input[2] == 8 else { throw .invalid }
|
|
82
|
+
let flags = input[3]
|
|
83
|
+
var position = 10
|
|
84
|
+
if flags & 0x04 != 0 { // FEXTRA
|
|
85
|
+
try need(position + 2)
|
|
86
|
+
position += 2 + (Int(input[position]) | Int(input[position + 1]) << 8)
|
|
87
|
+
}
|
|
88
|
+
for flag: UInt8 in [0x08, 0x10] where flags & flag != 0 { // FNAME, FCOMMENT: zero-terminated
|
|
89
|
+
while true {
|
|
90
|
+
try need(position + 1)
|
|
91
|
+
position += 1
|
|
92
|
+
if input[position - 1] == 0 { break }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if flags & 0x02 != 0 { position += 2 } // FHCRC
|
|
96
|
+
try need(position)
|
|
97
|
+
return position
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// Length and distance bases and extra bits (RFC 1951, 3.2.5).
|
|
101
|
+
static let lengthBase: [Int] = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258]
|
|
102
|
+
static let lengthExtra: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]
|
|
103
|
+
static let distanceBase: [Int] = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577]
|
|
104
|
+
static let distanceExtra: [Int] = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]
|
|
105
|
+
/// The order code length code lengths come in (RFC 1951, 3.2.7).
|
|
106
|
+
static let codeLengthOrder: [Int] = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]
|
|
107
|
+
|
|
108
|
+
/// A canonical Huffman code: how many codes each length has, and the
|
|
109
|
+
/// symbols in code order.
|
|
110
|
+
struct Huffman {
|
|
111
|
+
var counts = [Int](repeating: 0, count: 16)
|
|
112
|
+
var symbols: [Int]
|
|
113
|
+
|
|
114
|
+
init(lengths: ArraySlice<Int>) throws(Failure) {
|
|
115
|
+
for length in lengths { counts[length] += 1 }
|
|
116
|
+
counts[0] = 0
|
|
117
|
+
var left = 1
|
|
118
|
+
for length in 1...15 {
|
|
119
|
+
left = left << 1 - counts[length]
|
|
120
|
+
if left < 0 { throw .invalid } // over-subscribed
|
|
121
|
+
}
|
|
122
|
+
var offsets = [Int](repeating: 0, count: 16)
|
|
123
|
+
for length in 1..<15 { offsets[length + 1] = offsets[length] + counts[length] }
|
|
124
|
+
symbols = [Int](repeating: 0, count: lengths.count)
|
|
125
|
+
for (symbol, length) in lengths.enumerated() where length != 0 {
|
|
126
|
+
symbols[offsets[length]] = symbol
|
|
127
|
+
offsets[length] += 1
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static let fixedLiterals = try! Huffman(lengths: ArraySlice((0..<288).map { $0 < 144 ? 8 : $0 < 256 ? 9 : $0 < 280 ? 7 : 8 }))
|
|
132
|
+
static let fixedDistances = try! Huffman(lengths: ArraySlice([Int](repeating: 5, count: 30)))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
struct Inflater {
|
|
136
|
+
let input: [UInt8]
|
|
137
|
+
var position: Int
|
|
138
|
+
var bitBuffer = 0
|
|
139
|
+
var bitCount = 0
|
|
140
|
+
var output: [UInt8] = []
|
|
141
|
+
|
|
142
|
+
init(input: [UInt8], position: Int) {
|
|
143
|
+
self.input = input
|
|
144
|
+
self.position = position
|
|
145
|
+
output.reserveCapacity(input.count * 3)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
mutating func bits(_ count: Int) throws(Failure) -> Int {
|
|
149
|
+
while bitCount < count {
|
|
150
|
+
guard position < input.count else { throw .truncated }
|
|
151
|
+
bitBuffer |= Int(input[position]) << bitCount
|
|
152
|
+
position += 1
|
|
153
|
+
bitCount += 8
|
|
154
|
+
}
|
|
155
|
+
let value = bitBuffer & (1 << count - 1)
|
|
156
|
+
bitBuffer >>= count
|
|
157
|
+
bitCount -= count
|
|
158
|
+
return value
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// Reads one symbol, a bit at a time (codes are stored most significant bit first).
|
|
162
|
+
mutating func decode(_ huffman: Huffman) throws(Failure) -> Int {
|
|
163
|
+
var code = 0, first = 0, index = 0
|
|
164
|
+
for length in 1...15 {
|
|
165
|
+
code |= try bits(1)
|
|
166
|
+
let count = huffman.counts[length]
|
|
167
|
+
if code - first < count { return huffman.symbols[index + code - first] }
|
|
168
|
+
index += count
|
|
169
|
+
first = (first + count) << 1
|
|
170
|
+
code <<= 1
|
|
171
|
+
}
|
|
172
|
+
throw .invalid
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
mutating func run() throws(Failure) {
|
|
176
|
+
var last = false
|
|
177
|
+
while !last {
|
|
178
|
+
last = try bits(1) == 1
|
|
179
|
+
switch try bits(2) {
|
|
180
|
+
case 0: try stored()
|
|
181
|
+
case 1: try codes(Huffman.fixedLiterals, Huffman.fixedDistances)
|
|
182
|
+
case 2: try dynamic()
|
|
183
|
+
default: throw .invalid
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// The stream ends on a byte boundary; unread whole bytes go back to the input.
|
|
187
|
+
position -= bitCount / 8
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
mutating func stored() throws(Failure) {
|
|
191
|
+
bitBuffer = 0
|
|
192
|
+
bitCount = 0
|
|
193
|
+
guard position + 4 <= input.count else { throw .truncated }
|
|
194
|
+
let length = Int(input[position]) | Int(input[position + 1]) << 8
|
|
195
|
+
let complement = Int(input[position + 2]) | Int(input[position + 3]) << 8
|
|
196
|
+
guard length == ~complement & 0xffff else { throw .invalid }
|
|
197
|
+
position += 4
|
|
198
|
+
guard position + length <= input.count else { throw .truncated }
|
|
199
|
+
output.append(contentsOf: input[position..<position + length])
|
|
200
|
+
position += length
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
mutating func dynamic() throws(Failure) {
|
|
204
|
+
let literalCount = try bits(5) + 257
|
|
205
|
+
let distanceCount = try bits(5) + 1
|
|
206
|
+
let codeLengthCount = try bits(4) + 4
|
|
207
|
+
guard literalCount <= 286, distanceCount <= 30 else { throw .invalid }
|
|
208
|
+
var lengths = [Int](repeating: 0, count: 19)
|
|
209
|
+
for index in 0..<codeLengthCount { lengths[_Deflate.codeLengthOrder[index]] = try bits(3) }
|
|
210
|
+
let lengthCode = try Huffman(lengths: lengths[...])
|
|
211
|
+
lengths = []
|
|
212
|
+
lengths.reserveCapacity(literalCount + distanceCount)
|
|
213
|
+
while lengths.count < literalCount + distanceCount {
|
|
214
|
+
let symbol = try decode(lengthCode)
|
|
215
|
+
if symbol < 16 {
|
|
216
|
+
lengths.append(symbol)
|
|
217
|
+
continue
|
|
218
|
+
}
|
|
219
|
+
var value = 0, repeats: Int
|
|
220
|
+
switch symbol {
|
|
221
|
+
case 16:
|
|
222
|
+
guard let previous = lengths.last else { throw .invalid }
|
|
223
|
+
value = previous
|
|
224
|
+
repeats = try 3 + bits(2)
|
|
225
|
+
case 17: repeats = try 3 + bits(3)
|
|
226
|
+
default: repeats = try 11 + bits(7)
|
|
227
|
+
}
|
|
228
|
+
guard lengths.count + repeats <= literalCount + distanceCount else { throw .invalid }
|
|
229
|
+
lengths.append(contentsOf: repeatElement(value, count: repeats))
|
|
230
|
+
}
|
|
231
|
+
guard lengths[256] != 0 else { throw .invalid } // no end-of-block code
|
|
232
|
+
try codes(Huffman(lengths: lengths[0..<literalCount]), Huffman(lengths: lengths[literalCount...]))
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
mutating func codes(_ literals: Huffman, _ distances: Huffman) throws(Failure) {
|
|
236
|
+
while true {
|
|
237
|
+
let symbol = try decode(literals)
|
|
238
|
+
if symbol < 256 {
|
|
239
|
+
output.append(UInt8(symbol))
|
|
240
|
+
continue
|
|
241
|
+
}
|
|
242
|
+
if symbol == 256 { return }
|
|
243
|
+
let lengthIndex = symbol - 257
|
|
244
|
+
guard lengthIndex < 29 else { throw .invalid }
|
|
245
|
+
let length = try _Deflate.lengthBase[lengthIndex] + bits(_Deflate.lengthExtra[lengthIndex])
|
|
246
|
+
let distanceIndex = try decode(distances)
|
|
247
|
+
guard distanceIndex < 30 else { throw .invalid }
|
|
248
|
+
let distance = try _Deflate.distanceBase[distanceIndex] + bits(_Deflate.distanceExtra[distanceIndex])
|
|
249
|
+
guard distance <= output.count else { throw .invalid }
|
|
250
|
+
let from = output.count - distance
|
|
251
|
+
for offset in 0..<length { output.append(output[from + offset]) }
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// MARK: Encoding
|
|
257
|
+
|
|
258
|
+
/// Encodes `input` as raw DEFLATE.
|
|
259
|
+
static func deflate(_ input: [UInt8]) -> [UInt8] {
|
|
260
|
+
var writer = BitWriter()
|
|
261
|
+
writer.write(1, 1) // final block
|
|
262
|
+
writer.write(1, 2) // fixed Huffman codes
|
|
263
|
+
let count = input.count
|
|
264
|
+
var head = [Int](repeating: -1, count: 1 << 15)
|
|
265
|
+
var previous = [Int](repeating: -1, count: count)
|
|
266
|
+
func hash(_ at: Int) -> Int {
|
|
267
|
+
(Int(input[at]) << 10 ^ Int(input[at + 1]) << 5 ^ Int(input[at + 2])) & 0x7fff
|
|
268
|
+
}
|
|
269
|
+
func insert(_ at: Int) {
|
|
270
|
+
guard at + 2 < count else { return }
|
|
271
|
+
let key = hash(at)
|
|
272
|
+
previous[at] = head[key]
|
|
273
|
+
head[key] = at
|
|
274
|
+
}
|
|
275
|
+
var position = 0
|
|
276
|
+
while position < count {
|
|
277
|
+
var bestLength = 0, bestDistance = 0
|
|
278
|
+
if position + 2 < count {
|
|
279
|
+
var candidate = head[hash(position)]
|
|
280
|
+
var chain = 64
|
|
281
|
+
let limit = min(258, count - position)
|
|
282
|
+
while candidate >= 0, position - candidate <= 32768, chain > 0 {
|
|
283
|
+
var length = 0
|
|
284
|
+
while length < limit, input[candidate + length] == input[position + length] { length += 1 }
|
|
285
|
+
if length > bestLength {
|
|
286
|
+
bestLength = length
|
|
287
|
+
bestDistance = position - candidate
|
|
288
|
+
if length == limit { break }
|
|
289
|
+
}
|
|
290
|
+
candidate = previous[candidate]
|
|
291
|
+
chain -= 1
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if bestLength >= 3 {
|
|
295
|
+
writer.writeLength(bestLength)
|
|
296
|
+
writer.writeDistance(bestDistance)
|
|
297
|
+
for at in position..<position + bestLength { insert(at) }
|
|
298
|
+
position += bestLength
|
|
299
|
+
} else {
|
|
300
|
+
writer.writeLiteral(Int(input[position]))
|
|
301
|
+
insert(position)
|
|
302
|
+
position += 1
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
writer.writeLiteral(256)
|
|
306
|
+
writer.flush()
|
|
307
|
+
// Incompressible input: stored blocks are at most 5 bytes per 64K larger than the input.
|
|
308
|
+
if writer.bytes.count > count + 5 * (count / 65535 + 1) { return stored(input) }
|
|
309
|
+
return writer.bytes
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/// `input` in stored (uncompressed) blocks.
|
|
313
|
+
static func stored(_ input: [UInt8]) -> [UInt8] {
|
|
314
|
+
var output: [UInt8] = []
|
|
315
|
+
output.reserveCapacity(input.count + 5 * (input.count / 65535 + 1))
|
|
316
|
+
var position = 0
|
|
317
|
+
repeat {
|
|
318
|
+
let length = min(65535, input.count - position)
|
|
319
|
+
let final: UInt8 = position + length == input.count ? 1 : 0
|
|
320
|
+
output += [final, UInt8(length & 0xff), UInt8(length >> 8), UInt8(~length & 0xff), UInt8(~length >> 8 & 0xff)]
|
|
321
|
+
output += input[position..<position + length]
|
|
322
|
+
position += length
|
|
323
|
+
} while position < input.count
|
|
324
|
+
return output
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
struct BitWriter {
|
|
328
|
+
var bytes: [UInt8] = []
|
|
329
|
+
var buffer = 0
|
|
330
|
+
var count = 0
|
|
331
|
+
|
|
332
|
+
mutating func write(_ value: Int, _ bits: Int) {
|
|
333
|
+
buffer |= value << count
|
|
334
|
+
count += bits
|
|
335
|
+
while count >= 8 {
|
|
336
|
+
bytes.append(UInt8(buffer & 0xff))
|
|
337
|
+
buffer >>= 8
|
|
338
|
+
count -= 8
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/// Writes a Huffman code, most significant bit first.
|
|
343
|
+
mutating func writeCode(_ code: Int, _ bits: Int) {
|
|
344
|
+
var reversed = 0
|
|
345
|
+
for bit in 0..<bits { reversed |= (code >> bit & 1) << (bits - 1 - bit) }
|
|
346
|
+
write(reversed, bits)
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
mutating func writeLiteral(_ symbol: Int) {
|
|
350
|
+
switch symbol {
|
|
351
|
+
case 0..<144: writeCode(0x30 + symbol, 8)
|
|
352
|
+
case 144..<256: writeCode(0x190 + symbol - 144, 9)
|
|
353
|
+
case 256..<280: writeCode(symbol - 256, 7)
|
|
354
|
+
default: writeCode(0xc0 + symbol - 280, 8)
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
mutating func writeLength(_ length: Int) {
|
|
359
|
+
var index = 28
|
|
360
|
+
while _Deflate.lengthBase[index] > length { index -= 1 }
|
|
361
|
+
writeLiteral(257 + index)
|
|
362
|
+
write(length - _Deflate.lengthBase[index], _Deflate.lengthExtra[index])
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
mutating func writeDistance(_ distance: Int) {
|
|
366
|
+
var index = 29
|
|
367
|
+
while _Deflate.distanceBase[index] > distance { index -= 1 }
|
|
368
|
+
writeCode(index, 5)
|
|
369
|
+
write(distance - _Deflate.distanceBase[index], _Deflate.distanceExtra[index])
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
mutating func flush() {
|
|
373
|
+
if count > 0 { write(0, 8 - count) }
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// MARK: Checksums
|
|
378
|
+
|
|
379
|
+
static func adler32(_ bytes: [UInt8], _ start: UInt32 = 1) -> UInt32 {
|
|
380
|
+
var a = start & 0xffff, b = start >> 16
|
|
381
|
+
var index = 0
|
|
382
|
+
while index < bytes.count {
|
|
383
|
+
// 5552 bytes is the most that cannot overflow before the modulo.
|
|
384
|
+
let end = min(index + 5552, bytes.count)
|
|
385
|
+
while index < end {
|
|
386
|
+
a += UInt32(bytes[index])
|
|
387
|
+
b += a
|
|
388
|
+
index += 1
|
|
389
|
+
}
|
|
390
|
+
a %= 65521
|
|
391
|
+
b %= 65521
|
|
392
|
+
}
|
|
393
|
+
return b << 16 | a
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
static let crcTable: [UInt32] = (0..<256).map { (n: UInt32) in
|
|
397
|
+
var c = n
|
|
398
|
+
for _ in 0..<8 { c = c & 1 != 0 ? 0xedb8_8320 ^ c >> 1 : c >> 1 }
|
|
399
|
+
return c
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
static func crc32(_ bytes: [UInt8], _ start: UInt32 = 0) -> UInt32 {
|
|
403
|
+
var crc = ~start
|
|
404
|
+
for byte in bytes { crc = crcTable[Int((crc ^ UInt32(byte)) & 0xff)] ^ crc >> 8 }
|
|
405
|
+
return ~crc
|
|
406
|
+
}
|
|
407
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// zlib's decompression API (zlib.h), as Swift code calls it after
|
|
2
|
+
// `import zlib`: `inflateInit2_` / `inflate` / `inflateEnd` over a
|
|
3
|
+
// `z_stream`, decoding zlib, gzip and raw DEFLATE streams for real with the
|
|
4
|
+
// decoder in Deflate.swift. RevenueCat gunzips its container elements this
|
|
5
|
+
// way. As with Compression's streams, the output comes once the input holds
|
|
6
|
+
// the whole stream (Swift has no partial-block state to resume from), then
|
|
7
|
+
// in as many pieces as the caller's buffers need. There is no `deflate`:
|
|
8
|
+
// nothing that builds for the browser compresses through zlib yet.
|
|
9
|
+
|
|
10
|
+
/// zlib's byte and size types.
|
|
11
|
+
public typealias Bytef = UInt8
|
|
12
|
+
public typealias uInt = UInt32
|
|
13
|
+
public typealias uLong = UInt
|
|
14
|
+
public typealias voidpf = UnsafeMutableRawPointer
|
|
15
|
+
public typealias alloc_func = @convention(c) (voidpf?, uInt, uInt) -> voidpf?
|
|
16
|
+
public typealias free_func = @convention(c) (voidpf?, voidpf?) -> Void
|
|
17
|
+
|
|
18
|
+
/// The version the API is declared after (Apple's SDKs ship 1.2.12).
|
|
19
|
+
public let ZLIB_VERSION = "1.2.12"
|
|
20
|
+
public let ZLIB_VERNUM: Int32 = 0x12c0
|
|
21
|
+
/// The largest window, 32K: `MAX_WBITS + 16` asks for gzip, `+ 32` for
|
|
22
|
+
/// either header, a negative value for raw DEFLATE.
|
|
23
|
+
public let MAX_WBITS: Int32 = 15
|
|
24
|
+
public let MAX_MEM_LEVEL: Int32 = 9
|
|
25
|
+
public let Z_DEFLATED: Int32 = 8
|
|
26
|
+
|
|
27
|
+
public let Z_NO_FLUSH: Int32 = 0
|
|
28
|
+
public let Z_PARTIAL_FLUSH: Int32 = 1
|
|
29
|
+
public let Z_SYNC_FLUSH: Int32 = 2
|
|
30
|
+
public let Z_FULL_FLUSH: Int32 = 3
|
|
31
|
+
public let Z_FINISH: Int32 = 4
|
|
32
|
+
public let Z_BLOCK: Int32 = 5
|
|
33
|
+
public let Z_TREES: Int32 = 6
|
|
34
|
+
|
|
35
|
+
public let Z_OK: Int32 = 0
|
|
36
|
+
public let Z_STREAM_END: Int32 = 1
|
|
37
|
+
public let Z_NEED_DICT: Int32 = 2
|
|
38
|
+
public let Z_ERRNO: Int32 = -1
|
|
39
|
+
public let Z_STREAM_ERROR: Int32 = -2
|
|
40
|
+
public let Z_DATA_ERROR: Int32 = -3
|
|
41
|
+
public let Z_MEM_ERROR: Int32 = -4
|
|
42
|
+
public let Z_BUF_ERROR: Int32 = -5
|
|
43
|
+
public let Z_VERSION_ERROR: Int32 = -6
|
|
44
|
+
|
|
45
|
+
/// A stream in progress, as zlib.h declares it. The allocator fields are
|
|
46
|
+
/// accepted and unused: Swift manages the memory.
|
|
47
|
+
public struct z_stream {
|
|
48
|
+
public var next_in: UnsafeMutablePointer<Bytef>!
|
|
49
|
+
public var avail_in: uInt
|
|
50
|
+
public var total_in: uLong
|
|
51
|
+
public var next_out: UnsafeMutablePointer<Bytef>!
|
|
52
|
+
public var avail_out: uInt
|
|
53
|
+
public var total_out: uLong
|
|
54
|
+
public var msg: UnsafeMutablePointer<CChar>!
|
|
55
|
+
public var state: OpaquePointer!
|
|
56
|
+
public var zalloc: alloc_func!
|
|
57
|
+
public var zfree: free_func!
|
|
58
|
+
public var opaque: voidpf!
|
|
59
|
+
public var data_type: Int32
|
|
60
|
+
public var adler: uLong
|
|
61
|
+
public var reserved: uLong
|
|
62
|
+
|
|
63
|
+
public init() {
|
|
64
|
+
next_in = nil
|
|
65
|
+
avail_in = 0
|
|
66
|
+
total_in = 0
|
|
67
|
+
next_out = nil
|
|
68
|
+
avail_out = 0
|
|
69
|
+
total_out = 0
|
|
70
|
+
msg = nil
|
|
71
|
+
state = nil
|
|
72
|
+
zalloc = nil
|
|
73
|
+
zfree = nil
|
|
74
|
+
opaque = nil
|
|
75
|
+
data_type = 0
|
|
76
|
+
adler = 0
|
|
77
|
+
reserved = 0
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public typealias z_streamp = UnsafeMutablePointer<z_stream>
|
|
82
|
+
|
|
83
|
+
/// Starts decoding. `windowBits` 8...15 reads a zlib stream, 24...31 a gzip
|
|
84
|
+
/// one, 40...47 either, and -15...-8 raw DEFLATE.
|
|
85
|
+
public func inflateInit2_(_ strm: z_streamp!, _ windowBits: Int32, _ version: UnsafePointer<CChar>!, _ stream_size: Int32) -> Int32 {
|
|
86
|
+
guard let strm else { return Z_STREAM_ERROR }
|
|
87
|
+
guard let version, version.pointee == CChar(UInt8(ascii: "1")) else { return Z_VERSION_ERROR }
|
|
88
|
+
let format: _Deflate.Format
|
|
89
|
+
switch windowBits {
|
|
90
|
+
case 0, 8...15: format = .zlib
|
|
91
|
+
case -15 ... -8: format = .raw
|
|
92
|
+
case 24...31: format = .gzip
|
|
93
|
+
case 32, 40...47: format = .automatic
|
|
94
|
+
default: return Z_STREAM_ERROR
|
|
95
|
+
}
|
|
96
|
+
strm.pointee.state = OpaquePointer(Unmanaged.passRetained(_StreamCodec(encoding: false, format: format)).toOpaque())
|
|
97
|
+
strm.pointee.total_in = 0
|
|
98
|
+
strm.pointee.total_out = 0
|
|
99
|
+
strm.pointee.msg = nil
|
|
100
|
+
strm.pointee.adler = format == .raw || format == .gzip ? 0 : 1
|
|
101
|
+
return Z_OK
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/// Starts decoding a zlib stream.
|
|
105
|
+
public func inflateInit_(_ strm: z_streamp!, _ version: UnsafePointer<CChar>!, _ stream_size: Int32) -> Int32 {
|
|
106
|
+
inflateInit2_(strm, MAX_WBITS, version, stream_size)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/// Takes the input at `next_in` and writes output to `next_out`, advancing
|
|
110
|
+
/// both. Returns `Z_STREAM_END` once the whole stream has been written out,
|
|
111
|
+
/// `Z_OK` after progress, `Z_BUF_ERROR` when no progress was possible (the
|
|
112
|
+
/// stream needs more input or more output space) and `Z_DATA_ERROR` for
|
|
113
|
+
/// input that is not a valid stream.
|
|
114
|
+
public func inflate(_ strm: z_streamp!, _ flush: Int32) -> Int32 {
|
|
115
|
+
guard let strm, let state = strm.pointee.state else { return Z_STREAM_ERROR }
|
|
116
|
+
let codec = Unmanaged<_StreamCodec>.fromOpaque(UnsafeRawPointer(state)).takeUnretainedValue()
|
|
117
|
+
if codec.isDone { return Z_STREAM_END }
|
|
118
|
+
let available = Int(strm.pointee.avail_in)
|
|
119
|
+
let input = available > 0 ? UnsafeRawBufferPointer(start: strm.pointee.next_in, count: available) : UnsafeRawBufferPointer(start: nil, count: 0)
|
|
120
|
+
let consumed: Int
|
|
121
|
+
do {
|
|
122
|
+
consumed = try codec.consume(input, finish: flush == Z_FINISH)
|
|
123
|
+
} catch {
|
|
124
|
+
strm.pointee.msg = _invalidStreamMessage
|
|
125
|
+
return Z_DATA_ERROR
|
|
126
|
+
}
|
|
127
|
+
strm.pointee.next_in = strm.pointee.next_in.map { $0 + consumed }
|
|
128
|
+
strm.pointee.avail_in -= uInt(consumed)
|
|
129
|
+
strm.pointee.total_in += uLong(consumed)
|
|
130
|
+
let written = codec.drain(into: strm.pointee.next_out, capacity: Int(strm.pointee.avail_out))
|
|
131
|
+
strm.pointee.next_out = strm.pointee.next_out.map { $0 + written }
|
|
132
|
+
strm.pointee.avail_out -= uInt(written)
|
|
133
|
+
strm.pointee.total_out += uLong(written)
|
|
134
|
+
if codec.finished { strm.pointee.adler = uLong(codec.checksum) }
|
|
135
|
+
if codec.isDone { return Z_STREAM_END }
|
|
136
|
+
return consumed > 0 || written > 0 ? Z_OK : Z_BUF_ERROR
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// Frees what `inflateInit2_` allocated.
|
|
140
|
+
public func inflateEnd(_ strm: z_streamp!) -> Int32 {
|
|
141
|
+
guard let strm, let state = strm.pointee.state else { return Z_STREAM_ERROR }
|
|
142
|
+
Unmanaged<_StreamCodec>.fromOpaque(UnsafeRawPointer(state)).release()
|
|
143
|
+
strm.pointee.state = nil
|
|
144
|
+
return Z_OK
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/// Starts the next stream with the same settings.
|
|
148
|
+
public func inflateReset(_ strm: z_streamp!) -> Int32 {
|
|
149
|
+
guard let strm, let state = strm.pointee.state else { return Z_STREAM_ERROR }
|
|
150
|
+
let old = Unmanaged<_StreamCodec>.fromOpaque(UnsafeRawPointer(state))
|
|
151
|
+
let format = old.takeUnretainedValue().format
|
|
152
|
+
old.release()
|
|
153
|
+
strm.pointee.state = OpaquePointer(Unmanaged.passRetained(_StreamCodec(encoding: false, format: format)).toOpaque())
|
|
154
|
+
strm.pointee.total_in = 0
|
|
155
|
+
strm.pointee.total_out = 0
|
|
156
|
+
strm.pointee.msg = nil
|
|
157
|
+
return Z_OK
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/// The running Adler-32 of `buf` after `adler` (pass 1 to start, or nil
|
|
161
|
+
/// `buf` to get the initial value).
|
|
162
|
+
public func adler32(_ adler: uLong, _ buf: UnsafePointer<Bytef>!, _ len: uInt) -> uLong {
|
|
163
|
+
guard let buf else { return 1 }
|
|
164
|
+
return uLong(_Deflate.adler32(Array(UnsafeBufferPointer(start: buf, count: Int(len))), UInt32(truncatingIfNeeded: adler)))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/// The running CRC-32 of `buf` after `crc` (pass 0 to start).
|
|
168
|
+
public func crc32(_ crc: uLong, _ buf: UnsafePointer<Bytef>!, _ len: uInt) -> uLong {
|
|
169
|
+
guard let buf else { return 0 }
|
|
170
|
+
return uLong(_Deflate.crc32(Array(UnsafeBufferPointer(start: buf, count: Int(len))), UInt32(truncatingIfNeeded: crc)))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/// `z_stream.msg` for invalid input: a C string that lives as long as the process.
|
|
174
|
+
nonisolated(unsafe) let _invalidStreamMessage: UnsafeMutablePointer<CChar> = {
|
|
175
|
+
let text = Array("invalid stream".utf8CString)
|
|
176
|
+
let message = UnsafeMutablePointer<CChar>.allocate(capacity: text.count)
|
|
177
|
+
message.initialize(from: text, count: text.count)
|
|
178
|
+
return message
|
|
179
|
+
}()
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// Core Foundation's types, as the frameworks over it take them: on Apple
|
|
2
|
+
// platforms `CFString`, `CFURL`, `CFDictionary`… come from CoreFoundation,
|
|
3
|
+
// which Foundation, Security, Image I/O and Audio Toolbox all bring along.
|
|
4
|
+
// Here they are plain Swift values (`data as CFData`, `options as
|
|
5
|
+
// CFDictionary`), declared once in this module and re-exported by each of
|
|
6
|
+
// those, so a file that imports several sees one `CFString`. (The name
|
|
7
|
+
// CoreFoundation is taken: Linux toolchains ship corelibs' own.)
|
|
8
|
+
|
|
9
|
+
import Foundation
|
|
10
|
+
|
|
11
|
+
public typealias CFTypeRef = AnyObject
|
|
12
|
+
public typealias CFString = String
|
|
13
|
+
public typealias CFURL = URL
|
|
14
|
+
public typealias CFData = Data
|
|
15
|
+
public typealias CFMutableData = NSMutableData
|
|
16
|
+
public typealias CFDictionary = [String: Any]
|
|
17
|
+
public typealias CFTypeID = UInt
|
|
18
|
+
public typealias CFIndex = Int
|
|
19
|
+
public typealias CFAllocator = AnyObject
|
|
20
|
+
public typealias OSStatus = Int32
|
|
21
|
+
/// Toll-free bridged with `NSError` on Apple platforms (`error as NSError`,
|
|
22
|
+
/// `Unmanaged<CFError>` out-parameters).
|
|
23
|
+
public typealias CFError = NSError
|
|
24
|
+
|
|
25
|
+
/// Core Foundation's booleans, as options dictionaries take them
|
|
26
|
+
/// (`[kCGImageSourceShouldCache: kCFBooleanFalse]`, `kSecReturnData: kCFBooleanTrue`).
|
|
27
|
+
public let kCFBooleanTrue: Bool = true
|
|
28
|
+
public let kCFBooleanFalse: Bool = false
|
|
29
|
+
|
|
30
|
+
/// The type of a Core Foundation object, as `CFGetTypeID` answers it and the
|
|
31
|
+
/// `…GetTypeID()` functions name it (Apple's values). A boolean `NSNumber`
|
|
32
|
+
/// is a `CFBoolean`, as `JSONSerialization` makes them: the usual way to tell
|
|
33
|
+
/// `true` from `1`.
|
|
34
|
+
public func CFGetTypeID(_ cf: CFTypeRef?) -> CFTypeID {
|
|
35
|
+
switch cf {
|
|
36
|
+
case let number as NSNumber:
|
|
37
|
+
String(cString: number.objCType) == "c" ? CFBooleanGetTypeID() : CFNumberGetTypeID()
|
|
38
|
+
case is NSString, is String: CFStringGetTypeID()
|
|
39
|
+
case is NSData, is Data: CFDataGetTypeID()
|
|
40
|
+
case is NSArray: CFArrayGetTypeID()
|
|
41
|
+
case is NSDictionary: CFDictionaryGetTypeID()
|
|
42
|
+
case is NSDate, is Date: CFDateGetTypeID()
|
|
43
|
+
case is NSNull: CFNullGetTypeID()
|
|
44
|
+
default: 1
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public func CFStringGetTypeID() -> CFTypeID { 7 }
|
|
49
|
+
public func CFNullGetTypeID() -> CFTypeID { 16 }
|
|
50
|
+
public func CFDictionaryGetTypeID() -> CFTypeID { 18 }
|
|
51
|
+
public func CFArrayGetTypeID() -> CFTypeID { 19 }
|
|
52
|
+
public func CFDataGetTypeID() -> CFTypeID { 20 }
|
|
53
|
+
public func CFBooleanGetTypeID() -> CFTypeID { 21 }
|
|
54
|
+
public func CFNumberGetTypeID() -> CFTypeID { 22 }
|
|
55
|
+
public func CFDateGetTypeID() -> CFTypeID { 42 }
|
|
56
|
+
|
|
57
|
+
public func CFDataCreateMutable(_ allocator: CFAllocator?, _ capacity: CFIndex) -> CFMutableData? { NSMutableData() }
|
|
58
|
+
|
|
59
|
+
/// A URL from a string, as Core Foundation parses one: characters that may
|
|
60
|
+
/// not appear in a URL are percent-encoded, and escapes already in the string
|
|
61
|
+
/// (`%20`) are kept rather than encoded again, which `URL(string:)` does to
|
|
62
|
+
/// every `%` once anything in the string needs encoding. Square brackets are
|
|
63
|
+
/// kept in the host (`[::1]`) and encoded elsewhere. Nil when the result is
|
|
64
|
+
/// still no URL.
|
|
65
|
+
public func CFURLCreateWithString(_ allocator: CFAllocator?, _ urlString: CFString, _ baseURL: CFURL?) -> CFURL? {
|
|
66
|
+
let escaped = _escapingInvalidURLCharacters(urlString)
|
|
67
|
+
if let baseURL { return URL(string: escaped, relativeTo: baseURL) }
|
|
68
|
+
return URL(string: escaped)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// `urlString` with the characters a URL may not contain percent-encoded (UTF-8).
|
|
72
|
+
func _escapingInvalidURLCharacters(_ urlString: String) -> String {
|
|
73
|
+
let scalars = Array(urlString.unicodeScalars)
|
|
74
|
+
// The authority (`//host:port`), where `[` and `]` delimit an IPv6 address.
|
|
75
|
+
var authority = 0..<0
|
|
76
|
+
if let colon = scalars.firstIndex(of: ":"), scalars.count > colon + 2, scalars[colon + 1] == "/", scalars[colon + 2] == "/" {
|
|
77
|
+
let start = colon + 3
|
|
78
|
+
let end = scalars[start...].firstIndex { $0 == "/" || $0 == "?" || $0 == "#" } ?? scalars.count
|
|
79
|
+
authority = start..<end
|
|
80
|
+
}
|
|
81
|
+
var out = ""
|
|
82
|
+
for (index, scalar) in scalars.enumerated() {
|
|
83
|
+
let isHexEscape = scalar == "%" && index + 2 < scalars.count && scalars[index + 1].properties.isASCIIHexDigit && scalars[index + 2].properties.isASCIIHexDigit
|
|
84
|
+
if isHexEscape || _urlLegal(scalar) || ((scalar == "[" || scalar == "]") && authority.contains(index)) {
|
|
85
|
+
out.unicodeScalars.append(scalar)
|
|
86
|
+
} else {
|
|
87
|
+
for byte in String(scalar).utf8 { out += String(format: "%%%02X", byte) }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return out
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/// RFC 3986's unreserved and reserved characters, but the brackets.
|
|
94
|
+
private func _urlLegal(_ scalar: Unicode.Scalar) -> Bool {
|
|
95
|
+
guard scalar.isASCII else { return false }
|
|
96
|
+
switch scalar {
|
|
97
|
+
case "a"..."z", "A"..."Z", "0"..."9": return true
|
|
98
|
+
case "-", ".", "_", "~", ":", "/", "?", "#", "@", "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=": return true
|
|
99
|
+
default: return false
|
|
100
|
+
}
|
|
101
|
+
}
|