// swift-tools-version: 6.2 import PackageDescription let package = Package( name: "HaloKit", // Quellsprache ist Englisch, damit die Schlüssel im Code lesbar bleiben. // Deutsch kommt als Übersetzung dazu; die Systemsprache entscheidet. defaultLocalization: "en", // macOS steht hier nur, damit `swift test` die Logik-Tests ohne // Simulator laufen lassen kann — das spart bei jedem Durchlauf Minuten. // Welche Plattformen die Apps bedienen, legt project.yml fest: iOS für // Halo, tvOS für HaloTV. platforms: [.iOS(.v26), .macOS(.v26), .tvOS(.v26)], products: [ .library(name: "MediaKit", targets: ["MediaKit"]), .library(name: "JellyfinKit", targets: ["JellyfinKit"]), .library(name: "HaloDesign", targets: ["HaloDesign"]), .library(name: "HaloPlayback", targets: ["HaloPlayback"]), .library(name: "HaloDownloads", targets: ["HaloDownloads"]), ], targets: [ // Sprechen mit dem Server: Anmeldung, Endpunkte, Modelle. Kein SwiftUI, // damit die gesamte Protokoll-Schicht ohne Oberfläche testbar bleibt. // Die neutrale Grundschicht: Typen und Rechnungen, die für jeden // Server gelten. Hängt von nichts ab — genau das macht sie zur // Grundlage, auf der jeder Server und später das Web-Projekt // dasselbe meinen. .target(name: "MediaKit"), .testTarget(name: "MediaKitTests", dependencies: ["MediaKit"]), // Jellyfin. Eigenes Target auf der neutralen Schicht — ein Server, // eine Schachtel. Kommt ein zweiter dazu, steht er daneben und // nicht darin; herausnehmen heisst dann, ein Verzeichnis zu löschen. .target(name: "JellyfinKit", dependencies: ["MediaKit"], resources: [.process("Localizable.xcstrings")]), .testTarget( name: "JellyfinKitTests", dependencies: ["JellyfinKit"], resources: [.copy("Fixtures")] ), // Ein Werkzeug für die Fragen, die reines HTTP sind — ohne Oberfläche, // ohne Gerät, ohne Upload. Eine Runde dauert damit Sekunden statt // eines halben Tages, und das Upload-Kontingent bleibt für Builds. .executableTarget(name: "HaloProbe", dependencies: ["MediaKit", "JellyfinKit"]), // Farben, Typografie, wiederkehrende Bausteine. Hängt bewusst von // nichts ab: dadurch bleibt das Umstellen der Akzentfarbe ein // Token-Wechsel und keine Suche quer durch die App. .target(name: "HaloDesign", resources: [.process("Localizable.xcstrings")]), .testTarget(name: "HaloDesignTests", dependencies: ["HaloDesign"]), // Die Wiedergabe-Abstraktion samt AVPlayer-Engine und der Entscheidung // direkt / umpacken / umrechnen. .target(name: "HaloPlayback", dependencies: ["MediaKit"]), .testTarget(name: "HaloPlaybackTests", dependencies: ["HaloPlayback"]), // Warteschlange, Hintergrundübertragung, Offline-Bestand. .target(name: "HaloDownloads", dependencies: ["MediaKit"], resources: [.process("Localizable.xcstrings")]), .testTarget(name: "HaloDownloadsTests", dependencies: ["HaloDownloads"]), ] )