diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..7af3696 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,22 @@ +name: ci +on: + pull_request: +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true +jobs: + swift-test: + runs-on: macos-26 + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # 6.0.1 + - run: swift test + e2e: + runs-on: macos-26 + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # 6.0.1 + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # 4.0.1 + - run: corepack enable + - run: yarn install --immutable + working-directory: e2e + - run: yarn test + working-directory: e2e diff --git a/Package.swift b/Package.swift index 9c01787..06dac67 100644 --- a/Package.swift +++ b/Package.swift @@ -1,10 +1,10 @@ -// swift-tools-version: 6.3 +// swift-tools-version: 6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription -let checksum = "" -let tag = "" +let checksum = "8184364fc8f2e5b624debe4023f5c219e32190fecffc49a1cb39c535b41f88fd" +let tag = "prerelease/4513cab" let url = "https://github.com/webview-bundle/webview-bundle/releases/download/\(tag)/WebViewBundleFFI.xcframework.zip" @@ -21,7 +21,12 @@ let package = Package( .binaryTarget(name: "WebViewBundleFFI", url: url, checksum: checksum), .target( name: "WebViewBundle", - dependencies: [.target(name: "WebViewBundleFFI")] + dependencies: [.target(name: "WebViewBundleFFI")], + linkerSettings: [ + .linkedFramework("SystemConfiguration"), + .linkedFramework("Security"), + .linkedFramework("CoreFoundation"), + ] ), .testTarget( name: "WebViewBundleTests", diff --git a/README.md b/README.md index f729ccd..b1420c7 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,16 @@ Tags follow the upstream convention: `ffi/` for releases and `prerelease/` for prereleases. Run `node scripts/install.mjs --help` for all options. +## TestApp & E2E + +`TestApp/` is a tuist-generated SwiftUI app that serves a **real builtin `.wvb`** +to a `WKWebView` through the `testapp://` scheme, and `e2e/` drives it with +Appium. + +```sh +cd e2e && yarn install && yarn e2e +``` + ## License MIT License diff --git a/Sources/WebViewBundle/Conversions.swift b/Sources/WebViewBundle/Conversions.swift new file mode 100644 index 0000000..656785a --- /dev/null +++ b/Sources/WebViewBundle/Conversions.swift @@ -0,0 +1,38 @@ +import Foundation + +extension HttpMethod { + /// Maps a `URLRequest.httpMethod` string to the FFI ``HttpMethod``. + /// Defaults to `.get` for unknown or missing methods. + static func from(_ method: String?) -> HttpMethod { + switch method?.uppercased() { + case "GET": return .get + case "HEAD": return .head + case "OPTIONS": return .options + case "POST": return .post + case "PUT": return .put + case "PATCH": return .patch + case "DELETE": return .delete + case "TRACE": return .trace + case "CONNECT": return .connect + default: return .get + } + } +} + +extension HttpResponse { + /// Builds an `HTTPURLResponse` for `url` from this response's status and + /// headers. + func makeURLResponse(url: URL) -> HTTPURLResponse { + HTTPURLResponse( + url: url, + statusCode: Int(status), + httpVersion: "HTTP/1.1", + headerFields: headers + ) ?? HTTPURLResponse( + url: url, + statusCode: Int(status), + httpVersion: "HTTP/1.1", + headerFields: nil + )! + } +} diff --git a/Sources/WebViewBundle/RequestHandler.swift b/Sources/WebViewBundle/RequestHandler.swift new file mode 100644 index 0000000..2ef508b --- /dev/null +++ b/Sources/WebViewBundle/RequestHandler.swift @@ -0,0 +1,17 @@ +import Foundation + +/// Common shape of the UniFFI request handlers used by the WebView integration. +/// +/// Both ``BundleUrlHandler`` and ``LocalUrlHandler`` (generated into this module +/// by UniFFI) already expose this exact `handle` signature, so they conform +/// without extra code. +protocol WebViewBundleRequestHandler: AnyObject, Sendable { + func handle( + method: HttpMethod, + uri: String, + headers: [String: String]? + ) async throws -> HttpResponse +} + +extension BundleUrlHandler: WebViewBundleRequestHandler {} +extension LocalUrlHandler: WebViewBundleRequestHandler {} diff --git a/Sources/WebViewBundle/Source.swift b/Sources/WebViewBundle/Source.swift new file mode 100644 index 0000000..6b044b1 --- /dev/null +++ b/Sources/WebViewBundle/Source.swift @@ -0,0 +1,76 @@ +import Foundation + +/// Options for building a ``BundleSource`` with sensible iOS/macOS defaults. +/// +/// Every field is optional and falls back to a platform default when omitted: +/// - `builtinDir` → `/bundles` (read-only, shipped with the app). +/// - `remoteDir` → `//bundles` (writable, holds +/// bundles downloaded at runtime). +public struct SourceOptions: Sendable { + public var builtinDir: String? + public var remoteDir: String? + public var builtinManifestFilepath: String? + public var remoteManifestFilepath: String? + + public init( + builtinDir: String? = nil, + remoteDir: String? = nil, + builtinManifestFilepath: String? = nil, + remoteManifestFilepath: String? = nil + ) { + self.builtinDir = builtinDir + self.remoteDir = remoteDir + self.builtinManifestFilepath = builtinManifestFilepath + self.remoteManifestFilepath = remoteManifestFilepath + } +} + +extension BundleSource { + /// Builds a ``BundleSource`` from ``SourceOptions``, filling in default + /// directories and creating the writable `remoteDir`. + public static func make(_ options: SourceOptions = SourceOptions()) throws -> BundleSource { + let builtinDir = options.builtinDir ?? defaultBuiltinDir() + let remoteDir = options.remoteDir ?? defaultRemoteDir() + try FileManager.default.createDirectory( + atPath: remoteDir, + withIntermediateDirectories: true + ) + return BundleSource(config: BundleSourceConfig( + builtinDir: builtinDir, + remoteDir: remoteDir, + builtinManifestFilepath: options.builtinManifestFilepath, + remoteManifestFilepath: options.remoteManifestFilepath + )) + } + + /// `/bundles` — the read-only directory shipped with the app. + public static func defaultBuiltinDir() -> String { + // `Foundation.Bundle` because unqualified `Bundle` resolves to the FFI's + // own bundle type in this module. + let base = Foundation.Bundle.main.resourceURL ?? Foundation.Bundle.main.bundleURL + return base.appendingPathComponent("bundles").path + } + + /// `//bundles` — the writable directory for + /// bundles downloaded at runtime. Falls back to caches/temporary if + /// Application Support is unavailable. + /// + /// Scoped under the bundle id because macOS's Application Support is shared + /// (unlike iOS's per-app sandbox), so two apps linking this SDK would + /// otherwise clobber one `bundles` directory. + public static func defaultRemoteDir() -> String { + let fm = FileManager.default + let base = (try? fm.url( + for: .applicationSupportDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true + )) ?? fm.urls(for: .cachesDirectory, in: .userDomainMask).first + ?? fm.temporaryDirectory + let appId = Foundation.Bundle.main.bundleIdentifier ?? "WebViewBundle" + return base + .appendingPathComponent(appId) + .appendingPathComponent("bundles") + .path + } +} diff --git a/Sources/WebViewBundle/WebViewBundle.swift b/Sources/WebViewBundle/WebViewBundle.swift index 08b22b8..a1d44d3 100644 --- a/Sources/WebViewBundle/WebViewBundle.swift +++ b/Sources/WebViewBundle/WebViewBundle.swift @@ -1,2 +1,238 @@ -// The Swift Programming Language -// https://docs.swift.org/swift-book +import Foundation + +#if canImport(WebKit) + import WebKit +#endif + +/// Serves WebViewBundle resources to a system `WKWebView`. +/// +/// Wires one or more ``WebViewBundleProtocol``s to a `WKWebViewConfiguration` via +/// `WKURLSchemeHandler`: requests whose scheme matches a registered protocol are +/// resolved from the bundle ``source`` (or proxied to a local server) instead of +/// hitting the network. +/// +/// ```swift +/// let wvb = try webViewBundle(.init(protocols: [.bundle(scheme: "app")])) +/// let webView = wvb.makeWebView() +/// webView.load(URLRequest(url: URL(string: "app://app.wvb/index.html")!)) +/// ``` +/// +/// Keep a strong reference for the lifetime of the web view; it owns the scheme +/// handlers. +public final class WebViewBundle { + public let source: BundleSource + public let remote: Remote? + public let updater: Updater? + public let protocols: [WebViewBundleProtocol] + + #if canImport(WebKit) + private let schemeHandlers: [(scheme: String, handler: WebViewBundleSchemeHandler)] + #endif + + /// Schemes WebKit handles natively; registering a handler for one raises an + /// uncatchable `NSException` in `setURLSchemeHandler`. + private static let reservedSchemes: Set = [ + "http", "https", "file", "ftp", "ftps", "ws", "wss", "about", "blob", "data", "javascript", + ] + + /// - Parameters: + /// - source: the bundle source requests are served from. + /// - protocols: the protocols to register; each must use a unique, + /// non-reserved scheme. + /// - onError: optional observer invoked (on the main actor) when a scheme + /// handler fails to serve a request. + /// - Throws: ``WebViewBundleError`` if a scheme is empty, invalid, reserved, or duplicated. + public init( + source: BundleSource, + protocols: [WebViewBundleProtocol], + remote: Remote? = nil, + updater: Updater? = nil, + onError: (@Sendable (any Swift.Error) -> Void)? = nil + ) throws { + var seen = Set() + for proto in protocols { + let scheme = proto.scheme + guard !scheme.isEmpty else { throw WebViewBundleError.emptyScheme } + // URL schemes are case-insensitive and WebKit lowercases them, so + // validate and de-duplicate on the normalized form. + let normalized = scheme.lowercased() + guard normalized.range(of: "^[a-z][a-z0-9+.-]*$", options: .regularExpression) != nil else { + throw WebViewBundleError.invalidScheme(scheme) + } + guard !Self.reservedSchemes.contains(normalized) else { + throw WebViewBundleError.reservedScheme(scheme) + } + guard seen.insert(normalized).inserted else { + throw WebViewBundleError.duplicateScheme(scheme) + } + } + + self.source = source + self.protocols = protocols + self.remote = remote + self.updater = updater + + #if canImport(WebKit) + self.schemeHandlers = protocols.map { proto in + let handler: any WebViewBundleRequestHandler + switch proto { + case .bundle: + handler = BundleUrlHandler(source: source) + case .local(_, let hosts): + handler = LocalUrlHandler(hosts: hosts) + } + return ( + scheme: proto.scheme, + handler: WebViewBundleSchemeHandler(handler: handler, onError: onError) + ) + } + #endif + } + + /// The schemes this instance intercepts. + public var schemes: [String] { protocols.map(\.scheme) } + + #if canImport(WebKit) + /// Registers the bundle scheme handlers on `configuration`. + @MainActor + public func install(on configuration: WKWebViewConfiguration) { + for (scheme, handler) in schemeHandlers { + configuration.setURLSchemeHandler(handler, forURLScheme: scheme) + } + } + + /// A fresh `WKWebViewConfiguration` with the scheme handlers installed. + @MainActor + public func makeConfiguration() -> WKWebViewConfiguration { + let configuration = WKWebViewConfiguration() + install(on: configuration) + return configuration + } + + /// A fresh `WKWebView` configured to serve the registered bundles. + @MainActor + public func makeWebView(frame: CGRect = .zero) -> WKWebView { + WKWebView(frame: frame, configuration: makeConfiguration()) + } + #endif +} + +/// Errors thrown while constructing a ``WebViewBundle``. +// +// Spelled `Swift.Error` because unqualified `Error` resolves to the FFI's own +// error enum in this module. +public enum WebViewBundleError: Swift.Error, Equatable { + /// A protocol was given an empty scheme. + case emptyScheme + /// A scheme is not a syntactically valid URL scheme. + case invalidScheme(String) + /// A scheme is one WebKit handles natively (e.g. `http`, `https`, `file`). + case reservedScheme(String) + /// Two protocols share the same scheme (compared case-insensitively). + case duplicateScheme(String) +} + +/// Remote endpoint configuration for ``WebViewBundleConfig``. +public struct WebViewBundleRemoteConfig: Sendable { + /// The base URL of the remote server, e.g. `"https://bundles.example.com"`. + public var endpoint: String + + public init(endpoint: String) { + self.endpoint = endpoint + } +} + +/// Updater configuration for ``WebViewBundleConfig``. +/// +/// When present, ``WebViewBundle/init(config:)`` builds a ``Remote`` from +/// ``remote`` and an ``Updater`` wired to the source. +public struct WebViewBundleUpdaterConfig: Sendable { + public var remote: WebViewBundleRemoteConfig + /// Release channel (e.g. `"stable"`, `"beta"`). + public var channel: String? + public var integrityPolicy: IntegrityPolicy? + public var signatureVerifier: SignatureVerifierOptions? + + public init( + remote: WebViewBundleRemoteConfig, + channel: String? = nil, + integrityPolicy: IntegrityPolicy? = nil, + signatureVerifier: SignatureVerifierOptions? = nil + ) { + self.remote = remote + self.channel = channel + self.integrityPolicy = integrityPolicy + self.signatureVerifier = signatureVerifier + } + + fileprivate var updaterOptions: UpdaterOptions { + UpdaterOptions( + channel: channel, + integrityPolicy: integrityPolicy, + signatureVerifier: signatureVerifier + ) + } +} + +/// High-level configuration for ``WebViewBundle``. +public struct WebViewBundleConfig: Sendable { + /// Source directory options. Defaults to the platform builtin/remote dirs. + public var source: SourceOptions + /// The protocols to register; each must use a unique, non-reserved scheme. + public var protocols: [WebViewBundleProtocol] + /// When set, a ``Remote`` and ``Updater`` are created and exposed. + public var updater: WebViewBundleUpdaterConfig? + /// Optional observer invoked (on the main actor) when a scheme handler fails. + public var onError: (@Sendable (any Swift.Error) -> Void)? + + public init( + source: SourceOptions = SourceOptions(), + protocols: [WebViewBundleProtocol], + updater: WebViewBundleUpdaterConfig? = nil, + onError: (@Sendable (any Swift.Error) -> Void)? = nil + ) { + self.source = source + self.protocols = protocols + self.updater = updater + self.onError = onError + } +} + +extension WebViewBundle { + /// Builds a ``WebViewBundle`` from a high-level ``WebViewBundleConfig``. + /// + /// The source is created via ``BundleSource/make(_:)``, and — when + /// ``WebViewBundleConfig/updater`` is set — a ``Remote`` and ``Updater`` are + /// wired to it. + public convenience init(config: WebViewBundleConfig) throws { + let source = try BundleSource.make(config.source) + var remote: Remote? + var updater: Updater? + if let updaterConfig = config.updater { + let createdRemote = try Remote(endpoint: updaterConfig.remote.endpoint) + updater = try Updater( + source: source, + remote: createdRemote, + options: updaterConfig.updaterOptions + ) + remote = createdRemote + } + try self.init( + source: source, + protocols: config.protocols, + remote: remote, + updater: updater, + onError: config.onError + ) + } +} + +/// Builds a ``WebViewBundle`` from a high-level ``WebViewBundleConfig``. +public func webViewBundle(_ config: WebViewBundleConfig) throws -> WebViewBundle { + try WebViewBundle(config: config) +} + +/// Short alias for ``webViewBundle(_:)``. +public func wvb(_ config: WebViewBundleConfig) throws -> WebViewBundle { + try webViewBundle(config) +} diff --git a/Sources/WebViewBundle/WebViewBundleLibrary.swift b/Sources/WebViewBundle/WebViewBundleLibrary.swift new file mode 100644 index 0000000..c6ecb53 --- /dev/null +++ b/Sources/WebViewBundle/WebViewBundleLibrary.swift @@ -0,0 +1,5462 @@ +// This file was autogenerated by some hot garbage in the `uniffi` crate. +// Trust me, you don't want to mess with it! + +// swiftlint:disable all +import Foundation + +// Depending on the consumer's build setup, the low-level FFI code +// might be in a separate module, or it might be compiled inline into +// this module. This is a bit of light hackery to work with both. +#if canImport(wvb_ffi) +import wvb_ffi +#endif + +fileprivate extension RustBuffer { + // Allocate a new buffer, copying the contents of a `UInt8` array. + init(bytes: [UInt8]) { + let rbuf = bytes.withUnsafeBufferPointer { ptr in + RustBuffer.from(ptr) + } + self.init(capacity: rbuf.capacity, len: rbuf.len, data: rbuf.data) + } + + static func empty() -> RustBuffer { + RustBuffer(capacity: 0, len:0, data: nil) + } + + static func from(_ ptr: UnsafeBufferPointer) -> RustBuffer { + try! rustCall { ffi_wvb_ffi_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) } + } + + // Frees the buffer in place. + // The buffer must not be used after this is called. + func deallocate() { + try! rustCall { ffi_wvb_ffi_rustbuffer_free(self, $0) } + } +} + +fileprivate extension ForeignBytes { + init(bufferPointer: UnsafeBufferPointer) { + self.init(len: Int32(bufferPointer.count), data: bufferPointer.baseAddress) + } +} + +// For every type used in the interface, we provide helper methods for conveniently +// lifting and lowering that type from C-compatible data, and for reading and writing +// values of that type in a buffer. + +// Helper classes/extensions that don't change. +// Someday, this will be in a library of its own. + +fileprivate extension Data { + init(rustBuffer: RustBuffer) { + self.init( + bytesNoCopy: rustBuffer.data!, + count: Int(rustBuffer.len), + deallocator: .none + ) + } +} + +// Define reader functionality. Normally this would be defined in a class or +// struct, but we use standalone functions instead in order to make external +// types work. +// +// With external types, one swift source file needs to be able to call the read +// method on another source file's FfiConverter, but then what visibility +// should Reader have? +// - If Reader is fileprivate, then this means the read() must also +// be fileprivate, which doesn't work with external types. +// - If Reader is internal/public, we'll get compile errors since both source +// files will try define the same type. +// +// Instead, the read() method and these helper functions input a tuple of data + +fileprivate func createReader(data: Data) -> (data: Data, offset: Data.Index) { + (data: data, offset: 0) +} + +// Reads an integer at the current offset, in big-endian order, and advances +// the offset on success. Throws if reading the integer would move the +// offset past the end of the buffer. +fileprivate func readInt(_ reader: inout (data: Data, offset: Data.Index)) throws -> T { + let range = reader.offset...size + guard reader.data.count >= range.upperBound else { + throw UniffiInternalError.bufferOverflow + } + if T.self == UInt8.self { + let value = reader.data[reader.offset] + reader.offset += 1 + return value as! T + } + var value: T = 0 + let _ = withUnsafeMutableBytes(of: &value, { reader.data.copyBytes(to: $0, from: range)}) + reader.offset = range.upperBound + return value.bigEndian +} + +// Reads an arbitrary number of bytes, to be used to read +// raw bytes, this is useful when lifting strings +fileprivate func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> Array { + let range = reader.offset..<(reader.offset+count) + guard reader.data.count >= range.upperBound else { + throw UniffiInternalError.bufferOverflow + } + var value = [UInt8](repeating: 0, count: count) + value.withUnsafeMutableBufferPointer({ buffer in + reader.data.copyBytes(to: buffer, from: range) + }) + reader.offset = range.upperBound + return value +} + +// Reads a float at the current offset. +fileprivate func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float { + return Float(bitPattern: try readInt(&reader)) +} + +// Reads a float at the current offset. +fileprivate func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double { + return Double(bitPattern: try readInt(&reader)) +} + +// Indicates if the offset has reached the end of the buffer. +fileprivate func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { + return reader.offset < reader.data.count +} + +// Define writer functionality. Normally this would be defined in a class or +// struct, but we use standalone functions instead in order to make external +// types work. See the above discussion on Readers for details. + +fileprivate func createWriter() -> [UInt8] { + return [] +} + +fileprivate func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 { + writer.append(contentsOf: byteArr) +} + +// Writes an integer in big-endian order. +// +// Warning: make sure what you are trying to write +// is in the correct type! +fileprivate func writeInt(_ writer: inout [UInt8], _ value: T) { + var value = value.bigEndian + withUnsafeBytes(of: &value) { writer.append(contentsOf: $0) } +} + +fileprivate func writeFloat(_ writer: inout [UInt8], _ value: Float) { + writeInt(&writer, value.bitPattern) +} + +fileprivate func writeDouble(_ writer: inout [UInt8], _ value: Double) { + writeInt(&writer, value.bitPattern) +} + +// Protocol for types that transfer other types across the FFI. This is +// analogous to the Rust trait of the same name. +fileprivate protocol FfiConverter { + associatedtype FfiType + associatedtype SwiftType + + static func lift(_ value: FfiType) throws -> SwiftType + static func lower(_ value: SwiftType) -> FfiType + static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType + static func write(_ value: SwiftType, into buf: inout [UInt8]) +} + +// Types conforming to `Primitive` pass themselves directly over the FFI. +fileprivate protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType { } + +extension FfiConverterPrimitive { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lift(_ value: FfiType) throws -> SwiftType { + return value + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lower(_ value: SwiftType) -> FfiType { + return value + } +} + +// Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`. +// Used for complex types where it's hard to write a custom lift/lower. +fileprivate protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} + +extension FfiConverterRustBuffer { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lift(_ buf: RustBuffer) throws -> SwiftType { + var reader = createReader(data: Data(rustBuffer: buf)) + let value = try read(from: &reader) + if hasRemaining(reader) { + throw UniffiInternalError.incompleteData + } + buf.deallocate() + return value + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lower(_ value: SwiftType) -> RustBuffer { + var writer = createWriter() + write(value, into: &writer) + return RustBuffer(bytes: writer) + } +} +// An error type for FFI errors. These errors occur at the UniFFI level, not +// the library level. +fileprivate enum UniffiInternalError: LocalizedError { + case bufferOverflow + case incompleteData + case unexpectedOptionalTag + case unexpectedEnumCase + case unexpectedNullPointer + case unexpectedRustCallStatusCode + case unexpectedRustCallError + case unexpectedStaleHandle + case rustPanic(_ message: String) + + public var errorDescription: String? { + switch self { + case .bufferOverflow: return "Reading the requested value would read past the end of the buffer" + case .incompleteData: return "The buffer still has data after lifting its containing value" + case .unexpectedOptionalTag: return "Unexpected optional tag; should be 0 or 1" + case .unexpectedEnumCase: return "Raw enum value doesn't match any cases" + case .unexpectedNullPointer: return "Raw pointer value was null" + case .unexpectedRustCallStatusCode: return "Unexpected RustCallStatus code" + case .unexpectedRustCallError: return "CALL_ERROR but no errorClass specified" + case .unexpectedStaleHandle: return "The object in the handle map has been dropped already" + case let .rustPanic(message): return message + } + } +} + +fileprivate extension NSLock { + func withLock(f: () throws -> T) rethrows -> T { + self.lock() + defer { self.unlock() } + return try f() + } +} + +fileprivate let CALL_SUCCESS: Int8 = 0 +fileprivate let CALL_ERROR: Int8 = 1 +fileprivate let CALL_UNEXPECTED_ERROR: Int8 = 2 +fileprivate let CALL_CANCELLED: Int8 = 3 + +fileprivate extension RustCallStatus { + init() { + self.init( + code: CALL_SUCCESS, + errorBuf: RustBuffer.init( + capacity: 0, + len: 0, + data: nil + ) + ) + } +} + +private func rustCall(_ callback: (UnsafeMutablePointer) -> T) throws -> T { + let neverThrow: ((RustBuffer) throws -> Never)? = nil + return try makeRustCall(callback, errorHandler: neverThrow) +} + +private func rustCallWithError( + _ errorHandler: @escaping (RustBuffer) throws -> E, + _ callback: (UnsafeMutablePointer) -> T) throws -> T { + try makeRustCall(callback, errorHandler: errorHandler) +} + +private func makeRustCall( + _ callback: (UnsafeMutablePointer) -> T, + errorHandler: ((RustBuffer) throws -> E)? +) throws -> T { + uniffiEnsureWvbFfiInitialized() + var callStatus = RustCallStatus.init() + let returnedVal = callback(&callStatus) + try uniffiCheckCallStatus(callStatus: callStatus, errorHandler: errorHandler) + return returnedVal +} + +private func uniffiCheckCallStatus( + callStatus: RustCallStatus, + errorHandler: ((RustBuffer) throws -> E)? +) throws { + switch callStatus.code { + case CALL_SUCCESS: + return + + case CALL_ERROR: + if let errorHandler = errorHandler { + throw try errorHandler(callStatus.errorBuf) + } else { + callStatus.errorBuf.deallocate() + throw UniffiInternalError.unexpectedRustCallError + } + + case CALL_UNEXPECTED_ERROR: + // When the rust code sees a panic, it tries to construct a RustBuffer + // with the message. But if that code panics, then it just sends back + // an empty buffer. + if callStatus.errorBuf.len > 0 { + throw UniffiInternalError.rustPanic(try FfiConverterString.lift(callStatus.errorBuf)) + } else { + callStatus.errorBuf.deallocate() + throw UniffiInternalError.rustPanic("Rust panic") + } + + case CALL_CANCELLED: + fatalError("Cancellation not supported yet") + + default: + throw UniffiInternalError.unexpectedRustCallStatusCode + } +} + +private func uniffiTraitInterfaceCall( + callStatus: UnsafeMutablePointer, + makeCall: () throws -> T, + writeReturn: (T) -> () +) { + do { + try writeReturn(makeCall()) + } catch let error { + callStatus.pointee.code = CALL_UNEXPECTED_ERROR + callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) + } +} + +private func uniffiTraitInterfaceCallWithError( + callStatus: UnsafeMutablePointer, + makeCall: () throws -> T, + writeReturn: (T) -> (), + lowerError: (E) -> RustBuffer +) { + do { + try writeReturn(makeCall()) + } catch let error as E { + callStatus.pointee.code = CALL_ERROR + callStatus.pointee.errorBuf = lowerError(error) + } catch { + callStatus.pointee.code = CALL_UNEXPECTED_ERROR + callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) + } +} +// Initial value and increment amount for handles. +// These ensure that SWIFT handles always have the lowest bit set +fileprivate let UNIFFI_HANDLEMAP_INITIAL: UInt64 = 1 +fileprivate let UNIFFI_HANDLEMAP_DELTA: UInt64 = 2 + +fileprivate final class UniffiHandleMap: @unchecked Sendable { + // All mutation happens with this lock held, which is why we implement @unchecked Sendable. + private let lock = NSLock() + private var map: [UInt64: T] = [:] + private var currentHandle: UInt64 = UNIFFI_HANDLEMAP_INITIAL + + func insert(obj: T) -> UInt64 { + lock.withLock { + return doInsert(obj) + } + } + + // Low-level insert function, this assumes `lock` is held. + private func doInsert(_ obj: T) -> UInt64 { + let handle = currentHandle + currentHandle += UNIFFI_HANDLEMAP_DELTA + map[handle] = obj + return handle + } + + func get(handle: UInt64) throws -> T { + try lock.withLock { + guard let obj = map[handle] else { + throw UniffiInternalError.unexpectedStaleHandle + } + return obj + } + } + + func clone(handle: UInt64) throws -> UInt64 { + try lock.withLock { + guard let obj = map[handle] else { + throw UniffiInternalError.unexpectedStaleHandle + } + return doInsert(obj) + } + } + + @discardableResult + func remove(handle: UInt64) throws -> T { + try lock.withLock { + guard let obj = map.removeValue(forKey: handle) else { + throw UniffiInternalError.unexpectedStaleHandle + } + return obj + } + } + + var count: Int { + get { + map.count + } + } +} + + +// Public interface members begin here. + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterUInt16: FfiConverterPrimitive { + typealias FfiType = UInt16 + typealias SwiftType = UInt16 + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UInt16 { + return try lift(readInt(&buf)) + } + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterUInt32: FfiConverterPrimitive { + typealias FfiType = UInt32 + typealias SwiftType = UInt32 + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UInt32 { + return try lift(readInt(&buf)) + } + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterUInt64: FfiConverterPrimitive { + typealias FfiType = UInt64 + typealias SwiftType = UInt64 + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UInt64 { + return try lift(readInt(&buf)) + } + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterBool : FfiConverter { + typealias FfiType = Int8 + typealias SwiftType = Bool + + public static func lift(_ value: Int8) throws -> Bool { + return value != 0 + } + + public static func lower(_ value: Bool) -> Int8 { + return value ? 1 : 0 + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Bool { + return try lift(readInt(&buf)) + } + + public static func write(_ value: Bool, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterString: FfiConverter { + typealias SwiftType = String + typealias FfiType = RustBuffer + + public static func lift(_ value: RustBuffer) throws -> String { + defer { + value.deallocate() + } + if value.data == nil { + return String() + } + let bytes = UnsafeBufferPointer(start: value.data!, count: Int(value.len)) + return String(bytes: bytes, encoding: String.Encoding.utf8)! + } + + public static func lower(_ value: String) -> RustBuffer { + return value.utf8CString.withUnsafeBufferPointer { ptr in + // The swift string gives us int8_t, we want uint8_t. + ptr.withMemoryRebound(to: UInt8.self) { ptr in + // The swift string gives us a trailing null byte, we don't want it. + let buf = UnsafeBufferPointer(rebasing: ptr.prefix(upTo: ptr.count - 1)) + return RustBuffer.from(buf) + } + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> String { + let len: Int32 = try readInt(&buf) + return String(bytes: try readBytes(&buf, count: Int(len)), encoding: String.Encoding.utf8)! + } + + public static func write(_ value: String, into buf: inout [UInt8]) { + let len = Int32(value.utf8.count) + writeInt(&buf, len) + writeBytes(&buf, value.utf8) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterData: FfiConverterRustBuffer { + typealias SwiftType = Data + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Data { + let len: Int32 = try readInt(&buf) + return Data(try readBytes(&buf, count: Int(len))) + } + + public static func write(_ value: Data, into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + writeBytes(&buf, value) + } +} + + + + +/** + * A fully loaded bundle, giving access to both descriptor metadata and raw entry data. + */ +public protocol BundleProtocol: AnyObject, Sendable { + + /** + * Header and index metadata for this bundle. + */ + func descriptor() -> BundleDescriptor + + /** + * Returns the raw bytes for the entry at `path`, or `None` if the path does not exist. + */ + func getData(path: String) throws -> Data? + + /** + * Returns the CRC-32 checksum of the data at `path`, or `None` if the path does not exist. + */ + func getDataChecksum(path: String) throws -> UInt32? + +} +/** + * A fully loaded bundle, giving access to both descriptor metadata and raw entry data. + */ +open class Bundle: BundleProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_bundle(self.handle, $0) } + } + // No primary constructor declared for this class. + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_bundle(handle, $0) } + } + + + + + /** + * Header and index metadata for this bundle. + */ +open func descriptor() -> BundleDescriptor { + return try! FfiConverterTypeBundleDescriptor_lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundle_descriptor( + self.uniffiCloneHandle(),$0 + ) +}) +} + + /** + * Returns the raw bytes for the entry at `path`, or `None` if the path does not exist. + */ +open func getData(path: String)throws -> Data? { + return try FfiConverterOptionData.lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_method_bundle_get_data( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + + /** + * Returns the CRC-32 checksum of the data at `path`, or `None` if the path does not exist. + */ +open func getDataChecksum(path: String)throws -> UInt32? { + return try FfiConverterOptionUInt32.lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_method_bundle_get_data_checksum( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundle: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = Bundle + + public static func lift(_ handle: UInt64) throws -> Bundle { + return Bundle(unsafeFromHandle: handle) + } + + public static func lower(_ value: Bundle) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Bundle { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: Bundle, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundle_lift(_ handle: UInt64) throws -> Bundle { + return try FfiConverterTypeBundle.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundle_lower(_ value: Bundle) -> UInt64 { + return FfiConverterTypeBundle.lower(value) +} + + + + + + +/** + * Incrementally assembles a bundle from individual entries before finalizing it with [`build`](BundleBuilder::build). + * + * `BundleBuilder` is internally guarded by a `Mutex` so it is safe to share across + * threads, though in practice it is typically used from a single thread. + */ +public protocol BundleBuilderProtocol: AnyObject, Sendable { + + /** + * Finalizes the builder and produces a [`Bundle`]. + * The builder remains usable after calling `build`. + */ + func build(options: BuildOptions?) throws -> Bundle + + func containsEntry(path: String) -> Bool + + func entryPaths() -> [String] + + /** + * Inserts an entry at `path`. Returns `true` if a previous entry was replaced. + * + * `content_type` is inferred from the data bytes and file extension when `None`. + */ + func insertEntry(path: String, data: Data, contentType: String?, headers: [String: String]?) throws -> Bool + + /** + * Removes the entry at `path`. Returns `true` if an entry existed. + */ + func removeEntry(path: String) -> Bool + + func version() -> Version + +} +/** + * Incrementally assembles a bundle from individual entries before finalizing it with [`build`](BundleBuilder::build). + * + * `BundleBuilder` is internally guarded by a `Mutex` so it is safe to share across + * threads, though in practice it is typically used from a single thread. + */ +open class BundleBuilder: BundleBuilderProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_bundlebuilder(self.handle, $0) } + } + /** + * Creates a new builder. Defaults to [`Version::V1`] when `version` is `None`. + */ +public convenience init(version: Version?) { + let handle = + try! rustCall() { + uniffi_wvb_ffi_fn_constructor_bundlebuilder_new( + FfiConverterOptionTypeVersion.lower(version),$0 + ) +} + self.init(unsafeFromHandle: handle) +} + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_bundlebuilder(handle, $0) } + } + + + + + /** + * Finalizes the builder and produces a [`Bundle`]. + * The builder remains usable after calling `build`. + */ +open func build(options: BuildOptions?)throws -> Bundle { + return try FfiConverterTypeBundle_lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_method_bundlebuilder_build( + self.uniffiCloneHandle(), + FfiConverterOptionTypeBuildOptions.lower(options),$0 + ) +}) +} + +open func containsEntry(path: String) -> Bool { + return try! FfiConverterBool.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundlebuilder_contains_entry( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + +open func entryPaths() -> [String] { + return try! FfiConverterSequenceString.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundlebuilder_entry_paths( + self.uniffiCloneHandle(),$0 + ) +}) +} + + /** + * Inserts an entry at `path`. Returns `true` if a previous entry was replaced. + * + * `content_type` is inferred from the data bytes and file extension when `None`. + */ +open func insertEntry(path: String, data: Data, contentType: String?, headers: [String: String]?)throws -> Bool { + return try FfiConverterBool.lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_method_bundlebuilder_insert_entry( + self.uniffiCloneHandle(), + FfiConverterString.lower(path), + FfiConverterData.lower(data), + FfiConverterOptionString.lower(contentType), + FfiConverterOptionDictionaryStringString.lower(headers),$0 + ) +}) +} + + /** + * Removes the entry at `path`. Returns `true` if an entry existed. + */ +open func removeEntry(path: String) -> Bool { + return try! FfiConverterBool.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundlebuilder_remove_entry( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + +open func version() -> Version { + return try! FfiConverterTypeVersion_lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundlebuilder_version( + self.uniffiCloneHandle(),$0 + ) +}) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleBuilder: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = BundleBuilder + + public static func lift(_ handle: UInt64) throws -> BundleBuilder { + return BundleBuilder(unsafeFromHandle: handle) + } + + public static func lower(_ value: BundleBuilder) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleBuilder { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: BundleBuilder, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleBuilder_lift(_ handle: UInt64) throws -> BundleBuilder { + return try FfiConverterTypeBundleBuilder.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleBuilder_lower(_ value: BundleBuilder) -> UInt64 { + return FfiConverterTypeBundleBuilder.lower(value) +} + + + + + + +/** + * Header + index metadata for a bundle, without necessarily loading the data section. + */ +public protocol BundleDescriptorProtocol: AnyObject, Sendable { + + func containsPath(path: String) -> Bool + + func getIndexEntry(path: String) -> IndexEntry? + + /** + * Bundle file header. + */ + func header() -> Header + + /** + * Returns an [`Index`] view backed by the full bundle. + * + * # Panics + * Panics when called on a metadata-only descriptor (obtained via + * `BundleSource::fetch_descriptor` or `LoadedDescriptor::descriptor`), because + * those variants have no data section. Use `BundleSource::fetch_bundle` instead + * when data access is required. + */ + func index() -> Index + + func indexEntries() -> [String: IndexEntry] + +} +/** + * Header + index metadata for a bundle, without necessarily loading the data section. + */ +open class BundleDescriptor: BundleDescriptorProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_bundledescriptor(self.handle, $0) } + } + // No primary constructor declared for this class. + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_bundledescriptor(handle, $0) } + } + + + + +open func containsPath(path: String) -> Bool { + return try! FfiConverterBool.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundledescriptor_contains_path( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + +open func getIndexEntry(path: String) -> IndexEntry? { + return try! FfiConverterOptionTypeIndexEntry.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundledescriptor_get_index_entry( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + + /** + * Bundle file header. + */ +open func header() -> Header { + return try! FfiConverterTypeHeader_lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundledescriptor_header( + self.uniffiCloneHandle(),$0 + ) +}) +} + + /** + * Returns an [`Index`] view backed by the full bundle. + * + * # Panics + * Panics when called on a metadata-only descriptor (obtained via + * `BundleSource::fetch_descriptor` or `LoadedDescriptor::descriptor`), because + * those variants have no data section. Use `BundleSource::fetch_bundle` instead + * when data access is required. + */ +open func index() -> Index { + return try! FfiConverterTypeIndex_lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundledescriptor_index( + self.uniffiCloneHandle(),$0 + ) +}) +} + +open func indexEntries() -> [String: IndexEntry] { + return try! FfiConverterDictionaryStringTypeIndexEntry.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundledescriptor_index_entries( + self.uniffiCloneHandle(),$0 + ) +}) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleDescriptor: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = BundleDescriptor + + public static func lift(_ handle: UInt64) throws -> BundleDescriptor { + return BundleDescriptor(unsafeFromHandle: handle) + } + + public static func lower(_ value: BundleDescriptor) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleDescriptor { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: BundleDescriptor, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleDescriptor_lift(_ handle: UInt64) throws -> BundleDescriptor { + return try FfiConverterTypeBundleDescriptor.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleDescriptor_lower(_ value: BundleDescriptor) -> UInt64 { + return FfiConverterTypeBundleDescriptor.lower(value) +} + + + + + + +/** + * Unified access point for bundles from both the builtin and remote sources. + * + * The remote source takes precedence over the builtin source when both contain + * a bundle with the same name. + */ +public protocol BundleSourceProtocol: AnyObject, Sendable { + + /** + * Loads the full builtin bundle for `bundle_name` at `version`, bypassing the + * remote source and version resolution. + */ + func fetchBuiltinBundle(bundleName: String, version: String) async throws -> Bundle + + /** + * Loads the full bundle (header + index + data) for `bundle_name`. + */ + func fetchBundle(bundleName: String) async throws -> Bundle + + /** + * Loads only the header and index for `bundle_name`, skipping the data section. + * The returned descriptor does not support [`BundleDescriptor::index`]; use + * [`fetch`](BundleSource::fetch_bundle) when entry data is needed. + */ + func fetchDescriptor(bundleName: String) async throws -> BundleDescriptor + + /** + * Loads the full remote bundle for `bundle_name` at `version`, bypassing the + * builtin source and version resolution. + */ + func fetchRemoteBundle(bundleName: String, version: String) async throws -> Bundle + + /** + * Resolves the on-disk path of the builtin bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ + func getBuiltinBundleFilepath(bundleName: String, version: String) throws -> String + + /** + * Resolves the on-disk path of the remote bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ + func getRemoteBundleFilepath(bundleName: String, version: String) throws -> String + + func listBundles() async throws -> [ListBundleItem] + + /** + * Loads the manifest metadata for the builtin bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ + func loadBuiltinMetadata(bundleName: String, version: String) async throws -> BundleManifestMetadata? + + /** + * Loads (and caches) the descriptor for the current version of `bundle_name`. + * Concurrent calls for the same bundle share a single load (single-flight) and + * return the cached descriptor until the active version changes or + * [`unload_descriptor`](BundleSource::unload_descriptor) is called. + */ + func loadDescriptor(bundleName: String) async throws -> LoadedDescriptor + + /** + * Loads the manifest metadata for the remote bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ + func loadRemoteMetadata(bundleName: String, version: String) async throws -> BundleManifestMetadata? + + func loadVersion(bundleName: String) async throws -> BundleSourceVersion? + + /** + * Removes every staged remote version except the retained set (current and + * previous). Returns the versions that were removed. + */ + func pruneRemoteBundles(bundleName: String) async throws -> [String] + + /** + * Returns the remote versions that pruning retains (the current and previous). + */ + func remoteRetainedVersions(bundleName: String) async throws -> [String] + + /** + * Removes a single staged remote bundle version: drops its manifest entry and + * deletes its file from disk. Returns `true` if the entry existed. + */ + func removeRemoteBundle(bundleName: String, version: String) async throws -> Bool + + func resolveFilepath(bundleName: String) async throws -> String + + /** + * Drops the cached descriptor for `bundle_name`, if present. Already-returned + * [`LoadedDescriptor`] handles keep working; the next [`load_descriptor`] + * reloads from disk. Returns `true` if a cached descriptor was removed. + */ + func unloadDescriptor(bundleName: String) -> Bool + + func updateVersion(bundleName: String, version: String) async throws + + func writeRemoteBundle(bundleName: String, version: String, bundle: Bundle, metadata: BundleManifestMetadata) async throws + +} +/** + * Unified access point for bundles from both the builtin and remote sources. + * + * The remote source takes precedence over the builtin source when both contain + * a bundle with the same name. + */ +open class BundleSource: BundleSourceProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_bundlesource(self.handle, $0) } + } +public convenience init(config: BundleSourceConfig) { + let handle = + try! rustCall() { + uniffi_wvb_ffi_fn_constructor_bundlesource_new( + FfiConverterTypeBundleSourceConfig_lower(config),$0 + ) +} + self.init(unsafeFromHandle: handle) +} + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_bundlesource(handle, $0) } + } + + + + + /** + * Loads the full builtin bundle for `bundle_name` at `version`, bypassing the + * remote source and version resolution. + */ +open func fetchBuiltinBundle(bundleName: String, version: String)async throws -> Bundle { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_fetch_builtin_bundle( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterTypeBundle_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Loads the full bundle (header + index + data) for `bundle_name`. + */ +open func fetchBundle(bundleName: String)async throws -> Bundle { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_fetch_bundle( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterTypeBundle_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Loads only the header and index for `bundle_name`, skipping the data section. + * The returned descriptor does not support [`BundleDescriptor::index`]; use + * [`fetch`](BundleSource::fetch_bundle) when entry data is needed. + */ +open func fetchDescriptor(bundleName: String)async throws -> BundleDescriptor { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_fetch_descriptor( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterTypeBundleDescriptor_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Loads the full remote bundle for `bundle_name` at `version`, bypassing the + * builtin source and version resolution. + */ +open func fetchRemoteBundle(bundleName: String, version: String)async throws -> Bundle { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_fetch_remote_bundle( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterTypeBundle_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Resolves the on-disk path of the builtin bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ +open func getBuiltinBundleFilepath(bundleName: String, version: String)throws -> String { + return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_method_bundlesource_get_builtin_bundle_filepath( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName), + FfiConverterString.lower(version),$0 + ) +}) +} + + /** + * Resolves the on-disk path of the remote bundle `bundle_name` at `version`, + * without checking whether the file exists. + */ +open func getRemoteBundleFilepath(bundleName: String, version: String)throws -> String { + return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_method_bundlesource_get_remote_bundle_filepath( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName), + FfiConverterString.lower(version),$0 + ) +}) +} + +open func listBundles()async throws -> [ListBundleItem] { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_list_bundles( + self.uniffiCloneHandle() + + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterSequenceTypeListBundleItem.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Loads the manifest metadata for the builtin bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ +open func loadBuiltinMetadata(bundleName: String, version: String)async throws -> BundleManifestMetadata? { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_load_builtin_metadata( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterOptionTypeBundleManifestMetadata.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Loads (and caches) the descriptor for the current version of `bundle_name`. + * Concurrent calls for the same bundle share a single load (single-flight) and + * return the cached descriptor until the active version changes or + * [`unload_descriptor`](BundleSource::unload_descriptor) is called. + */ +open func loadDescriptor(bundleName: String)async throws -> LoadedDescriptor { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_load_descriptor( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterTypeLoadedDescriptor_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Loads the manifest metadata for the remote bundle `bundle_name` at `version`, + * or `None` if no such entry exists. + */ +open func loadRemoteMetadata(bundleName: String, version: String)async throws -> BundleManifestMetadata? { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_load_remote_metadata( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterOptionTypeBundleManifestMetadata.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + +open func loadVersion(bundleName: String)async throws -> BundleSourceVersion? { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_load_version( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterOptionTypeBundleSourceVersion.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Removes every staged remote version except the retained set (current and + * previous). Returns the versions that were removed. + */ +open func pruneRemoteBundles(bundleName: String)async throws -> [String] { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_prune_remote_bundles( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterSequenceString.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Returns the remote versions that pruning retains (the current and previous). + */ +open func remoteRetainedVersions(bundleName: String)async throws -> [String] { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_remote_retained_versions( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterSequenceString.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Removes a single staged remote bundle version: drops its manifest entry and + * deletes its file from disk. Returns `true` if the entry existed. + */ +open func removeRemoteBundle(bundleName: String, version: String)async throws -> Bool { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_remove_remote_bundle( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_i8, + completeFunc: ffi_wvb_ffi_rust_future_complete_i8, + freeFunc: ffi_wvb_ffi_rust_future_free_i8, + liftFunc: FfiConverterBool.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + +open func resolveFilepath(bundleName: String)async throws -> String { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_resolve_filepath( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterString.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Drops the cached descriptor for `bundle_name`, if present. Already-returned + * [`LoadedDescriptor`] handles keep working; the next [`load_descriptor`] + * reloads from disk. Returns `true` if a cached descriptor was removed. + */ +open func unloadDescriptor(bundleName: String) -> Bool { + return try! FfiConverterBool.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_bundlesource_unload_descriptor( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),$0 + ) +}) +} + +open func updateVersion(bundleName: String, version: String)async throws { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_update_version( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_void, + completeFunc: ffi_wvb_ffi_rust_future_complete_void, + freeFunc: ffi_wvb_ffi_rust_future_free_void, + liftFunc: { $0 }, + errorHandler: FfiConverterTypeError_lift + ) +} + +open func writeRemoteBundle(bundleName: String, version: String, bundle: Bundle, metadata: BundleManifestMetadata)async throws { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundlesource_write_remote_bundle( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version),FfiConverterTypeBundle_lower(bundle),FfiConverterTypeBundleManifestMetadata_lower(metadata) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_void, + completeFunc: ffi_wvb_ffi_rust_future_complete_void, + freeFunc: ffi_wvb_ffi_rust_future_free_void, + liftFunc: { $0 }, + errorHandler: FfiConverterTypeError_lift + ) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleSource: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = BundleSource + + public static func lift(_ handle: UInt64) throws -> BundleSource { + return BundleSource(unsafeFromHandle: handle) + } + + public static func lower(_ value: BundleSource) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleSource { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: BundleSource, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSource_lift(_ handle: UInt64) throws -> BundleSource { + return try FfiConverterTypeBundleSource.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSource_lower(_ value: BundleSource) -> UInt64 { + return FfiConverterTypeBundleSource.lower(value) +} + + + + + + +/** + * Handles HTTP-like requests by serving bundle entries from a [`BundleSource`]. + * + * The host portion of the URI identifies the bundle by name + * (e.g. `https://app.wvb/index.html` → bundle `"app"`, path `"/index.html"`). + * Returns 200 with the entry body, 404 when the path is not found, or + * 200 with an empty body for HEAD requests. + */ +public protocol BundleUrlHandlerProtocol: AnyObject, Sendable { + + func handle(method: HttpMethod, uri: String, headers: [String: String]?) async throws -> HttpResponse + +} +/** + * Handles HTTP-like requests by serving bundle entries from a [`BundleSource`]. + * + * The host portion of the URI identifies the bundle by name + * (e.g. `https://app.wvb/index.html` → bundle `"app"`, path `"/index.html"`). + * Returns 200 with the entry body, 404 when the path is not found, or + * 200 with an empty body for HEAD requests. + */ +open class BundleUrlHandler: BundleUrlHandlerProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_bundleurlhandler(self.handle, $0) } + } +public convenience init(source: BundleSource) { + let handle = + try! rustCall() { + uniffi_wvb_ffi_fn_constructor_bundleurlhandler_new( + FfiConverterTypeBundleSource_lower(source),$0 + ) +} + self.init(unsafeFromHandle: handle) +} + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_bundleurlhandler(handle, $0) } + } + + + + +open func handle(method: HttpMethod, uri: String, headers: [String: String]?)async throws -> HttpResponse { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_bundleurlhandler_handle( + self.uniffiCloneHandle(), + FfiConverterTypeHttpMethod_lower(method),FfiConverterString.lower(uri),FfiConverterOptionDictionaryStringString.lower(headers) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeHttpResponse_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleUrlHandler: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = BundleUrlHandler + + public static func lift(_ handle: UInt64) throws -> BundleUrlHandler { + return BundleUrlHandler(unsafeFromHandle: handle) + } + + public static func lower(_ value: BundleUrlHandler) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleUrlHandler { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: BundleUrlHandler, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleUrlHandler_lift(_ handle: UInt64) throws -> BundleUrlHandler { + return try FfiConverterTypeBundleUrlHandler.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleUrlHandler_lower(_ value: BundleUrlHandler) -> UInt64 { + return FfiConverterTypeBundleUrlHandler.lower(value) +} + + + + + + +/** + * Fixed-size bundle file header containing format metadata. + */ +public protocol HeaderProtocol: AnyObject, Sendable { + + /** + * Byte offset at which the index section ends (and data section begins). + */ + func indexEndOffset() -> UInt64 + + /** + * Byte length of the serialized index section. + */ + func indexSize() -> UInt32 + + /** + * Bundle format version encoded in the header. + */ + func version() -> Version + +} +/** + * Fixed-size bundle file header containing format metadata. + */ +open class Header: HeaderProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_header(self.handle, $0) } + } + // No primary constructor declared for this class. + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_header(handle, $0) } + } + + + + + /** + * Byte offset at which the index section ends (and data section begins). + */ +open func indexEndOffset() -> UInt64 { + return try! FfiConverterUInt64.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_header_index_end_offset( + self.uniffiCloneHandle(),$0 + ) +}) +} + + /** + * Byte length of the serialized index section. + */ +open func indexSize() -> UInt32 { + return try! FfiConverterUInt32.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_header_index_size( + self.uniffiCloneHandle(),$0 + ) +}) +} + + /** + * Bundle format version encoded in the header. + */ +open func version() -> Version { + return try! FfiConverterTypeVersion_lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_header_version( + self.uniffiCloneHandle(),$0 + ) +}) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeHeader: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = Header + + public static func lift(_ handle: UInt64) throws -> Header { + return Header(unsafeFromHandle: handle) + } + + public static func lower(_ value: Header) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Header { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: Header, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeHeader_lift(_ handle: UInt64) throws -> Header { + return try FfiConverterTypeHeader.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeHeader_lower(_ value: Header) -> UInt64 { + return FfiConverterTypeHeader.lower(value) +} + + + + + + +/** + * View into the index section of a bundle. Backed by the parent [`Bundle`] via + * an `Arc` so that individual entries can be read without copying the whole bundle. + */ +public protocol IndexProtocol: AnyObject, Sendable { + + func containsPath(path: String) -> Bool + + /** + * Returns all index entries keyed by their path (e.g. `"/index.html"`). + */ + func entries() -> [String: IndexEntry] + + func getEntry(path: String) -> IndexEntry? + +} +/** + * View into the index section of a bundle. Backed by the parent [`Bundle`] via + * an `Arc` so that individual entries can be read without copying the whole bundle. + */ +open class Index: IndexProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_index(self.handle, $0) } + } + // No primary constructor declared for this class. + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_index(handle, $0) } + } + + + + +open func containsPath(path: String) -> Bool { + return try! FfiConverterBool.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_index_contains_path( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + + /** + * Returns all index entries keyed by their path (e.g. `"/index.html"`). + */ +open func entries() -> [String: IndexEntry] { + return try! FfiConverterDictionaryStringTypeIndexEntry.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_index_entries( + self.uniffiCloneHandle(),$0 + ) +}) +} + +open func getEntry(path: String) -> IndexEntry? { + return try! FfiConverterOptionTypeIndexEntry.lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_index_get_entry( + self.uniffiCloneHandle(), + FfiConverterString.lower(path),$0 + ) +}) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeIndex: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = Index + + public static func lift(_ handle: UInt64) throws -> Index { + return Index(unsafeFromHandle: handle) + } + + public static func lower(_ value: Index) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Index { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: Index, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIndex_lift(_ handle: UInt64) throws -> Index { + return try FfiConverterTypeIndex.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIndex_lower(_ value: Index) -> UInt64 { + return FfiConverterTypeIndex.lower(value) +} + + + + + + +/** + * A descriptor loaded (and cached) by a [`BundleSource`]. + * + * Holds the parsed header/index together with the filepath it was loaded from, so + * reading entry data always targets the exact bundle version that produced this + * descriptor — even if the source's active version is swapped concurrently. Entry + * data is read lazily from disk via [`LoadedDescriptor::get_data`], avoiding loading + * the whole bundle into memory. + */ +public protocol LoadedDescriptorProtocol: AnyObject, Sendable { + + /** + * Returns the bundle descriptor (header + index metadata). + * + * The returned descriptor carries no reference back to the source, so it can + * outlive this `LoadedDescriptor`. It holds only metadata, so its `index()` is + * unsupported; use [`get_data`](LoadedDescriptor::get_data) for entry data. + */ + func descriptor() -> BundleDescriptor + + /** + * Reads the bytes for `path`, loading them lazily from disk. + * + * The read targets the bundle file this descriptor was loaded from, so the data + * stays consistent with [`descriptor`](LoadedDescriptor::descriptor) even if the + * source's active version changes meanwhile. Returns `None` if `path` does not + * exist in the bundle. + */ + func getData(path: String) async throws -> Data? + + /** + * Reads the CRC-32 checksum for `path`, loading it lazily from disk. + * Returns `None` if `path` does not exist in the bundle. + */ + func getDataChecksum(path: String) async throws -> UInt32? + +} +/** + * A descriptor loaded (and cached) by a [`BundleSource`]. + * + * Holds the parsed header/index together with the filepath it was loaded from, so + * reading entry data always targets the exact bundle version that produced this + * descriptor — even if the source's active version is swapped concurrently. Entry + * data is read lazily from disk via [`LoadedDescriptor::get_data`], avoiding loading + * the whole bundle into memory. + */ +open class LoadedDescriptor: LoadedDescriptorProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_loadeddescriptor(self.handle, $0) } + } + // No primary constructor declared for this class. + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_loadeddescriptor(handle, $0) } + } + + + + + /** + * Returns the bundle descriptor (header + index metadata). + * + * The returned descriptor carries no reference back to the source, so it can + * outlive this `LoadedDescriptor`. It holds only metadata, so its `index()` is + * unsupported; use [`get_data`](LoadedDescriptor::get_data) for entry data. + */ +open func descriptor() -> BundleDescriptor { + return try! FfiConverterTypeBundleDescriptor_lift(try! rustCall() { + uniffi_wvb_ffi_fn_method_loadeddescriptor_descriptor( + self.uniffiCloneHandle(),$0 + ) +}) +} + + /** + * Reads the bytes for `path`, loading them lazily from disk. + * + * The read targets the bundle file this descriptor was loaded from, so the data + * stays consistent with [`descriptor`](LoadedDescriptor::descriptor) even if the + * source's active version changes meanwhile. Returns `None` if `path` does not + * exist in the bundle. + */ +open func getData(path: String)async throws -> Data? { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_loadeddescriptor_get_data( + self.uniffiCloneHandle(), + FfiConverterString.lower(path) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterOptionData.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Reads the CRC-32 checksum for `path`, loading it lazily from disk. + * Returns `None` if `path` does not exist in the bundle. + */ +open func getDataChecksum(path: String)async throws -> UInt32? { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_loadeddescriptor_get_data_checksum( + self.uniffiCloneHandle(), + FfiConverterString.lower(path) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterOptionUInt32.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeLoadedDescriptor: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = LoadedDescriptor + + public static func lift(_ handle: UInt64) throws -> LoadedDescriptor { + return LoadedDescriptor(unsafeFromHandle: handle) + } + + public static func lower(_ value: LoadedDescriptor) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> LoadedDescriptor { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: LoadedDescriptor, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeLoadedDescriptor_lift(_ handle: UInt64) throws -> LoadedDescriptor { + return try FfiConverterTypeLoadedDescriptor.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeLoadedDescriptor_lower(_ value: LoadedDescriptor) -> UInt64 { + return FfiConverterTypeLoadedDescriptor.lower(value) +} + + + + + + +/** + * Proxies HTTP-like requests to a local HTTP server. + * + * `hosts` maps virtual hostnames to local server base URLs + * (e.g. `{"myapp" => "http://localhost:8080"}`). Requests to an unknown + * host are returned as an error. + */ +public protocol LocalUrlHandlerProtocol: AnyObject, Sendable { + + func handle(method: HttpMethod, uri: String, headers: [String: String]?) async throws -> HttpResponse + +} +/** + * Proxies HTTP-like requests to a local HTTP server. + * + * `hosts` maps virtual hostnames to local server base URLs + * (e.g. `{"myapp" => "http://localhost:8080"}`). Requests to an unknown + * host are returned as an error. + */ +open class LocalUrlHandler: LocalUrlHandlerProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_localurlhandler(self.handle, $0) } + } +public convenience init(hosts: [String: String]) { + let handle = + try! rustCall() { + uniffi_wvb_ffi_fn_constructor_localurlhandler_new( + FfiConverterDictionaryStringString.lower(hosts),$0 + ) +} + self.init(unsafeFromHandle: handle) +} + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_localurlhandler(handle, $0) } + } + + + + +open func handle(method: HttpMethod, uri: String, headers: [String: String]?)async throws -> HttpResponse { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_localurlhandler_handle( + self.uniffiCloneHandle(), + FfiConverterTypeHttpMethod_lower(method),FfiConverterString.lower(uri),FfiConverterOptionDictionaryStringString.lower(headers) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeHttpResponse_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeLocalUrlHandler: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = LocalUrlHandler + + public static func lift(_ handle: UInt64) throws -> LocalUrlHandler { + return LocalUrlHandler(unsafeFromHandle: handle) + } + + public static func lower(_ value: LocalUrlHandler) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> LocalUrlHandler { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: LocalUrlHandler, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeLocalUrlHandler_lift(_ handle: UInt64) throws -> LocalUrlHandler { + return try FfiConverterTypeLocalUrlHandler.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeLocalUrlHandler_lower(_ value: LocalUrlHandler) -> UInt64 { + return FfiConverterTypeLocalUrlHandler.lower(value) +} + + + + + + +/** + * HTTP client for a WebViewBundle remote server. + */ +public protocol RemoteProtocol: AnyObject, Sendable { + + func download(bundleName: String, channel: String?) async throws -> DownloadResult + + func downloadVersion(bundleName: String, version: String) async throws -> DownloadResult + + /** + * Fetches metadata for the latest version of `bundle_name` without downloading the bundle. + */ + func getInfo(bundleName: String, channel: String?) async throws -> RemoteBundleInfo + + func listBundles(channel: String?) async throws -> [ListRemoteBundleInfo] + +} +/** + * HTTP client for a WebViewBundle remote server. + */ +open class Remote: RemoteProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_remote(self.handle, $0) } + } + /** + * Creates a client for the server at `endpoint` (e.g. `"https://bundles.example.com"`). + */ +public convenience init(endpoint: String)throws { + let handle = + try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_constructor_remote_new( + FfiConverterString.lower(endpoint),$0 + ) +} + self.init(unsafeFromHandle: handle) +} + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_remote(handle, $0) } + } + + + + +open func download(bundleName: String, channel: String?)async throws -> DownloadResult { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_remote_download( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterOptionString.lower(channel) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeDownloadResult_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + +open func downloadVersion(bundleName: String, version: String)async throws -> DownloadResult { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_remote_download_version( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeDownloadResult_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Fetches metadata for the latest version of `bundle_name` without downloading the bundle. + */ +open func getInfo(bundleName: String, channel: String?)async throws -> RemoteBundleInfo { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_remote_get_info( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterOptionString.lower(channel) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeRemoteBundleInfo_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + +open func listBundles(channel: String?)async throws -> [ListRemoteBundleInfo] { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_remote_list_bundles( + self.uniffiCloneHandle(), + FfiConverterOptionString.lower(channel) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterSequenceTypeListRemoteBundleInfo.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeRemote: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = Remote + + public static func lift(_ handle: UInt64) throws -> Remote { + return Remote(unsafeFromHandle: handle) + } + + public static func lower(_ value: Remote) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Remote { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: Remote, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeRemote_lift(_ handle: UInt64) throws -> Remote { + return try FfiConverterTypeRemote.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeRemote_lower(_ value: Remote) -> UInt64 { + return FfiConverterTypeRemote.lower(value) +} + + + + + + +/** + * Orchestrates the full update cycle: checks for a new version on the remote, + * downloads it, verifies integrity/signature, and writes it to the local source. + */ +public protocol UpdaterProtocol: AnyObject, Sendable { + + /** + * Downloads and persists an update for `bundle_name`. + * Uses the latest remote version when `version` is `None`. + */ + func downloadUpdate(bundleName: String, version: String?) async throws -> RemoteBundleInfo + + /** + * Checks whether a newer version of `bundle_name` is available on the remote. + * Does not download the bundle. + */ + func getUpdate(bundleName: String) async throws -> BundleUpdateInfo + + /** + * Activates a previously downloaded bundle version. + * + * The version must already be staged in the remote source (via + * [`download_update`](Updater::download_update)). When integrity/signature + * verification is configured, the staged bundle is verified before activation. + * On success the current version is updated, the cached descriptor is dropped, + * and stale staged versions are pruned. + */ + func install(bundleName: String, version: String) async throws + + func listRemotes() async throws -> [ListRemoteBundleInfo] + +} +/** + * Orchestrates the full update cycle: checks for a new version on the remote, + * downloads it, verifies integrity/signature, and writes it to the local source. + */ +open class Updater: UpdaterProtocol, @unchecked Sendable { + fileprivate let handle: UInt64 + + /// Used to instantiate a [FFIObject] without an actual handle, for fakes in tests, mostly. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public struct NoHandle { + public init() {} + } + + // TODO: We'd like this to be `private` but for Swifty reasons, + // we can't implement `FfiConverter` without making this `required` and we can't + // make it `required` without making it `public`. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + required public init(unsafeFromHandle handle: UInt64) { + self.handle = handle + } + + // This constructor can be used to instantiate a fake object. + // - Parameter noHandle: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject]. + // + // - Warning: + // Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing handle the FFI lower functions will crash. +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public init(noHandle: NoHandle) { + self.handle = 0 + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public func uniffiCloneHandle() -> UInt64 { + return try! rustCall { uniffi_wvb_ffi_fn_clone_updater(self.handle, $0) } + } +public convenience init(source: BundleSource, remote: Remote, options: UpdaterOptions?)throws { + let handle = + try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_constructor_updater_new( + FfiConverterTypeBundleSource_lower(source), + FfiConverterTypeRemote_lower(remote), + FfiConverterOptionTypeUpdaterOptions.lower(options),$0 + ) +} + self.init(unsafeFromHandle: handle) +} + + deinit { + if handle == 0 { + // Mock objects have handle=0 don't try to free them + return + } + + try! rustCall { uniffi_wvb_ffi_fn_free_updater(handle, $0) } + } + + + + + /** + * Downloads and persists an update for `bundle_name`. + * Uses the latest remote version when `version` is `None`. + */ +open func downloadUpdate(bundleName: String, version: String?)async throws -> RemoteBundleInfo { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_updater_download_update( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterOptionString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeRemoteBundleInfo_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Checks whether a newer version of `bundle_name` is available on the remote. + * Does not download the bundle. + */ +open func getUpdate(bundleName: String)async throws -> BundleUpdateInfo { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_updater_get_update( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterTypeBundleUpdateInfo_lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + /** + * Activates a previously downloaded bundle version. + * + * The version must already be staged in the remote source (via + * [`download_update`](Updater::download_update)). When integrity/signature + * verification is configured, the staged bundle is verified before activation. + * On success the current version is updated, the cached descriptor is dropped, + * and stale staged versions are pruned. + */ +open func install(bundleName: String, version: String)async throws { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_updater_install( + self.uniffiCloneHandle(), + FfiConverterString.lower(bundleName),FfiConverterString.lower(version) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_void, + completeFunc: ffi_wvb_ffi_rust_future_complete_void, + freeFunc: ffi_wvb_ffi_rust_future_free_void, + liftFunc: { $0 }, + errorHandler: FfiConverterTypeError_lift + ) +} + +open func listRemotes()async throws -> [ListRemoteBundleInfo] { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_method_updater_list_remotes( + self.uniffiCloneHandle() + + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_rust_buffer, + completeFunc: ffi_wvb_ffi_rust_future_complete_rust_buffer, + freeFunc: ffi_wvb_ffi_rust_future_free_rust_buffer, + liftFunc: FfiConverterSequenceTypeListRemoteBundleInfo.lift, + errorHandler: FfiConverterTypeError_lift + ) +} + + + +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeUpdater: FfiConverter { + typealias FfiType = UInt64 + typealias SwiftType = Updater + + public static func lift(_ handle: UInt64) throws -> Updater { + return Updater(unsafeFromHandle: handle) + } + + public static func lower(_ value: Updater) -> UInt64 { + return value.uniffiCloneHandle() + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Updater { + let handle: UInt64 = try readInt(&buf) + return try lift(handle) + } + + public static func write(_ value: Updater, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUpdater_lift(_ handle: UInt64) throws -> Updater { + return try FfiConverterTypeUpdater.lift(handle) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUpdater_lower(_ value: Updater) -> UInt64 { + return FfiConverterTypeUpdater.lower(value) +} + + + + +/** + * Checksum options for the bundle header section. + */ +public struct BuildHeaderOptions: Equatable, Hashable { + public var checksumSeed: UInt32? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(checksumSeed: UInt32?) { + self.checksumSeed = checksumSeed + } + + + + +} + +#if compiler(>=6) +extension BuildHeaderOptions: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBuildHeaderOptions: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BuildHeaderOptions { + return + try BuildHeaderOptions( + checksumSeed: FfiConverterOptionUInt32.read(from: &buf) + ) + } + + public static func write(_ value: BuildHeaderOptions, into buf: inout [UInt8]) { + FfiConverterOptionUInt32.write(value.checksumSeed, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBuildHeaderOptions_lift(_ buf: RustBuffer) throws -> BuildHeaderOptions { + return try FfiConverterTypeBuildHeaderOptions.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBuildHeaderOptions_lower(_ value: BuildHeaderOptions) -> RustBuffer { + return FfiConverterTypeBuildHeaderOptions.lower(value) +} + + +/** + * Checksum options for the bundle index section. + */ +public struct BuildIndexOptions: Equatable, Hashable { + public var checksumSeed: UInt32? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(checksumSeed: UInt32?) { + self.checksumSeed = checksumSeed + } + + + + +} + +#if compiler(>=6) +extension BuildIndexOptions: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBuildIndexOptions: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BuildIndexOptions { + return + try BuildIndexOptions( + checksumSeed: FfiConverterOptionUInt32.read(from: &buf) + ) + } + + public static func write(_ value: BuildIndexOptions, into buf: inout [UInt8]) { + FfiConverterOptionUInt32.write(value.checksumSeed, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBuildIndexOptions_lift(_ buf: RustBuffer) throws -> BuildIndexOptions { + return try FfiConverterTypeBuildIndexOptions.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBuildIndexOptions_lower(_ value: BuildIndexOptions) -> RustBuffer { + return FfiConverterTypeBuildIndexOptions.lower(value) +} + + +/** + * Top-level options passed to [`BundleBuilder::build`]. + * All fields are optional; omitting them applies the library defaults. + */ +public struct BuildOptions: Equatable, Hashable { + public var header: BuildHeaderOptions? + public var index: BuildIndexOptions? + /** + * Seed for the CRC-32 checksum written into each data entry. + */ + public var dataChecksumSeed: UInt32? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(header: BuildHeaderOptions?, index: BuildIndexOptions?, + /** + * Seed for the CRC-32 checksum written into each data entry. + */dataChecksumSeed: UInt32?) { + self.header = header + self.index = index + self.dataChecksumSeed = dataChecksumSeed + } + + + + +} + +#if compiler(>=6) +extension BuildOptions: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBuildOptions: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BuildOptions { + return + try BuildOptions( + header: FfiConverterOptionTypeBuildHeaderOptions.read(from: &buf), + index: FfiConverterOptionTypeBuildIndexOptions.read(from: &buf), + dataChecksumSeed: FfiConverterOptionUInt32.read(from: &buf) + ) + } + + public static func write(_ value: BuildOptions, into buf: inout [UInt8]) { + FfiConverterOptionTypeBuildHeaderOptions.write(value.header, into: &buf) + FfiConverterOptionTypeBuildIndexOptions.write(value.index, into: &buf) + FfiConverterOptionUInt32.write(value.dataChecksumSeed, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBuildOptions_lift(_ buf: RustBuffer) throws -> BuildOptions { + return try FfiConverterTypeBuildOptions.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBuildOptions_lower(_ value: BuildOptions) -> RustBuffer { + return FfiConverterTypeBuildOptions.lower(value) +} + + +/** + * HTTP cache-control fields stored alongside each bundle entry in the manifest. + * Used to avoid re-downloading bundles that haven't changed. + */ +public struct BundleManifestMetadata: Equatable, Hashable { + public var etag: String? + public var integrity: String? + public var signature: String? + public var lastModified: String? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(etag: String?, integrity: String?, signature: String?, lastModified: String?) { + self.etag = etag + self.integrity = integrity + self.signature = signature + self.lastModified = lastModified + } + + + + +} + +#if compiler(>=6) +extension BundleManifestMetadata: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleManifestMetadata: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleManifestMetadata { + return + try BundleManifestMetadata( + etag: FfiConverterOptionString.read(from: &buf), + integrity: FfiConverterOptionString.read(from: &buf), + signature: FfiConverterOptionString.read(from: &buf), + lastModified: FfiConverterOptionString.read(from: &buf) + ) + } + + public static func write(_ value: BundleManifestMetadata, into buf: inout [UInt8]) { + FfiConverterOptionString.write(value.etag, into: &buf) + FfiConverterOptionString.write(value.integrity, into: &buf) + FfiConverterOptionString.write(value.signature, into: &buf) + FfiConverterOptionString.write(value.lastModified, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleManifestMetadata_lift(_ buf: RustBuffer) throws -> BundleManifestMetadata { + return try FfiConverterTypeBundleManifestMetadata.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleManifestMetadata_lower(_ value: BundleManifestMetadata) -> RustBuffer { + return FfiConverterTypeBundleManifestMetadata.lower(value) +} + + +/** + * Directory paths used by [`BundleSource`] to locate bundles on disk. + * + * `builtin_dir` is read-only (e.g. the app bundle on iOS/Android). + * `remote_dir` must be writable so downloaded bundles can be persisted. + * Both manifest paths default to `/manifest.json` when `None`. + */ +public struct BundleSourceConfig: Equatable, Hashable { + public var builtinDir: String + public var remoteDir: String + public var builtinManifestFilepath: String? + public var remoteManifestFilepath: String? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(builtinDir: String, remoteDir: String, builtinManifestFilepath: String?, remoteManifestFilepath: String?) { + self.builtinDir = builtinDir + self.remoteDir = remoteDir + self.builtinManifestFilepath = builtinManifestFilepath + self.remoteManifestFilepath = remoteManifestFilepath + } + + + + +} + +#if compiler(>=6) +extension BundleSourceConfig: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleSourceConfig: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleSourceConfig { + return + try BundleSourceConfig( + builtinDir: FfiConverterString.read(from: &buf), + remoteDir: FfiConverterString.read(from: &buf), + builtinManifestFilepath: FfiConverterOptionString.read(from: &buf), + remoteManifestFilepath: FfiConverterOptionString.read(from: &buf) + ) + } + + public static func write(_ value: BundleSourceConfig, into buf: inout [UInt8]) { + FfiConverterString.write(value.builtinDir, into: &buf) + FfiConverterString.write(value.remoteDir, into: &buf) + FfiConverterOptionString.write(value.builtinManifestFilepath, into: &buf) + FfiConverterOptionString.write(value.remoteManifestFilepath, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSourceConfig_lift(_ buf: RustBuffer) throws -> BundleSourceConfig { + return try FfiConverterTypeBundleSourceConfig.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSourceConfig_lower(_ value: BundleSourceConfig) -> RustBuffer { + return FfiConverterTypeBundleSourceConfig.lower(value) +} + + +/** + * The currently active version of a bundle and where it was loaded from. + */ +public struct BundleSourceVersion: Equatable, Hashable { + public var kind: BundleSourceKind + public var version: String + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(kind: BundleSourceKind, version: String) { + self.kind = kind + self.version = version + } + + + + +} + +#if compiler(>=6) +extension BundleSourceVersion: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleSourceVersion: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleSourceVersion { + return + try BundleSourceVersion( + kind: FfiConverterTypeBundleSourceKind.read(from: &buf), + version: FfiConverterString.read(from: &buf) + ) + } + + public static func write(_ value: BundleSourceVersion, into buf: inout [UInt8]) { + FfiConverterTypeBundleSourceKind.write(value.kind, into: &buf) + FfiConverterString.write(value.version, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSourceVersion_lift(_ buf: RustBuffer) throws -> BundleSourceVersion { + return try FfiConverterTypeBundleSourceVersion.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSourceVersion_lower(_ value: BundleSourceVersion) -> RustBuffer { + return FfiConverterTypeBundleSourceVersion.lower(value) +} + + +/** + * Result of checking whether a bundle update is available. + * + * `is_available` is `true` when `version` differs from `local_version`. + * The `etag`, `integrity`, `signature`, and `last_modified` fields can be + * passed to [`BundleSource::write_remote_bundle`] after downloading. + */ +public struct BundleUpdateInfo: Equatable, Hashable { + public var name: String + public var version: String + public var localVersion: String? + public var isAvailable: Bool + public var etag: String? + public var integrity: String? + public var signature: String? + public var lastModified: String? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(name: String, version: String, localVersion: String?, isAvailable: Bool, etag: String?, integrity: String?, signature: String?, lastModified: String?) { + self.name = name + self.version = version + self.localVersion = localVersion + self.isAvailable = isAvailable + self.etag = etag + self.integrity = integrity + self.signature = signature + self.lastModified = lastModified + } + + + + +} + +#if compiler(>=6) +extension BundleUpdateInfo: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleUpdateInfo: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleUpdateInfo { + return + try BundleUpdateInfo( + name: FfiConverterString.read(from: &buf), + version: FfiConverterString.read(from: &buf), + localVersion: FfiConverterOptionString.read(from: &buf), + isAvailable: FfiConverterBool.read(from: &buf), + etag: FfiConverterOptionString.read(from: &buf), + integrity: FfiConverterOptionString.read(from: &buf), + signature: FfiConverterOptionString.read(from: &buf), + lastModified: FfiConverterOptionString.read(from: &buf) + ) + } + + public static func write(_ value: BundleUpdateInfo, into buf: inout [UInt8]) { + FfiConverterString.write(value.name, into: &buf) + FfiConverterString.write(value.version, into: &buf) + FfiConverterOptionString.write(value.localVersion, into: &buf) + FfiConverterBool.write(value.isAvailable, into: &buf) + FfiConverterOptionString.write(value.etag, into: &buf) + FfiConverterOptionString.write(value.integrity, into: &buf) + FfiConverterOptionString.write(value.signature, into: &buf) + FfiConverterOptionString.write(value.lastModified, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleUpdateInfo_lift(_ buf: RustBuffer) throws -> BundleUpdateInfo { + return try FfiConverterTypeBundleUpdateInfo.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleUpdateInfo_lower(_ value: BundleUpdateInfo) -> RustBuffer { + return FfiConverterTypeBundleUpdateInfo.lower(value) +} + + +/** + * Result of a bundle download containing the parsed bundle, its raw bytes, + * and the server-provided metadata. + * + * `data` holds the raw `.wvb` bytes as received from the server, which callers + * can persist to disk via [`BundleSource::write_remote_bundle`]. + */ +public struct DownloadResult { + public var info: RemoteBundleInfo + public var bundle: Bundle + public var data: Data + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(info: RemoteBundleInfo, bundle: Bundle, data: Data) { + self.info = info + self.bundle = bundle + self.data = data + } + + + + +} + +#if compiler(>=6) +extension DownloadResult: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeDownloadResult: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> DownloadResult { + return + try DownloadResult( + info: FfiConverterTypeRemoteBundleInfo.read(from: &buf), + bundle: FfiConverterTypeBundle.read(from: &buf), + data: FfiConverterData.read(from: &buf) + ) + } + + public static func write(_ value: DownloadResult, into buf: inout [UInt8]) { + FfiConverterTypeRemoteBundleInfo.write(value.info, into: &buf) + FfiConverterTypeBundle.write(value.bundle, into: &buf) + FfiConverterData.write(value.data, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeDownloadResult_lift(_ buf: RustBuffer) throws -> DownloadResult { + return try FfiConverterTypeDownloadResult.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeDownloadResult_lower(_ value: DownloadResult) -> RustBuffer { + return FfiConverterTypeDownloadResult.lower(value) +} + + +/** + * HTTP response returned by protocol handlers. + */ +public struct HttpResponse: Equatable, Hashable { + public var status: UInt16 + public var headers: [String: String] + public var body: Data + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(status: UInt16, headers: [String: String], body: Data) { + self.status = status + self.headers = headers + self.body = body + } + + + + +} + +#if compiler(>=6) +extension HttpResponse: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeHttpResponse: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> HttpResponse { + return + try HttpResponse( + status: FfiConverterUInt16.read(from: &buf), + headers: FfiConverterDictionaryStringString.read(from: &buf), + body: FfiConverterData.read(from: &buf) + ) + } + + public static func write(_ value: HttpResponse, into buf: inout [UInt8]) { + FfiConverterUInt16.write(value.status, into: &buf) + FfiConverterDictionaryStringString.write(value.headers, into: &buf) + FfiConverterData.write(value.body, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeHttpResponse_lift(_ buf: RustBuffer) throws -> HttpResponse { + return try FfiConverterTypeHttpResponse.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeHttpResponse_lower(_ value: HttpResponse) -> RustBuffer { + return FfiConverterTypeHttpResponse.lower(value) +} + + +/** + * Metadata for a single entry stored in the bundle index. + * + * `offset` and `len` refer to the entry's position in the data section. + * `content_length` is the logical (uncompressed) size exposed to HTTP clients, + * which may differ from `len` if the data is stored compressed. + */ +public struct IndexEntry: Equatable, Hashable { + public var offset: UInt64 + public var len: UInt64 + public var isEmpty: Bool + public var contentType: String + public var contentLength: UInt64 + public var headers: [String: String] + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(offset: UInt64, len: UInt64, isEmpty: Bool, contentType: String, contentLength: UInt64, headers: [String: String]) { + self.offset = offset + self.len = len + self.isEmpty = isEmpty + self.contentType = contentType + self.contentLength = contentLength + self.headers = headers + } + + + + +} + +#if compiler(>=6) +extension IndexEntry: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeIndexEntry: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> IndexEntry { + return + try IndexEntry( + offset: FfiConverterUInt64.read(from: &buf), + len: FfiConverterUInt64.read(from: &buf), + isEmpty: FfiConverterBool.read(from: &buf), + contentType: FfiConverterString.read(from: &buf), + contentLength: FfiConverterUInt64.read(from: &buf), + headers: FfiConverterDictionaryStringString.read(from: &buf) + ) + } + + public static func write(_ value: IndexEntry, into buf: inout [UInt8]) { + FfiConverterUInt64.write(value.offset, into: &buf) + FfiConverterUInt64.write(value.len, into: &buf) + FfiConverterBool.write(value.isEmpty, into: &buf) + FfiConverterString.write(value.contentType, into: &buf) + FfiConverterUInt64.write(value.contentLength, into: &buf) + FfiConverterDictionaryStringString.write(value.headers, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIndexEntry_lift(_ buf: RustBuffer) throws -> IndexEntry { + return try FfiConverterTypeIndexEntry.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIndexEntry_lower(_ value: IndexEntry) -> RustBuffer { + return FfiConverterTypeIndexEntry.lower(value) +} + + +public struct ListBundleItem: Equatable, Hashable { + public var kind: BundleSourceKind + public var name: String + public var version: String + public var current: Bool + public var metadata: BundleManifestMetadata + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(kind: BundleSourceKind, name: String, version: String, current: Bool, metadata: BundleManifestMetadata) { + self.kind = kind + self.name = name + self.version = version + self.current = current + self.metadata = metadata + } + + + + +} + +#if compiler(>=6) +extension ListBundleItem: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeListBundleItem: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> ListBundleItem { + return + try ListBundleItem( + kind: FfiConverterTypeBundleSourceKind.read(from: &buf), + name: FfiConverterString.read(from: &buf), + version: FfiConverterString.read(from: &buf), + current: FfiConverterBool.read(from: &buf), + metadata: FfiConverterTypeBundleManifestMetadata.read(from: &buf) + ) + } + + public static func write(_ value: ListBundleItem, into buf: inout [UInt8]) { + FfiConverterTypeBundleSourceKind.write(value.kind, into: &buf) + FfiConverterString.write(value.name, into: &buf) + FfiConverterString.write(value.version, into: &buf) + FfiConverterBool.write(value.current, into: &buf) + FfiConverterTypeBundleManifestMetadata.write(value.metadata, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeListBundleItem_lift(_ buf: RustBuffer) throws -> ListBundleItem { + return try FfiConverterTypeListBundleItem.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeListBundleItem_lower(_ value: ListBundleItem) -> RustBuffer { + return FfiConverterTypeListBundleItem.lower(value) +} + + +/** + * Summary of a bundle returned by the remote listing endpoint. + */ +public struct ListRemoteBundleInfo: Equatable, Hashable { + public var name: String + public var version: String + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(name: String, version: String) { + self.name = name + self.version = version + } + + + + +} + +#if compiler(>=6) +extension ListRemoteBundleInfo: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeListRemoteBundleInfo: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> ListRemoteBundleInfo { + return + try ListRemoteBundleInfo( + name: FfiConverterString.read(from: &buf), + version: FfiConverterString.read(from: &buf) + ) + } + + public static func write(_ value: ListRemoteBundleInfo, into buf: inout [UInt8]) { + FfiConverterString.write(value.name, into: &buf) + FfiConverterString.write(value.version, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeListRemoteBundleInfo_lift(_ buf: RustBuffer) throws -> ListRemoteBundleInfo { + return try FfiConverterTypeListRemoteBundleInfo.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeListRemoteBundleInfo_lower(_ value: ListRemoteBundleInfo) -> RustBuffer { + return FfiConverterTypeListRemoteBundleInfo.lower(value) +} + + +/** + * Full metadata returned when fetching or downloading a specific bundle version. + */ +public struct RemoteBundleInfo: Equatable, Hashable { + public var name: String + public var version: String + public var etag: String? + public var integrity: String? + public var signature: String? + public var lastModified: String? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(name: String, version: String, etag: String?, integrity: String?, signature: String?, lastModified: String?) { + self.name = name + self.version = version + self.etag = etag + self.integrity = integrity + self.signature = signature + self.lastModified = lastModified + } + + + + +} + +#if compiler(>=6) +extension RemoteBundleInfo: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeRemoteBundleInfo: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> RemoteBundleInfo { + return + try RemoteBundleInfo( + name: FfiConverterString.read(from: &buf), + version: FfiConverterString.read(from: &buf), + etag: FfiConverterOptionString.read(from: &buf), + integrity: FfiConverterOptionString.read(from: &buf), + signature: FfiConverterOptionString.read(from: &buf), + lastModified: FfiConverterOptionString.read(from: &buf) + ) + } + + public static func write(_ value: RemoteBundleInfo, into buf: inout [UInt8]) { + FfiConverterString.write(value.name, into: &buf) + FfiConverterString.write(value.version, into: &buf) + FfiConverterOptionString.write(value.etag, into: &buf) + FfiConverterOptionString.write(value.integrity, into: &buf) + FfiConverterOptionString.write(value.signature, into: &buf) + FfiConverterOptionString.write(value.lastModified, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeRemoteBundleInfo_lift(_ buf: RustBuffer) throws -> RemoteBundleInfo { + return try FfiConverterTypeRemoteBundleInfo.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeRemoteBundleInfo_lower(_ value: RemoteBundleInfo) -> RustBuffer { + return FfiConverterTypeRemoteBundleInfo.lower(value) +} + + +/** + * Configuration passed to the updater to enable signature verification. + */ +public struct SignatureVerifierOptions: Equatable, Hashable { + public var algorithm: SignatureAlgorithm + public var key: SignatureVerifyingKey + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(algorithm: SignatureAlgorithm, key: SignatureVerifyingKey) { + self.algorithm = algorithm + self.key = key + } + + + + +} + +#if compiler(>=6) +extension SignatureVerifierOptions: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeSignatureVerifierOptions: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SignatureVerifierOptions { + return + try SignatureVerifierOptions( + algorithm: FfiConverterTypeSignatureAlgorithm.read(from: &buf), + key: FfiConverterTypeSignatureVerifyingKey.read(from: &buf) + ) + } + + public static func write(_ value: SignatureVerifierOptions, into buf: inout [UInt8]) { + FfiConverterTypeSignatureAlgorithm.write(value.algorithm, into: &buf) + FfiConverterTypeSignatureVerifyingKey.write(value.key, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeSignatureVerifierOptions_lift(_ buf: RustBuffer) throws -> SignatureVerifierOptions { + return try FfiConverterTypeSignatureVerifierOptions.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeSignatureVerifierOptions_lower(_ value: SignatureVerifierOptions) -> RustBuffer { + return FfiConverterTypeSignatureVerifierOptions.lower(value) +} + + +/** + * Key data for signature verification. + * Use `pem` for PEM-encoded text keys, `der` for DER/raw binary keys. + */ +public struct SignatureVerifyingKey: Equatable, Hashable { + public var format: VerifyingKeyFormat + public var pem: String? + public var der: Data? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init(format: VerifyingKeyFormat, pem: String?, der: Data?) { + self.format = format + self.pem = pem + self.der = der + } + + + + +} + +#if compiler(>=6) +extension SignatureVerifyingKey: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeSignatureVerifyingKey: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SignatureVerifyingKey { + return + try SignatureVerifyingKey( + format: FfiConverterTypeVerifyingKeyFormat.read(from: &buf), + pem: FfiConverterOptionString.read(from: &buf), + der: FfiConverterOptionData.read(from: &buf) + ) + } + + public static func write(_ value: SignatureVerifyingKey, into buf: inout [UInt8]) { + FfiConverterTypeVerifyingKeyFormat.write(value.format, into: &buf) + FfiConverterOptionString.write(value.pem, into: &buf) + FfiConverterOptionData.write(value.der, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeSignatureVerifyingKey_lift(_ buf: RustBuffer) throws -> SignatureVerifyingKey { + return try FfiConverterTypeSignatureVerifyingKey.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeSignatureVerifyingKey_lower(_ value: SignatureVerifyingKey) -> RustBuffer { + return FfiConverterTypeSignatureVerifyingKey.lower(value) +} + + +/** + * Optional configuration for the [`Updater`]. + */ +public struct UpdaterOptions: Equatable, Hashable { + /** + * Release channel (e.g. `"stable"`, `"beta"`). Passed as a query parameter to the remote. + */ + public var channel: String? + public var integrityPolicy: IntegrityPolicy? + /** + * When set, the updater verifies the bundle signature before applying an update. + */ + public var signatureVerifier: SignatureVerifierOptions? + + // Default memberwise initializers are never public by default, so we + // declare one manually. + public init( + /** + * Release channel (e.g. `"stable"`, `"beta"`). Passed as a query parameter to the remote. + */channel: String?, integrityPolicy: IntegrityPolicy?, + /** + * When set, the updater verifies the bundle signature before applying an update. + */signatureVerifier: SignatureVerifierOptions?) { + self.channel = channel + self.integrityPolicy = integrityPolicy + self.signatureVerifier = signatureVerifier + } + + + + +} + +#if compiler(>=6) +extension UpdaterOptions: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeUpdaterOptions: FfiConverterRustBuffer { + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UpdaterOptions { + return + try UpdaterOptions( + channel: FfiConverterOptionString.read(from: &buf), + integrityPolicy: FfiConverterOptionTypeIntegrityPolicy.read(from: &buf), + signatureVerifier: FfiConverterOptionTypeSignatureVerifierOptions.read(from: &buf) + ) + } + + public static func write(_ value: UpdaterOptions, into buf: inout [UInt8]) { + FfiConverterOptionString.write(value.channel, into: &buf) + FfiConverterOptionTypeIntegrityPolicy.write(value.integrityPolicy, into: &buf) + FfiConverterOptionTypeSignatureVerifierOptions.write(value.signatureVerifier, into: &buf) + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUpdaterOptions_lift(_ buf: RustBuffer) throws -> UpdaterOptions { + return try FfiConverterTypeUpdaterOptions.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeUpdaterOptions_lower(_ value: UpdaterOptions) -> RustBuffer { + return FfiConverterTypeUpdaterOptions.lower(value) +} + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * Whether a bundle was loaded from the builtin (read-only, shipped with the app) + * or the remote (writable, downloaded at runtime) directory. + */ + +public enum BundleSourceKind: Equatable, Hashable { + + case builtin + case remote + + + + + +} + +#if compiler(>=6) +extension BundleSourceKind: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeBundleSourceKind: FfiConverterRustBuffer { + typealias SwiftType = BundleSourceKind + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> BundleSourceKind { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .builtin + + case 2: return .remote + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: BundleSourceKind, into buf: inout [UInt8]) { + switch value { + + + case .builtin: + writeInt(&buf, Int32(1)) + + + case .remote: + writeInt(&buf, Int32(2)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSourceKind_lift(_ buf: RustBuffer) throws -> BundleSourceKind { + return try FfiConverterTypeBundleSourceKind.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeBundleSourceKind_lower(_ value: BundleSourceKind) -> RustBuffer { + return FfiConverterTypeBundleSourceKind.lower(value) +} + + + +/** + * Top-level error type exposed across the FFI boundary. + * + * Errors are flattened to string messages (`flat_error`) because structured + * error types cannot be projected into all UniFFI target languages. + */ +public enum Error: Swift.Error, Equatable, Hashable, Foundation.LocalizedError { + + + + /** + * Propagated from the `wvb` core library. + */ + case Core(message: String) + + /** + * Invalid HTTP header name or value. + */ + case Http(message: String) + + /** + * Signature key parsing or verification failure. + */ + case Signature(message: String) + + + + + + + + public var errorDescription: String? { + String(reflecting: self) + } + +} + +#if compiler(>=6) +extension Error: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeError: FfiConverterRustBuffer { + typealias SwiftType = Error + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Error { + let variant: Int32 = try readInt(&buf) + switch variant { + + + + + case 1: return .Core( + message: try FfiConverterString.read(from: &buf) + ) + + case 2: return .Http( + message: try FfiConverterString.read(from: &buf) + ) + + case 3: return .Signature( + message: try FfiConverterString.read(from: &buf) + ) + + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: Error, into buf: inout [UInt8]) { + switch value { + + + + + case .Core(_ /* message is ignored*/): + writeInt(&buf, Int32(1)) + case .Http(_ /* message is ignored*/): + writeInt(&buf, Int32(2)) + case .Signature(_ /* message is ignored*/): + writeInt(&buf, Int32(3)) + + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeError_lift(_ buf: RustBuffer) throws -> Error { + return try FfiConverterTypeError.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeError_lower(_ value: Error) -> RustBuffer { + return FfiConverterTypeError.lower(value) +} + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * HTTP request method exposed to FFI consumers. + */ + +public enum HttpMethod: Equatable, Hashable { + + case get + case head + case options + case post + case put + case patch + case delete + case trace + case connect + + + + + +} + +#if compiler(>=6) +extension HttpMethod: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeHttpMethod: FfiConverterRustBuffer { + typealias SwiftType = HttpMethod + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> HttpMethod { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .get + + case 2: return .head + + case 3: return .options + + case 4: return .post + + case 5: return .put + + case 6: return .patch + + case 7: return .delete + + case 8: return .trace + + case 9: return .connect + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: HttpMethod, into buf: inout [UInt8]) { + switch value { + + + case .get: + writeInt(&buf, Int32(1)) + + + case .head: + writeInt(&buf, Int32(2)) + + + case .options: + writeInt(&buf, Int32(3)) + + + case .post: + writeInt(&buf, Int32(4)) + + + case .put: + writeInt(&buf, Int32(5)) + + + case .patch: + writeInt(&buf, Int32(6)) + + + case .delete: + writeInt(&buf, Int32(7)) + + + case .trace: + writeInt(&buf, Int32(8)) + + + case .connect: + writeInt(&buf, Int32(9)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeHttpMethod_lift(_ buf: RustBuffer) throws -> HttpMethod { + return try FfiConverterTypeHttpMethod.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeHttpMethod_lower(_ value: HttpMethod) -> RustBuffer { + return FfiConverterTypeHttpMethod.lower(value) +} + + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * Hash algorithm used to compute the [`Subresource Integrity`](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) digest of a bundle. + */ + +public enum IntegrityAlgorithm: Equatable, Hashable { + + case sha256 + case sha384 + case sha512 + + + + + +} + +#if compiler(>=6) +extension IntegrityAlgorithm: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeIntegrityAlgorithm: FfiConverterRustBuffer { + typealias SwiftType = IntegrityAlgorithm + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> IntegrityAlgorithm { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .sha256 + + case 2: return .sha384 + + case 3: return .sha512 + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: IntegrityAlgorithm, into buf: inout [UInt8]) { + switch value { + + + case .sha256: + writeInt(&buf, Int32(1)) + + + case .sha384: + writeInt(&buf, Int32(2)) + + + case .sha512: + writeInt(&buf, Int32(3)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIntegrityAlgorithm_lift(_ buf: RustBuffer) throws -> IntegrityAlgorithm { + return try FfiConverterTypeIntegrityAlgorithm.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIntegrityAlgorithm_lower(_ value: IntegrityAlgorithm) -> RustBuffer { + return FfiConverterTypeIntegrityAlgorithm.lower(value) +} + + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * Controls how the updater handles a missing or mismatched integrity digest. + * + * - `Strict`: reject bundles whose digest doesn't match. + * - `Optional`: verify when a digest is present, skip when absent. + * - `None`: skip integrity verification entirely. + */ + +public enum IntegrityPolicy: Equatable, Hashable { + + case strict + case optional + case none + + + + + +} + +#if compiler(>=6) +extension IntegrityPolicy: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeIntegrityPolicy: FfiConverterRustBuffer { + typealias SwiftType = IntegrityPolicy + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> IntegrityPolicy { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .strict + + case 2: return .optional + + case 3: return .none + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: IntegrityPolicy, into buf: inout [UInt8]) { + switch value { + + + case .strict: + writeInt(&buf, Int32(1)) + + + case .optional: + writeInt(&buf, Int32(2)) + + + case .none: + writeInt(&buf, Int32(3)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIntegrityPolicy_lift(_ buf: RustBuffer) throws -> IntegrityPolicy { + return try FfiConverterTypeIntegrityPolicy.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeIntegrityPolicy_lower(_ value: IntegrityPolicy) -> RustBuffer { + return FfiConverterTypeIntegrityPolicy.lower(value) +} + + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * Digital signature algorithm used to verify bundle authenticity. + */ + +public enum SignatureAlgorithm: Equatable, Hashable { + + case ecdsaSecp256r1 + case ecdsaSecp384r1 + case ed25519 + case rsaPkcs1V15 + case rsaPss + + + + + +} + +#if compiler(>=6) +extension SignatureAlgorithm: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeSignatureAlgorithm: FfiConverterRustBuffer { + typealias SwiftType = SignatureAlgorithm + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SignatureAlgorithm { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .ecdsaSecp256r1 + + case 2: return .ecdsaSecp384r1 + + case 3: return .ed25519 + + case 4: return .rsaPkcs1V15 + + case 5: return .rsaPss + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: SignatureAlgorithm, into buf: inout [UInt8]) { + switch value { + + + case .ecdsaSecp256r1: + writeInt(&buf, Int32(1)) + + + case .ecdsaSecp384r1: + writeInt(&buf, Int32(2)) + + + case .ed25519: + writeInt(&buf, Int32(3)) + + + case .rsaPkcs1V15: + writeInt(&buf, Int32(4)) + + + case .rsaPss: + writeInt(&buf, Int32(5)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeSignatureAlgorithm_lift(_ buf: RustBuffer) throws -> SignatureAlgorithm { + return try FfiConverterTypeSignatureAlgorithm.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeSignatureAlgorithm_lower(_ value: SignatureAlgorithm) -> RustBuffer { + return FfiConverterTypeSignatureAlgorithm.lower(value) +} + + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * Encoding format of the public key provided in [`SignatureVerifyingKey`]. + * + * Not all combinations of algorithm + format are valid; unsupported pairs + * return [`Error::Signature`] at construction time. + */ + +public enum VerifyingKeyFormat: Equatable, Hashable { + + case spkiDer + case spkiPem + case pkcs1Der + case pkcs1Pem + case sec1 + case raw + + + + + +} + +#if compiler(>=6) +extension VerifyingKeyFormat: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeVerifyingKeyFormat: FfiConverterRustBuffer { + typealias SwiftType = VerifyingKeyFormat + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> VerifyingKeyFormat { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .spkiDer + + case 2: return .spkiPem + + case 3: return .pkcs1Der + + case 4: return .pkcs1Pem + + case 5: return .sec1 + + case 6: return .raw + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: VerifyingKeyFormat, into buf: inout [UInt8]) { + switch value { + + + case .spkiDer: + writeInt(&buf, Int32(1)) + + + case .spkiPem: + writeInt(&buf, Int32(2)) + + + case .pkcs1Der: + writeInt(&buf, Int32(3)) + + + case .pkcs1Pem: + writeInt(&buf, Int32(4)) + + + case .sec1: + writeInt(&buf, Int32(5)) + + + case .raw: + writeInt(&buf, Int32(6)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeVerifyingKeyFormat_lift(_ buf: RustBuffer) throws -> VerifyingKeyFormat { + return try FfiConverterTypeVerifyingKeyFormat.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeVerifyingKeyFormat_lower(_ value: VerifyingKeyFormat) -> RustBuffer { + return FfiConverterTypeVerifyingKeyFormat.lower(value) +} + + +// Note that we don't yet support `indirect` for enums. +// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion. +/** + * Bundle format version. Currently only `V1` is defined. + */ + +public enum Version: Equatable, Hashable { + + case v1 + + + + + +} + +#if compiler(>=6) +extension Version: Sendable {} +#endif + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public struct FfiConverterTypeVersion: FfiConverterRustBuffer { + typealias SwiftType = Version + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Version { + let variant: Int32 = try readInt(&buf) + switch variant { + + case 1: return .v1 + + default: throw UniffiInternalError.unexpectedEnumCase + } + } + + public static func write(_ value: Version, into buf: inout [UInt8]) { + switch value { + + + case .v1: + writeInt(&buf, Int32(1)) + + } + } +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeVersion_lift(_ buf: RustBuffer) throws -> Version { + return try FfiConverterTypeVersion.lift(buf) +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +public func FfiConverterTypeVersion_lower(_ value: Version) -> RustBuffer { + return FfiConverterTypeVersion.lower(value) +} + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionUInt32: FfiConverterRustBuffer { + typealias SwiftType = UInt32? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterUInt32.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterUInt32.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionString: FfiConverterRustBuffer { + typealias SwiftType = String? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterString.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterString.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionData: FfiConverterRustBuffer { + typealias SwiftType = Data? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterData.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterData.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeBuildHeaderOptions: FfiConverterRustBuffer { + typealias SwiftType = BuildHeaderOptions? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeBuildHeaderOptions.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeBuildHeaderOptions.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeBuildIndexOptions: FfiConverterRustBuffer { + typealias SwiftType = BuildIndexOptions? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeBuildIndexOptions.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeBuildIndexOptions.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeBuildOptions: FfiConverterRustBuffer { + typealias SwiftType = BuildOptions? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeBuildOptions.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeBuildOptions.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeBundleManifestMetadata: FfiConverterRustBuffer { + typealias SwiftType = BundleManifestMetadata? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeBundleManifestMetadata.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeBundleManifestMetadata.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeBundleSourceVersion: FfiConverterRustBuffer { + typealias SwiftType = BundleSourceVersion? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeBundleSourceVersion.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeBundleSourceVersion.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeIndexEntry: FfiConverterRustBuffer { + typealias SwiftType = IndexEntry? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeIndexEntry.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeIndexEntry.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeSignatureVerifierOptions: FfiConverterRustBuffer { + typealias SwiftType = SignatureVerifierOptions? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeSignatureVerifierOptions.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeSignatureVerifierOptions.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeUpdaterOptions: FfiConverterRustBuffer { + typealias SwiftType = UpdaterOptions? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeUpdaterOptions.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeUpdaterOptions.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeIntegrityPolicy: FfiConverterRustBuffer { + typealias SwiftType = IntegrityPolicy? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeIntegrityPolicy.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeIntegrityPolicy.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionTypeVersion: FfiConverterRustBuffer { + typealias SwiftType = Version? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterTypeVersion.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterTypeVersion.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterOptionDictionaryStringString: FfiConverterRustBuffer { + typealias SwiftType = [String: String]? + + public static func write(_ value: SwiftType, into buf: inout [UInt8]) { + guard let value = value else { + writeInt(&buf, Int8(0)) + return + } + writeInt(&buf, Int8(1)) + FfiConverterDictionaryStringString.write(value, into: &buf) + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType { + switch try readInt(&buf) as Int8 { + case 0: return nil + case 1: return try FfiConverterDictionaryStringString.read(from: &buf) + default: throw UniffiInternalError.unexpectedOptionalTag + } + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterSequenceString: FfiConverterRustBuffer { + typealias SwiftType = [String] + + public static func write(_ value: [String], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for item in value { + FfiConverterString.write(item, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String] { + let len: Int32 = try readInt(&buf) + var seq = [String]() + seq.reserveCapacity(Int(len)) + for _ in 0 ..< len { + seq.append(try FfiConverterString.read(from: &buf)) + } + return seq + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterSequenceTypeListBundleItem: FfiConverterRustBuffer { + typealias SwiftType = [ListBundleItem] + + public static func write(_ value: [ListBundleItem], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for item in value { + FfiConverterTypeListBundleItem.write(item, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [ListBundleItem] { + let len: Int32 = try readInt(&buf) + var seq = [ListBundleItem]() + seq.reserveCapacity(Int(len)) + for _ in 0 ..< len { + seq.append(try FfiConverterTypeListBundleItem.read(from: &buf)) + } + return seq + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterSequenceTypeListRemoteBundleInfo: FfiConverterRustBuffer { + typealias SwiftType = [ListRemoteBundleInfo] + + public static func write(_ value: [ListRemoteBundleInfo], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for item in value { + FfiConverterTypeListRemoteBundleInfo.write(item, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [ListRemoteBundleInfo] { + let len: Int32 = try readInt(&buf) + var seq = [ListRemoteBundleInfo]() + seq.reserveCapacity(Int(len)) + for _ in 0 ..< len { + seq.append(try FfiConverterTypeListRemoteBundleInfo.read(from: &buf)) + } + return seq + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterDictionaryStringString: FfiConverterRustBuffer { + public static func write(_ value: [String: String], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for (key, value) in value { + FfiConverterString.write(key, into: &buf) + FfiConverterString.write(value, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String: String] { + let len: Int32 = try readInt(&buf) + var dict = [String: String]() + dict.reserveCapacity(Int(len)) + for _ in 0..=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterDictionaryStringTypeIndexEntry: FfiConverterRustBuffer { + public static func write(_ value: [String: IndexEntry], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for (key, value) in value { + FfiConverterString.write(key, into: &buf) + FfiConverterTypeIndexEntry.write(value, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String: IndexEntry] { + let len: Int32 = try readInt(&buf) + var dict = [String: IndexEntry]() + dict.reserveCapacity(Int(len)) + for _ in 0..>() + +fileprivate func uniffiRustCallAsync( + rustFutureFunc: () -> UInt64, + pollFunc: (UInt64, @escaping UniffiRustFutureContinuationCallback, UInt64) -> (), + completeFunc: (UInt64, UnsafeMutablePointer) -> F, + freeFunc: (UInt64) -> (), + liftFunc: (F) throws -> T, + errorHandler: ((RustBuffer) throws -> Swift.Error)? +) async throws -> T { + // Make sure to call the ensure init function since future creation doesn't have a + // RustCallStatus param, so doesn't use makeRustCall() + uniffiEnsureWvbFfiInitialized() + let rustFuture = rustFutureFunc() + defer { + freeFunc(rustFuture) + } + var pollResult: Int8; + repeat { + pollResult = await withUnsafeContinuation { + pollFunc( + rustFuture, + { handle, pollResult in + uniffiFutureContinuationCallback(handle: handle, pollResult: pollResult) + }, + uniffiContinuationHandleMap.insert(obj: $0) + ) + } + } while pollResult != UNIFFI_RUST_FUTURE_POLL_READY + + return try liftFunc(makeRustCall( + { completeFunc(rustFuture, $0) }, + errorHandler: errorHandler + )) +} + +// Callback handlers for an async calls. These are invoked by Rust when the future is ready. They +// lift the return value or error and resume the suspended function. +fileprivate func uniffiFutureContinuationCallback(handle: UInt64, pollResult: Int8) { + if let continuation = try? uniffiContinuationHandleMap.remove(handle: handle) { + continuation.resume(returning: pollResult) + } else { + print("uniffiFutureContinuationCallback invalid handle") + } +} +/** + * Reads a bundle from a file path using async I/O. + */ +public func readBundle(filepath: String)async throws -> Bundle { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_func_read_bundle(FfiConverterString.lower(filepath) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterTypeBundle_lift, + errorHandler: FfiConverterTypeError_lift + ) +} +/** + * Deserializes a bundle from an in-memory byte slice. + * Prefer [`read_bundle`] for large files to avoid loading everything into memory. + */ +public func readBundleFromBytes(data: Data)throws -> Bundle { + return try FfiConverterTypeBundle_lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_func_read_bundle_from_bytes( + FfiConverterData.lower(data),$0 + ) +}) +} +/** + * Writes a bundle to a file path using async I/O. Returns the number of bytes written. + */ +public func writeBundle(bundle: Bundle, filepath: String)async throws -> UInt64 { + return + try await uniffiRustCallAsync( + rustFutureFunc: { + uniffi_wvb_ffi_fn_func_write_bundle(FfiConverterTypeBundle_lower(bundle),FfiConverterString.lower(filepath) + ) + }, + pollFunc: ffi_wvb_ffi_rust_future_poll_u64, + completeFunc: ffi_wvb_ffi_rust_future_complete_u64, + freeFunc: ffi_wvb_ffi_rust_future_free_u64, + liftFunc: FfiConverterUInt64.lift, + errorHandler: FfiConverterTypeError_lift + ) +} +/** + * Serializes a bundle into an in-memory byte vector. + */ +public func writeBundleToBytes(bundle: Bundle)throws -> Data { + return try FfiConverterData.lift(try rustCallWithError(FfiConverterTypeError_lift) { + uniffi_wvb_ffi_fn_func_write_bundle_to_bytes( + FfiConverterTypeBundle_lower(bundle),$0 + ) +}) +} + +private enum InitializationResult { + case ok + case contractVersionMismatch + case apiChecksumMismatch +} +// Use a global variable to perform the versioning checks. Swift ensures that +// the code inside is only computed once. +private let initializationResult: InitializationResult = { + // Get the bindings contract version from our ComponentInterface + let bindings_contract_version = 30 + // Get the scaffolding contract version by calling the into the dylib + let scaffolding_contract_version = ffi_wvb_ffi_uniffi_contract_version() + if bindings_contract_version != scaffolding_contract_version { + return InitializationResult.contractVersionMismatch + } + if (uniffi_wvb_ffi_checksum_func_read_bundle() != 45171) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_func_read_bundle_from_bytes() != 49816) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_func_write_bundle() != 56814) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_func_write_bundle_to_bytes() != 12678) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundle_descriptor() != 24504) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundle_get_data() != 55398) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundle_get_data_checksum() != 18429) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlebuilder_build() != 30478) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlebuilder_contains_entry() != 25173) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlebuilder_entry_paths() != 50740) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlebuilder_insert_entry() != 22469) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlebuilder_remove_entry() != 3328) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlebuilder_version() != 60038) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundledescriptor_contains_path() != 61140) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundledescriptor_get_index_entry() != 32313) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundledescriptor_header() != 28740) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundledescriptor_index() != 45942) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundledescriptor_index_entries() != 42039) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_header_index_end_offset() != 1675) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_header_index_size() != 56804) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_header_version() != 39898) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_index_contains_path() != 48092) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_index_entries() != 6774) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_index_get_entry() != 50953) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundleurlhandler_handle() != 36637) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_localurlhandler_handle() != 26868) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_remote_download() != 50807) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_remote_download_version() != 39083) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_remote_get_info() != 50561) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_remote_list_bundles() != 28549) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_fetch_builtin_bundle() != 33213) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_fetch_bundle() != 38812) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_fetch_descriptor() != 28723) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_fetch_remote_bundle() != 44933) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_get_builtin_bundle_filepath() != 17928) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_get_remote_bundle_filepath() != 23450) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_list_bundles() != 34449) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_load_builtin_metadata() != 4913) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_load_descriptor() != 30101) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_load_remote_metadata() != 61273) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_load_version() != 32808) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_prune_remote_bundles() != 48913) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_remote_retained_versions() != 47892) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_remove_remote_bundle() != 4825) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_resolve_filepath() != 55355) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_unload_descriptor() != 36116) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_update_version() != 52326) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_bundlesource_write_remote_bundle() != 49447) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_loadeddescriptor_descriptor() != 52553) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_loadeddescriptor_get_data() != 27083) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_loadeddescriptor_get_data_checksum() != 38729) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_updater_download_update() != 45642) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_updater_get_update() != 5468) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_updater_install() != 28133) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_method_updater_list_remotes() != 35179) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_constructor_bundlebuilder_new() != 7081) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_constructor_bundleurlhandler_new() != 25981) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_constructor_localurlhandler_new() != 33598) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_constructor_remote_new() != 25828) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_constructor_bundlesource_new() != 59923) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_wvb_ffi_checksum_constructor_updater_new() != 37366) { + return InitializationResult.apiChecksumMismatch + } + + return InitializationResult.ok +}() + +// Make the ensure init function public so that other modules which have external type references to +// our types can call it. +public func uniffiEnsureWvbFfiInitialized() { + switch initializationResult { + case .ok: + break + case .contractVersionMismatch: + fatalError("UniFFI contract version mismatch: try cleaning and rebuilding your project") + case .apiChecksumMismatch: + fatalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } +} + +// swiftlint:enable all \ No newline at end of file diff --git a/Sources/WebViewBundle/WebViewBundleProtocol.swift b/Sources/WebViewBundle/WebViewBundleProtocol.swift new file mode 100644 index 0000000..0fd401a --- /dev/null +++ b/Sources/WebViewBundle/WebViewBundleProtocol.swift @@ -0,0 +1,35 @@ +import Foundation + +/// Binds a URL scheme handled inside a `WKWebView` to a WebViewBundle request +/// handler. +/// +/// Each protocol owns a scheme, and requests to that scheme are routed to the +/// matching handler which resolves them against the bundle source or a local +/// server. The bundle name is resolved from the first label of the request host, +/// e.g. `app://app.wvb/index.html` -> bundle `"app"`, path `"/index.html"`. +/// +/// `WKWebView` only allows scheme handlers for non-reserved schemes, so use a +/// custom scheme (not `http`/`https`). +public enum WebViewBundleProtocol: Sendable { + /// Serves entries from the WebViewBundle source, backed by a + /// ``BundleUrlHandler``. + case bundle(scheme: String) + + /// Proxies requests to local HTTP servers, backed by a ``LocalUrlHandler``. + /// + /// `hosts` maps a virtual host to a local base URL, e.g. + /// `["myapp": "http://localhost:8080"]`. Unlike ``bundle(scheme:)`` — where + /// the bundle name is only the *first label* of the host — the `hosts` key is + /// matched against the **entire** request URL host. So a request to + /// `local://myapp/index.html` requires the key `"myapp"`, while + /// `local://app.wvb/index.html` would require the key `"app.wvb"`. + case local(scheme: String, hosts: [String: String]) + + /// The URL scheme this protocol handles. + public var scheme: String { + switch self { + case let .bundle(scheme): return scheme + case let .local(scheme, _): return scheme + } + } +} diff --git a/Sources/WebViewBundle/WebViewBundleSchemeHandler.swift b/Sources/WebViewBundle/WebViewBundleSchemeHandler.swift new file mode 100644 index 0000000..7acb1d6 --- /dev/null +++ b/Sources/WebViewBundle/WebViewBundleSchemeHandler.swift @@ -0,0 +1,83 @@ +import Foundation + +#if canImport(WebKit) +import WebKit + +/// A `WKURLSchemeHandler` that serves WebViewBundle resources for a single +/// scheme by routing requests to a UniFFI handler. +/// +/// WebKit invokes the scheme-handler callbacks on the main actor. The +/// (suspending) FFI handler runs off the main thread; its result is delivered +/// back to the task on the main actor, and skipped if the task was already +/// stopped. +@MainActor +final class WebViewBundleSchemeHandler: NSObject, WKURLSchemeHandler { + private let handler: any WebViewBundleRequestHandler + private let onError: (@Sendable (any Swift.Error) -> Void)? + + // Tracks the tasks WebKit currently considers active. Touched only on the + // main actor (WebKit calls start/stop there, and the completion below + // resumes on the main actor), so a stopped task is never fed. + private var activeTasks = Set() + + nonisolated init( + handler: any WebViewBundleRequestHandler, + onError: (@Sendable (any Swift.Error) -> Void)? = nil + ) { + self.handler = handler + self.onError = onError + super.init() + } + + func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) { + let id = ObjectIdentifier(urlSchemeTask) + activeTasks.insert(id) + + let request = urlSchemeTask.request + let method = HttpMethod.from(request.httpMethod) + let uri = request.url?.absoluteString ?? "" + let headers = request.allHTTPHeaderFields + let url = request.url ?? URL(string: "about:blank")! + let handler = self.handler + + // Inherits the main actor; the `await` lets the FFI handler run off-main + // (it is `nonisolated`) and resumes here back on the main actor. + Task { + let result: Result + do { + let response = try await handler.handle(method: method, uri: uri, headers: headers) + result = .success(response) + } catch { + result = .failure(error) + } + self.complete(urlSchemeTask, id: id, url: url, result: result) + } + } + + func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) { + activeTasks.remove(ObjectIdentifier(urlSchemeTask)) + } + + private func complete( + _ task: WKURLSchemeTask, + id: ObjectIdentifier, + url: URL, + result: Result + ) { + // Start, stop and completion are all serialized on the main actor, so + // this check is race-free: a stopped task is never fed. + guard activeTasks.remove(id) != nil else { return } + switch result { + case let .success(response): + task.didReceive(response.makeURLResponse(url: url)) + task.didReceive(response.body) + task.didFinish() + case let .failure(error): + // WebKit surfaces this as a load failure; `onError` is the + // observability hook. + onError?(error) + task.didFailWithError(error) + } + } +} +#endif diff --git a/TestApp/.gitignore b/TestApp/.gitignore new file mode 100644 index 0000000..1f17e52 --- /dev/null +++ b/TestApp/.gitignore @@ -0,0 +1,8 @@ +*.xcodeproj/ +*.xcworkspace/ +Derived/ +.build-xc/ +.tuist-bin/ +xcuserdata/ +*.xcuserstate +.DS_Store diff --git a/TestApp/Fixtures/bundles/hacker-news/hacker-news_0.0.1.wvb b/TestApp/Fixtures/bundles/hacker-news/hacker-news_0.0.1.wvb new file mode 100644 index 0000000..ff309bc Binary files /dev/null and b/TestApp/Fixtures/bundles/hacker-news/hacker-news_0.0.1.wvb differ diff --git a/TestApp/Fixtures/bundles/manifest.json b/TestApp/Fixtures/bundles/manifest.json new file mode 100644 index 0000000..f1c78a1 --- /dev/null +++ b/TestApp/Fixtures/bundles/manifest.json @@ -0,0 +1,7 @@ +{ + "manifestVersion": 1, + "entries": { + "next": { "versions": { "1.0.0": {} }, "currentVersion": "1.0.0" }, + "hacker-news": { "versions": { "0.0.1": {} }, "currentVersion": "0.0.1" } + } +} diff --git a/TestApp/Fixtures/bundles/next/next_1.0.0.wvb b/TestApp/Fixtures/bundles/next/next_1.0.0.wvb new file mode 100644 index 0000000..865fc2c Binary files /dev/null and b/TestApp/Fixtures/bundles/next/next_1.0.0.wvb differ diff --git a/TestApp/Project.swift b/TestApp/Project.swift new file mode 100644 index 0000000..917c0a5 --- /dev/null +++ b/TestApp/Project.swift @@ -0,0 +1,33 @@ +import ProjectDescription + +let project = Project( + name: "TestApp", + packages: [ + // The WebViewBundle Swift package at the repository root. + .local(path: ".."), + ], + targets: [ + .target( + name: "TestApp", + destinations: .iOS, + product: .app, + bundleId: "dev.wvb.ios.testapp", + deploymentTargets: .iOS("16.0"), + infoPlist: .extendingDefault(with: [ + "UILaunchScreen": .dictionary([:]), + ]), + sources: ["TestApp/**/*.swift"], + resources: [ + // Shipped as the read-only builtin bundle directory; lands at + // `/bundles`, which is `BundleSource.defaultBuiltinDir()`. + .folderReference(path: "Fixtures/bundles"), + ], + dependencies: [ + .package(product: "WebViewBundle"), + ], + settings: .settings(base: [ + "SWIFT_VERSION": "5.0", + ]) + ), + ] +) diff --git a/TestApp/TestApp/ContentView.swift b/TestApp/TestApp/ContentView.swift new file mode 100644 index 0000000..b678c01 --- /dev/null +++ b/TestApp/TestApp/ContentView.swift @@ -0,0 +1,80 @@ +import Foundation +import SwiftUI +import WebKit +import WebViewBundle + +@MainActor +final class WebViewModel: NSObject, ObservableObject, WKNavigationDelegate { + @Published var status: String = "loading" + let webView: WKWebView + private var wvb: WebViewBundle? + + private static let entryURL = URL(string: "testapp://hacker-news.wvb")! + + private struct NavStep { + let label: String + let clickSelector: String? + let expectPath: String + let expectHeading: String + let needSelector: String + } + + override init() { + var buildError: String? + do { + let instance = try webViewBundle( + WebViewBundleConfig( + protocols: [.bundle(scheme: "testapp")], + )) + self.wvb = instance + self.webView = instance.makeWebView() + } catch { + self.wvb = nil + self.webView = WKWebView() + buildError = "ERROR build \(error)" + } + super.init() + webView.navigationDelegate = self + if #available(iOS 16.4, *) { + webView.isInspectable = true + } + if let buildError { + print("error: \(buildError)") + } + } + + func start() { + guard wvb != nil else { return } + webView.load(URLRequest(url: Self.entryURL)) + } + + func webView( + _ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Swift.Error + ) { + print("ERROR nav \(error.localizedDescription)") + } + + func webView( + _ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, + withError error: Swift.Error + ) { + print("ERROR provisional \(error.localizedDescription)") + } +} + +struct WebViewContainer: UIViewRepresentable { + let webView: WKWebView + func makeUIView(context: Context) -> WKWebView { webView } + func updateUIView(_ uiView: WKWebView, context: Context) {} +} + +struct ContentView: View { + @StateObject private var model = WebViewModel() + + var body: some View { + VStack(spacing: 0) { + WebViewContainer(webView: model.webView) + } + .onAppear { model.start() } + } +} diff --git a/TestApp/TestApp/TestApp.swift b/TestApp/TestApp/TestApp.swift new file mode 100644 index 0000000..6461d3a --- /dev/null +++ b/TestApp/TestApp/TestApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct TestApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/TestApp/Tuist.swift b/TestApp/Tuist.swift new file mode 100644 index 0000000..ff8e64f --- /dev/null +++ b/TestApp/Tuist.swift @@ -0,0 +1,3 @@ +import ProjectDescription + +let config = Config() diff --git a/Tests/WebViewBundleTests/WebViewBundleTests.swift b/Tests/WebViewBundleTests/WebViewBundleTests.swift index 104908b..1b68889 100644 --- a/Tests/WebViewBundleTests/WebViewBundleTests.swift +++ b/Tests/WebViewBundleTests/WebViewBundleTests.swift @@ -1,9 +1,160 @@ +import Foundation import Testing @testable import WebViewBundle -@Test func example() async throws { - // Write your test here and use APIs like `#expect(...)` to check expected conditions. - // Swift Testing Documentation - // https://developer.apple.com/documentation/testing +@Suite("WebViewBundle") +struct WebViewBundleTests { + /// Builds a one-bundle source on disk: a `.wvb` with the given entries plus a + /// manifest pinning it as the current remote version. Returns the source. + private func makeSource( + bundleName: String = "app", + version: String = "1.0.0", + entries: [(path: String, data: Data, contentType: String)] + ) throws -> BundleSource { + let tmp = FileManager.default.temporaryDirectory + .appendingPathComponent("wvb-test-\(UUID().uuidString)") + let remote = tmp.appendingPathComponent("remote") + let builtin = tmp.appendingPathComponent("builtin") + let bundleDir = remote.appendingPathComponent(bundleName) + try FileManager.default.createDirectory(at: bundleDir, withIntermediateDirectories: true) + try FileManager.default.createDirectory(at: builtin, withIntermediateDirectories: true) + + let manifest = #"{"manifestVersion":1,"entries":{"\#(bundleName)":{"versions":{"\#(version)":{}},"currentVersion":"\#(version)"}}}"# + try Data(manifest.utf8).write(to: remote.appendingPathComponent("manifest.json")) + + let builder = BundleBuilder(version: nil) + for entry in entries { + _ = try builder.insertEntry( + path: entry.path, + data: entry.data, + contentType: entry.contentType, + headers: nil + ) + } + let bundle = try builder.build(options: nil) + let bytes = try writeBundleToBytes(bundle: bundle) + try bytes.write(to: bundleDir.appendingPathComponent("\(bundleName)_\(version).wvb")) + + return BundleSource(config: BundleSourceConfig( + builtinDir: builtin.path, + remoteDir: remote.path, + builtinManifestFilepath: nil, + remoteManifestFilepath: nil + )) + } + + @Test("BundleUrlHandler serves an entry as 200") + func bundleHandlerServesEntry() async throws { + let html = "hi" + let source = try makeSource(entries: [ + (path: "/index.html", data: Data(html.utf8), contentType: "text/html") + ]) + let handler: any WebViewBundleRequestHandler = BundleUrlHandler(source: source) + + let response = try await handler.handle( + method: .get, + uri: "app://app.wvb/index.html", + headers: nil + ) + + #expect(response.status == 200) + #expect(String(decoding: response.body, as: UTF8.self) == html) + #expect(response.headers["content-type"]?.contains("text/html") == true) + } + + @Test("Missing entry returns 404") + func missingEntryIs404() async throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + let handler: any WebViewBundleRequestHandler = BundleUrlHandler(source: source) + + let response = try await handler.handle( + method: .get, + uri: "app://app.wvb/missing.html", + headers: nil + ) + + #expect(response.status == 404) + } + + @Test("Facade exposes its schemes") + func facadeSchemes() throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + let wvb = try WebViewBundle( + source: source, + protocols: [.bundle(scheme: "app"), .local(scheme: "local", hosts: ["myapp": "http://localhost:8080"])] + ) + + #expect(wvb.schemes == ["app", "local"]) + #expect(wvb.remote == nil) + #expect(wvb.updater == nil) + } + + @Test("Duplicate scheme throws instead of trapping") + func duplicateSchemeThrows() throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + #expect(throws: WebViewBundleError.duplicateScheme("app")) { + _ = try WebViewBundle( + source: source, + protocols: [.bundle(scheme: "app"), .bundle(scheme: "app")] + ) + } + } + + @Test("Empty scheme throws instead of trapping") + func emptySchemeThrows() throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + #expect(throws: WebViewBundleError.emptyScheme) { + _ = try WebViewBundle(source: source, protocols: [.bundle(scheme: "")]) + } + } + + @Test("Invalid scheme throws instead of trapping") + func invalidSchemeThrows() throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + #expect(throws: WebViewBundleError.invalidScheme("1app")) { + _ = try WebViewBundle(source: source, protocols: [.bundle(scheme: "1app")]) + } + } + + @Test("Reserved scheme throws instead of trapping") + func reservedSchemeThrows() throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + #expect(throws: WebViewBundleError.reservedScheme("https")) { + _ = try WebViewBundle(source: source, protocols: [.bundle(scheme: "https")]) + } + } + + @Test("Case-insensitive duplicate scheme throws") + func caseInsensitiveDuplicateSchemeThrows() throws { + let source = try makeSource(entries: [ + (path: "/index.html", data: Data("ok".utf8), contentType: "text/html") + ]) + #expect(throws: WebViewBundleError.duplicateScheme("App")) { + _ = try WebViewBundle( + source: source, + protocols: [.bundle(scheme: "app"), .bundle(scheme: "App")] + ) + } + } + + @Test("HttpMethod maps from request strings") + func httpMethodFrom() { + #expect(HttpMethod.from("get") == .get) + #expect(HttpMethod.from("POST") == .post) + #expect(HttpMethod.from(nil) == .get) + #expect(HttpMethod.from("weird") == .get) + } } diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 0000000..e2b3ebc --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.yarn/ +*.log +.appium/ diff --git a/e2e/.yarnrc.yml b/e2e/.yarnrc.yml new file mode 100644 index 0000000..446307c --- /dev/null +++ b/e2e/.yarnrc.yml @@ -0,0 +1,3 @@ +nodeLinker: node-modules +enableScripts: true +npmMinimalAgeGate: 0 diff --git a/e2e/appium.ts b/e2e/appium.ts new file mode 100644 index 0000000..a7e7ffc --- /dev/null +++ b/e2e/appium.ts @@ -0,0 +1,89 @@ +import os from "node:os"; +import path from "node:path"; +import { setTimeout as delay } from "node:timers/promises"; +import { execa, type ResultPromise } from "execa"; + +export const APPIUM_PORT = 4723; + +if (!process.env.APPIUM_HOME) { + process.env.APPIUM_HOME = path.join(os.homedir(), ".appium"); +} + +/** Ensures the given Appium drivers are installed into `APPIUM_HOME` (default `~/.appium`). */ +export async function ensureAppiumDrivers(drivers: string[]): Promise { + const installed = await listInstalledDrivers(); + for (const driver of drivers) { + if (driver in installed) { + continue; + } + console.log(`[appium] installing driver: ${driver}`); + await execa("appium", ["driver", "install", driver], { + preferLocal: true, + stdout: "inherit", + stderr: "inherit", + timeout: 5 * 60_000, + }); + } +} + +async function listInstalledDrivers(): Promise> { + const { stdout } = await execa( + "appium", + ["driver", "list", "--installed", "--json"], + { + preferLocal: true, + reject: false, + }, + ); + try { + return JSON.parse(stdout || "{}"); + } catch { + return {}; + } +} + +export interface AppiumServer { + port: number; + stop: () => Promise; +} + +export async function startAppiumServer( + port = APPIUM_PORT, +): Promise { + console.log(`[appium] starting server on port ${port}`); + const proc: ResultPromise = execa( + "appium", + ["--port", String(port), "--base-path", "/", "--log-level", "error"], + { preferLocal: true, stdout: "inherit", stderr: "inherit" }, + ); + proc.catch(() => {}); + + await waitForAppiumServer(port, 60_000); + + return { + port, + stop: async () => { + proc.kill("SIGTERM"); + await proc.catch(() => {}); + }, + }; +} + +async function waitForAppiumServer( + port: number, + timeoutMs: number, +): Promise { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + const res = await fetch(`http://127.0.0.1:${port}/status`); + if (res.ok) { + return; + } + } catch {} + await delay(500); + } + throw new Error( + `Appium server did not become ready on port ${port} within ${timeoutMs}ms`, + ); +} diff --git a/e2e/context.ts b/e2e/context.ts new file mode 100644 index 0000000..f23352d --- /dev/null +++ b/e2e/context.ts @@ -0,0 +1,174 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { execa } from "execa"; +import { glob } from "tinyglobby"; +import { remote } from "webdriverio"; +import { + APPIUM_PORT, + type AppiumServer, + ensureAppiumDrivers, + startAppiumServer, +} from "./appium.js"; +import { ensureIosSimulator, type IosSimulator } from "./device.js"; + +export const ROOT = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "..", +); +export const BUNDLE_ID = "dev.wvb.ios.testapp"; +export const DEVICE_NAME = process.env.IOS_DEVICE ?? "iPhone 16"; + +export type Driver = Awaited>; + +export interface TestContext { + server: AppiumServer; + device: IosSimulator; + driver: Driver; +} + +/** Locates the built simulator `TestApp.app` (fixed derivedDataPath, then DerivedData). */ +export async function findSimulatorApp(): Promise { + const fixed = path.join( + ROOT, + "TestApp", + ".build-xc", + "Build", + "Products", + "Debug-iphonesimulator", + "TestApp.app", + ); + if (await pathExists(fixed)) { + return fixed; + } + + const pattern = path.join( + os.homedir(), + "Library/Developer/Xcode/DerivedData/TestApp-*/Build/Products/Debug-iphonesimulator/TestApp.app", + ); + const matches = await glob(pattern, { + onlyDirectories: true, + absolute: true, + expandDirectories: false, + }); + if (matches.length === 0) { + return undefined; + } + const withMtime = await Promise.all( + matches.map(async (app) => ({ app, mtime: (await fs.stat(app)).mtimeMs })), + ); + withMtime.sort((a, b) => b.mtime - a.mtime); + // biome-ignore lint/style/noNonNullAssertion: expected + return withMtime[0]!.app; +} + +async function pathExists(p: string): Promise { + try { + await fs.access(p); + return true; + } catch { + return false; + } +} + +export async function createTestContext(): Promise { + const appPath = await findSimulatorApp(); + if (!appPath) { + throw new Error( + "Built TestApp.app not found — the vitest globalSetup build step must run first.", + ); + } + + await ensureAppiumDrivers(["xcuitest"]); + const device = await ensureIosSimulator(DEVICE_NAME); + + console.log( + `[device] installing ${path.basename(appPath)} -> ${device.udid}`, + ); + await execa("xcrun", ["simctl", "install", device.udid, appPath]); + + const server = await startAppiumServer(APPIUM_PORT); + + const wdaTimeout = process.env.CI ? 600_000 : 300_000; + const sessionTimeout = process.env.CI ? 720_000 : 360_000; + + // Launch by `appium:bundleId`; passing `appium:app` at a `.app` *directory* + // trips the XCUITest driver with EISDIR. + const driver = await remote({ + hostname: "127.0.0.1", + port: server.port, + path: "/", + logLevel: "error", + connectionRetryTimeout: sessionTimeout, + connectionRetryCount: 0, + capabilities: { + platformName: "iOS", + "appium:automationName": "XCUITest", + "appium:udid": device.udid, + "appium:deviceName": device.name, + "appium:bundleId": BUNDLE_ID, + "appium:newCommandTimeout": 240, + "appium:wdaLaunchTimeout": wdaTimeout, + "appium:wdaConnectionTimeout": wdaTimeout, + "appium:webviewConnectTimeout": 30_000, + // The WKWebView's inspectable page is reported under a process whose + // bundle id isn't in the driver's default match list, so without this + // the page is missed ("Empty page dictionary") and no WEBVIEW context + // appears. Requires the host Safari "Develop" menu to be enabled. + "appium:additionalWebviewBundleIds": ["*"], + }, + }); + + await switchToWebview(driver); + + return { server, device, driver }; +} + +async function switchToWebview(driver: Driver): Promise { + for (let i = 0; i < 30; i++) { + const contexts = (await driver.getContexts()) as Array< + string | { id: string } + >; + const id = contexts + .map((c) => (typeof c === "string" ? c : c.id)) + .find((c) => typeof c === "string" && c.startsWith("WEBVIEW")); + if (id) { + await driver.switchContext(id); + return; + } + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + throw new Error( + "WEBVIEW context never appeared (is Safari's Develop menu enabled?)", + ); +} + +export async function disposeTestContext( + context: TestContext | undefined, +): Promise { + if (!context) { + return; + } + await context.driver.deleteSession().catch(() => {}); + await context.server.stop(); + if (context.device.bootedByUs && !process.env.WVB_E2E_KEEP) { + await context.device.shutdown(); + } +} + +let active: TestContext | undefined; + +/** Set by `vitest.setup.ts`'s `beforeAll` so specs can reach the live context. */ +export function setActiveContext(context: TestContext | undefined): void { + active = context; +} + +export function getTestContext(): TestContext { + if (!active) { + throw new Error( + "Test context not started — vitest.setup.ts beforeAll did not run.", + ); + } + return active; +} diff --git a/e2e/device.ts b/e2e/device.ts new file mode 100644 index 0000000..09a7944 --- /dev/null +++ b/e2e/device.ts @@ -0,0 +1,86 @@ +import { execa } from "execa"; + +export interface IosSimulator { + udid: string; + name: string; + /** Whether this process booted the device (callers decide whether to shut it down). */ + bootedByUs: boolean; + shutdown: () => Promise; +} + +interface SimDevice { + udid: string; + name: string; + state: string; +} + +async function listIosSimDevices(): Promise { + const { stdout } = await execa("xcrun", [ + "simctl", + "list", + "devices", + "available", + "--json", + ]); + const parsed = JSON.parse(stdout) as { + devices: Record< + string, + Array<{ udid: string; name: string; state: string }> + >; + }; + const out: SimDevice[] = []; + for (const [runtime, devices] of Object.entries(parsed.devices)) { + if (!/iOS/i.test(runtime)) { + continue; + } + for (const d of devices) { + out.push({ udid: d.udid, name: d.name, state: d.state }); + } + } + return out; +} + +export async function ensureIosSimulator( + deviceName: string, +): Promise { + const devices = await listIosSimDevices(); + + const booted = devices.find((d) => d.state === "Booted"); + if (booted != null) { + return { + udid: booted.udid, + name: booted.name, + bootedByUs: false, + shutdown: async () => {}, + }; + } + + const target = + devices.find((d) => d.name === deviceName) ?? + devices.find((d) => /^iPhone/i.test(d.name)); + if (target == null) { + throw new Error( + `No iOS simulator found (looked for "${deviceName}" or any iPhone).`, + ); + } + if (target.name !== deviceName) { + console.log( + `[device] "${deviceName}" not available; falling back to ${target.name}`, + ); + } + console.log( + `[device] booting iOS simulator: ${target.name} (${target.udid})`, + ); + await execa("xcrun", ["simctl", "boot", target.udid]); + await execa("xcrun", ["simctl", "bootstatus", target.udid]); // blocks until fully booted + return { + udid: target.udid, + name: target.name, + bootedByUs: true, + shutdown: async () => { + await execa("xcrun", ["simctl", "shutdown", target.udid], { + reject: false, + }); + }, + }; +} diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 0000000..91b831f --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,24 @@ +{ + "name": "webview-bundle-ios-e2e", + "version": "0.0.0", + "private": true, + "type": "module", + "description": "Appium-driven E2E tests for the WebViewBundle iOS TestApp", + "packageManager": "yarn@4.16.0", + "scripts": { + "test": "vitest run" + }, + "dependencies": { + "@wvb-playground/testing": "^0.0.0", + "@wvb-playground/webview-hacker-news": "^0.0.0" + }, + "devDependencies": { + "@types/node": "^25", + "appium": "^3.5.0", + "execa": "^9.5.2", + "tinyglobby": "^0.2.10", + "typescript": "6.0.3", + "vitest": "4.1.8", + "webdriverio": "9.28.0" + } +} diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts new file mode 100644 index 0000000..dadaab4 --- /dev/null +++ b/e2e/smoke.spec.ts @@ -0,0 +1,17 @@ +import { createAppiumDriver } from "@wvb-playground/testing/appium"; +import { testCases } from "@wvb-playground/webview-hacker-news/testing"; +import { describe, test } from "vitest"; +import { getTestContext } from "./context"; + +describe("hacker-news tests", () => { + for (const testCase of testCases) { + test(testCase.name, async () => { + const { driver } = getTestContext(); + const webviewDriver = createAppiumDriver(driver, { + baseURL: "testapp://hacker-news.wvb", + }); + + await testCase.run(webviewDriver); + }); + } +}); diff --git a/e2e/vitest.config.ts b/e2e/vitest.config.ts new file mode 100644 index 0000000..be9419b --- /dev/null +++ b/e2e/vitest.config.ts @@ -0,0 +1,16 @@ +import { defineConfig, type ViteUserConfig } from "vitest/config"; + +const config: ViteUserConfig = defineConfig({ + test: { + name: "webview-bundle-ios/e2e", + include: ["**/*.spec.ts"], + fileParallelism: false, + pool: "forks", + testTimeout: 120_000, + hookTimeout: 1_800_000, + globalSetup: ["./vitest.global-setup.ts"], + setupFiles: ["./vitest.setup.ts"], + }, +}); + +export { config as default }; diff --git a/e2e/vitest.global-setup.ts b/e2e/vitest.global-setup.ts new file mode 100644 index 0000000..d788d2a --- /dev/null +++ b/e2e/vitest.global-setup.ts @@ -0,0 +1,37 @@ +import { spawnSync } from "node:child_process"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const TESTAPP = join(ROOT, "TestApp"); + +function run(cmd: string, args: string[], cwd: string): void { + console.log(`\n$ ${cmd} ${args.join(" ")} (cwd: ${cwd})`); + const res = spawnSync(cmd, args, { cwd, stdio: "inherit" }); + if (res.status !== 0) { + throw new Error( + `command failed (${res.status ?? res.signal}): ${cmd} ${args.join(" ")}`, + ); + } +} + +export default function setup(): void { + run("tuist", ["install"], TESTAPP); + run("tuist", ["generate", "--no-open"], TESTAPP); + run( + "xcodebuild", + [ + "build", + "-workspace", + "TestApp/TestApp.xcworkspace", + "-scheme", + "TestApp", + "-destination", + "generic/platform=iOS Simulator", + "-derivedDataPath", + "TestApp/.build-xc", + "CODE_SIGNING_ALLOWED=NO", + ], + ROOT, + ); +} diff --git a/e2e/vitest.setup.ts b/e2e/vitest.setup.ts new file mode 100644 index 0000000..74c3706 --- /dev/null +++ b/e2e/vitest.setup.ts @@ -0,0 +1,19 @@ +import { afterAll, beforeAll } from "vitest"; +import { + createTestContext, + disposeTestContext, + setActiveContext, + type TestContext, +} from "./context.js"; + +let context: TestContext | undefined; + +beforeAll(async () => { + context = await createTestContext(); + setActiveContext(context); +}); + +afterAll(async () => { + await disposeTestContext(context); + setActiveContext(undefined); +}); diff --git a/e2e/yarn.lock b/e2e/yarn.lock new file mode 100644 index 0000000..c0692fd --- /dev/null +++ b/e2e/yarn.lock @@ -0,0 +1,5833 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 10 + cacheKey: 10c0 + +"@appium/base-driver@npm:10.6.0": + version: 10.6.0 + resolution: "@appium/base-driver@npm:10.6.0" + dependencies: + "@appium/support": "npm:7.2.3" + "@appium/types": "npm:1.5.0" + "@colors/colors": "npm:1.6.0" + async-lock: "npm:1.4.1" + asyncbox: "npm:6.3.0" + axios: "npm:1.16.1" + body-parser: "npm:2.2.2" + express: "npm:5.2.1" + fastest-levenshtein: "npm:1.0.16" + http-status-codes: "npm:2.3.0" + lru-cache: "npm:11.5.0" + method-override: "npm:3.0.0" + morgan: "npm:1.10.1" + path-to-regexp: "npm:8.4.2" + serve-favicon: "npm:2.5.1" + spdy: "npm:4.0.2" + type-fest: "npm:5.6.0" + dependenciesMeta: + spdy: + optional: true + checksum: 10c0/750d654a6a3c660edbe07dc050e4f32026f5aeae41a8ed5665be657ffcb40a5ae287d265f0fe8db48d141bb23867f0dbf1ae15a0ad5f9f35a270db3eece192a9 + languageName: node + linkType: hard + +"@appium/base-plugin@npm:3.3.0": + version: 3.3.0 + resolution: "@appium/base-plugin@npm:3.3.0" + dependencies: + "@appium/base-driver": "npm:10.6.0" + "@appium/support": "npm:7.2.3" + "@appium/types": "npm:1.5.0" + checksum: 10c0/85a6f087506d8f1277d0630001aa5cbdeeca3b864daad212cbcb122389034b5b7f0724e3404751503c27572a7a2478fc727b9ffa1f2af64242b0ee7ae342bde4 + languageName: node + linkType: hard + +"@appium/docutils@npm:2.4.3": + version: 2.4.3 + resolution: "@appium/docutils@npm:2.4.3" + dependencies: + "@appium/support": "npm:7.2.3" + consola: "npm:3.4.2" + diff: "npm:9.0.0" + lilconfig: "npm:3.1.3" + package-directory: "npm:8.2.0" + read-pkg: "npm:10.1.0" + teen_process: "npm:4.1.3" + type-fest: "npm:5.6.0" + yaml: "npm:2.9.0" + yargs: "npm:18.0.0" + yargs-parser: "npm:22.0.0" + bin: + appium-docs: bin/appium-docs.js + checksum: 10c0/e7482dd7489dedab2054f34c78a8bae8bbb7da18b03abf8f3f68ae9eb91c38a6a69c9d18000c9f908bbcbe2d4a922fbadee36eb85ca61686e013b18950ae0946 + languageName: node + linkType: hard + +"@appium/logger@npm:2.0.8": + version: 2.0.8 + resolution: "@appium/logger@npm:2.0.8" + dependencies: + console-control-strings: "npm:1.1.0" + lru-cache: "npm:11.5.0" + set-blocking: "npm:2.0.0" + checksum: 10c0/e3ce8fdc5e093e1c533fa0d08739b21341423ff6fc55c9cd3539ee21e086f3ed6f6dcf7f9fe62331467d06533132a9fb093cadde7d50c0fd213761354f352580 + languageName: node + linkType: hard + +"@appium/schema@npm:1.2.0": + version: 1.2.0 + resolution: "@appium/schema@npm:1.2.0" + dependencies: + json-schema: "npm:0.4.0" + checksum: 10c0/233d2f94dca075d48d1cbc865366ed5f74a7874860d285dd7bbc064e82bdb547e18d75b2b62cc1e568935bccad67976ddb9d3e226a01800fbf162cb23fd2ce01 + languageName: node + linkType: hard + +"@appium/support@npm:7.2.3": + version: 7.2.3 + resolution: "@appium/support@npm:7.2.3" + dependencies: + "@appium/logger": "npm:2.0.8" + "@appium/tsconfig": "npm:1.1.2" + "@appium/types": "npm:1.5.0" + "@colors/colors": "npm:1.6.0" + archiver: "npm:8.0.0" + asyncbox: "npm:6.3.0" + axios: "npm:1.16.1" + base64-stream: "npm:1.0.0" + bluebird: "npm:3.7.2" + bplist-creator: "npm:0.1.1" + bplist-parser: "npm:0.3.2" + form-data: "npm:4.0.5" + get-stream: "npm:9.0.1" + glob: "npm:13.0.6" + jsftp: "npm:2.1.3" + klaw: "npm:4.1.0" + lockfile: "npm:1.0.4" + log-symbols: "npm:7.0.1" + ncp: "npm:2.0.0" + package-directory: "npm:8.2.0" + plist: "npm:4.0.0" + pluralize: "npm:8.0.0" + read-pkg: "npm:10.1.0" + resolve-from: "npm:5.0.0" + sanitize-filename: "npm:1.6.4" + semver: "npm:7.8.1" + sharp: "npm:0.34.5" + shell-quote: "npm:1.8.4" + supports-color: "npm:10.2.2" + teen_process: "npm:4.1.3" + type-fest: "npm:5.6.0" + uuid: "npm:14.0.0" + which: "npm:6.0.1" + yauzl: "npm:3.3.1" + dependenciesMeta: + sharp: + optional: true + checksum: 10c0/d7b4f94bc12f2d8280d1f0390191b4708336986fb643705aa6f9f8e5d9c3e36f7f0b8540e9616da38e4b90640e69f8728d5582d2428bf590bd06a2739c830554 + languageName: node + linkType: hard + +"@appium/tsconfig@npm:1.1.2": + version: 1.1.2 + resolution: "@appium/tsconfig@npm:1.1.2" + dependencies: + "@tsconfig/node20": "npm:20.1.9" + checksum: 10c0/e847d004189694d84254be37ac505d85b4cdb5dbc35eadbbea996a3e706419b868a2d23df4210830f744eea9e6000236ef852715458130f32459ffef55ed0f8a + languageName: node + linkType: hard + +"@appium/types@npm:1.5.0": + version: 1.5.0 + resolution: "@appium/types@npm:1.5.0" + dependencies: + "@appium/logger": "npm:2.0.8" + "@appium/schema": "npm:1.2.0" + "@appium/tsconfig": "npm:1.1.2" + type-fest: "npm:5.6.0" + checksum: 10c0/11122ee33944e222e33bbdbd36688ced9bdb382f20d0a8de780f1a47d70f6012c08b45f75e78cd8a74643a27300257da9c0403f5cce339c31086f994842c2e35 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.26.2": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/169fc2080169a40c1760155eaaaf739bcb882df0bec76a83adbda5493645bc17270a3434b8848c494b1933e96fe1d147370001e3cda09a39f43ae30f08ef2069 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10c0/4795354e7ae0dcafa72de1cd04ec51252dc1498517170beaf019e03effc5b7bf13c6b21a3949a77e07b8125be7f106ed1131350d8ebd4566ae874094a726d62b + languageName: node + linkType: hard + +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 + languageName: node + linkType: hard + +"@dabh/diagnostics@npm:^2.0.8": + version: 2.0.8 + resolution: "@dabh/diagnostics@npm:2.0.8" + dependencies: + "@so-ric/colorspace": "npm:^1.1.6" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10c0/64701c272f7de02800039fea99796507670fe5f67d4eb7718599351ec156936efd123fcab7ee18f9d7874939caaacc08e7c7a6bb05ff8cda6d930ad041cc555c + languageName: node + linkType: hard + +"@emnapi/core@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/core@npm:1.10.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10c0/f51d08227857b60632de7714d708124f0e100a1462dde6df8221760939aa3204a73193830371830fac0716f3ccd2129f2cac1b17cd7d7958bc4da9018a296edb + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/runtime@npm:1.10.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/953f14991d1aefb92ee6f8eb27dea725e484791a53a0cb5f47d9e0087b9a2c929ff2e92adf95af15d6ad456db6300c6b761ebf72b50a875b874a83520b3ba093 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.7.0": + version: 1.11.1 + resolution: "@emnapi/runtime@npm:1.11.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/04332fb62076afc440aa23316c04bec42f584ca8b074e5507d08e2b33a47cbe0493b1aadb8f3c1057b64ae1e17f5bde1a7bc37f7facc9d0bc25c18197cbd366f + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.2.1": + version: 1.2.1 + resolution: "@emnapi/wasi-threads@npm:1.2.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 + languageName: node + linkType: hard + +"@img/colour@npm:^1.0.0": + version: 1.1.0 + resolution: "@img/colour@npm:1.1.0" + checksum: 10c0/2ebea2c0bbaee73b99badcefa04e1e71d83f36e5369337d3121dca841f4569533c4e2faddda6d62dd247f0d5cca143711f9446c59bcce81e427ba433a7a94a17 + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" + dependencies: + "@emnapi/runtime": "npm:^1.7.0" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:^1.1.4": + version: 1.1.5 + resolution: "@napi-rs/wasm-runtime@npm:1.1.5" + dependencies: + "@tybys/wasm-util": "npm:^0.10.2" + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/727f2b6ae0e68bbe5d39aeb68aa6f183314e9f03dc50bb55a962849535b2db53ecc3fbf1554d8656a54488a608df5a2634670595cf5874dc4af2ee59f817c65d + languageName: node + linkType: hard + +"@nodable/entities@npm:^2.1.0": + version: 2.2.0 + resolution: "@nodable/entities@npm:2.2.0" + checksum: 10c0/a5ace5b2f747ae5b851f68a1731526c3e10feacde80469415d15a0df0e960251b515e3cd4ea080a3534e0610ac74b0d3252f607ef2f536bcc97e22d324231578 + languageName: node + linkType: hard + +"@oxc-project/types@npm:=0.133.0": + version: 0.133.0 + resolution: "@oxc-project/types@npm:0.133.0" + checksum: 10c0/70c57ba58644f7ec217b670c301801f4d06995f4ccdba6b2bd106ea3e5ee49d616573e6ef8d55530b87571a960696543687f3850e87ad173d3f88965c30cdd63 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@promptbook/utils@npm:0.69.5": + version: 0.69.5 + resolution: "@promptbook/utils@npm:0.69.5" + dependencies: + spacetrim: "npm:0.11.59" + checksum: 10c0/148aa35a01151740d175b1c2c640349cc3af4c42f5f927c77f92b68ccb4303331e4e27e595d21d36ad97bf4556d4a8741346215f6228b193efd5dd027f013550 + languageName: node + linkType: hard + +"@puppeteer/browsers@npm:^2.2.0": + version: 2.13.2 + resolution: "@puppeteer/browsers@npm:2.13.2" + dependencies: + debug: "npm:^4.4.3" + extract-zip: "npm:^2.0.1" + progress: "npm:^2.0.3" + proxy-agent: "npm:^6.5.0" + semver: "npm:^7.7.4" + tar-fs: "npm:^3.1.1" + yargs: "npm:^17.7.2" + bin: + browsers: lib/cjs/main-cli.js + checksum: 10c0/d4f7a6b160a87598f9bb6524d475e4bb16effb7ee39e82a731e51af3454858e95d80c1cfe2030dfadfc407b77d7ef60f0f8c1a2dcf4532dce30f09c09df29082 + languageName: node + linkType: hard + +"@rolldown/binding-android-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-android-arm64@npm:1.0.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-ppc64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.3" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-s390x-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.3" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.3" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.3" + dependencies: + "@emnapi/core": "npm:1.10.0" + "@emnapi/runtime": "npm:1.10.0" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:^1.0.0": + version: 1.0.1 + resolution: "@rolldown/pluginutils@npm:1.0.1" + checksum: 10c0/99d9b06d90196823e4d8c841f258db7a16e5dbba5824a2962b05d907b79f1ba929d56f22dd744fd530936e568c865ee56a719dc31e57e13bc0a8eb4764a8d8dd + languageName: node + linkType: hard + +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + +"@sidvind/better-ajv-errors@npm:5.0.0": + version: 5.0.0 + resolution: "@sidvind/better-ajv-errors@npm:5.0.0" + dependencies: + kleur: "npm:^4.1.0" + peerDependencies: + ajv: ^7.0.0 || ^8.0.0 + checksum: 10c0/ef2559d0a6809f2da820159f818b6bc19c5ff18f577b41eb0762eb30dd3b6ddae31dda0d61963498840b0b0482b106a1f21b05183c730c20a619174cc48b6ba8 + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b + languageName: node + linkType: hard + +"@so-ric/colorspace@npm:^1.1.6": + version: 1.1.6 + resolution: "@so-ric/colorspace@npm:1.1.6" + dependencies: + color: "npm:^5.0.2" + text-hex: "npm:1.0.x" + checksum: 10c0/f3ad26afefbb8d6101ea7c385cd5f402d4291c2ffc9cabe37030d5fdb8bda980ee534a0d7c250f8233fc3a59b99272410177cd98b219f6b3770f91a0fdb6eb3e + languageName: node + linkType: hard + +"@standard-schema/spec@npm:^1.1.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 + languageName: node + linkType: hard + +"@tootallnate/quickjs-emscripten@npm:^0.23.0": + version: 0.23.0 + resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" + checksum: 10c0/2a939b781826fb5fd3edd0f2ec3b321d259d760464cf20611c9877205aaca3ccc0b7304dea68416baa0d568e82cd86b17d29548d1e5139fa3155a4a86a2b4b49 + languageName: node + linkType: hard + +"@tsconfig/node20@npm:20.1.9": + version: 20.1.9 + resolution: "@tsconfig/node20@npm:20.1.9" + checksum: 10c0/04e4e515dc6ce9386af74accb565884c3771b355208acc3d3dee32f0ce4c1d12e59319e05200fb2b87a8655ed4d8eb9910e36667a91e4683879feea9938d90d1 + languageName: node + linkType: hard + +"@tybys/wasm-util@npm:^0.10.2": + version: 0.10.2 + resolution: "@tybys/wasm-util@npm:0.10.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/26165bcd1fd7269f42d7fbe3de318f854a8968de8397e89fc9a423bb3e2da35a52150f382e6323b3367595beb16d9800a6f35971a5599daf76da1742ec3afc25 + languageName: node + linkType: hard + +"@types/chai@npm:^5.2.2": + version: 5.2.3 + resolution: "@types/chai@npm:5.2.3" + dependencies: + "@types/deep-eql": "npm:*" + assertion-error: "npm:^2.0.1" + checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f + languageName: node + linkType: hard + +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.0": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 10c0/3ad3286ca2988cd550dafb8f2ad599c8474868e954fa601a36655bdfefd8039f7c714b8c1c7f2ae219ffbd58bd4660e66fa7479a0120fc02d4777057d4865387 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^25": + version: 25.9.3 + resolution: "@types/node@npm:25.9.3" + dependencies: + undici-types: "npm:>=7.24.0 <7.24.7" + checksum: 10c0/72d3aece9d42c2c641bcd3f3cb2dc2828b4bd384dfcbd910c404b8859a68bd69d50c4769ce7defd4ff5e049768e23e615f09407ea2cbbb5f44b90d75a7c6b8ca + languageName: node + linkType: hard + +"@types/node@npm:^20.1.0, @types/node@npm:^20.11.30": + version: 20.19.43 + resolution: "@types/node@npm:20.19.43" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/9bcec3b5295bdd77ff0b44a528a69f7e22028c347507ba2c69be47ec84e30299f45043b222e9c86c510e138c9c53b2419dd5cd34920602a4a5a381c288075318 + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.4": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 + languageName: node + linkType: hard + +"@types/sinonjs__fake-timers@npm:^8.1.5": + version: 8.1.5 + resolution: "@types/sinonjs__fake-timers@npm:8.1.5" + checksum: 10c0/2b8bdc246365518fc1b08f5720445093cce586183acca19a560be6ef81f824bd9a96c090e462f622af4d206406dadf2033c5daf99a51c1096da6494e5c8dc32e + languageName: node + linkType: hard + +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a + languageName: node + linkType: hard + +"@types/which@npm:^2.0.1": + version: 2.0.2 + resolution: "@types/which@npm:2.0.2" + checksum: 10c0/c9a2ca5f1d4ca26381cd8adc7415f9e203fa5bfa2f7855c68bc5b676dc402f9c31bd8c83766bfa73d7aa70a0f4b979e7eb139ceec41a17ac2e1fc08a5bca6ba8 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.3": + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab + languageName: node + linkType: hard + +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc + languageName: node + linkType: hard + +"@vitest/expect@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/expect@npm:4.1.8" + dependencies: + "@standard-schema/spec": "npm:^1.1.0" + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:4.1.8" + "@vitest/utils": "npm:4.1.8" + chai: "npm:^6.2.2" + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/f7bf6c720d2427c3bd0b35472ebd84d963be7d09ecf52a0fb05e8c4d5d0c9ee164a8c28eee6360947be1b245b47faefab54560cb98e5cb678c1c1074260b9149 + languageName: node + linkType: hard + +"@vitest/mocker@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/mocker@npm:4.1.8" + dependencies: + "@vitest/spy": "npm:4.1.8" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.21" + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/f8cb2b8b55dc2cba0b2399aeee528b0187042f22cbc2d50a4fd6141f5aa246ebc41700f45dd1d73eca44ddfb57dcde48b2eb317bfbb1198f5ab2cc4fd04b2ea0 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/pretty-format@npm:4.1.8" + dependencies: + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/553c456692a4b9ae13cd116c234c74b4495e0f1a0d5c51ffc3fab8ea085e3550769967e29db79bdac0cf127b1bf88b7f70bfba3dcc72be6bddf834433e30cc91 + languageName: node + linkType: hard + +"@vitest/runner@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/runner@npm:4.1.8" + dependencies: + "@vitest/utils": "npm:4.1.8" + pathe: "npm:^2.0.3" + checksum: 10c0/706808a4b7b95ea9a9268fc152dd39e15a9a754f37c7990aea167486a9094caa913dae454771ae02c18dccfabd667f8cc38eed33a1307a79d32a89878b5bcce1 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/snapshot@npm:4.1.8" + dependencies: + "@vitest/pretty-format": "npm:4.1.8" + "@vitest/utils": "npm:4.1.8" + magic-string: "npm:^0.30.21" + pathe: "npm:^2.0.3" + checksum: 10c0/ba4c32112491d42d24986f921c50ede5edbdb4b7eafa16c72cf8d2c9ecc44121fdb3d9365236747a9841f0d6776affc6457470fcbb082df9dbc28c24792a0c6d + languageName: node + linkType: hard + +"@vitest/spy@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/spy@npm:4.1.8" + checksum: 10c0/3c10c0325a09d16bc0e77c0be96c47c15416186e33332880c0d1dd0a51d51a866091067b81f2a2ef6fb422a7760e6cf15c04d91a0eca4d59f62e8c8401fa53fc + languageName: node + linkType: hard + +"@vitest/utils@npm:4.1.8": + version: 4.1.8 + resolution: "@vitest/utils@npm:4.1.8" + dependencies: + "@vitest/pretty-format": "npm:4.1.8" + convert-source-map: "npm:^2.0.0" + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/acda9d3d640c1ebc81afb358ac30589d7d7d583af81e2d09419f0af9cbe41f3ce0b90527326943bf0da51614be5fc31afcd32259f6beb32b3417999d6ef380f3 + languageName: node + linkType: hard + +"@wdio/config@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/config@npm:9.28.0" + dependencies: + "@wdio/logger": "npm:9.18.0" + "@wdio/types": "npm:9.28.0" + "@wdio/utils": "npm:9.28.0" + deepmerge-ts: "npm:^7.0.3" + glob: "npm:^10.2.2" + import-meta-resolve: "npm:^4.0.0" + jiti: "npm:^2.6.1" + checksum: 10c0/0c1b46c3ca20a5543920e71e03a3fcef8b141b22cd500cce0c44177689354dcc42d0180a1886e31e8992197f9bf876b93c1e47ba0d02b2c97156109d44a5e3ce + languageName: node + linkType: hard + +"@wdio/logger@npm:9.18.0, @wdio/logger@npm:^9.18.0": + version: 9.18.0 + resolution: "@wdio/logger@npm:9.18.0" + dependencies: + chalk: "npm:^5.1.2" + loglevel: "npm:^1.6.0" + loglevel-plugin-prefix: "npm:^0.8.4" + safe-regex2: "npm:^5.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/c11cc06ea9f6696a0077f29d0360c10828317e5980815408d04cad99db1a64a6bc1491583ffef681e46e18476f061f37a2e18706f06488715291f3bfc8b32615 + languageName: node + linkType: hard + +"@wdio/protocols@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/protocols@npm:9.28.0" + checksum: 10c0/d71ddd19b73140cb18f24c2e35f992c8f58d6450d5dec911df3e4094e95a40eb3559123f65fd04b69d6e5fa8d1fb63ba86c5433285a7044a09bc2f8e012c1764 + languageName: node + linkType: hard + +"@wdio/repl@npm:9.16.2": + version: 9.16.2 + resolution: "@wdio/repl@npm:9.16.2" + dependencies: + "@types/node": "npm:^20.1.0" + checksum: 10c0/9f46cef8098e3c4f0aa16f6104582b423e3b9d5d99ef901b6f8c64248e81b47512f36e4c198c626459370433ae8c30e0494f86966a99a9f8f773fe37f3b2fc4b + languageName: node + linkType: hard + +"@wdio/types@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/types@npm:9.28.0" + dependencies: + "@types/node": "npm:^20.1.0" + checksum: 10c0/c277976ff98947fb73242cc32da3cdf39484e077b9560ecc76db1e40d42bdfd08a8e27af384af4cbf8723ad9c2120e02d2aec1bb2d3a1f2924a7598c961baf57 + languageName: node + linkType: hard + +"@wdio/utils@npm:9.28.0": + version: 9.28.0 + resolution: "@wdio/utils@npm:9.28.0" + dependencies: + "@puppeteer/browsers": "npm:^2.2.0" + "@wdio/logger": "npm:9.18.0" + "@wdio/types": "npm:9.28.0" + decamelize: "npm:^6.0.0" + deepmerge-ts: "npm:^7.0.3" + edgedriver: "npm:^6.1.2" + geckodriver: "npm:^6.1.0" + get-port: "npm:^7.0.0" + import-meta-resolve: "npm:^4.0.0" + locate-app: "npm:^2.2.24" + mitt: "npm:^3.0.1" + safaridriver: "npm:^1.0.0" + split2: "npm:^4.2.0" + wait-port: "npm:^1.1.0" + checksum: 10c0/8da49341974ed9d48d2ecb4d665841c4220dc6304ff3fe6b62d56c6c8caa7845a5a226f84c68e74409bc84c6509ba732c814ef9faab75106c36a4d78d9ba3ccb + languageName: node + linkType: hard + +"@wvb-playground/testing@npm:^0.0.0": + version: 0.0.0 + resolution: "@wvb-playground/testing@npm:0.0.0" + peerDependencies: + playwright-core: ^1.40.0 + selenium-webdriver: ^4.0.0 + webdriverio: ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + playwright-core: + optional: true + selenium-webdriver: + optional: true + webdriverio: + optional: true + checksum: 10c0/aff3809a52ced27cdba6a05dc7e60375ee72b6581d95e1bac684f25f94c275f0bcd68f0d8edab10f281427b1c3605758562c3b6b15d95bb0ae0454136982f2ab + languageName: node + linkType: hard + +"@wvb-playground/webview-hacker-news@npm:^0.0.0": + version: 0.0.0 + resolution: "@wvb-playground/webview-hacker-news@npm:0.0.0" + dependencies: + "@wvb-playground/testing": "npm:^0.0.0" + peerDependencies: + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vitest: + optional: true + checksum: 10c0/722a88b4c43c1a9e7b274bebef3aa6126683aa1300d6e04186de65f090943f3512546b8ca17f08f5a5ae8f586560ede615f87cfc319112c9f23074f8b5c2f6be + languageName: node + linkType: hard + +"@xmldom/xmldom@npm:^0.9.10": + version: 0.9.10 + resolution: "@xmldom/xmldom@npm:0.9.10" + checksum: 10c0/38a9c9b95450d7fccebc61371c8e0b90ceaae992886484108333d29ccbd2640e3555b6af012f15ce1beb5067aeb40486659b6183fad38af179e82d28028bfc5d + languageName: node + linkType: hard + +"@zip.js/zip.js@npm:^2.8.11": + version: 2.8.26 + resolution: "@zip.js/zip.js@npm:2.8.26" + checksum: 10c0/246e446309f55c3cc7beecf5d69e53aebb149707804afccb0bbaf07b31efe129292b4cc5f4f974092a583be5cbf79277b2864e9f6902ce8bb6d0cbd244844ebe + languageName: node + linkType: hard + +"abbrev@npm:^5.0.0": + version: 5.0.0 + resolution: "abbrev@npm:5.0.0" + checksum: 10c0/8e88f5c798ea4562d28c5a3e9ad69e3879890bc5d695d8f2dffb8609be4c890aacc8f80ef4553fdd2c6a62d70c2ce8bc57b38074e383beb7487bdafa9ed42ea5 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: "npm:^5.0.0" + checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 + languageName: node + linkType: hard + +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef + languageName: node + linkType: hard + +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe + languageName: node + linkType: hard + +"ajv-formats@npm:3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a + languageName: node + linkType: hard + +"ajv@npm:8.20.0, ajv@npm:^8.0.0": + version: 8.20.0 + resolution: "ajv@npm:8.20.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/5df9a1c8f83863cde1bd3a9ddb426f599718f88e3dc9153616c79fb28e0be455335830d7f21d745576519f057b371352daa31047b6a33d7036fe08777d60cf2a + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.2.2": + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 + languageName: node + linkType: hard + +"anynum@npm:^1.0.0": + version: 1.0.0 + resolution: "anynum@npm:1.0.0" + checksum: 10c0/c929fed8f4127cd706312da58ae2aa83a06e62059eef04392fe2bacec003b6f6b7ca5f2719bd09c693b100f185bcf6405419744812f1096cdb53aed4034b9209 + languageName: node + linkType: hard + +"appium@npm:^3.5.0": + version: 3.5.0 + resolution: "appium@npm:3.5.0" + dependencies: + "@appium/base-driver": "npm:10.6.0" + "@appium/base-plugin": "npm:3.3.0" + "@appium/docutils": "npm:2.4.3" + "@appium/logger": "npm:2.0.8" + "@appium/schema": "npm:1.2.0" + "@appium/support": "npm:7.2.3" + "@appium/types": "npm:1.5.0" + "@sidvind/better-ajv-errors": "npm:5.0.0" + ajv: "npm:8.20.0" + ajv-formats: "npm:3.0.1" + argparse: "npm:2.0.1" + asyncbox: "npm:6.3.0" + axios: "npm:1.16.1" + lilconfig: "npm:3.1.3" + lodash: "npm:4.18.1" + lru-cache: "npm:11.5.0" + ora: "npm:5.4.1" + package-changed: "npm:3.0.0" + resolve-from: "npm:5.0.0" + semver: "npm:7.8.1" + teen_process: "npm:4.1.3" + type-fest: "npm:5.6.0" + winston: "npm:3.19.0" + ws: "npm:8.21.0" + yaml: "npm:2.9.0" + bin: + appium: index.js + checksum: 10c0/b7389561965cc9c53d8d8e1754ebd7e2608337731cdb56102565f8d5faad4838651823ad72652180b6114cd5b4de56646710c4369354ca94f5dff32e1c90f6e0 + languageName: node + linkType: hard + +"archiver-utils@npm:^5.0.0, archiver-utils@npm:^5.0.2": + version: 5.0.2 + resolution: "archiver-utils@npm:5.0.2" + dependencies: + glob: "npm:^10.0.0" + graceful-fs: "npm:^4.2.0" + is-stream: "npm:^2.0.1" + lazystream: "npm:^1.0.0" + lodash: "npm:^4.17.15" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/3782c5fa9922186aa1a8e41ed0c2867569faa5f15c8e5e6418ea4c1b730b476e21bd68270b3ea457daf459ae23aaea070b2b9f90cf90a59def8dc79b9e4ef538 + languageName: node + linkType: hard + +"archiver@npm:8.0.0": + version: 8.0.0 + resolution: "archiver@npm:8.0.0" + dependencies: + async: "npm:^3.2.4" + buffer-crc32: "npm:^1.0.0" + is-stream: "npm:^4.0.0" + lazystream: "npm:^1.0.0" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + readdir-glob: "npm:^3.0.0" + tar-stream: "npm:^3.0.0" + zip-stream: "npm:^7.0.2" + checksum: 10c0/bcb12f3c8c0baac15ab0b3e92d2b6a249a09c59ffded8b259bdf5ff7ea547a75a93d79e614f99d8ba9d5f4a8ee43bbcedcd07117b1faef3369249fd8070efec8 + languageName: node + linkType: hard + +"archiver@npm:^7.0.1": + version: 7.0.1 + resolution: "archiver@npm:7.0.1" + dependencies: + archiver-utils: "npm:^5.0.2" + async: "npm:^3.2.4" + buffer-crc32: "npm:^1.0.0" + readable-stream: "npm:^4.0.0" + readdir-glob: "npm:^1.1.2" + tar-stream: "npm:^3.0.0" + zip-stream: "npm:^6.0.1" + checksum: 10c0/02afd87ca16f6184f752db8e26884e6eff911c476812a0e7f7b26c4beb09f06119807f388a8e26ed2558aa8ba9db28646ebd147a4f99e46813b8b43158e1438e + languageName: node + linkType: hard + +"argparse@npm:2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"aria-query@npm:^5.3.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e + languageName: node + linkType: hard + +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/3a1a409764faa1471601a0ad01b3aa699292991aa9c8a30c7717002cabdf5d98008e7b53ae61f6e058f757fc6ba965e147967a93c13e62692c907d79cfb245f8 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 + languageName: node + linkType: hard + +"async-lock@npm:1.4.1": + version: 1.4.1 + resolution: "async-lock@npm:1.4.1" + checksum: 10c0/f696991c7d894af1dc91abc81cc4f14b3785190a35afb1646d8ab91138238d55cabd83bfdd56c42663a008d72b3dc39493ff83797e550effc577d1ccbde254af + languageName: node + linkType: hard + +"async@npm:^3.2.3, async@npm:^3.2.4": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"asyncbox@npm:6.3.0": + version: 6.3.0 + resolution: "asyncbox@npm:6.3.0" + dependencies: + p-limit: "npm:^7.2.0" + checksum: 10c0/822a7546f539cbcfe09c4244f478e76c4678e3fbf91a77eebe8abac3aa4d9614d6ce390fcb3b03dc71bc98a45c87b704cc13fb9cdbbefa187cdc64734c82a80b + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + +"axios@npm:1.16.1": + version: 1.16.1 + resolution: "axios@npm:1.16.1" + dependencies: + follow-redirects: "npm:^1.16.0" + form-data: "npm:^4.0.5" + https-proxy-agent: "npm:^5.0.1" + proxy-from-env: "npm:^2.1.0" + checksum: 10c0/2f77e37e6552bbff8a772d058fb09500198e9188c6b20dc799d82dbe12a8cb506f6eed4e4e62a9ba612a35cbab496faa26d68f9bff14a53af6d15c3e136391a7 + languageName: node + linkType: hard + +"b4a@npm:^1.6.4, b4a@npm:^1.8.1": + version: 1.8.1 + resolution: "b4a@npm:1.8.1" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: 10c0/344d8c94b244ec7a9cb516ea43a98216312454cb72478e4b7628a679ee343be237564c53bbe73995ab10ea9bc923b420236081b180b3cf78fd0c945bfc886798 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b + languageName: node + linkType: hard + +"bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": + version: 2.9.1 + resolution: "bare-events@npm:2.9.1" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: 10c0/576fba522bdd2167f35e86791e6c881fdaaf542aa5fca0acfaf8fac7a2c0789340f1cafa0b63e216808efb5cc710887c0cf683f1783293bf98a215d8555ecc36 + languageName: node + linkType: hard + +"bare-fs@npm:^4.0.1, bare-fs@npm:^4.5.5": + version: 4.7.2 + resolution: "bare-fs@npm:4.7.2" + dependencies: + bare-events: "npm:^2.5.4" + bare-path: "npm:^3.0.0" + bare-stream: "npm:^2.6.4" + bare-url: "npm:^2.2.2" + fast-fifo: "npm:^1.3.2" + peerDependencies: + bare-buffer: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + checksum: 10c0/b70ad408b532dc244660a48b56a9d730c9f0e772d493693ad289dfe4c90ea65ce38674d78f0b9242c8856b549e15cb1dd9e2634ae1322c6e8118dc58719126c5 + languageName: node + linkType: hard + +"bare-os@npm:^3.0.1": + version: 3.9.1 + resolution: "bare-os@npm:3.9.1" + checksum: 10c0/65219ea4ae8b843395bc91be8c65d4ab6d7479d4b38a247efdde80341523c17fc242d5b0b8f09f89d6e54ef7ebec9700b3d9d4334559ffd4c1398b15cf93fa03 + languageName: node + linkType: hard + +"bare-path@npm:^3.0.0": + version: 3.0.1 + resolution: "bare-path@npm:3.0.1" + dependencies: + bare-os: "npm:^3.0.1" + checksum: 10c0/5f9b7ce5643fd0da64997a8630f2707a1a0e943f0f092d1562bd839699042714650268aa7d271d5a1ce089163b15695564ac4419f839431f1cec552d3bda8317 + languageName: node + linkType: hard + +"bare-stream@npm:^2.6.4": + version: 2.13.3 + resolution: "bare-stream@npm:2.13.3" + dependencies: + b4a: "npm:^1.8.1" + streamx: "npm:^2.25.0" + teex: "npm:^1.0.1" + peerDependencies: + bare-abort-controller: "*" + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + checksum: 10c0/1867ca2e89042a7a9c53e8415a0be6e958bdc7231bc0858a793ec35614419eb6e57ad7a27db2de3dc75a799f7432494e27029b3805eee53693629ff64cae16c9 + languageName: node + linkType: hard + +"bare-url@npm:^2.2.2": + version: 2.4.5 + resolution: "bare-url@npm:2.4.5" + dependencies: + bare-path: "npm:^3.0.0" + checksum: 10c0/5077ddb2386548a1efad58418e4d7d6895700b1ecf95d1a63e020f4ae01ebdf7e5f393c9f9b45f3228de32c4803161a80785cf999b03cecdd913516795c50f7c + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"base64-stream@npm:1.0.0": + version: 1.0.0 + resolution: "base64-stream@npm:1.0.0" + checksum: 10c0/5735cb5678c61a01763cc158e599a57bf23cbc1d1d6e14e0bf28a559bf0ac3cc0ef223db415ec8cdc6eeb086b08b6340f2c949be89b5cb53f7d7abb8370dd823 + languageName: node + linkType: hard + +"basic-auth@npm:~2.0.1": + version: 2.0.1 + resolution: "basic-auth@npm:2.0.1" + dependencies: + safe-buffer: "npm:5.1.2" + checksum: 10c0/05f56db3a0fc31c89c86b605231e32ee143fb6ae38dc60616bc0970ae6a0f034172def99e69d3aed0e2c9e7cac84e2d63bc51a0b5ff6ab5fc8808cc8b29923c1 + languageName: node + linkType: hard + +"basic-ftp@npm:^5.0.2": + version: 5.3.1 + resolution: "basic-ftp@npm:5.3.1" + checksum: 10c0/03511b488cd292abfa82a8c0ea3b9573b40d12d2f1518d6f41a9461b012b3376d3e6d50679b38d9b2b4f48fd6e8e0418ac196312ee7e2da13cb801169940d1c3 + languageName: node + linkType: hard + +"big-integer@npm:1.6.x": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10c0/9604224b4c2ab3c43c075d92da15863077a9f59e5d4205f4e7e76acd0cd47e8d469ec5e5dba8d9b32aa233951893b29329ca56ac80c20ce094b4a647a66abae0 + languageName: node + linkType: hard + +"bl@npm:^4.1.0": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"bluebird@npm:3.7.2": + version: 3.7.2 + resolution: "bluebird@npm:3.7.2" + checksum: 10c0/680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 + languageName: node + linkType: hard + +"body-parser@npm:2.2.2, body-parser@npm:^2.2.1": + version: 2.2.2 + resolution: "body-parser@npm:2.2.2" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.3" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.7.0" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.1" + raw-body: "npm:^3.0.1" + type-is: "npm:^2.0.1" + checksum: 10c0/95a830a003b38654b75166ca765358aa92ee3d561bf0e41d6ccdde0e1a0c9783cab6b90b20eb635d23172c010b59d3563a137a738e74da4ba714463510d05137 + languageName: node + linkType: hard + +"boolbase@npm:^1.0.0": + version: 1.0.0 + resolution: "boolbase@npm:1.0.0" + checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf + languageName: node + linkType: hard + +"bplist-creator@npm:0.1.1": + version: 0.1.1 + resolution: "bplist-creator@npm:0.1.1" + dependencies: + stream-buffers: "npm:2.2.x" + checksum: 10c0/427ec37263ce0e8c68a83f595fc9889a9cbf2e6fda2de18e1f8ef7f0c6ce68c0cdbb7c9c1f3bb3f2d217407af8cffbdf254bf0f71c99f2186175d07752f08a47 + languageName: node + linkType: hard + +"bplist-parser@npm:0.3.2": + version: 0.3.2 + resolution: "bplist-parser@npm:0.3.2" + dependencies: + big-integer: "npm:1.6.x" + checksum: 10c0/4dc307c11d2511a01255e87e370d4ab6f1962b35fdc27605fd4ce9a557a259c2dc9f87822617ddb1f7aa062a71e30ef20d6103329ac7ce235628f637fb0ed763 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1, brace-expansion@npm:^2.0.2": + version: 2.1.1 + resolution: "brace-expansion@npm:2.1.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/63b5ddce608b70b50a76817c0526faf8ea67a9180073d88bb402f6bbc22a22da6b1dfac4f65efc53e5faa80222fb7d44bbf2fc638c3f55365975573f671d0ccb + languageName: node + linkType: hard + +"brace-expansion@npm:^5.0.5": + version: 5.0.6 + resolution: "brace-expansion@npm:5.0.6" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10c0/8c919869b90f61d533b341d3340be5ee4413232ea89b8246cbc2f38eb014f1d8182785c98a006eaf6111d02dc9eeffefdc240d5ac158625b2ed084dccd4bbf9b + languageName: node + linkType: hard + +"buffer-crc32@npm:^1.0.0": + version: 1.0.0 + resolution: "buffer-crc32@npm:1.0.0" + checksum: 10c0/8b86e161cee4bb48d5fa622cbae4c18f25e4857e5203b89e23de59e627ab26beb82d9d7999f2b8de02580165f61f83f997beaf02980cdf06affd175b651921ab + languageName: node + linkType: hard + +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + +"bytes@npm:^3.1.2, bytes@npm:~3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + +"chai@npm:^6.2.2": + version: 6.2.2 + resolution: "chai@npm:6.2.2" + checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 + languageName: node + linkType: hard + +"chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chalk@npm:^5.1.2": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + +"cheerio-select@npm:^2.1.0": + version: 2.1.0 + resolution: "cheerio-select@npm:2.1.0" + dependencies: + boolbase: "npm:^1.0.0" + css-select: "npm:^5.1.0" + css-what: "npm:^6.1.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.0.1" + checksum: 10c0/2242097e593919dba4aacb97d7b8275def8b9ec70b00aa1f43335456870cfc9e284eae2080bdc832ed232dabb9eefcf56c722d152da4a154813fb8814a55d282 + languageName: node + linkType: hard + +"cheerio@npm:^1.0.0-rc.12": + version: 1.2.0 + resolution: "cheerio@npm:1.2.0" + dependencies: + cheerio-select: "npm:^2.1.0" + dom-serializer: "npm:^2.0.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.2.2" + encoding-sniffer: "npm:^0.2.1" + htmlparser2: "npm:^10.1.0" + parse5: "npm:^7.3.0" + parse5-htmlparser2-tree-adapter: "npm:^7.1.0" + parse5-parser-stream: "npm:^7.1.2" + undici: "npm:^7.19.0" + whatwg-mimetype: "npm:^4.0.0" + checksum: 10c0/91a566aabfa9962f28056045bb7d92d79c0f8f3abb1fb86a852a9d1760556adddeb01a36b6f08fa7c133282375d387ae450a181a659e76c6a64016c30cc3f611 + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"cli-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-cursor@npm:3.1.0" + dependencies: + restore-cursor: "npm:^3.1.0" + checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 + languageName: node + linkType: hard + +"cli-spinners@npm:^2.5.0": + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"cliui@npm:^9.0.1": + version: 9.0.1 + resolution: "cliui@npm:9.0.1" + dependencies: + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 + languageName: node + linkType: hard + +"clone@npm:^1.0.2": + version: 1.0.4 + resolution: "clone@npm:1.0.4" + checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-convert@npm:^3.1.3": + version: 3.1.3 + resolution: "color-convert@npm:3.1.3" + dependencies: + color-name: "npm:^2.0.0" + checksum: 10c0/427648b442c6ea6dab5ba03f4962201ee59f128c80b25d5a0f7d9aab0ef52519a9db8a9bb3cf40b73f86eb19b5ca6aeb0ab930665f3d14973ce776d7d0448a15 + languageName: node + linkType: hard + +"color-name@npm:^2.0.0": + version: 2.1.0 + resolution: "color-name@npm:2.1.0" + checksum: 10c0/9c953caba99557fce472232ded438c56b902c569cb15d66fcfbdf6374206126eef52ab66459f3984d4074b4aa8ab95e6f4b31a8e4f228dea57d0afecf94281fa + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"color-string@npm:^2.1.3": + version: 2.1.4 + resolution: "color-string@npm:2.1.4" + dependencies: + color-name: "npm:^2.0.0" + checksum: 10c0/18a9fefec153d885e0dbfb076f3a65cdcd19f52d96c719f2f261e90e5b7dafd13c51baac399d7099eac290f004d340045ab9467312dcc8afefe6f877ec5c4428 + languageName: node + linkType: hard + +"color@npm:^5.0.2": + version: 5.0.3 + resolution: "color@npm:5.0.3" + dependencies: + color-convert: "npm:^3.1.3" + color-string: "npm:^2.1.3" + checksum: 10c0/f08a03c5113ae4aa36dba9d2438596b194b897e18b961310643cb63872add1da507cd238df264eb434bbdbe3a377ec41f90d877531acca611523cfcd365db1b6 + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:^6.2.0": + version: 6.2.1 + resolution: "commander@npm:6.2.1" + checksum: 10c0/85748abd9d18c8bc88febed58b98f66b7c591d9b5017cad459565761d7b29ca13b7783ea2ee5ce84bf235897333706c4ce29adf1ce15c8252780e7000e2ce9ea + languageName: node + linkType: hard + +"commander@npm:^9.3.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: 10c0/5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d + languageName: node + linkType: hard + +"compress-commons@npm:^6.0.2": + version: 6.0.2 + resolution: "compress-commons@npm:6.0.2" + dependencies: + crc-32: "npm:^1.2.0" + crc32-stream: "npm:^6.0.0" + is-stream: "npm:^2.0.1" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/2347031b7c92c8ed5011b07b93ec53b298fa2cd1800897532ac4d4d1aeae06567883f481b6e35f13b65fc31b190c751df6635434d525562f0203fde76f1f0814 + languageName: node + linkType: hard + +"compress-commons@npm:^7.0.0": + version: 7.0.1 + resolution: "compress-commons@npm:7.0.1" + dependencies: + crc-32: "npm:^1.2.0" + crc32-stream: "npm:^7.0.1" + is-stream: "npm:^4.0.0" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/9837b9971c7e536f14b113178e944741a0cb76051db2c84ff23da2b6321f2f6da8ed922d713bb643987d4cd39eeaa537c73d9d7843f9eb74f8fe47afe93d0733 + languageName: node + linkType: hard + +"consola@npm:3.4.2": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 10c0/7cebe57ecf646ba74b300bcce23bff43034ed6fbec9f7e39c27cee1dc00df8a21cd336b466ad32e304ea70fba04ec9e890c200270de9a526ce021ba8a7e4c11a + languageName: node + linkType: hard + +"console-control-strings@npm:1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 + languageName: node + linkType: hard + +"content-disposition@npm:^1.0.0": + version: 1.1.0 + resolution: "content-disposition@npm:1.1.0" + checksum: 10c0/94e0aef65873e69330f5f187fbc44ebce593bdcb8013dd8a68b7d0f159ca089bd30db3f8095d829f81c341695b60a6085ee6e15e6d775c4a325b586cc8d91974 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"content-type@npm:^2.0.0": + version: 2.0.0 + resolution: "content-type@npm:2.0.0" + checksum: 10c0/491539fff707d7594b0ca4fabcc084bef2a31ffa754ff0a4f80c4377e3963cff0394317f9271c24087596c97fa675bc123d61fa34ffe65b4904e7d3d3098de72 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6 + languageName: node + linkType: hard + +"cookie@npm:^0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 + languageName: node + linkType: hard + +"crc-32@npm:^1.2.0": + version: 1.2.2 + resolution: "crc-32@npm:1.2.2" + bin: + crc32: bin/crc32.njs + checksum: 10c0/11dcf4a2e77ee793835d49f2c028838eae58b44f50d1ff08394a610bfd817523f105d6ae4d9b5bef0aad45510f633eb23c903e9902e4409bed1ce70cb82b9bf0 + languageName: node + linkType: hard + +"crc32-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "crc32-stream@npm:6.0.0" + dependencies: + crc-32: "npm:^1.2.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/bf9c84571ede2d119c2b4f3a9ef5eeb9ff94b588493c0d3862259af86d3679dcce1c8569dd2b0a6eff2f35f5e2081cc1263b846d2538d4054da78cf34f262a3d + languageName: node + linkType: hard + +"crc32-stream@npm:^7.0.1": + version: 7.0.1 + resolution: "crc32-stream@npm:7.0.1" + dependencies: + crc-32: "npm:^1.2.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/0d8d217ca4f328bba859a6bef8593028d24841bef2fe4dc44ae892c7cace4301ce6d5676b568642ddb0a709ee3f0f7af1d1ada4c9c399bc5a4ff9b93d5d1071d + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"css-select@npm:^5.1.0": + version: 5.2.2 + resolution: "css-select@npm:5.2.2" + dependencies: + boolbase: "npm:^1.0.0" + css-what: "npm:^6.1.0" + domhandler: "npm:^5.0.2" + domutils: "npm:^3.0.1" + nth-check: "npm:^2.0.1" + checksum: 10c0/d79fffa97106007f2802589f3ed17b8c903f1c961c0fc28aa8a051eee0cbad394d8446223862efd4c1b40445a6034f626bb639cf2035b0bfc468544177593c99 + languageName: node + linkType: hard + +"css-shorthand-properties@npm:^1.1.1": + version: 1.1.2 + resolution: "css-shorthand-properties@npm:1.1.2" + checksum: 10c0/848445ae836da55a3e00333b8413e0ade323d292ebd7336c9ebe1c1da6adc2b7d6e30e6aca808a37e33c5ba4923b795affe21229a5942098534ee3ad77beea52 + languageName: node + linkType: hard + +"css-value@npm:^0.0.1": + version: 0.0.1 + resolution: "css-value@npm:0.0.1" + checksum: 10c0/1d3f5177df6c8d0ef26b98e2c3376b44c4a3898336bb2fb38d3ac38ee2e2848a4ca4fddec291108e1a254439f2c1462ac5cf71e342480b9123ac5f3cd1251cd5 + languageName: node + linkType: hard + +"css-what@npm:^6.1.0": + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10c0/91e24c26fb977b4ccef30d7007d2668c1c10ac0154cc3f42f7304410e9594fb772aea4f30c832d2993b132ca8d99338050866476210316345ec2e7d47b248a56 + languageName: node + linkType: hard + +"data-uri-to-buffer@npm:^6.0.2": + version: 6.0.2 + resolution: "data-uri-to-buffer@npm:6.0.2" + checksum: 10c0/f76922bf895b3d7d443059ff278c9cc5efc89d70b8b80cd9de0aa79b3adc6d7a17948eefb8692e30398c43635f70ece1673d6085cc9eba2878dbc6c6da5292ac + languageName: node + linkType: hard + +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + +"debug@npm:3.1.0": + version: 3.1.0 + resolution: "debug@npm:3.1.0" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/5bff34a352d7b2eaa31886eeaf2ee534b5461ec0548315b2f9f80bd1d2533cab7df1fa52e130ce27bc31c3945fbffb0fc72baacdceb274b95ce853db89254ea4 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + +"debug@npm:^3.1.0": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: "npm:^2.1.1" + checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a + languageName: node + linkType: hard + +"decamelize@npm:^6.0.0, decamelize@npm:^6.0.1": + version: 6.0.1 + resolution: "decamelize@npm:6.0.1" + checksum: 10c0/c0a3a529591ebab1d1a9458b60684194e91d904e9b0a56367d3d507b2c8ab89dfd40c61423ca6a1eb2f70e2d44d2efe78f3342326395d3738d1d42592b1a6224 + languageName: node + linkType: hard + +"deepmerge-ts@npm:^7.0.3": + version: 7.1.5 + resolution: "deepmerge-ts@npm:7.1.5" + checksum: 10c0/3a265a2086f334e3ecf43a7d4138c950cb99e0b39e816fa7fd7f5326161364e51b13010906908212667619066f5b48de738ed42543212323fbbb5d4ed7ebdc84 + languageName: node + linkType: hard + +"defaults@npm:^1.0.3": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" + dependencies: + clone: "npm:^1.0.2" + checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a + languageName: node + linkType: hard + +"degenerator@npm:^5.0.0": + version: 5.0.1 + resolution: "degenerator@npm:5.0.1" + dependencies: + ast-types: "npm:^0.13.4" + escodegen: "npm:^2.1.0" + esprima: "npm:^4.0.1" + checksum: 10c0/e48d8a651edeb512a648711a09afec269aac6de97d442a4bb9cf121a66877e0eec11b9727100a10252335c0666ae1c84a8bc1e3a3f47788742c975064d2c7b1c + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + +"depd@npm:^2.0.0, depd@npm:~2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.3, detect-libc@npm:^2.1.2": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + +"detect-node@npm:^2.0.4": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 + languageName: node + linkType: hard + +"diff@npm:9.0.0": + version: 9.0.0 + resolution: "diff@npm:9.0.0" + checksum: 10c0/a971cc88f66071a33bd3942db2f51b57d484e9856265ae45cf44fb28ab2fde91f132d9c26d8be0fb6082d2be94d29e1295c1adb251b7461935d6a2dd304cd161 + languageName: node + linkType: hard + +"dom-serializer@npm:^2.0.0": + version: 2.0.0 + resolution: "dom-serializer@npm:2.0.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.2" + entities: "npm:^4.2.0" + checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 + languageName: node + linkType: hard + +"domelementtype@npm:^2.3.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": + version: 5.0.3 + resolution: "domhandler@npm:5.0.3" + dependencies: + domelementtype: "npm:^2.3.0" + checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a + languageName: node + linkType: hard + +"domutils@npm:^3.0.1, domutils@npm:^3.2.2": + version: 3.2.2 + resolution: "domutils@npm:3.2.2" + dependencies: + dom-serializer: "npm:^2.0.0" + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + +"duplexer@npm:~0.1.1": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"edge-paths@npm:^3.0.5": + version: 3.0.5 + resolution: "edge-paths@npm:3.0.5" + dependencies: + "@types/which": "npm:^2.0.1" + which: "npm:^2.0.2" + checksum: 10c0/690c3d274004ab1ea87be50d261690c788ad27debdb0b7a38b0d91e823510b2ef3aa58735666cfeafc88e2d935f329f968901caee860cde3f50110f1d383e6e3 + languageName: node + linkType: hard + +"edgedriver@npm:^6.1.2": + version: 6.3.0 + resolution: "edgedriver@npm:6.3.0" + dependencies: + "@wdio/logger": "npm:^9.18.0" + "@zip.js/zip.js": "npm:^2.8.11" + decamelize: "npm:^6.0.1" + edge-paths: "npm:^3.0.5" + fast-xml-parser: "npm:^5.3.3" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" + which: "npm:^6.0.0" + bin: + edgedriver: bin/edgedriver.js + checksum: 10c0/95d276332e1d4022826df10779d5a1804713e239ecd42e1a4fc20884c4187e0e5edd3dce17401407766c127a2a6cab95b230af1000dccf658b79166f6ed2a887 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.6.0 + resolution: "emoji-regex@npm:10.6.0" + checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f + languageName: node + linkType: hard + +"encodeurl@npm:^2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + +"encoding-sniffer@npm:^0.2.1": + version: 0.2.1 + resolution: "encoding-sniffer@npm:0.2.1" + dependencies: + iconv-lite: "npm:^0.6.3" + whatwg-encoding: "npm:^3.1.1" + checksum: 10c0/d6b591880788f3baf8dd1744636dd189d24a1ec93e6f9817267c60ac3458a5191ca70ab1a186fb67731beff1c3489c6527dfdc4718158ed8460ab2f400dd5e7d + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/b0701c92a10b89afb1cb45bf54a5292c6f008d744eb4382fa559d54775ff31617d1d7bc3ef617575f552e24fad2c7c1a1835948c66b3f3a4be0a6c1f35c883d8 + languageName: node + linkType: hard + +"entities@npm:^4.2.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 + languageName: node + linkType: hard + +"entities@npm:^7.0.1": + version: 7.0.1 + resolution: "entities@npm:7.0.1" + checksum: 10c0/b4fb9937bb47ecb00aaaceb9db9cdd1cc0b0fb649c0e843d05cf5dbbd2e9d2df8f98721d8b1b286445689c72af7b54a7242fc2d63ef7c9739037a8c73363e7ca + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-module-lexer@npm:^2.0.0": + version: 2.1.0 + resolution: "es-module-lexer@npm:2.1.0" + checksum: 10c0/93bcf2454fa72d67fe3ccd0abef8ce7933f5840a319513418a643dd8e9c6aa8f49709cecfae02ded722805dd327232d30723a807cc52e6809d6ac697c62c29fb + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.2 + resolution: "es-object-atoms@npm:1.1.2" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/1772861f094f739d6f41b579cfb9a18579daffeb434552a370a5fbef50a32d22227e27b63fdbb757b7ddd429d1b42fe52ccae7966d9302a2ec221b6f1b41bbc4 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-html@npm:^1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 + languageName: node + linkType: hard + +"esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"etag@npm:^1.8.1, etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b + languageName: node + linkType: hard + +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: "npm:^2.7.0" + checksum: 10c0/a1d9a5e9f95843650f8ec240dd1221454c110189a9813f32cdf7185759b43f1f964367ac7dca4ebc69150b59043f2d77c7e122b0d03abf7c25477ea5494785a5 + languageName: node + linkType: hard + +"events@npm:^3.3.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"execa@npm:^9.5.2": + version: 9.6.1 + resolution: "execa@npm:9.6.1" + dependencies: + "@sindresorhus/merge-streams": "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + figures: "npm:^6.1.0" + get-stream: "npm:^9.0.0" + human-signals: "npm:^8.0.1" + is-plain-obj: "npm:^4.1.0" + is-stream: "npm:^4.0.1" + npm-run-path: "npm:^6.0.0" + pretty-ms: "npm:^9.2.0" + signal-exit: "npm:^4.1.0" + strip-final-newline: "npm:^4.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10c0/636b36585306a3c8bc3a9d7b25d2d915fb06d8c9b9b02a804280d62562de3b34535affc1b7702b039320e0953daa6545a073f3c4b63fe974c1fe11336c56b467 + languageName: node + linkType: hard + +"expect-type@npm:^1.3.0": + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267 + languageName: node + linkType: hard + +"express@npm:5.2.1": + version: 5.2.1 + resolution: "express@npm:5.2.1" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.1" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10c0/45e8c841ad188a41402ddcd1294901e861ee0819f632fb494f2ed344ef9c43315d294d443fb48d594e6586a3b779785120f43321417adaef8567316a55072949 + languageName: node + linkType: hard + +"extract-zip@npm:^2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee + languageName: node + linkType: hard + +"fast-deep-equal@npm:^2.0.1": + version: 2.0.1 + resolution: "fast-deep-equal@npm:2.0.1" + checksum: 10c0/1602e0d6ed63493c865cc6b03f9070d6d3926e8cd086a123060b58f80a295f3f08b1ecfb479ae7c45b7fd45535202aea7cf5b49bc31bffb81c20b1502300be84 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.1.2 + resolution: "fast-uri@npm:3.1.2" + checksum: 10c0/5b35641895959f3f7ab7a7b1b5542bded159346f25ec9f256817b206d50b64eda5828e90d605a2e2fc645c90519a7259c2bab2c942ee728c88b88e5be21b090d + languageName: node + linkType: hard + +"fast-xml-builder@npm:^1.2.0": + version: 1.2.0 + resolution: "fast-xml-builder@npm:1.2.0" + dependencies: + path-expression-matcher: "npm:^1.5.0" + xml-naming: "npm:^0.1.0" + checksum: 10c0/84bb105cd04e91d6dcb746c4dbaeb12903b510e7ab9a06ffde55b5a582e005559a87d84467f18a655c6c4baf098f696fd74cee3cbe1aea9d01385907768ba32d + languageName: node + linkType: hard + +"fast-xml-parser@npm:^5.3.3": + version: 5.8.0 + resolution: "fast-xml-parser@npm:5.8.0" + dependencies: + "@nodable/entities": "npm:^2.1.0" + fast-xml-builder: "npm:^1.2.0" + path-expression-matcher: "npm:^1.5.0" + strnum: "npm:^2.3.0" + xml-naming: "npm:^0.1.0" + bin: + fxparser: src/cli/cli.js + checksum: 10c0/cd0828b7daf3f683c64d0d6a0c719f1476d4f02f1089cf345a9bc0b886e7d5fa18c11da025d480ea67a41765be63135cbd952051942c9d0b422a5d4dde11814e + languageName: node + linkType: hard + +"fastest-levenshtein@npm:1.0.16": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e + languageName: node + linkType: hard + +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f + languageName: node + linkType: hard + +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf + languageName: node + linkType: hard + +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: "npm:^2.0.0" + checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 + languageName: node + linkType: hard + +"finalhandler@npm:^2.1.0": + version: 2.1.1 + resolution: "finalhandler@npm:2.1.1" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10c0/6bd664e21b7b2e79efcaace7d1a427169f61cce048fae68eb56290e6934e676b78e55d89f5998c5508871345bc59a61f47002dc505dc7288be68cceac1b701e2 + languageName: node + linkType: hard + +"find-up-simple@npm:^1.0.0": + version: 1.0.1 + resolution: "find-up-simple@npm:1.0.1" + checksum: 10c0/ad34de157b7db925d50ff78302fefb28e309f3bc947c93ffca0f9b0bccf9cf1a2dc57d805d5c94ec9fc60f4838f5dbdfd2a48ecd77c23015fa44c6dd5f60bc40 + languageName: node + linkType: hard + +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a + languageName: node + linkType: hard + +"follow-redirects@npm:^1.16.0": + version: 1.16.0 + resolution: "follow-redirects@npm:1.16.0" + peerDependenciesMeta: + debug: + optional: true + checksum: 10c0/a1e2900163e6f1b4d1ed5c221b607f41decbab65534c63fe7e287e40a5d552a6496e7d9d7d976fa4ba77b4c51c11e5e9f683f10b43011ea11e442ff128d0e181 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" + dependencies: + cross-spawn: "npm:^7.0.6" + signal-exit: "npm:^4.0.1" + checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 + languageName: node + linkType: hard + +"form-data@npm:4.0.5": + version: 4.0.5 + resolution: "form-data@npm:4.0.5" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.2" + mime-types: "npm:^2.1.12" + checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b + languageName: node + linkType: hard + +"form-data@npm:^4.0.5": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10c0/43947a77bf0ff45c6ceed789778982d47a3f3e720a74b71721174ebf3310a5f1a8be1d6b38a3ee3688e8a18a2c4273073ec0844cd37efda3eaf46d41c9c318ff + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc + languageName: node + linkType: hard + +"fresh@npm:~0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a + languageName: node + linkType: hard + +"fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"ftp-response-parser@npm:^1.0.1": + version: 1.0.1 + resolution: "ftp-response-parser@npm:1.0.1" + dependencies: + readable-stream: "npm:^1.0.31" + checksum: 10c0/b10207924ba22514063a3f6c388ac68443d6ee2183a7feda1309dfbaa02659adfeda58c88d2d30b5a2906605710740796265532d8e9e634305e56b7c770f7e15 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"geckodriver@npm:^6.1.0": + version: 6.1.0 + resolution: "geckodriver@npm:6.1.0" + dependencies: + "@wdio/logger": "npm:^9.18.0" + "@zip.js/zip.js": "npm:^2.8.11" + decamelize: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" + modern-tar: "npm:^0.7.2" + bin: + geckodriver: bin/geckodriver.js + checksum: 10c0/d7e28b02b40ee3af01a061f33382ef7874bc8d2a9a46fc0ce6209274b1c21c27f7297a0307b6ffd2af87f19f4e8d24c23ca99e03bfed16f9f170e30ffc3437f6 + languageName: node + linkType: hard + +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-east-asian-width@npm:^1.0.0": + version: 1.6.0 + resolution: "get-east-asian-width@npm:1.6.0" + checksum: 10c0/7e72e9550fd49ca5b246f9af6bb2afc129c96412845ff6556b3274fd44817a381702ca17028efe9866b261a3d44254cbf21e6c90cf05b4b61675630af776d431 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d + languageName: node + linkType: hard + +"get-port@npm:^7.0.0": + version: 7.2.0 + resolution: "get-port@npm:7.2.0" + checksum: 10c0/4ed741d9008ad15a24e2098c8971918025cc8241624245e704ecc62bb65160db5c79de5d7112acdaabccbe0714cd0704008c74d43a1f7a24a5875e58b84621be + languageName: node + linkType: hard + +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"get-stream@npm:9.0.1, get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 + languageName: node + linkType: hard + +"get-uri@npm:^6.0.1": + version: 6.0.5 + resolution: "get-uri@npm:6.0.5" + dependencies: + basic-ftp: "npm:^5.0.2" + data-uri-to-buffer: "npm:^6.0.2" + debug: "npm:^4.3.4" + checksum: 10c0/c7ff5d5d55de53d23ecce7c5108cc3ed0db1174db43c9aa15506d640283d36ee0956fd8ba1fc50b06a718466cc85794ae9d8860193f91318afe846e3e7010f3a + languageName: node + linkType: hard + +"glob@npm:13.0.6": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a + languageName: node + linkType: hard + +"glob@npm:^10.0.0, glob@npm:^10.2.2": + version: 10.5.0 + resolution: "glob@npm:10.5.0" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 + languageName: node + linkType: hard + +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 10c0/108415fb07ac913f17040dc336607772fcea68c7f495ef91887edddb0b0f5ff7bc1d1ab181b125ecb2f0505669ef12c9a178a3bbd2dd8e042d8c5f1d7c90331a + languageName: node + linkType: hard + +"handle-thing@npm:^2.0.0": + version: 2.0.1 + resolution: "handle-thing@npm:2.0.1" + checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: "npm:^1.0.3" + checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c + languageName: node + linkType: hard + +"hasown@npm:^2.0.2, hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 + languageName: node + linkType: hard + +"hosted-git-info@npm:^9.0.0": + version: 9.0.3 + resolution: "hosted-git-info@npm:9.0.3" + dependencies: + lru-cache: "npm:^11.1.0" + checksum: 10c0/8f216ccb461ca54ae1846745325ced6a880b53101a58c820b813f067caa301576bf974f787df5688b7f0f1b752cdfcbaa2979751d1fcfd604032cc57bc538607 + languageName: node + linkType: hard + +"hpack.js@npm:^2.1.6": + version: 2.1.6 + resolution: "hpack.js@npm:2.1.6" + dependencies: + inherits: "npm:^2.0.1" + obuf: "npm:^1.0.0" + readable-stream: "npm:^2.0.1" + wbuf: "npm:^1.1.0" + checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 + languageName: node + linkType: hard + +"htmlfy@npm:^0.8.1": + version: 0.8.1 + resolution: "htmlfy@npm:0.8.1" + checksum: 10c0/5c76ffd5d99b66335a7cafefa573b8e63e561bb04e3d40d37cb759a06ea8e2f98be663d678bcbd920f2c90ee097e04e4cafa25f8573c08e01f0072742c741d59 + languageName: node + linkType: hard + +"htmlparser2@npm:^10.1.0": + version: 10.1.0 + resolution: "htmlparser2@npm:10.1.0" + dependencies: + domelementtype: "npm:^2.3.0" + domhandler: "npm:^5.0.3" + domutils: "npm:^3.2.2" + entities: "npm:^7.0.1" + checksum: 10c0/36394e29b80cfcc5e78e0fa4d3aa21fdaac3e6778d23e5c933e625c290987cd9a724a2eb0753ab60ed0c69dfaba0ab115f0ee50fb112fd8f0c4d522e7e0089a2 + languageName: node + linkType: hard + +"http-deceiver@npm:^1.2.7": + version: 1.2.7 + resolution: "http-deceiver@npm:1.2.7" + checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 + languageName: node + linkType: hard + +"http-errors@npm:^2.0.0, http-errors@npm:^2.0.1, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" + dependencies: + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10c0/fb38906cef4f5c83952d97661fe14dc156cb59fe54812a42cd448fa57b5c5dfcb38a40a916957737bd6b87aab257c0648d63eb5b6a9ca9f548e105b6072712d4 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1, http-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"http-status-codes@npm:2.3.0": + version: 2.3.0 + resolution: "http-status-codes@npm:2.3.0" + checksum: 10c0/c2412188929e8eed6623eef468c62d0c3c082919c03e9b74fd79cfd060d11783dba44603e38a3cee52d26563fe32005913eaf6120aa8ba907da1238f3eaad5fe + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.6": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^8.0.1": + version: 8.0.1 + resolution: "human-signals@npm:8.0.1" + checksum: 10c0/195ac607108c56253757717242e17cd2e21b29f06c5d2dad362e86c672bf2d096e8a3bbb2601841c376c2301c4ae7cff129e87f740aa4ebff1390c163114c7c4 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.3": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.7.0, iconv-lite@npm:~0.7.0": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: 10c0/f8ba7ede69bee9260241ad078d2d535848745ff5f6995c7c7cb41cfdc9ccc213f66e10fa5afb881f90298b24a3f7344b637b592beb4f54e582770cdce3f1f039 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^4.0.0": + version: 4.2.0 + resolution: "import-meta-resolve@npm:4.2.0" + checksum: 10c0/3ee8aeecb61d19b49d2703987f977e9d1c7d4ba47db615a570eaa02fe414f40dfa63f7b953e842cbe8470d26df6371332bfcf21b2fd92b0112f9fea80dde2c4c + languageName: node + linkType: hard + +"index-to-position@npm:^1.1.0": + version: 1.2.0 + resolution: "index-to-position@npm:1.2.0" + checksum: 10c0/d7ac9fae9fad1d7fbeb7bd92e1553b26e8b10522c2d80af5c362828428a41360e21fc5915d7b8c8227eb0f0d37b12099846ac77381a04d6c0059eb81749e374d + languageName: node + linkType: hard + +"inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ip-address@npm:^10.1.1": + version: 10.2.0 + resolution: "ip-address@npm:10.2.0" + checksum: 10c0/5a00aada6e922c9c69dfc800ed5d0fa3348675ebdeed0e1575f503f27ca385b5f534363c9af7ad1daf64c1f1409388cdd3cc2e9b9b0fe1c924a431378d55075a + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-interactive@npm:^1.0.0": + version: 1.0.0 + resolution: "is-interactive@npm:1.0.0" + checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d + languageName: node + linkType: hard + +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"is-stream@npm:^4.0.0, is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^2.0.0": + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 10c0/ed1e62da617f71fe348907c71743b5ed550448b455f8d269f89a7c7ddb8ae6e962de3dab6a74a237b06f5eb7f6ece7a45ada8ce96d87fe972926530f91ae3311 + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"jiti@npm:^2.6.1": + version: 2.7.0 + resolution: "jiti@npm:2.7.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/1b1e2310a490dce1aeea3da5f5dfe18273516c20ce48be2e98eb8ea452d5f3dcc8fd0cfd6d28b4052a24c5dbab6e3089b2d7e79f0bce7915b10d750929563c42 + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"jsftp@npm:2.1.3": + version: 2.1.3 + resolution: "jsftp@npm:2.1.3" + dependencies: + debug: "npm:^3.1.0" + ftp-response-parser: "npm:^1.0.1" + once: "npm:^1.4.0" + parse-listing: "npm:^1.1.3" + stream-combiner: "npm:^0.2.2" + unorm: "npm:^1.4.1" + checksum: 10c0/e834bb2b28ebfc52d0eb16512ffbea1e196066a6d42e1cfbb6f68c03468f21a96f97eeeba13a7e79cfbcc1105ae09157c029a8c9c5f01d4fb9f462f50eaf926b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-schema@npm:0.4.0": + version: 0.4.0 + resolution: "json-schema@npm:0.4.0" + checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 + languageName: node + linkType: hard + +"jszip@npm:^3.10.1": + version: 3.10.1 + resolution: "jszip@npm:3.10.1" + dependencies: + lie: "npm:~3.3.0" + pako: "npm:~1.0.2" + readable-stream: "npm:~2.3.6" + setimmediate: "npm:^1.0.5" + checksum: 10c0/58e01ec9c4960383fb8b38dd5f67b83ccc1ec215bf74c8a5b32f42b6e5fb79fada5176842a11409c4051b5b94275044851814a31076bf49e1be218d3ef57c863 + languageName: node + linkType: hard + +"klaw@npm:4.1.0": + version: 4.1.0 + resolution: "klaw@npm:4.1.0" + checksum: 10c0/f2fb70843ab61bc7df9f180307fa35d5b080753f57f6936755d3d707b50b752e210f2b21523c23c0621e161eb920dea66d6139d6b71d8f76b58754902d0e0034 + languageName: node + linkType: hard + +"kleur@npm:^4.1.0": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d + languageName: node + linkType: hard + +"lazystream@npm:^1.0.0": + version: 1.0.1 + resolution: "lazystream@npm:1.0.1" + dependencies: + readable-stream: "npm:^2.0.5" + checksum: 10c0/ea4e509a5226ecfcc303ba6782cc269be8867d372b9bcbd625c88955df1987ea1a20da4643bf9270336415a398d33531ebf0d5f0d393b9283dc7c98bfcbd7b69 + languageName: node + linkType: hard + +"lie@npm:~3.3.0": + version: 3.3.0 + resolution: "lie@npm:3.3.0" + dependencies: + immediate: "npm:~3.0.5" + checksum: 10c0/56dd113091978f82f9dc5081769c6f3b947852ecf9feccaf83e14a123bc630c2301439ce6182521e5fbafbde88e88ac38314327a4e0493a1bea7e0699a7af808 + languageName: node + linkType: hard + +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.32.0": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 + languageName: node + linkType: hard + +"lilconfig@npm:3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc + languageName: node + linkType: hard + +"locate-app@npm:^2.2.24": + version: 2.5.0 + resolution: "locate-app@npm:2.5.0" + dependencies: + "@promptbook/utils": "npm:0.69.5" + type-fest: "npm:4.26.0" + userhome: "npm:1.0.1" + checksum: 10c0/40a688b72e6153d57026ee0ed56425d697a9f9d8e1a32ff9aa7ecd7baa6a5a468c820849a855f40ebfbbac3378d03828f7d9f0c38830679813245aa54a53bd40 + languageName: node + linkType: hard + +"lockfile@npm:1.0.4": + version: 1.0.4 + resolution: "lockfile@npm:1.0.4" + dependencies: + signal-exit: "npm:^3.0.2" + checksum: 10c0/80b7777ceb43105d9e588733c3efc2514653a5e3a0dae3e61347a1f5381da34dcaa2caaa60c39ed5d4ad31c1735a4831e5639a0ba1c508bfea8dbc9c89777b37 + languageName: node + linkType: hard + +"lodash.clonedeep@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.clonedeep@npm:4.5.0" + checksum: 10c0/2caf0e4808f319d761d2939ee0642fa6867a4bbf2cfce43276698828380756b99d4c4fa226d881655e6ac298dd453fe12a5ec8ba49861777759494c534936985 + languageName: node + linkType: hard + +"lodash.zip@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.zip@npm:4.2.0" + checksum: 10c0/e596da80a6138e369998b50c78b51ed6cf984b4f239e59056aa18dca5972a213c491c511caf5888a2dec603c67265caf942099bec554a86a5c7ff1937d57f0e4 + languageName: node + linkType: hard + +"lodash@npm:4.18.1, lodash@npm:^4.17.15": + version: 4.18.1 + resolution: "lodash@npm:4.18.1" + checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 + languageName: node + linkType: hard + +"log-symbols@npm:7.0.1": + version: 7.0.1 + resolution: "log-symbols@npm:7.0.1" + dependencies: + is-unicode-supported: "npm:^2.0.0" + yoctocolors: "npm:^2.1.1" + checksum: 10c0/71d30f9a44b8604b14df5e7c9b579d739997253db7385339d493ece41ee2cc74c1f96c5b4c0b2c1e0829b05348d4f287e68faab495b7a094a80f51351c816075 + languageName: node + linkType: hard + +"log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 + languageName: node + linkType: hard + +"logform@npm:^2.7.0": + version: 2.7.0 + resolution: "logform@npm:2.7.0" + dependencies: + "@colors/colors": "npm:1.6.0" + "@types/triple-beam": "npm:^1.3.2" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f + languageName: node + linkType: hard + +"loglevel-plugin-prefix@npm:^0.8.4": + version: 0.8.4 + resolution: "loglevel-plugin-prefix@npm:0.8.4" + checksum: 10c0/357524eec4c165ff823b5bbf72e8373ff529e5cb95c1f4b20749847bd5b5b16ab328d6d33d1a9019f1a2dc52e28fca5d595e52f2ee20e24986182a6f9552a9ec + languageName: node + linkType: hard + +"loglevel@npm:^1.6.0": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 + languageName: node + linkType: hard + +"lru-cache@npm:11.5.0": + version: 11.5.0 + resolution: "lru-cache@npm:11.5.0" + checksum: 10c0/b92c2a7518128dec6b244bf3eb9fd79964d316cdeb12865ebfc2cebb4dfe9b24e3767a3923d71e6eb735f56b557fc55f08f150a53097d7805afb628c90158df4 + languageName: node + linkType: hard + +"lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0": + version: 11.5.1 + resolution: "lru-cache@npm:11.5.1" + checksum: 10c0/7b341cea79a8efe9c6a6f20c8757a77eca5b25d7ff983ccf4e11e547b81f6787824baa1c84705251dff84ab4ffac85717ac354b9d02e465f86a9f8b166409979 + languageName: node + linkType: hard + +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed + languageName: node + linkType: hard + +"magic-string@npm:^0.30.21": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9 + languageName: node + linkType: hard + +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3 + languageName: node + linkType: hard + +"method-override@npm:3.0.0": + version: 3.0.0 + resolution: "method-override@npm:3.0.0" + dependencies: + debug: "npm:3.1.0" + methods: "npm:~1.1.2" + parseurl: "npm:~1.3.2" + vary: "npm:~1.1.2" + checksum: 10c0/0da9a25961b6dd909698e20fc4598f810ba1632e92928136558854296cdf6baa014f0f9170cf65d88aaec496c7c486fdf914964e24532dce0b15390b946ffabe + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.35": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.2": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/35a0dd1035d14d185664f346efcdb72e93ef7a9b6e9ae808bd1f6358227010267fab52657b37562c80fc888ff76becb2b2938deb5e730818b7983bf8bd359767 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd + languageName: node + linkType: hard + +"minimatch@npm:^10.2.2": + version: 10.2.5 + resolution: "minimatch@npm:10.2.5" + dependencies: + brace-expansion: "npm:^5.0.5" + checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd + languageName: node + linkType: hard + +"minimatch@npm:^5.1.0": + version: 5.1.9 + resolution: "minimatch@npm:5.1.9" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/4202718683815a7288b13e470160a4f9560cf392adef4f453927505817e01ef6b3476ecde13cfcaed17e7326dd3b69ad44eb2daeb19a217c5500f9277893f1d6 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.9 + resolution: "minimatch@npm:9.0.9" + dependencies: + brace-expansion: "npm:^2.0.2" + checksum: 10c0/0b6a58530dbb00361745aa6c8cffaba4c90f551afe7c734830bd95fd88ebf469dd7355a027824ea1d09e37181cfeb0a797fb17df60c15ac174303ac110eb7e86 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb + languageName: node + linkType: hard + +"minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: "npm:^7.1.2" + checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec + languageName: node + linkType: hard + +"mitt@npm:^3.0.1": + version: 3.0.1 + resolution: "mitt@npm:3.0.1" + checksum: 10c0/3ab4fdecf3be8c5255536faa07064d05caa3dd332bd318ff02e04621f7b3069ca1de9106cfe8e7ced675abfc2bec2ce4c4ef321c4a1bb1fb29df8ae090741913 + languageName: node + linkType: hard + +"modern-tar@npm:^0.7.2": + version: 0.7.6 + resolution: "modern-tar@npm:0.7.6" + checksum: 10c0/1733590c67f31141a7efafd084d82f1da6818f20a7e6edc66623bf9e91b7451f4da079536e3e0e29b20947ea92219cba8d415cea19734edd15fe3bbd874b4846 + languageName: node + linkType: hard + +"morgan@npm:1.10.1": + version: 1.10.1 + resolution: "morgan@npm:1.10.1" + dependencies: + basic-auth: "npm:~2.0.1" + debug: "npm:2.6.9" + depd: "npm:~2.0.0" + on-finished: "npm:~2.3.0" + on-headers: "npm:~1.1.0" + checksum: 10c0/2ecd68504d29151b516a6233839e4f27ae0312acc4dbcb1fe84ff9b5db0eb9b25f31258a931dcf689184b4858839572095fcc62eef3cbd7339287d59f1424346 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:^2.1.1, ms@npm:^2.1.3, ms@npm:~2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.12": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/ba142b7b39e11e80c16dd74b0365d407880c87c1cf7e1480956981ae940ee36060fa5b6f092cd1e315184dd19244c657bd017d03327bd3c62247d691c5e8edfb + languageName: node + linkType: hard + +"ncp@npm:2.0.0": + version: 2.0.0 + resolution: "ncp@npm:2.0.0" + bin: + ncp: ./bin/ncp + checksum: 10c0/d515babf9d3205ab9252e7d640af7c3e1a880317016d41f2fce2e6b9c8f60eb8bb6afde30e8c4f8e1e3fa551465f094433c3f364b25a85d6a28ec52c1ad6e067 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"netmask@npm:^2.0.2": + version: 2.1.1 + resolution: "netmask@npm:2.1.1" + checksum: 10c0/c78e31869b0578fb0a9874a0c0fdf0e1f8b3492392d1043355fb11d9ea42ef94e0216c6aee7d8e15db39d1a8caf331f9b144ae3ee43fd951b73a66837711fb09 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 13.0.0 + resolution: "node-gyp@npm:13.0.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + graceful-fs: "npm:^4.2.6" + nopt: "npm:^10.0.0" + proc-log: "npm:^7.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + undici: "npm:^6.25.0" + which: "npm:^7.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/e7525c427db2d16aa368b8947187de83083d2a8dda23e3e096a71c22ae637ac5bb8ed7cf6c871f1b9118cd2729dbfee4ff3a4245e2b79226900227b15831b492 + languageName: node + linkType: hard + +"nopt@npm:^10.0.0": + version: 10.0.1 + resolution: "nopt@npm:10.0.1" + dependencies: + abbrev: "npm:^5.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/980d89257f9587f3e1f77877ddbf905d6aa3b738ec33e49a4fa1a059a0dd82eb28063982b150654a7ae9de386f2ead60e56172db7d37cf56de545f7392a2a26a + languageName: node + linkType: hard + +"normalize-package-data@npm:^8.0.0": + version: 8.0.0 + resolution: "normalize-package-data@npm:8.0.0" + dependencies: + hosted-git-info: "npm:^9.0.0" + semver: "npm:^7.3.5" + validate-npm-package-license: "npm:^3.0.4" + checksum: 10c0/abd9d85912d6435979a5779d30e54b7725a6271e36186f284d00b33886a584d738ca7c2d2569e7f7e1be9cc72d90c1485d58562f546163b49edb87ea30804acf + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^6.0.0": + version: 6.0.0 + resolution: "npm-run-path@npm:6.0.0" + dependencies: + path-key: "npm:^4.0.0" + unicorn-magic: "npm:^0.3.0" + checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd + languageName: node + linkType: hard + +"nth-check@npm:^2.0.1": + version: 2.1.1 + resolution: "nth-check@npm:2.1.1" + dependencies: + boolbase: "npm:^1.0.0" + checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + +"obuf@npm:^1.0.0, obuf@npm:^1.1.2": + version: 1.1.2 + resolution: "obuf@npm:1.1.2" + checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 + languageName: node + linkType: hard + +"obug@npm:^2.1.1": + version: 2.1.3 + resolution: "obug@npm:2.1.3" + checksum: 10c0/cb8187fed0a5fc8445507c950e89f3c1bd43895658c398b5803f6b7804dfa0c562975ecce1e67f3d9247d521452a5bfade9e0e951cc0326b7444272f7c24d25f + languageName: node + linkType: hard + +"on-finished@npm:^2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"on-finished@npm:~2.3.0": + version: 2.3.0 + resolution: "on-finished@npm:2.3.0" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/c904f9e518b11941eb60279a3cbfaf1289bd0001f600a950255b1dede9fe3df8cd74f38483550b3bb9485165166acb5db500c3b4c4337aec2815c88c96fcc2ea + languageName: node + linkType: hard + +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10c0/2c3b6b0d68ec9adbd561dc2d61c9b14da8ac03d8a2f0fd9e97bdf0600c887d5d97f664ff3be6876cf40cda6e3c587d73a4745e10b426ac50c7664fc5a0dfc0a1 + languageName: node + linkType: hard + +"once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa + languageName: node + linkType: hard + +"onetime@npm:^5.1.0": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"ora@npm:5.4.1": + version: 5.4.1 + resolution: "ora@npm:5.4.1" + dependencies: + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 + languageName: node + linkType: hard + +"p-limit@npm:^7.2.0": + version: 7.3.0 + resolution: "p-limit@npm:7.3.0" + dependencies: + yocto-queue: "npm:^1.2.1" + checksum: 10c0/8030f0ccc67d80d9c12f2b4ed277c5ede151f80a09cb1b143ab0ee597940784f2cf6e07e92d54c023fe9836784329750c25c6cd4488a7a326c0ae0ec2efca982 + languageName: node + linkType: hard + +"pac-proxy-agent@npm:^7.1.0": + version: 7.2.0 + resolution: "pac-proxy-agent@npm:7.2.0" + dependencies: + "@tootallnate/quickjs-emscripten": "npm:^0.23.0" + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + get-uri: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.6" + pac-resolver: "npm:^7.0.1" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10c0/0265c17c9401c2ea735697931a6553a0c6d8b20c4d7d4e3b3a0506080ba69a8d5ad656e2a6be875411212e2b6ed7a4d9526dd3997e08581fdfb1cbcad454c296 + languageName: node + linkType: hard + +"pac-resolver@npm:^7.0.1": + version: 7.0.1 + resolution: "pac-resolver@npm:7.0.1" + dependencies: + degenerator: "npm:^5.0.0" + netmask: "npm:^2.0.2" + checksum: 10c0/5f3edd1dd10fded31e7d1f95776442c3ee51aa098c28b74ede4927d9677ebe7cebb2636750c24e945f5b84445e41ae39093d3a1014a994e5ceb9f0b1b88ebff5 + languageName: node + linkType: hard + +"package-changed@npm:3.0.0": + version: 3.0.0 + resolution: "package-changed@npm:3.0.0" + dependencies: + commander: "npm:^6.2.0" + bin: + package-changed: bin/package-changed.js + checksum: 10c0/b2a386bb82ececf11cf2728914085915f4a0fff092646f8643ec6cf64c4e5e664f8e589f56bbe9c8f5a86372b4545d576b1da0c91aee518f19472f4b449ad7e4 + languageName: node + linkType: hard + +"package-directory@npm:8.2.0": + version: 8.2.0 + resolution: "package-directory@npm:8.2.0" + dependencies: + find-up-simple: "npm:^1.0.0" + checksum: 10c0/a2426d4ec22098ba8f35e9d0fa0935e0040ddd276d91330c790a68e36c01a41985ddd81ab1878e5ce9d395d98ca04aab99d107cb68431ff77a087c15e14d40a2 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"pako@npm:~1.0.2": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe + languageName: node + linkType: hard + +"parse-json@npm:^8.3.0": + version: 8.3.0 + resolution: "parse-json@npm:8.3.0" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + index-to-position: "npm:^1.1.0" + type-fest: "npm:^4.39.1" + checksum: 10c0/0eb5a50f88b8428c8f7a9cf021636c16664f0c62190323652d39e7bdf62953e7c50f9957e55e17dc2d74fc05c89c11f5553f381dbc686735b537ea9b101c7153 + languageName: node + linkType: hard + +"parse-listing@npm:^1.1.3": + version: 1.1.3 + resolution: "parse-listing@npm:1.1.3" + checksum: 10c0/59e72ec5e3cd14d2bb24cbcab1f6533b3bd53c3a554c7c3a71423fac90bd796e0d81e5c339b87177da0cd4c3488658dd1b60e235a67572b3eb4d1c770ac0e8e0 + languageName: node + linkType: hard + +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 + languageName: node + linkType: hard + +"parse5-htmlparser2-tree-adapter@npm:^7.1.0": + version: 7.1.0 + resolution: "parse5-htmlparser2-tree-adapter@npm:7.1.0" + dependencies: + domhandler: "npm:^5.0.3" + parse5: "npm:^7.0.0" + checksum: 10c0/e5a4e0b834c84c9e244b5749f8d007f4baaeafac7a1da2c54be3421ffd9ef8fdec4f198bf55cda22e88e6ba95e9943f6ed5aa3ae5900b39972ebf5dc8c3f4722 + languageName: node + linkType: hard + +"parse5-parser-stream@npm:^7.1.2": + version: 7.1.2 + resolution: "parse5-parser-stream@npm:7.1.2" + dependencies: + parse5: "npm:^7.0.0" + checksum: 10c0/e236c61000d38ecad369e725a48506b051cebad8abb00e6d4e8bff7aa85c183820fcb45db1559cc90955bdbbdbd665ea94c41259594e74566fff411478dc7fcb + languageName: node + linkType: hard + +"parse5@npm:^7.0.0, parse5@npm:^7.3.0": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: "npm:^6.0.0" + checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 + languageName: node + linkType: hard + +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + +"path-expression-matcher@npm:^1.5.0": + version: 1.5.0 + resolution: "path-expression-matcher@npm:1.5.0" + checksum: 10c0/646cb5bc66cd7d809a52288336f3ac1e6223f156fd8e912936e490e590f7f93e8056d4fd25fcbcc7da61bb698fa520112cb050372a3f65e7b79bd4afa0f77610 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 + languageName: node + linkType: hard + +"path-to-regexp@npm:8.4.2, path-to-regexp@npm:^8.0.0": + version: 8.4.2 + resolution: "path-to-regexp@npm:8.4.2" + checksum: 10c0/05b115c49b47ad252ce05faa32930f643f23769c68b8bcfe78ad833545140c48bbffb3266986d6c8d5db13a64cf12e07e0d72d9882cab830efeefa553533ebaf + languageName: node + linkType: hard + +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 + languageName: node + linkType: hard + +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 + languageName: node + linkType: hard + +"plist@npm:4.0.0": + version: 4.0.0 + resolution: "plist@npm:4.0.0" + dependencies: + "@xmldom/xmldom": "npm:^0.9.10" + xmlbuilder: "npm:^15.1.1" + checksum: 10c0/e2d97e11407e873e39764c7397207790dc31b2ddf8a7685bf602ce828de986ee7cce334deb3a630b65e5e99c4be95ea2f14f8c6bb44a900d11edc7f488ab16a8 + languageName: node + linkType: hard + +"pluralize@npm:8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10c0/2044cfc34b2e8c88b73379ea4a36fc577db04f651c2909041b054c981cd863dd5373ebd030123ab058d194ae615d3a97cfdac653991e499d10caf592e8b3dc33 + languageName: node + linkType: hard + +"postcss@npm:^8.5.15": + version: 8.5.15 + resolution: "postcss@npm:8.5.15" + dependencies: + nanoid: "npm:^3.3.12" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/7f2e63ae22fbe43aace1bf652bd99da4e90737c64194d49e51ddc9cd0f9e51ff2861a7d734379b494deffa03a880a5c65eec70bc29ee9ebaa7136dde3eee8f31 + languageName: node + linkType: hard + +"pretty-ms@npm:^9.2.0": + version: 9.3.0 + resolution: "pretty-ms@npm:9.3.0" + dependencies: + parse-ms: "npm:^4.0.0" + checksum: 10c0/555ea39a1de48a30601938aedb76d682871d33b6dee015281c37108921514b11e1792928b1648c2e5589acc73c8ef0fb5e585fb4c718e340a28b86799e90fb34 + languageName: node + linkType: hard + +"proc-log@npm:^7.0.0": + version: 7.0.0 + resolution: "proc-log@npm:7.0.0" + checksum: 10c0/b89c2d862604f35fec795477b0c7e376feab3ba0d4f4d291c4e959567442697cf451ac557d0623c1cc38af45a78128b983410f397a10c5d3a67f76c33de4754b + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 + languageName: node + linkType: hard + +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 + languageName: node + linkType: hard + +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c + languageName: node + linkType: hard + +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"proxy-agent@npm:^6.5.0": + version: 6.5.0 + resolution: "proxy-agent@npm:6.5.0" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + http-proxy-agent: "npm:^7.0.1" + https-proxy-agent: "npm:^7.0.6" + lru-cache: "npm:^7.14.1" + pac-proxy-agent: "npm:^7.1.0" + proxy-from-env: "npm:^1.1.0" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10c0/7fd4e6f36bf17098a686d4aee3b8394abfc0b0537c2174ce96b0a4223198b9fafb16576c90108a3fcfc2af0168bd7747152bfa1f58e8fee91d3780e79aab7fd8 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b + languageName: node + linkType: hard + +"proxy-from-env@npm:^2.1.0": + version: 2.1.0 + resolution: "proxy-from-env@npm:2.1.0" + checksum: 10c0/ed01729fd4d094eab619cd7e17ce3698b3413b31eb102c4904f9875e677cd207392795d5b4adee9cec359dfd31c44d5ad7595a3a3ad51c40250e141512281c58 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.4 + resolution: "pump@npm:3.0.4" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/2780e66b5471c19e3e3e1063b84f3f6a3a08367f24c5ed552f98cd5901e6ada27c7ad6495d4244f553fd03b01884a4561933064f053f47c8994d84fd352768ea + languageName: node + linkType: hard + +"qs@npm:^6.14.0, qs@npm:^6.14.1": + version: 6.15.2 + resolution: "qs@npm:6.15.2" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/e6fd5f6f0aab06d480fe9ab15cebfc4ce4235303e2f91dc69a8f7f4df1e668a61c11d1cfbabacf4295cbbeb7b670ed23db45307480726259761f98e5695e93a7 + languageName: node + linkType: hard + +"query-selector-shadow-dom@npm:^1.0.1": + version: 1.0.1 + resolution: "query-selector-shadow-dom@npm:1.0.1" + checksum: 10c0/f36de03f170ff1da69c3eecfa7f8b01e450a46dd266c921e17f36076ec59862eee00179489f30cb17c118bb56e868436578c01ea66f671fb358750d6ae474125 + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:^3.0.1": + version: 3.0.2 + resolution: "raw-body@npm:3.0.2" + dependencies: + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.7.0" + unpipe: "npm:~1.0.0" + checksum: 10c0/d266678d08e1e7abea62c0ce5864344e980fa81c64f6b481e9842c5beaed2cdcf975f658a3ccd67ad35fc919c1f6664ccc106067801850286a6cbe101de89f29 + languageName: node + linkType: hard + +"read-pkg@npm:10.1.0": + version: 10.1.0 + resolution: "read-pkg@npm:10.1.0" + dependencies: + "@types/normalize-package-data": "npm:^2.4.4" + normalize-package-data: "npm:^8.0.0" + parse-json: "npm:^8.3.0" + type-fest: "npm:^5.4.4" + unicorn-magic: "npm:^0.4.0" + checksum: 10c0/6a284bd00945239f715b8a0e986ad0faf29e184f5f26890734991c2696e48b4fa330939f937faac85bc4a2f6be17f8fce288ecd795b337bb4e37a5b75c464569 + languageName: node + linkType: hard + +"readable-stream@npm:^1.0.31": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.1" + isarray: "npm:0.0.1" + string_decoder: "npm:~0.10.x" + checksum: 10c0/b7f41b16b305103d598e3c8964fa30d52d6e0b5d9fdad567588964521691c24b279c7a8bb71f11927c3613acf355bac72d8396885a43d50425b2caafd49bc83d + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.5, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa + languageName: node + linkType: hard + +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readable-stream@npm:^4.0.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10c0/fd86d068da21cfdb10f7a4479f2e47d9c0a9b0c862fc0c840a7e5360201580a55ac399c764b12a4f6fa291f8cee74d9c4b7562e0d53b3c4b2769f2c98155d957 + languageName: node + linkType: hard + +"readdir-glob@npm:^1.1.2": + version: 1.1.3 + resolution: "readdir-glob@npm:1.1.3" + dependencies: + minimatch: "npm:^5.1.0" + checksum: 10c0/a37e0716726650845d761f1041387acd93aa91b28dd5381950733f994b6c349ddc1e21e266ec7cc1f9b92e205a7a972232f9b89d5424d07361c2c3753d5dbace + languageName: node + linkType: hard + +"readdir-glob@npm:^3.0.0": + version: 3.0.0 + resolution: "readdir-glob@npm:3.0.0" + dependencies: + minimatch: "npm:^10.2.2" + checksum: 10c0/9a358c8347b4db2a1f72168da67f7ef8d9ccd51f7fdaa127eed8170a1025e97942705f827b0b45e6fdc0e40f04d0859ba75c3d471ee1fcc9e2cfb9fc81606989 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"resolve-from@npm:5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resq@npm:^1.11.0": + version: 1.11.0 + resolution: "resq@npm:1.11.0" + dependencies: + fast-deep-equal: "npm:^2.0.1" + checksum: 10c0/870e70bcbb85fcfe311c6742843decd4ef870252d00f4b041960076f98b2ff4d18cf88aca36d4f4838ca8bc6ded27097fefb31ab3340390adfcb8a82b9474a95 + languageName: node + linkType: hard + +"restore-cursor@npm:^3.1.0": + version: 3.1.0 + resolution: "restore-cursor@npm:3.1.0" + dependencies: + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f + languageName: node + linkType: hard + +"ret@npm:~0.5.0": + version: 0.5.0 + resolution: "ret@npm:0.5.0" + checksum: 10c0/220868b194f87bf1998e32e409086eec6b39e860c052bf267f8ad4d0131706a9773d45fd3f91acfb1a7c928fce002b694ab86fdba90bc8d4b8df68fa8645c5cc + languageName: node + linkType: hard + +"rgb2hex@npm:0.2.5": + version: 0.2.5 + resolution: "rgb2hex@npm:0.2.5" + checksum: 10c0/32bf5373fe2690efc2a1761c9b50500faa6248e86ef3051766b06d4e95f3c49acfa6d522da5ea87e5db3ec5412ed777570fd626b1505c54bb5a970653fc9757b + languageName: node + linkType: hard + +"rolldown@npm:1.0.3": + version: 1.0.3 + resolution: "rolldown@npm:1.0.3" + dependencies: + "@oxc-project/types": "npm:=0.133.0" + "@rolldown/binding-android-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-x64": "npm:1.0.3" + "@rolldown/binding-freebsd-x64": "npm:1.0.3" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.3" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.3" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-s390x-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-musl": "npm:1.0.3" + "@rolldown/binding-openharmony-arm64": "npm:1.0.3" + "@rolldown/binding-wasm32-wasi": "npm:1.0.3" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.3" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.3" + "@rolldown/pluginutils": "npm:^1.0.0" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-ppc64-gnu": + optional: true + "@rolldown/binding-linux-s390x-gnu": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: ./bin/cli.mjs + checksum: 10c0/5f9dd47b7abf203b16bc600db68542f245e974c800e59ff50b76157d1dada1403657690435b036fabca88e93d13a67c31abe5cfaa6f61ce33717f61720204cdf + languageName: node + linkType: hard + +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867 + languageName: node + linkType: hard + +"safaridriver@npm:^1.0.0": + version: 1.0.1 + resolution: "safaridriver@npm:1.0.1" + checksum: 10c0/ee45d882f8193ac4151128ebb6574eef6a518abf637d0d457f7c2aa1a5ed8a29f1c160d86e3242bbbcede97ed927896ad9445e8ece1a31e81c686b03f2023ef0 + languageName: node + linkType: hard + +"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.2.0, safe-buffer@npm:~5.2.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safe-regex2@npm:^5.0.0": + version: 5.1.1 + resolution: "safe-regex2@npm:5.1.1" + dependencies: + ret: "npm:~0.5.0" + bin: + safe-regex2: bin/safe-regex2.js + checksum: 10c0/65c59fb33de8e500fa1d7254cc7f9b6b8b932f925bcfc8d92273ec024c259052a2b3c975bbf5a9f9dd49cd3b0fa394fb56f36d6b10e394404056edfd1223fd17 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sanitize-filename@npm:1.6.4": + version: 1.6.4 + resolution: "sanitize-filename@npm:1.6.4" + dependencies: + truncate-utf8-bytes: "npm:^1.0.0" + checksum: 10c0/b56415a95e4f90dc992cd126b5f45c7b39d178662fbd0dc48f03203e35c58ab8e9eb3f5cebfaabc46f1438093d65a3a3cc96875e2b036a1474e19593bee9a540 + languageName: node + linkType: hard + +"select-hose@npm:^2.0.0": + version: 2.0.0 + resolution: "select-hose@npm:2.0.0" + checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 + languageName: node + linkType: hard + +"semver@npm:7.8.1": + version: 7.8.1 + resolution: "semver@npm:7.8.1" + bin: + semver: bin/semver.js + checksum: 10c0/92d6871d6347e1f99d0ba396a70f2545ccf2a032cda3d378fa0699edf7506b5c6d266aed55c8b88e72bd91a30d2351e4f39db479375374430fcdc4b58f4e3c1a + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.7.3, semver@npm:^7.7.4": + version: 7.8.4 + resolution: "semver@npm:7.8.4" + bin: + semver: bin/semver.js + checksum: 10c0/81b7c296fd7927b80f67fa516b75fa1017caac8167795320de28e76ccbc6f7f01763c30ecd10d6a0d8fd089708ab0548a5aebb94b0870e99c2a2b4600a46389b + languageName: node + linkType: hard + +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.1 + resolution: "send@npm:1.2.1" + dependencies: + debug: "npm:^4.4.3" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.1" + mime-types: "npm:^3.0.2" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.2" + checksum: 10c0/fbbbbdc902a913d65605274be23f3d604065cfc3ee3d78bf9fc8af1dc9fc82667c50d3d657f5e601ac657bac9b396b50ee97bd29cd55436320cf1cddebdcec72 + languageName: node + linkType: hard + +"serialize-error@npm:^12.0.0": + version: 12.0.0 + resolution: "serialize-error@npm:12.0.0" + dependencies: + type-fest: "npm:^4.31.0" + checksum: 10c0/d8422db262dd28422834e0acdaaa2425ba6735f791417cfbcbceb201ddea0e41ccd2865778afeb9b33c28273f01e89a4503fa670f82c0a387de61e2b0f8d74e4 + languageName: node + linkType: hard + +"serve-favicon@npm:2.5.1": + version: 2.5.1 + resolution: "serve-favicon@npm:2.5.1" + dependencies: + etag: "npm:~1.8.1" + fresh: "npm:~0.5.2" + ms: "npm:~2.1.3" + parseurl: "npm:~1.3.2" + safe-buffer: "npm:~5.2.1" + checksum: 10c0/b0860fa122096207357ee11eba34692f0ce9ef5b62f12d41fac5384e905556e44340661cae966df8d59b4bd5b7ee140596b4a1c39e4778216641588c3f246e48 + languageName: node + linkType: hard + +"serve-static@npm:^2.2.0": + version: 2.2.1 + resolution: "serve-static@npm:2.2.1" + dependencies: + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10c0/37986096e8572e2dfaad35a3925fa8da0c0969f8814fd7788e84d4d388bc068cf0c06d1658509788e55bed942a6b6d040a8a267fa92bb9ffb1179f8bacde5fd7 + languageName: node + linkType: hard + +"set-blocking@npm:2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + +"setprototypeof@npm:~1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + +"sharp@npm:0.34.5": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" + dependencies: + "@img/colour": "npm:^1.0.0" + "@img/sharp-darwin-arm64": "npm:0.34.5" + "@img/sharp-darwin-x64": "npm:0.34.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + "@img/sharp-linux-arm": "npm:0.34.5" + "@img/sharp-linux-arm64": "npm:0.34.5" + "@img/sharp-linux-ppc64": "npm:0.34.5" + "@img/sharp-linux-riscv64": "npm:0.34.5" + "@img/sharp-linux-s390x": "npm:0.34.5" + "@img/sharp-linux-x64": "npm:0.34.5" + "@img/sharp-linuxmusl-arm64": "npm:0.34.5" + "@img/sharp-linuxmusl-x64": "npm:0.34.5" + "@img/sharp-wasm32": "npm:0.34.5" + "@img/sharp-win32-arm64": "npm:0.34.5" + "@img/sharp-win32-ia32": "npm:0.34.5" + "@img/sharp-win32-x64": "npm:0.34.5" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.7.3" + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: 10c0/fd79e29df0597a7d5704b8461c51f944ead91a5243691697be6e8243b966402beda53ddc6f0a53b96ea3cb8221f0b244aa588114d3ebf8734fb4aefd41ab802f + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shell-quote@npm:1.8.4, shell-quote@npm:^1.8.1": + version: 1.8.4 + resolution: "shell-quote@npm:1.8.4" + checksum: 10c0/86c93678bc394cb81f5ddcdc87df9c95d279ef9652775cd1cd1eed361404169a8d8cbaacaeed232ab09919e36ee1e5363863570390d78571f8c22b7f6312fb40 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-list@npm:1.0.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + checksum: 10c0/d346c787fd2f9f1c2fdea14f00e8250118db0e7596d85a6cb9faa75f105d31a73a8f7a341c93d7df2a2429098c3d37a77bd3be9e88c37094b8c01807bc77c7a2 + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.1 + resolution: "side-channel@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.4" + side-channel-list: "npm:^1.0.1" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/dc0ab81d67f61bda9247d053ce93f41c3fd8ad2bdcb9cf9d8d2f8540d488f26d87a5e99ebfc07eea49ec025867b2452b705442d974b1478f0395e69f6bfb3270 + languageName: node + linkType: hard + +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.2": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.5": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.9 + resolution: "socks@npm:2.8.9" + dependencies: + ip-address: "npm:^10.1.1" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/2d4350c31142b0931eb1758825b426bcbf4bfb5eed682ca48bc46dc9e7d1930ec366ea574ad49fc6c1fd9e9e17ce243be0ef13e31fc4b0319d9093f1fb19743c + languageName: node + linkType: hard + +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"spacetrim@npm:0.11.59": + version: 0.11.59 + resolution: "spacetrim@npm:0.11.59" + checksum: 10c0/1cb7e55b161ca05b792d0306d87e69d254f2e785397f7dbeb4013fd833ff63cee4f1047d10c9785ede66e4ee97cd1c3bc595e50244447027d29bfb9d0111cc00 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.23 + resolution: "spdx-license-ids@npm:3.0.23" + checksum: 10c0/8495620f6f2a237749cce922ea2d593a66f7885c301b1a0f5542183e7041182f27f616a8f13345cefdea0c9b3e0899328e0aa8cec100cf4f3fac4bb3bd975515 + languageName: node + linkType: hard + +"spdy-transport@npm:^3.0.0": + version: 3.0.0 + resolution: "spdy-transport@npm:3.0.0" + dependencies: + debug: "npm:^4.1.0" + detect-node: "npm:^2.0.4" + hpack.js: "npm:^2.1.6" + obuf: "npm:^1.1.2" + readable-stream: "npm:^3.0.6" + wbuf: "npm:^1.7.3" + checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb + languageName: node + linkType: hard + +"spdy@npm:4.0.2": + version: 4.0.2 + resolution: "spdy@npm:4.0.2" + dependencies: + debug: "npm:^4.1.0" + handle-thing: "npm:^2.0.0" + http-deceiver: "npm:^1.2.7" + select-hose: "npm:^2.0.0" + spdy-transport: "npm:^3.0.0" + checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf + languageName: node + linkType: hard + +"split2@npm:^4.2.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 10c0/b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 + languageName: node + linkType: hard + +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b + languageName: node + linkType: hard + +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"statuses@npm:^2.0.1, statuses@npm:^2.0.2, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f + languageName: node + linkType: hard + +"std-env@npm:^4.0.0-rc.1": + version: 4.1.0 + resolution: "std-env@npm:4.1.0" + checksum: 10c0/2e14b6b490db34cb969a48d9cf7c35bca4a47653914aac2814221baae7b867a5b15940d133625c391621971f98cd2266a5dc7036669960e883f1081db2a56558 + languageName: node + linkType: hard + +"stream-buffers@npm:2.2.x": + version: 2.2.0 + resolution: "stream-buffers@npm:2.2.0" + checksum: 10c0/14a351f0a066eaa08c8c64a74f4aedd87dd7a8e59d4be224703da33dca3eb370828ee6c0ae3fff59a9c743e8098728fc95c5f052ae7741672a31e6b1430ba50a + languageName: node + linkType: hard + +"stream-combiner@npm:^0.2.2": + version: 0.2.2 + resolution: "stream-combiner@npm:0.2.2" + dependencies: + duplexer: "npm:~0.1.1" + through: "npm:~2.3.4" + checksum: 10c0/b5d2782fbfa9251c88e01af1b1f54bc183673a776989dce2842b345be7fc3ce7eb2eade363b3c198ba0e5153a20a96e0014d0d0e884153f885d7ee919f22b639 + languageName: node + linkType: hard + +"streamx@npm:^2.12.5, streamx@npm:^2.15.0, streamx@npm:^2.25.0": + version: 2.28.0 + resolution: "streamx@npm:2.28.0" + dependencies: + events-universal: "npm:^1.0.0" + fast-fifo: "npm:^1.3.2" + text-decoder: "npm:^1.1.0" + checksum: 10c0/1cd5647c4dbdaadf4623b48183bab1d71bdc251e24c8f3baddf9fb9fa75096a7d446aba2c58a4f71964eeb5753f514b59e97bfdf94a60ce2c1b33594410b0342 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string-width@npm:^7.0.0, string-width@npm:^7.2.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" + dependencies: + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: 10c0/1c628d78f974aa7539c496029f48e7019acc32487fc695464f9d6bdfec98edd7d933a06b3216bc2016918f6e75074c611d84430a53cb0e43071597d6c1ac5e25 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: "npm:~5.1.0" + checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.2.0 + resolution: "strip-ansi@npm:7.2.0" + dependencies: + ansi-regex: "npm:^6.2.2" + checksum: 10c0/544d13b7582f8254811ea97db202f519e189e59d35740c46095897e254e4f1aa9fe1524a83ad6bc5ad67d4dd6c0281d2e0219ed62b880a6238a16a17d375f221 + languageName: node + linkType: hard + +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff + languageName: node + linkType: hard + +"strnum@npm:^2.3.0": + version: 2.4.0 + resolution: "strnum@npm:2.4.0" + dependencies: + anynum: "npm:^1.0.0" + checksum: 10c0/36ac1ca6f511d8216d9b07934359f78afb158eedee73fb057c77b1cffa160a60cb848b35f219bd2c115b0037e8ec3962f492874ea4b10ef021ab6403dbb10e7e + languageName: node + linkType: hard + +"supports-color@npm:10.2.2": + version: 10.2.2 + resolution: "supports-color@npm:10.2.2" + checksum: 10c0/fb28dd7e0cdf80afb3f2a41df5e068d60c8b4f97f7140de2eaed5b42e075d82a0e980b20a2c0efd2b6d73cfacb55555285d8cc719fa0472220715aefeaa1da7c + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"tagged-tag@npm:^1.0.0": + version: 1.0.0 + resolution: "tagged-tag@npm:1.0.0" + checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1 + languageName: node + linkType: hard + +"tar-fs@npm:^3.1.1": + version: 3.1.2 + resolution: "tar-fs@npm:3.1.2" + dependencies: + bare-fs: "npm:^4.0.1" + bare-path: "npm:^3.0.0" + pump: "npm:^3.0.0" + tar-stream: "npm:^3.1.5" + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: 10c0/9dcbbbef9cdfc27f47651fe679f15952a6a8e6b3c9761c4bf3f416ace41cf462fb6292519bd3e041cadfcc0b89043a6bdecb46ff19f770b6864b77dcde7bad46 + languageName: node + linkType: hard + +"tar-stream@npm:^3.0.0, tar-stream@npm:^3.1.5": + version: 3.2.0 + resolution: "tar-stream@npm:3.2.0" + dependencies: + b4a: "npm:^1.6.4" + bare-fs: "npm:^4.5.5" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10c0/8a06c915f93c9b0906e79867e36a9cfe197da4d41b72e89ec0de99577ae755505d14815c1346b70c2410aa09d3145c3e3af2ff5802b6af84990cdd6c60dbb997 + languageName: node + linkType: hard + +"tar@npm:^7.5.4": + version: 7.5.16 + resolution: "tar@npm:7.5.16" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10c0/4f37f3c4bd2ca2755fd736a5df1d573c1a868ec1b1e893346aeafa95ac510f9e2fd1469420bd866cc7904799e5bd4ac62b5d4f03fe27747d6e1e373b44505c5c + languageName: node + linkType: hard + +"teen_process@npm:4.1.3": + version: 4.1.3 + resolution: "teen_process@npm:4.1.3" + dependencies: + shell-quote: "npm:^1.8.1" + checksum: 10c0/1d34393af165cfa3022186e9d4168d32d228918718130fbd83ee531ba8deb4210248a7645f6aba507e5f4168bf51133a16a78d64bb890c873d72c80d0ca4d1e7 + languageName: node + linkType: hard + +"teex@npm:^1.0.1": + version: 1.0.1 + resolution: "teex@npm:1.0.1" + dependencies: + streamx: "npm:^2.12.5" + checksum: 10c0/8df9166c037ba694b49d32a49858e314c60e513d55ac5e084dbf1ddbb827c5fa43cc389a81e87684419c21283308e9d68bb068798189c767ec4c252f890b8a77 + languageName: node + linkType: hard + +"text-decoder@npm:^1.1.0": + version: 1.2.7 + resolution: "text-decoder@npm:1.2.7" + dependencies: + b4a: "npm:^1.6.4" + checksum: 10c0/929938ed154fbadb660a7f3d1aca30b7e53649a731af7583168fcfba0c158046325d35d945926e2a512bb62d1a49a7818151c987ea38b48853f01e1615722fc5 + languageName: node + linkType: hard + +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d + languageName: node + linkType: hard + +"through@npm:~2.3.4": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc + languageName: node + linkType: hard + +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyexec@npm:^1.0.2": + version: 1.2.4 + resolution: "tinyexec@npm:1.2.4" + checksum: 10c0/153b8db6b080194b558ff145b9cffc36b80a6e07babd644dcfbe49c807eee668c876049d28bdee90b96304476f883352f2dad91b3f86bc23832532f4363e66ff + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.17": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c + languageName: node + linkType: hard + +"tinyrainbow@npm:^3.1.0": + version: 3.1.0 + resolution: "tinyrainbow@npm:3.1.0" + checksum: 10c0/f11cf387a26c5c9255bec141a90ac511b26172981b10c3e50053bc6700ea7d2336edcc4a3a21dbb8412fe7c013477d2ba4d7e4877800f3f8107be5105aad6511 + languageName: node + linkType: hard + +"toidentifier@npm:~1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea + languageName: node + linkType: hard + +"truncate-utf8-bytes@npm:^1.0.0": + version: 1.0.2 + resolution: "truncate-utf8-bytes@npm:1.0.2" + dependencies: + utf8-byte-length: "npm:^1.0.1" + checksum: 10c0/af2b431fc4314f119b551e5fccfad49d4c0ef82e13ba9ca61be6567801195b08e732ce9643542e8ad1b3df44f3df2d7345b3dd34f723954b6bb43a14584d6b3c + languageName: node + linkType: hard + +"tslib@npm:^2.0.1, tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"type-fest@npm:4.26.0": + version: 4.26.0 + resolution: "type-fest@npm:4.26.0" + checksum: 10c0/3819b65fedd4655ed90703dad9e14248fb61f0a232dce8385e59771bdeaeca08195fe0683d892d62fcd84c0f3bb18bd4b0c3c2ba29023187d267868e75c53076 + languageName: node + linkType: hard + +"type-fest@npm:5.6.0": + version: 5.6.0 + resolution: "type-fest@npm:5.6.0" + dependencies: + tagged-tag: "npm:^1.0.0" + checksum: 10c0/5468a8ffda7f3904e6f7bbd8069eb8b6dd4bd9156e206df7a01d09a73e28cd1afedf74ead9d0fc12841c8c90074194859feca240511c50800962fde1bd9ddcbc + languageName: node + linkType: hard + +"type-fest@npm:^4.31.0, type-fest@npm:^4.39.1": + version: 4.41.0 + resolution: "type-fest@npm:4.41.0" + checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4 + languageName: node + linkType: hard + +"type-fest@npm:^5.4.4": + version: 5.7.0 + resolution: "type-fest@npm:5.7.0" + dependencies: + tagged-tag: "npm:^1.0.0" + checksum: 10c0/f71ed17b753649421e419db8cc2e140f930333a1467b1d9cca2e0e4052900fd442f2360bae73f3a6bf9340d949ac46d9a1598c709b4c8089272e7624df9c8716 + languageName: node + linkType: hard + +"type-is@npm:^2.0.1": + version: 2.1.0 + resolution: "type-is@npm:2.1.0" + dependencies: + content-type: "npm:^2.0.0" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10c0/a6018f8f509de48f2c7429305e3a920e73b374fa93127dd0877ae1c2df65a5d33907caac8afb0c37a9b9fc7c49f29e3f55d668963dc845d966930b667c07f50e + languageName: node + linkType: hard + +"typescript@npm:6.0.3": + version: 6.0.3 + resolution: "typescript@npm:6.0.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/4a25ff5045b984370f48f196b3a0120779b1b343d40b9a68d114ea5e5fff099809b2bb777576991a63a5cd59cf7bffd96ff6fe10afcefbcb8bd6fb96ad4b6606 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A6.0.3#optional!builtin": + version: 6.0.3 + resolution: "typescript@patch:typescript@npm%3A6.0.3#optional!builtin::version=6.0.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/2f25c74e65663c248fa1ade2b8459d9ce5372ff9dad07067310f132966ebec1d93f6c42f0baf77a6b6a7a91460463f708e6887013aaade22111037457c6b25df + languageName: node + linkType: hard + +"undici-types@npm:>=7.24.0 <7.24.7": + version: 7.24.6 + resolution: "undici-types@npm:7.24.6" + checksum: 10c0/d9cd8befb643ac904615c280a095ba4240531f6bb4a5e75a22a7483630ca8d3f1016d2ab6ace6ceda1f63b3a2db2fe037fafe121d6917a0187573aa548ff78ca + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + +"undici@npm:^6.21.3, undici@npm:^6.25.0": + version: 6.26.0 + resolution: "undici@npm:6.26.0" + checksum: 10c0/cf2b4caf58c33d6582970991290cc7a6486d6e738845f25dcdd16952d708ec844815c6d30362919764fcaf30f719891289341f1ada496f003ce2700310453a47 + languageName: node + linkType: hard + +"undici@npm:^7.19.0": + version: 7.27.2 + resolution: "undici@npm:7.27.2" + checksum: 10c0/714632147c80eb8eda8a52df51b481d346df5e035ccc1d87eb3bbcb8f92ec25d7cbbe81abdeae5db4e37a93e490c8d2fa2359ecdca4b2c5c6c513dcd2626ad47 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.4.0": + version: 0.4.0 + resolution: "unicorn-magic@npm:0.4.0" + checksum: 10c0/cd6eff90967a5528dfa2016bdb5b38b0cd64c8558f9ba04fb5c2c23f3a232a67dfe2bfa4c45af3685d5f1a40dbac6a36d48e053f80f97ae4da1e0f6a55431685 + languageName: node + linkType: hard + +"unorm@npm:^1.4.1": + version: 1.6.0 + resolution: "unorm@npm:1.6.0" + checksum: 10c0/ff0caa3292f318e2e832d02ad019a401118fe42f5e554dca3b9c7e4a2a3100eda051945711234a6ffbd74088cf51930755782456d30864240936cb3485f80a01 + languageName: node + linkType: hard + +"unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + +"urlpattern-polyfill@npm:^10.0.0": + version: 10.1.0 + resolution: "urlpattern-polyfill@npm:10.1.0" + checksum: 10c0/5b124fd8d0ae920aa2a48b49a7a3b9ad1643b5ce7217b808fb6877826e751cabc01897fd4c85cd1989c4e729072b63aad5c3ba1c1325e4433e0d2f6329156bf1 + languageName: node + linkType: hard + +"userhome@npm:1.0.1": + version: 1.0.1 + resolution: "userhome@npm:1.0.1" + checksum: 10c0/ded66b35487f4cd255d54b6e9ddb1f6c8bf9c1886495da7afc8433a123406a1b87ce4b32ea932fc7947958149385e3562ca139b3e2abffd9d630b864989d32f0 + languageName: node + linkType: hard + +"utf8-byte-length@npm:^1.0.1": + version: 1.0.5 + resolution: "utf8-byte-length@npm:1.0.5" + checksum: 10c0/e69bda3299608f4cc75976da9fb74ac94801a58b9ca29fdad03a20ec952e7477d7f226c12716b5f36bd4cff8151d1d152d02ee1df3752f017d4b2c725ce3e47a + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"uuid@npm:14.0.0": + version: 14.0.0 + resolution: "uuid@npm:14.0.0" + bin: + uuid: dist-node/bin/uuid + checksum: 10c0/a57ae7794c45005c1a9208989196c5baf79a7679c30f43c1bee9033a2c4d113a2cea216fa6fcc9663b08b0d55635df1a7c6eb7e7f3d21c3e50688c698fa39a50 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.4": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f + languageName: node + linkType: hard + +"vary@npm:^1.1.2, vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + +"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.0.16 + resolution: "vite@npm:8.0.16" + dependencies: + fsevents: "npm:~2.3.3" + lightningcss: "npm:^1.32.0" + picomatch: "npm:^4.0.4" + postcss: "npm:^8.5.15" + rolldown: "npm:1.0.3" + tinyglobby: "npm:^0.2.17" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + "@vitejs/devtools": ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: ">=1.21.0" + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + "@vitejs/devtools": + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/d75be3fbe2f63e6a8145325970338afaf0dd4d96ba9175c13f9a286fd5f95afc489401b693e4fa6c0899a4dd0e137be91cdf9401a40a635563911ad5036e3467 + languageName: node + linkType: hard + +"vitest@npm:4.1.8": + version: 4.1.8 + resolution: "vitest@npm:4.1.8" + dependencies: + "@vitest/expect": "npm:4.1.8" + "@vitest/mocker": "npm:4.1.8" + "@vitest/pretty-format": "npm:4.1.8" + "@vitest/runner": "npm:4.1.8" + "@vitest/snapshot": "npm:4.1.8" + "@vitest/spy": "npm:4.1.8" + "@vitest/utils": "npm:4.1.8" + es-module-lexer: "npm:^2.0.0" + expect-type: "npm:^1.3.0" + magic-string: "npm:^0.30.21" + obug: "npm:^2.1.1" + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.3" + std-env: "npm:^4.0.0-rc.1" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^1.0.2" + tinyglobby: "npm:^0.2.15" + tinyrainbow: "npm:^3.1.0" + vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@opentelemetry/api": ^1.9.0 + "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 + "@vitest/browser-playwright": 4.1.8 + "@vitest/browser-preview": 4.1.8 + "@vitest/browser-webdriverio": 4.1.8 + "@vitest/coverage-istanbul": 4.1.8 + "@vitest/coverage-v8": 4.1.8 + "@vitest/ui": 4.1.8 + happy-dom: "*" + jsdom: "*" + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@opentelemetry/api": + optional: true + "@types/node": + optional: true + "@vitest/browser-playwright": + optional: true + "@vitest/browser-preview": + optional: true + "@vitest/browser-webdriverio": + optional: true + "@vitest/coverage-istanbul": + optional: true + "@vitest/coverage-v8": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vite: + optional: false + bin: + vitest: vitest.mjs + checksum: 10c0/f459c500f8818c7a2318cd23228b4e5c0b5efb25bf8e5cb7f116c6d26e51482b2f800a8bb19837c0b5f0d05c51519edbf502bc8ceb5bd86868e8facf1d2c498e + languageName: node + linkType: hard + +"wait-port@npm:^1.1.0": + version: 1.1.0 + resolution: "wait-port@npm:1.1.0" + dependencies: + chalk: "npm:^4.1.2" + commander: "npm:^9.3.0" + debug: "npm:^4.3.4" + bin: + wait-port: bin/wait-port.js + checksum: 10c0/1bf321c27ec31b71d2ddb16251bd9bdc3bcdb604a2f895ff780f53b1b97302a1823e4762d0c99954be9ada63d6d2a77e74928e06f11dcd01b9ed1f26eb60b353 + languageName: node + linkType: hard + +"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": + version: 1.7.3 + resolution: "wbuf@npm:1.7.3" + dependencies: + minimalistic-assert: "npm:^1.0.0" + checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 + languageName: node + linkType: hard + +"wcwidth@npm:^1.0.1": + version: 1.0.1 + resolution: "wcwidth@npm:1.0.1" + dependencies: + defaults: "npm:^1.0.3" + checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 + languageName: node + linkType: hard + +"webdriver@npm:9.28.0": + version: 9.28.0 + resolution: "webdriver@npm:9.28.0" + dependencies: + "@types/node": "npm:^20.1.0" + "@types/ws": "npm:^8.5.3" + "@wdio/config": "npm:9.28.0" + "@wdio/logger": "npm:9.18.0" + "@wdio/protocols": "npm:9.28.0" + "@wdio/types": "npm:9.28.0" + "@wdio/utils": "npm:9.28.0" + deepmerge-ts: "npm:^7.0.3" + https-proxy-agent: "npm:^7.0.6" + undici: "npm:^6.21.3" + ws: "npm:^8.8.0" + checksum: 10c0/461b28f6bae9fff606010ed978c075b4b4379aa6ea8a58b37507c7363f26ea9c5eae5727ec6ec131c439213548bee741c10d7f85cbb2d79a5da281f7c53db898 + languageName: node + linkType: hard + +"webdriverio@npm:9.28.0": + version: 9.28.0 + resolution: "webdriverio@npm:9.28.0" + dependencies: + "@types/node": "npm:^20.11.30" + "@types/sinonjs__fake-timers": "npm:^8.1.5" + "@wdio/config": "npm:9.28.0" + "@wdio/logger": "npm:9.18.0" + "@wdio/protocols": "npm:9.28.0" + "@wdio/repl": "npm:9.16.2" + "@wdio/types": "npm:9.28.0" + "@wdio/utils": "npm:9.28.0" + archiver: "npm:^7.0.1" + aria-query: "npm:^5.3.0" + cheerio: "npm:^1.0.0-rc.12" + css-shorthand-properties: "npm:^1.1.1" + css-value: "npm:^0.0.1" + grapheme-splitter: "npm:^1.0.4" + htmlfy: "npm:^0.8.1" + is-plain-obj: "npm:^4.1.0" + jszip: "npm:^3.10.1" + lodash.clonedeep: "npm:^4.5.0" + lodash.zip: "npm:^4.2.0" + query-selector-shadow-dom: "npm:^1.0.1" + resq: "npm:^1.11.0" + rgb2hex: "npm:0.2.5" + serialize-error: "npm:^12.0.0" + urlpattern-polyfill: "npm:^10.0.0" + webdriver: "npm:9.28.0" + peerDependencies: + puppeteer-core: ">=22.x || <=24.x" + peerDependenciesMeta: + puppeteer-core: + optional: true + checksum: 10c0/cf2fa1c8963b1974787797ad33d22b231a900e3311d3367954646c57d8ac278a571820d3570faa269f233bce2ec1c3e5872c0a653b0c4c2700720578aa2ab9c0 + languageName: node + linkType: hard + +"webview-bundle-ios-e2e@workspace:.": + version: 0.0.0-use.local + resolution: "webview-bundle-ios-e2e@workspace:." + dependencies: + "@types/node": "npm:^25" + "@wvb-playground/testing": "npm:^0.0.0" + "@wvb-playground/webview-hacker-news": "npm:^0.0.0" + appium: "npm:^3.5.0" + execa: "npm:^9.5.2" + tinyglobby: "npm:^0.2.10" + typescript: "npm:6.0.3" + vitest: "npm:4.1.8" + webdriverio: "npm:9.28.0" + languageName: unknown + linkType: soft + +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df + languageName: node + linkType: hard + +"which@npm:6.0.1, which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^7.0.0": + version: 7.0.0 + resolution: "which@npm:7.0.0" + dependencies: + isexe: "npm:^4.0.0" + bin: + node-which: bin/which.js + checksum: 10c0/ca0b54f198f78bbc4b7c02e34bda8d335cb352e0adb4cbca1c37b1a957af3a879a82c4c27ca6525bc942f548d8b64f816ef6528360af9f3de55ffb9b979b620d + languageName: node + linkType: hard + +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + +"winston-transport@npm:^4.9.0": + version: 4.9.0 + resolution: "winston-transport@npm:4.9.0" + dependencies: + logform: "npm:^2.7.0" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 + languageName: node + linkType: hard + +"winston@npm:3.19.0": + version: 3.19.0 + resolution: "winston@npm:3.19.0" + dependencies: + "@colors/colors": "npm:^1.6.0" + "@dabh/diagnostics": "npm:^2.0.8" + async: "npm:^3.2.3" + is-stream: "npm:^2.0.0" + logform: "npm:^2.7.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + safe-stable-stringify: "npm:^2.3.1" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.9.0" + checksum: 10c0/341a8ccfb726120209d34e2466040e2ca72cadb1a3402c4fc90425facad002b81275675b4ab9b4432a624311bc47ef7c9fb7652c86fca454d2be2f2ee1882226 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrap-ansi@npm:^9.0.0": + version: 9.0.2 + resolution: "wrap-ansi@npm:9.0.2" + dependencies: + ansi-styles: "npm:^6.2.1" + string-width: "npm:^7.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 10c0/3305839b9a0d6fb930cb63a52f34d3936013d8b0682ff3ec133c9826512620f213800ffa19ea22904876d5b7e9a3c1f40682f03597d986a4ca881fa7b033688c + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"ws@npm:8.21.0, ws@npm:^8.8.0": + version: 8.21.0 + resolution: "ws@npm:8.21.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 + languageName: node + linkType: hard + +"xml-naming@npm:^0.1.0": + version: 0.1.0 + resolution: "xml-naming@npm:0.1.0" + checksum: 10c0/8c7614865361bcb7e53e3e091dac21c567e2b92d447919b2f072775aa9dcfc94a5255bd52fbaa0fd53c93513e53a23a6a835218ad2af512451dbc678392f85fe + languageName: node + linkType: hard + +"xmlbuilder@npm:^15.1.1": + version: 15.1.1 + resolution: "xmlbuilder@npm:15.1.1" + checksum: 10c0/665266a8916498ff8d82b3d46d3993913477a254b98149ff7cff060d9b7cc0db7cf5a3dae99aed92355254a808c0e2e3ec74ad1b04aa1061bdb8dfbea26c18b8 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yaml@npm:2.9.0": + version: 2.9.0 + resolution: "yaml@npm:2.9.0" + bin: + yaml: bin.mjs + checksum: 10c0/f340718df45e97a9551b9bf9dac61c80050bc464513b710debfb5067c380c8472e3b67809cffacb4ab5ffb5e66ef9310816c88b05f371cec60abfedd8c88e0a2 + languageName: node + linkType: hard + +"yargs-parser@npm:22.0.0, yargs-parser@npm:^22.0.0": + version: 22.0.0 + resolution: "yargs-parser@npm:22.0.0" + checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" + dependencies: + cliui: "npm:^9.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + string-width: "npm:^7.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^22.0.0" + checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yauzl@npm:3.3.1": + version: 3.3.1 + resolution: "yauzl@npm:3.3.1" + dependencies: + buffer-crc32: "npm:~0.2.3" + pend: "npm:~1.2.0" + checksum: 10c0/e396b070abb0c528cd4df3b86907142f72e09d5bc1edac262cebbff5b045e3091528a5e54e10a9a7209b031ba94bdcb1ad1ec6d85eecd69ad428bcb4a5c914ae + languageName: node + linkType: hard + +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.2.1": + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 10c0/36d4793e9cf7060f9da543baf67c55e354f4862c8d3d34de1a1b1d7c382d44171315cc54abf84d8900b8113d742b830108a1434f4898fb244f9b7e8426d4b8f5 + languageName: node + linkType: hard + +"yoctocolors@npm:^2.1.1": + version: 2.1.2 + resolution: "yoctocolors@npm:2.1.2" + checksum: 10c0/b220f30f53ebc2167330c3adc86a3c7f158bcba0236f6c67e25644c3188e2571a6014ffc1321943bb619460259d3d27eb4c9cc58c2d884c1b195805883ec7066 + languageName: node + linkType: hard + +"zip-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "zip-stream@npm:6.0.1" + dependencies: + archiver-utils: "npm:^5.0.0" + compress-commons: "npm:^6.0.2" + readable-stream: "npm:^4.0.0" + checksum: 10c0/50f2fb30327fb9d09879abf7ae2493705313adf403e794b030151aaae00009162419d60d0519e807673ec04d442e140c8879ca14314df0a0192de3b233e8f28b + languageName: node + linkType: hard + +"zip-stream@npm:^7.0.2": + version: 7.0.5 + resolution: "zip-stream@npm:7.0.5" + dependencies: + compress-commons: "npm:^7.0.0" + normalize-path: "npm:^3.0.0" + readable-stream: "npm:^4.0.0" + checksum: 10c0/e1669e17031c3c7243cb9014eacfaa66f4cd2e0d613a57dbee9caf7122ae869f8b2ea2e5891b5d9eee2897060c01db048b9b2a544ba83e227f6c162905282e48 + languageName: node + linkType: hard