diff --git a/.github/actions/nix-devshell/action.yaml b/.github/actions/nix-devshell/action.yaml new file mode 100644 index 0000000..6cea0a0 --- /dev/null +++ b/.github/actions/nix-devshell/action.yaml @@ -0,0 +1,13 @@ +name: "Setup Nix devshell" +description: "This action sets up a nix devshell environment" +runs: + using: "composite" + steps: + - name: Setup Nix + uses: DeterminateSystems/nix-installer-action@e50d5f73bfe71c2dd0aa4218de8f4afa59f8f81d # v16 + + - name: Setup GHA Nix cache + uses: DeterminateSystems/magic-nix-cache-action@6221693898146dc97e38ad0e013488a16477a4c4 # v9 + + - name: Enter devshell + uses: nicknovitski/nix-develop@9be7cfb4b10451d3390a75dc18ad0465bed4932a # v1.2.1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f48417..145b67a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,6 @@ on: paths-ignore: - "README.md" - permissions: contents: read @@ -19,36 +18,69 @@ jobs: name: test runs-on: ${{ github.repository_owner == 'coder' && 'depot-macos-latest' || 'macos-latest'}} steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 1 + - name: Switch XCode Version - uses: maxim-lobanov/setup-xcode@v1 + uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: - xcode-version: '16.0.0' - - run: | - make test + # (ThomasK33): depot.dev does not yet support Xcode 16.1 or 16.2 GA, thus we're stuck with 16.0.0 for now. + # I've already reached out, so hopefully this comment will soon be obsolete. + xcode-version: "16.0.0" + + - name: Setup Nix + uses: ./.github/actions/nix-devshell + + - run: make test + format: name: fmt runs-on: ${{ github.repository_owner == 'coder' && 'depot-macos-latest' || 'macos-latest'}} steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 1 - - run: | - make fmt + + - name: Switch XCode Version + uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 + with: + # (ThomasK33): depot.dev does not yet support Xcode 16.1 or 16.2 GA, thus we're stuck with 16.0.0 for now. + # I've already reached out, so hopefully this comment will soon be obsolete. + xcode-version: "16.0.0" + + - name: Setup Nix + uses: ./.github/actions/nix-devshell + + - run: make fmt + lint: name: lint runs-on: ${{ github.repository_owner == 'coder' && 'depot-macos-latest' || 'macos-latest'}} steps: + - name: Harden Runner + uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + with: + egress-policy: audit + - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 1 - - name: Install Swiftlint - run: | - brew install swiftlint - - run: | - make lint \ No newline at end of file + + - name: Setup Nix + uses: ./.github/actions/nix-devshell + + - run: make lint diff --git a/.gitignore b/.gitignore index 0be2743..6d52644 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,293 @@ -# Xcode specifics +# Created by https://www.toptal.com/developers/gitignore/api/xcode,jetbrains,macos,direnv,swift,swiftpm,objective-c +# Edit at https://www.toptal.com/developers/gitignore?templates=xcode,jetbrains,macos,direnv,swift,swiftpm,objective-c + +### direnv ### +.direnv +.envrc + +### JetBrains ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### JetBrains Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### macOS ### +# General .DS_Store -UserInterfaceState.xcuserstate +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Objective-C ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings xcuserdata/ -# JetBrains -.idea/ \ No newline at end of file +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +### Objective-C Patch ### + +### Swift ### +# Xcode +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + + + + + + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +Packages/ +Package.pins +Package.resolved +*.xcodeproj +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +*.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + + +### SwiftPM ### +Packages +xcuserdata +*.xcodeproj + + +### Xcode ### + +## Xcode 8 and earlier + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/project.xcworkspace/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno +**/xcshareddata/WorkspaceSettings.xcsettings + +# End of https://www.toptal.com/developers/gitignore/api/xcode,jetbrains,macos,direnv,swift,swiftpm,objective-c diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..cec0dfe --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,142 @@ +# Contributing to Coder Desktop + +Thank you for your interest in contributing to Coder Desktop! Below are the +guidelines to help you get started. + +## Prerequisites + +Before opening the project in Xcode, you need to generate the Xcode project files. +We use [**XcodeGen**](https://github.com/yonaskolb/XcodeGen) to handle this +process, and the project generation is integrated into the `Makefile`. + +## Setting Up the Development Environment + +To ensure a consistent and reliable development environment, we recommend using +[**Nix**](https://nix.dev/) with Flake support. All the tools required for +development are defined in the `flake.nix` file. + +**Note:** Nix is the only supported development environment for this project. +While setups outside of Nix may work, we do not support custom tool installations +or address issues related to missing path setups or other tooling installation +problems. Using Nix ensures consistency across development environments and avoids +these potential issues. + +### Installing Nix with Flakes Enabled + +If you don’t already have Nix installed, you can: + +1. Use the [Determinate Systems installer](https://nixinstaller.com/) for a + simple setup. +2. Alternatively, use the [official installer](https://nixos.org/download.html) + and enable Flake support by adding the following to your Nix configuration: + + ```nix + experimental-features = nix-command flakes + ``` + +This project does **not** support non-Flake versions of Nix. + +### Entering the Development Environment + +Run the following command to enter the development environment with all necessary +tools: + +```bash +nix develop +``` + +### Using `direnv` for Environment Automation (Optional) + +As an optional recommendation, you can use [`direnv`](https://direnv.net/) to +automatically load and unload the Nix development environment when you navigate +to the project directory. After installing `direnv`, enable it for this project by: + +1. Adding the following line to your `.envrc` file in the project directory: + + ```bash + use flake + ``` + +2. Allowing the `.envrc` file by running: + + ```bash + direnv allow + ``` + +With `direnv`, the development environment will automatically be set up whenever +you enter the project directory. This step is optional but can significantly +streamline your workflow. + +## Generating the Xcode Project Files + +Once your development environment is set up, generate the Xcode project files by +running: + +```bash +make +``` + +This will use **XcodeGen** to create the required Xcode project files. +The configuration for the project is defined in `Coder Desktop/project.yml`. + +## Common Make Commands + +Here are some useful `make` commands for working with the project: + +- `make fmt`: Format Swift files using SwiftFormat. +- `make lint`: Lint Swift files using SwiftLint. +- `make test`: Run all tests using `xcodebuild`. +- `make clean`: Clean the Xcode project. +- `make proto`: Generate Swift files from protobufs. +- `make help`: Display all available `make` commands with descriptions. + +For continuous development, you can also use: + +```bash +make watch-gen +``` + +This command watches for changes to `Coder Desktop/project.yml` and regenerates +the Xcode project file as needed. + +## Testing and Formatting + +To maintain code quality, ensure you run the following before submitting any changes: + +1. **Format Swift files:** + + ```bash + make fmt + ``` + +2. **Lint Swift files:** + + ```bash + make lint + ``` + +3. **Run tests:** + + ```bash + make test + ``` + +## Contributing Workflow + +1. Fork the repository and create your feature branch: + + ```bash + git checkout -b feature/your-feature-name + ``` + +2. Make your changes and commit them with clear messages. +3. Push your branch to your forked repository: + + ```bash + git push origin feature/your-feature-name + ``` + +4. Open a pull request to the main repository. + +Thank you for contributing! If you have any questions or need further assistance, +feel free to open an issue. diff --git a/Coder Desktop/Coder Desktop.xcodeproj/project.pbxproj b/Coder Desktop/Coder Desktop.xcodeproj/project.pbxproj deleted file mode 100644 index a7b3592..0000000 --- a/Coder Desktop/Coder Desktop.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1659 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 77; - objects = { - -/* Begin PBXBuildFile section */ - 961679332CFF117300B2B6DF /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 961679322CFF117300B2B6DF /* NetworkExtension.framework */; }; - 9616793D2CFF117300B2B6DF /* com.coder.Coder-Desktop.VPN.systemextension in Embed System Extensions */ = {isa = PBXBuildFile; fileRef = 961679302CFF117300B2B6DF /* com.coder.Coder-Desktop.VPN.systemextension */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - AA2C690F2D34F6920059AFAF /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = AA2C690E2D34F6920059AFAF /* LaunchAtLogin */; }; - AA3B3DA92D2D23860099996A /* VPNLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B3DA12D2D23860099996A /* VPNLib.framework */; }; - AA3B3DBF2D2D23AB0099996A /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = AA3B3DBE2D2D23AB0099996A /* SwiftProtobuf */; }; - AA3B3DC12D2D23AB0099996A /* SwiftProtobufPluginLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = AA3B3DC02D2D23AB0099996A /* SwiftProtobufPluginLibrary */; }; - AA3B3DCD2D2D249F0099996A /* VPNLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B3DA12D2D23860099996A /* VPNLib.framework */; }; - AA3B3DCE2D2D249F0099996A /* VPNLib.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B3DA12D2D23860099996A /* VPNLib.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - AA3B3E8E2D2E0FF40099996A /* Mocker in Frameworks */ = {isa = PBXBuildFile; productRef = AA3B3E8D2D2E0FF40099996A /* Mocker */; }; - AA3B40992D2FC8560099996A /* CoderSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; }; - AA3B40B62D2FD9DD0099996A /* Mocker in Frameworks */ = {isa = PBXBuildFile; productRef = AA3B40B52D2FD9DD0099996A /* Mocker */; }; - AA3B40B72D2FDA5C0099996A /* CoderSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; }; - AA3B40BD2D2FDFBA0099996A /* Mocker in Frameworks */ = {isa = PBXBuildFile; productRef = AA3B40BC2D2FDFBA0099996A /* Mocker */; }; - AA3B40C02D2FE7760099996A /* CoderSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; }; - AA8BC3392D0060A900E1ABAA /* ViewInspector in Frameworks */ = {isa = PBXBuildFile; productRef = AA8BC3382D0060A900E1ABAA /* ViewInspector */; }; - AA8BC33F2D0061F200E1ABAA /* FluidMenuBarExtra in Frameworks */ = {isa = PBXBuildFile; productRef = AA8BC33E2D0061F200E1ABAA /* FluidMenuBarExtra */; }; - AA8BC4CF2D00A4B700E1ABAA /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = AA8BC4CE2D00A4B700E1ABAA /* KeychainAccess */; }; - AAC382352D427B7600F6DFB4 /* CoderSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; }; - AAC382362D427B7600F6DFB4 /* CoderSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - AAC382392D427B8300F6DFB4 /* CoderSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; }; - AAC3823A2D427B8300F6DFB4 /* CoderSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = AA3B40912D2FC8560099996A /* CoderSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 961679102CFF100E00B2B6DF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = 961678FB2CFF100D00B2B6DF; - remoteInfo = "Coder Desktop"; - }; - 9616791A2CFF100E00B2B6DF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = 961678FB2CFF100D00B2B6DF; - remoteInfo = "Coder Desktop"; - }; - 9616793B2CFF117300B2B6DF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9616792F2CFF117300B2B6DF; - remoteInfo = VPN; - }; - AA3B3DAA2D2D23860099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B3DA02D2D23860099996A; - remoteInfo = VPNLib; - }; - AA3B3DAC2D2D23860099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = 961678FB2CFF100D00B2B6DF; - remoteInfo = "Coder Desktop"; - }; - AA3B3DCF2D2D249F0099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B3DA02D2D23860099996A; - remoteInfo = VPNLib; - }; - AA3B409A2D2FC8560099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B40902D2FC8560099996A; - remoteInfo = CoderSDK; - }; - AA3B409C2D2FC8560099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = 961678FB2CFF100D00B2B6DF; - remoteInfo = "Coder Desktop"; - }; - AA3B40A22D2FC8560099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B40902D2FC8560099996A; - remoteInfo = CoderSDK; - }; - AA3B40B92D2FDA5C0099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B40902D2FC8560099996A; - remoteInfo = CoderSDK; - }; - AA3B40C22D2FE7760099996A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B40902D2FC8560099996A; - remoteInfo = CoderSDK; - }; - AAC382372D427B7600F6DFB4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 961678F42CFF100D00B2B6DF /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA3B40902D2FC8560099996A; - remoteInfo = CoderSDK; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 961679422CFF117300B2B6DF /* Embed System Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "$(SYSTEM_EXTENSIONS_FOLDER_PATH)"; - dstSubfolderSpec = 16; - files = ( - 9616793D2CFF117300B2B6DF /* com.coder.Coder-Desktop.VPN.systemextension in Embed System Extensions */, - ); - name = "Embed System Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; - AA32A0E32D2D21A3004D6733 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - AA3B3DCE2D2D249F0099996A /* VPNLib.framework in Embed Frameworks */, - AAC382362D427B7600F6DFB4 /* CoderSDK.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - AAC3823B2D427B8300F6DFB4 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - AAC3823A2D427B8300F6DFB4 /* CoderSDK.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 961678FC2CFF100D00B2B6DF /* Coder Desktop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Coder Desktop.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9616790F2CFF100E00B2B6DF /* Coder DesktopTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Coder DesktopTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 961679192CFF100E00B2B6DF /* Coder DesktopUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Coder DesktopUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 961679302CFF117300B2B6DF /* com.coder.Coder-Desktop.VPN.systemextension */ = {isa = PBXFileReference; explicitFileType = "wrapper.system-extension"; includeInIndex = 0; path = "com.coder.Coder-Desktop.VPN.systemextension"; sourceTree = BUILT_PRODUCTS_DIR; }; - 961679322CFF117300B2B6DF /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; - AA3B3DA12D2D23860099996A /* VPNLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = VPNLib.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AA3B3DA82D2D23860099996A /* VPNLibTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VPNLibTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - AA3B40912D2FC8560099996A /* CoderSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CoderSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AA3B40982D2FC8560099996A /* CoderSDKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoderSDKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - AA3B3DB62D2D23860099996A /* Exceptions for "VPNLib" folder in "VPNLib" target */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - vpn.proto, - ); - publicHeaders = ( - VPNLib.h, - ); - target = AA3B3DA02D2D23860099996A /* VPNLib */; - }; - AA3B40A62D2FC8560099996A /* Exceptions for "CoderSDK" folder in "CoderSDK" target */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - publicHeaders = ( - CoderSDK.h, - ); - target = AA3B40902D2FC8560099996A /* CoderSDK */; - }; - AA3C69C12D2D15D200A45481 /* Exceptions for "VPN" folder in "VPN" target */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - Info.plist, - ); - target = 9616792F2CFF117300B2B6DF /* VPN */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - -/* Begin PBXFileSystemSynchronizedRootGroup section */ - 961678FE2CFF100D00B2B6DF /* Coder Desktop */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = "Coder Desktop"; - sourceTree = ""; - }; - 961679122CFF100E00B2B6DF /* Coder DesktopTests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = "Coder DesktopTests"; - sourceTree = ""; - }; - 9616791C2CFF100E00B2B6DF /* Coder DesktopUITests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = "Coder DesktopUITests"; - sourceTree = ""; - }; - AA3B3DA22D2D23860099996A /* VPNLib */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - AA3B3DB62D2D23860099996A /* Exceptions for "VPNLib" folder in "VPNLib" target */, - ); - path = VPNLib; - sourceTree = ""; - }; - AA3B3DAE2D2D23860099996A /* VPNLibTests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = VPNLibTests; - sourceTree = ""; - }; - AA3B40922D2FC8560099996A /* CoderSDK */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - AA3B40A62D2FC8560099996A /* Exceptions for "CoderSDK" folder in "CoderSDK" target */, - ); - path = CoderSDK; - sourceTree = ""; - }; - AA3B409E2D2FC8560099996A /* CoderSDKTests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = CoderSDKTests; - sourceTree = ""; - }; - AA3C69AD2D2D143400A45481 /* VPN */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - AA3C69C12D2D15D200A45481 /* Exceptions for "VPN" folder in "VPN" target */, - ); - path = VPN; - sourceTree = ""; - }; -/* End PBXFileSystemSynchronizedRootGroup section */ - -/* Begin PBXFrameworksBuildPhase section */ - 961678F92CFF100D00B2B6DF /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AA8BC4CF2D00A4B700E1ABAA /* KeychainAccess in Frameworks */, - AAC382392D427B8300F6DFB4 /* CoderSDK.framework in Frameworks */, - AA2C690F2D34F6920059AFAF /* LaunchAtLogin in Frameworks */, - AA8BC33F2D0061F200E1ABAA /* FluidMenuBarExtra in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9616790C2CFF100E00B2B6DF /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AA8BC3392D0060A900E1ABAA /* ViewInspector in Frameworks */, - AA3B40B72D2FDA5C0099996A /* CoderSDK.framework in Frameworks */, - AA3B40B62D2FD9DD0099996A /* Mocker in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 961679162CFF100E00B2B6DF /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9616792D2CFF117300B2B6DF /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 961679332CFF117300B2B6DF /* NetworkExtension.framework in Frameworks */, - AAC382352D427B7600F6DFB4 /* CoderSDK.framework in Frameworks */, - AA3B3DCD2D2D249F0099996A /* VPNLib.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B3D9E2D2D23860099996A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AA3B3DC12D2D23AB0099996A /* SwiftProtobufPluginLibrary in Frameworks */, - AA3B40C02D2FE7760099996A /* CoderSDK.framework in Frameworks */, - AA3B3DBF2D2D23AB0099996A /* SwiftProtobuf in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B3DA52D2D23860099996A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AA3B3DA92D2D23860099996A /* VPNLib.framework in Frameworks */, - AA3B3E8E2D2E0FF40099996A /* Mocker in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B408E2D2FC8560099996A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B40952D2FC8560099996A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AA3B40992D2FC8560099996A /* CoderSDK.framework in Frameworks */, - AA3B40BD2D2FDFBA0099996A /* Mocker in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 961678F32CFF100D00B2B6DF = { - isa = PBXGroup; - children = ( - 961678FE2CFF100D00B2B6DF /* Coder Desktop */, - AA3C69AD2D2D143400A45481 /* VPN */, - 961679122CFF100E00B2B6DF /* Coder DesktopTests */, - 9616791C2CFF100E00B2B6DF /* Coder DesktopUITests */, - AA3B3DA22D2D23860099996A /* VPNLib */, - AA3B3DAE2D2D23860099996A /* VPNLibTests */, - AA3B40922D2FC8560099996A /* CoderSDK */, - AA3B409E2D2FC8560099996A /* CoderSDKTests */, - 961679312CFF117300B2B6DF /* Frameworks */, - 961678FD2CFF100D00B2B6DF /* Products */, - ); - sourceTree = ""; - }; - 961678FD2CFF100D00B2B6DF /* Products */ = { - isa = PBXGroup; - children = ( - 961678FC2CFF100D00B2B6DF /* Coder Desktop.app */, - 9616790F2CFF100E00B2B6DF /* Coder DesktopTests.xctest */, - 961679192CFF100E00B2B6DF /* Coder DesktopUITests.xctest */, - 961679302CFF117300B2B6DF /* com.coder.Coder-Desktop.VPN.systemextension */, - AA3B3DA12D2D23860099996A /* VPNLib.framework */, - AA3B3DA82D2D23860099996A /* VPNLibTests.xctest */, - AA3B40912D2FC8560099996A /* CoderSDK.framework */, - AA3B40982D2FC8560099996A /* CoderSDKTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 961679312CFF117300B2B6DF /* Frameworks */ = { - isa = PBXGroup; - children = ( - 961679322CFF117300B2B6DF /* NetworkExtension.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - AA3B3D9C2D2D23860099996A /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B408C2D2FC8560099996A /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 961678FB2CFF100D00B2B6DF /* Coder Desktop */ = { - isa = PBXNativeTarget; - buildConfigurationList = 961679232CFF100F00B2B6DF /* Build configuration list for PBXNativeTarget "Coder Desktop" */; - buildPhases = ( - 961678F82CFF100D00B2B6DF /* Sources */, - 961678F92CFF100D00B2B6DF /* Frameworks */, - 961678FA2CFF100D00B2B6DF /* Resources */, - 961679422CFF117300B2B6DF /* Embed System Extensions */, - AAC3823B2D427B8300F6DFB4 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - AA2C698C2D354A800059AFAF /* PBXTargetDependency */, - 9616793C2CFF117300B2B6DF /* PBXTargetDependency */, - AA3B40A32D2FC8560099996A /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - 961678FE2CFF100D00B2B6DF /* Coder Desktop */, - ); - name = "Coder Desktop"; - packageProductDependencies = ( - AA8BC33E2D0061F200E1ABAA /* FluidMenuBarExtra */, - AA8BC4CE2D00A4B700E1ABAA /* KeychainAccess */, - AA2C690E2D34F6920059AFAF /* LaunchAtLogin */, - ); - productName = "Coder Desktop"; - productReference = 961678FC2CFF100D00B2B6DF /* Coder Desktop.app */; - productType = "com.apple.product-type.application"; - }; - 9616790E2CFF100E00B2B6DF /* Coder DesktopTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 961679262CFF100F00B2B6DF /* Build configuration list for PBXNativeTarget "Coder DesktopTests" */; - buildPhases = ( - 9616790B2CFF100E00B2B6DF /* Sources */, - 9616790C2CFF100E00B2B6DF /* Frameworks */, - 9616790D2CFF100E00B2B6DF /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AA2C698E2D354A840059AFAF /* PBXTargetDependency */, - 961679112CFF100E00B2B6DF /* PBXTargetDependency */, - AA3B40BA2D2FDA5C0099996A /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - 961679122CFF100E00B2B6DF /* Coder DesktopTests */, - ); - name = "Coder DesktopTests"; - packageProductDependencies = ( - AA8BC3382D0060A900E1ABAA /* ViewInspector */, - AA3B40B52D2FD9DD0099996A /* Mocker */, - ); - productName = "Coder DesktopTests"; - productReference = 9616790F2CFF100E00B2B6DF /* Coder DesktopTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 961679182CFF100E00B2B6DF /* Coder DesktopUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 961679292CFF100F00B2B6DF /* Build configuration list for PBXNativeTarget "Coder DesktopUITests" */; - buildPhases = ( - 961679152CFF100E00B2B6DF /* Sources */, - 961679162CFF100E00B2B6DF /* Frameworks */, - 961679172CFF100E00B2B6DF /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AA2C69902D354A880059AFAF /* PBXTargetDependency */, - 9616791B2CFF100E00B2B6DF /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - 9616791C2CFF100E00B2B6DF /* Coder DesktopUITests */, - ); - name = "Coder DesktopUITests"; - packageProductDependencies = ( - ); - productName = "Coder DesktopUITests"; - productReference = 961679192CFF100E00B2B6DF /* Coder DesktopUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 9616792F2CFF117300B2B6DF /* VPN */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9616793F2CFF117300B2B6DF /* Build configuration list for PBXNativeTarget "VPN" */; - buildPhases = ( - 9616792C2CFF117300B2B6DF /* Sources */, - 9616792D2CFF117300B2B6DF /* Frameworks */, - 9616792E2CFF117300B2B6DF /* Resources */, - AA32A0E32D2D21A3004D6733 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - AA2C69922D354A8B0059AFAF /* PBXTargetDependency */, - AA3B3DD02D2D249F0099996A /* PBXTargetDependency */, - AAC382382D427B7600F6DFB4 /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - AA3C69AD2D2D143400A45481 /* VPN */, - ); - name = VPN; - packageProductDependencies = ( - ); - productName = VPN; - productReference = 961679302CFF117300B2B6DF /* com.coder.Coder-Desktop.VPN.systemextension */; - productType = "com.apple.product-type.system-extension"; - }; - AA3B3DA02D2D23860099996A /* VPNLib */ = { - isa = PBXNativeTarget; - buildConfigurationList = AA3B3DB72D2D23860099996A /* Build configuration list for PBXNativeTarget "VPNLib" */; - buildPhases = ( - AA3B3D9C2D2D23860099996A /* Headers */, - AA3B3D9D2D2D23860099996A /* Sources */, - AA3B3D9E2D2D23860099996A /* Frameworks */, - AA3B3D9F2D2D23860099996A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AA2C69942D354A8E0059AFAF /* PBXTargetDependency */, - AA3B40C32D2FE7760099996A /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - AA3B3DA22D2D23860099996A /* VPNLib */, - ); - name = VPNLib; - packageProductDependencies = ( - AA3B3DBE2D2D23AB0099996A /* SwiftProtobuf */, - AA3B3DC02D2D23AB0099996A /* SwiftProtobufPluginLibrary */, - ); - productName = VPNLib; - productReference = AA3B3DA12D2D23860099996A /* VPNLib.framework */; - productType = "com.apple.product-type.framework"; - }; - AA3B3DA72D2D23860099996A /* VPNLibTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = AA3B3DBA2D2D23860099996A /* Build configuration list for PBXNativeTarget "VPNLibTests" */; - buildPhases = ( - AA3B3DA42D2D23860099996A /* Sources */, - AA3B3DA52D2D23860099996A /* Frameworks */, - AA3B3DA62D2D23860099996A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AA2C69962D354A910059AFAF /* PBXTargetDependency */, - AA3B3DAB2D2D23860099996A /* PBXTargetDependency */, - AA3B3DAD2D2D23860099996A /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - AA3B3DAE2D2D23860099996A /* VPNLibTests */, - ); - name = VPNLibTests; - packageProductDependencies = ( - AA3B3E8D2D2E0FF40099996A /* Mocker */, - ); - productName = VPNLibTests; - productReference = AA3B3DA82D2D23860099996A /* VPNLibTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - AA3B40902D2FC8560099996A /* CoderSDK */ = { - isa = PBXNativeTarget; - buildConfigurationList = AA3B40A72D2FC8560099996A /* Build configuration list for PBXNativeTarget "CoderSDK" */; - buildPhases = ( - AA3B408C2D2FC8560099996A /* Headers */, - AA3B408D2D2FC8560099996A /* Sources */, - AA3B408E2D2FC8560099996A /* Frameworks */, - AA3B408F2D2FC8560099996A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AA2C69982D354A940059AFAF /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - AA3B40922D2FC8560099996A /* CoderSDK */, - ); - name = CoderSDK; - packageProductDependencies = ( - ); - productName = CoderSDK; - productReference = AA3B40912D2FC8560099996A /* CoderSDK.framework */; - productType = "com.apple.product-type.framework"; - }; - AA3B40972D2FC8560099996A /* CoderSDKTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = AA3B40AA2D2FC8560099996A /* Build configuration list for PBXNativeTarget "CoderSDKTests" */; - buildPhases = ( - AA3B40942D2FC8560099996A /* Sources */, - AA3B40952D2FC8560099996A /* Frameworks */, - AA3B40962D2FC8560099996A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - AA2C699A2D354A970059AFAF /* PBXTargetDependency */, - AA3B409B2D2FC8560099996A /* PBXTargetDependency */, - AA3B409D2D2FC8560099996A /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - AA3B409E2D2FC8560099996A /* CoderSDKTests */, - ); - name = CoderSDKTests; - packageProductDependencies = ( - AA3B40BC2D2FDFBA0099996A /* Mocker */, - ); - productName = CoderSDKTests; - productReference = AA3B40982D2FC8560099996A /* CoderSDKTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 961678F42CFF100D00B2B6DF /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1620; - LastUpgradeCheck = 1620; - TargetAttributes = { - 961678FB2CFF100D00B2B6DF = { - CreatedOnToolsVersion = 16.1; - }; - 9616790E2CFF100E00B2B6DF = { - CreatedOnToolsVersion = 16.1; - TestTargetID = 961678FB2CFF100D00B2B6DF; - }; - 961679182CFF100E00B2B6DF = { - CreatedOnToolsVersion = 16.1; - TestTargetID = 961678FB2CFF100D00B2B6DF; - }; - 9616792F2CFF117300B2B6DF = { - CreatedOnToolsVersion = 16.1; - }; - AA3B3DA02D2D23860099996A = { - CreatedOnToolsVersion = 16.2; - }; - AA3B3DA72D2D23860099996A = { - CreatedOnToolsVersion = 16.2; - TestTargetID = 961678FB2CFF100D00B2B6DF; - }; - AA3B40902D2FC8560099996A = { - CreatedOnToolsVersion = 16.2; - }; - AA3B40972D2FC8560099996A = { - CreatedOnToolsVersion = 16.2; - TestTargetID = 961678FB2CFF100D00B2B6DF; - }; - }; - }; - buildConfigurationList = 961678F72CFF100D00B2B6DF /* Build configuration list for PBXProject "Coder Desktop" */; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 961678F32CFF100D00B2B6DF; - minimizedProjectReferenceProxies = 1; - packageReferences = ( - AA8BC3372D00609700E1ABAA /* XCRemoteSwiftPackageReference "ViewInspector" */, - AA8BC33D2D0061F200E1ABAA /* XCRemoteSwiftPackageReference "fluid-menu-bar-extra" */, - AA8BC4CD2D00A4B700E1ABAA /* XCRemoteSwiftPackageReference "KeychainAccess" */, - 961679512CFF207900B2B6DF /* XCRemoteSwiftPackageReference "swift-protobuf" */, - AA3B3E8A2D2E0FE10099996A /* XCRemoteSwiftPackageReference "Mocker" */, - AA2C690D2D34F6920059AFAF /* XCRemoteSwiftPackageReference "LaunchAtLogin-modern" */, - AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */, - ); - preferredProjectObjectVersion = 77; - productRefGroup = 961678FD2CFF100D00B2B6DF /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 961678FB2CFF100D00B2B6DF /* Coder Desktop */, - 9616790E2CFF100E00B2B6DF /* Coder DesktopTests */, - 961679182CFF100E00B2B6DF /* Coder DesktopUITests */, - 9616792F2CFF117300B2B6DF /* VPN */, - AA3B3DA02D2D23860099996A /* VPNLib */, - AA3B3DA72D2D23860099996A /* VPNLibTests */, - AA3B40902D2FC8560099996A /* CoderSDK */, - AA3B40972D2FC8560099996A /* CoderSDKTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 961678FA2CFF100D00B2B6DF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9616790D2CFF100E00B2B6DF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 961679172CFF100E00B2B6DF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9616792E2CFF117300B2B6DF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B3D9F2D2D23860099996A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B3DA62D2D23860099996A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B408F2D2FC8560099996A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B40962D2FC8560099996A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 961678F82CFF100D00B2B6DF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9616790B2CFF100E00B2B6DF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 961679152CFF100E00B2B6DF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9616792C2CFF117300B2B6DF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B3D9D2D2D23860099996A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B3DA42D2D23860099996A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B408D2D2FC8560099996A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AA3B40942D2FC8560099996A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 961679112CFF100E00B2B6DF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 961678FB2CFF100D00B2B6DF /* Coder Desktop */; - targetProxy = 961679102CFF100E00B2B6DF /* PBXContainerItemProxy */; - }; - 9616791B2CFF100E00B2B6DF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 961678FB2CFF100D00B2B6DF /* Coder Desktop */; - targetProxy = 9616791A2CFF100E00B2B6DF /* PBXContainerItemProxy */; - }; - 9616793C2CFF117300B2B6DF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9616792F2CFF117300B2B6DF /* VPN */; - targetProxy = 9616793B2CFF117300B2B6DF /* PBXContainerItemProxy */; - }; - AA2C698C2D354A800059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C698B2D354A800059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C698E2D354A840059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C698D2D354A840059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C69902D354A880059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C698F2D354A880059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C69922D354A8B0059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C69912D354A8B0059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C69942D354A8E0059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C69932D354A8E0059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C69962D354A910059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C69952D354A910059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C69982D354A940059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C69972D354A940059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA2C699A2D354A970059AFAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - productRef = AA2C69992D354A970059AFAF /* SwiftLintBuildToolPlugin */; - }; - AA3B3DAB2D2D23860099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B3DA02D2D23860099996A /* VPNLib */; - targetProxy = AA3B3DAA2D2D23860099996A /* PBXContainerItemProxy */; - }; - AA3B3DAD2D2D23860099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 961678FB2CFF100D00B2B6DF /* Coder Desktop */; - targetProxy = AA3B3DAC2D2D23860099996A /* PBXContainerItemProxy */; - }; - AA3B3DD02D2D249F0099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B3DA02D2D23860099996A /* VPNLib */; - targetProxy = AA3B3DCF2D2D249F0099996A /* PBXContainerItemProxy */; - }; - AA3B409B2D2FC8560099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B40902D2FC8560099996A /* CoderSDK */; - targetProxy = AA3B409A2D2FC8560099996A /* PBXContainerItemProxy */; - }; - AA3B409D2D2FC8560099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 961678FB2CFF100D00B2B6DF /* Coder Desktop */; - targetProxy = AA3B409C2D2FC8560099996A /* PBXContainerItemProxy */; - }; - AA3B40A32D2FC8560099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B40902D2FC8560099996A /* CoderSDK */; - targetProxy = AA3B40A22D2FC8560099996A /* PBXContainerItemProxy */; - }; - AA3B40BA2D2FDA5C0099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B40902D2FC8560099996A /* CoderSDK */; - targetProxy = AA3B40B92D2FDA5C0099996A /* PBXContainerItemProxy */; - }; - AA3B40C32D2FE7760099996A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B40902D2FC8560099996A /* CoderSDK */; - targetProxy = AA3B40C22D2FE7760099996A /* PBXContainerItemProxy */; - }; - AAC382382D427B7600F6DFB4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AA3B40902D2FC8560099996A /* CoderSDK */; - targetProxy = AAC382372D427B7600F6DFB4 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 961679212CFF100F00B2B6DF /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 15.1; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 6.0; - }; - name = Debug; - }; - 961679222CFF100F00B2B6DF /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 15.1; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_VERSION = 6.0; - }; - name = Release; - }; - 961679242CFF100F00B2B6DF /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "Coder Desktop/Coder_Desktop.entitlements"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_ASSET_PATHS = "\"Coder Desktop/Preview Content\""; - DEVELOPMENT_TEAM = 4399GN35BJ; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_LSUIElement = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 6.0; - }; - name = Debug; - }; - 961679252CFF100F00B2B6DF /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = "Coder Desktop/Coder_Desktop.entitlements"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_ASSET_PATHS = "\"Coder Desktop/Preview Content\""; - DEVELOPMENT_TEAM = 4399GN35BJ; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_LSUIElement = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop"; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 6.0; - }; - name = Release; - }; - 961679272CFF100F00B2B6DF /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-DesktopTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 6.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop"; - }; - name = Debug; - }; - 961679282CFF100F00B2B6DF /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-DesktopTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 6.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop"; - }; - name = Release; - }; - 9616792A2CFF100F00B2B6DF /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-DesktopUITests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 6.0; - TEST_TARGET_NAME = "Coder Desktop"; - }; - name = Debug; - }; - 9616792B2CFF100F00B2B6DF /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-DesktopUITests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 6.0; - TEST_TARGET_NAME = "Coder Desktop"; - }; - name = Release; - }; - 961679402CFF117300B2B6DF /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = VPN/VPN.entitlements; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEFINES_MODULE = NO; - DEVELOPMENT_TEAM = 4399GN35BJ; - ENABLE_HARDENED_RUNTIME = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPN/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = VPN; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@executable_path/../../../../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop.VPN"; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)"; - PRODUCT_NAME = "$(inherited)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OBJC_BRIDGING_HEADER = "VPN/$(SWIFT_MODULE_NAME)-Bridging-Header.h"; - SWIFT_VERSION = 6.0; - }; - name = Debug; - }; - 961679412CFF117300B2B6DF /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_ENTITLEMENTS = VPN/VPN.entitlements; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = YES; - DEFINES_MODULE = NO; - DEVELOPMENT_TEAM = 4399GN35BJ; - ENABLE_HARDENED_RUNTIME = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = VPN/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = VPN; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@executable_path/../../../../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop.VPN"; - PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)"; - PRODUCT_NAME = "$(inherited)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OBJC_BRIDGING_HEADER = "VPN/$(SWIFT_MODULE_NAME)-Bridging-Header.h"; - SWIFT_VERSION = 6.0; - }; - name = Release; - }; - AA3B3DB82D2D23860099996A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = NO; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).VPNLib"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 6.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - AA3B3DB92D2D23860099996A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).VPNLib"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 6.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - AA3B3DBB2D2D23860099996A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop.VPNLibTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 6.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop"; - }; - name = Debug; - }; - AA3B3DBC2D2D23860099996A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop.VPNLibTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 6.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop"; - }; - name = Release; - }; - AA3B40A82D2FC8560099996A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = NO; - CODE_SIGN_IDENTITY = ""; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).CoderSDK"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - AA3B40A92D2FC8560099996A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 4399GN35BJ; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).CoderSDK"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - AA3B40AB2D2FC8560099996A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop.CoderSDKTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop"; - }; - name = Debug; - }; - AA3B40AC2D2FC8560099996A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 4399GN35BJ; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "com.coder.Coder-Desktop.CoderSDKTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 961678F72CFF100D00B2B6DF /* Build configuration list for PBXProject "Coder Desktop" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 961679212CFF100F00B2B6DF /* Debug */, - 961679222CFF100F00B2B6DF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 961679232CFF100F00B2B6DF /* Build configuration list for PBXNativeTarget "Coder Desktop" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 961679242CFF100F00B2B6DF /* Debug */, - 961679252CFF100F00B2B6DF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 961679262CFF100F00B2B6DF /* Build configuration list for PBXNativeTarget "Coder DesktopTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 961679272CFF100F00B2B6DF /* Debug */, - 961679282CFF100F00B2B6DF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 961679292CFF100F00B2B6DF /* Build configuration list for PBXNativeTarget "Coder DesktopUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9616792A2CFF100F00B2B6DF /* Debug */, - 9616792B2CFF100F00B2B6DF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9616793F2CFF117300B2B6DF /* Build configuration list for PBXNativeTarget "VPN" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 961679402CFF117300B2B6DF /* Debug */, - 961679412CFF117300B2B6DF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AA3B3DB72D2D23860099996A /* Build configuration list for PBXNativeTarget "VPNLib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AA3B3DB82D2D23860099996A /* Debug */, - AA3B3DB92D2D23860099996A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AA3B3DBA2D2D23860099996A /* Build configuration list for PBXNativeTarget "VPNLibTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AA3B3DBB2D2D23860099996A /* Debug */, - AA3B3DBC2D2D23860099996A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AA3B40A72D2FC8560099996A /* Build configuration list for PBXNativeTarget "CoderSDK" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AA3B40A82D2FC8560099996A /* Debug */, - AA3B40A92D2FC8560099996A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AA3B40AA2D2FC8560099996A /* Build configuration list for PBXNativeTarget "CoderSDKTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AA3B40AB2D2FC8560099996A /* Debug */, - AA3B40AC2D2FC8560099996A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 961679512CFF207900B2B6DF /* XCRemoteSwiftPackageReference "swift-protobuf" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/apple/swift-protobuf.git"; - requirement = { - kind = exactVersion; - version = 1.28.2; - }; - }; - AA2C690D2D34F6920059AFAF /* XCRemoteSwiftPackageReference "LaunchAtLogin-modern" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/sindresorhus/LaunchAtLogin-modern"; - requirement = { - kind = exactVersion; - version = 1.1.0; - }; - }; - AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/SimplyDanny/SwiftLintPlugins"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.58.0; - }; - }; - AA3B3E8A2D2E0FE10099996A /* XCRemoteSwiftPackageReference "Mocker" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/WeTransfer/Mocker"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 3.0.2; - }; - }; - AA8BC3372D00609700E1ABAA /* XCRemoteSwiftPackageReference "ViewInspector" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/nalexn/ViewInspector"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.10.0; - }; - }; - AA8BC33D2D0061F200E1ABAA /* XCRemoteSwiftPackageReference "fluid-menu-bar-extra" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/lfroms/fluid-menu-bar-extra"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.1.0; - }; - }; - AA8BC4CD2D00A4B700E1ABAA /* XCRemoteSwiftPackageReference "KeychainAccess" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess"; - requirement = { - branch = e0c7eebc5a4465a3c4680764f26b7a61f567cdaf; - kind = branch; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - AA2C690E2D34F6920059AFAF /* LaunchAtLogin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C690D2D34F6920059AFAF /* XCRemoteSwiftPackageReference "LaunchAtLogin-modern" */; - productName = LaunchAtLogin; - }; - AA2C698B2D354A800059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C698D2D354A840059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C698F2D354A880059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C69912D354A8B0059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C69932D354A8E0059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C69952D354A910059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C69972D354A940059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA2C69992D354A970059AFAF /* SwiftLintBuildToolPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = AA2C698A2D354A600059AFAF /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */; - productName = "plugin:SwiftLintBuildToolPlugin"; - }; - AA3B3DBE2D2D23AB0099996A /* SwiftProtobuf */ = { - isa = XCSwiftPackageProductDependency; - package = 961679512CFF207900B2B6DF /* XCRemoteSwiftPackageReference "swift-protobuf" */; - productName = SwiftProtobuf; - }; - AA3B3DC02D2D23AB0099996A /* SwiftProtobufPluginLibrary */ = { - isa = XCSwiftPackageProductDependency; - package = 961679512CFF207900B2B6DF /* XCRemoteSwiftPackageReference "swift-protobuf" */; - productName = SwiftProtobufPluginLibrary; - }; - AA3B3E8D2D2E0FF40099996A /* Mocker */ = { - isa = XCSwiftPackageProductDependency; - package = AA3B3E8A2D2E0FE10099996A /* XCRemoteSwiftPackageReference "Mocker" */; - productName = Mocker; - }; - AA3B40B52D2FD9DD0099996A /* Mocker */ = { - isa = XCSwiftPackageProductDependency; - package = AA3B3E8A2D2E0FE10099996A /* XCRemoteSwiftPackageReference "Mocker" */; - productName = Mocker; - }; - AA3B40BC2D2FDFBA0099996A /* Mocker */ = { - isa = XCSwiftPackageProductDependency; - package = AA3B3E8A2D2E0FE10099996A /* XCRemoteSwiftPackageReference "Mocker" */; - productName = Mocker; - }; - AA8BC3382D0060A900E1ABAA /* ViewInspector */ = { - isa = XCSwiftPackageProductDependency; - package = AA8BC3372D00609700E1ABAA /* XCRemoteSwiftPackageReference "ViewInspector" */; - productName = ViewInspector; - }; - AA8BC33E2D0061F200E1ABAA /* FluidMenuBarExtra */ = { - isa = XCSwiftPackageProductDependency; - package = AA8BC33D2D0061F200E1ABAA /* XCRemoteSwiftPackageReference "fluid-menu-bar-extra" */; - productName = FluidMenuBarExtra; - }; - AA8BC4CE2D00A4B700E1ABAA /* KeychainAccess */ = { - isa = XCSwiftPackageProductDependency; - package = AA8BC4CD2D00A4B700E1ABAA /* XCRemoteSwiftPackageReference "KeychainAccess" */; - productName = KeychainAccess; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 961678F42CFF100D00B2B6DF /* Project object */; -} diff --git a/Coder Desktop/Coder Desktop.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Coder Desktop/Coder Desktop.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Coder Desktop/Coder Desktop.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Coder Desktop/Coder Desktop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Coder Desktop/Coder Desktop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 37e6bc5..0000000 --- a/Coder Desktop/Coder Desktop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,68 +0,0 @@ -{ - "originHash" : "c41f63aa01c78f450e2232efbefcd30874995ad120db77fa5942062d6f813891", - "pins" : [ - { - "identity" : "fluid-menu-bar-extra", - "kind" : "remoteSourceControl", - "location" : "https://github.com/lfroms/fluid-menu-bar-extra", - "state" : { - "revision" : "e152a3a1a25aca24906217f8d4d63afbb08d7f97", - "version" : "1.1.0" - } - }, - { - "identity" : "keychainaccess", - "kind" : "remoteSourceControl", - "location" : "https://github.com/kishikawakatsumi/KeychainAccess", - "state" : { - "revision" : "e0c7eebc5a4465a3c4680764f26b7a61f567cdaf" - } - }, - { - "identity" : "launchatlogin-modern", - "kind" : "remoteSourceControl", - "location" : "https://github.com/sindresorhus/LaunchAtLogin-modern", - "state" : { - "revision" : "a04ec1c363be3627734f6dad757d82f5d4fa8fcc", - "version" : "1.1.0" - } - }, - { - "identity" : "mocker", - "kind" : "remoteSourceControl", - "location" : "https://github.com/WeTransfer/Mocker", - "state" : { - "revision" : "95fa785c751f6bc40c49e112d433c3acf8417a97", - "version" : "3.0.2" - } - }, - { - "identity" : "swift-protobuf", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-protobuf.git", - "state" : { - "revision" : "ebc7251dd5b37f627c93698e4374084d98409633", - "version" : "1.28.2" - } - }, - { - "identity" : "swiftlintplugins", - "kind" : "remoteSourceControl", - "location" : "https://github.com/SimplyDanny/SwiftLintPlugins", - "state" : { - "revision" : "fac0c3d3ac69b15ea5382275dbbd5e583a2e05fa", - "version" : "0.58.0" - } - }, - { - "identity" : "viewinspector", - "kind" : "remoteSourceControl", - "location" : "https://github.com/nalexn/ViewInspector", - "state" : { - "revision" : "788e7879d38a839c4e348ab0762dcc0364e646a2", - "version" : "0.10.1" - } - } - ], - "version" : 3 -} diff --git a/Coder Desktop/Coder Desktop.xcodeproj/xcshareddata/xcschemes/Coder Desktop.xcscheme b/Coder Desktop/Coder Desktop.xcodeproj/xcshareddata/xcschemes/Coder Desktop.xcscheme deleted file mode 100644 index c17080f..0000000 --- a/Coder Desktop/Coder Desktop.xcodeproj/xcshareddata/xcschemes/Coder Desktop.xcscheme +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Coder Desktop/Coder Desktop.xcodeproj/xcshareddata/xcschemes/VPN.xcscheme b/Coder Desktop/Coder Desktop.xcodeproj/xcshareddata/xcschemes/VPN.xcscheme deleted file mode 100644 index 17d9d7a..0000000 --- a/Coder Desktop/Coder Desktop.xcodeproj/xcshareddata/xcschemes/VPN.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Coder Desktop/Coder Desktop/NetworkExtension.swift b/Coder Desktop/Coder Desktop/NetworkExtension.swift index 745579e..28aa78f 100644 --- a/Coder Desktop/Coder Desktop/NetworkExtension.swift +++ b/Coder Desktop/Coder Desktop/NetworkExtension.swift @@ -10,13 +10,13 @@ enum NetworkExtensionState: Equatable { var description: String { switch self { case .unconfigured: - return "NetworkExtension not configured, try logging in again" + "NetworkExtension not configured, try logging in again" case .enabled: - return "NetworkExtension tunnel enabled" + "NetworkExtension tunnel enabled" case .disabled: - return "NetworkExtension tunnel disabled" + "NetworkExtension tunnel disabled" case let .failed(error): - return "NetworkExtension config failed: \(error)" + "NetworkExtension config failed: \(error)" } } } diff --git a/Coder Desktop/Coder Desktop/Preview Content/PreviewSession.swift b/Coder Desktop/Coder Desktop/Preview Content/PreviewSession.swift index a065194..ff58e76 100644 --- a/Coder Desktop/Coder Desktop/Preview Content/PreviewSession.swift +++ b/Coder Desktop/Coder Desktop/Preview Content/PreviewSession.swift @@ -24,6 +24,6 @@ class PreviewSession: Session { } func tunnelProviderProtocol() -> NETunnelProviderProtocol? { - return nil + nil } } diff --git a/Coder Desktop/Coder Desktop/State.swift b/Coder Desktop/Coder Desktop/State.swift index 7a58808..01ef7c2 100644 --- a/Coder Desktop/Coder Desktop/State.swift +++ b/Coder Desktop/Coder Desktop/State.swift @@ -78,7 +78,7 @@ class SecureSession: ObservableObject, Session { } private func keychainSet(_ value: String?, for key: String) { - if let value = value { + if let value { try? keychain.set(value, key: key) } else { try? keychain.remove(key) @@ -132,6 +132,6 @@ struct LiteralHeader: Hashable, Identifiable, Equatable, Codable { extension LiteralHeader { func toSDKHeader() -> HTTPHeader { - return .init(header: header, value: value) + .init(header: header, value: value) } } diff --git a/Coder Desktop/Coder Desktop/SystemExtension.swift b/Coder Desktop/Coder Desktop/SystemExtension.swift index bc81bd1..934db09 100644 --- a/Coder Desktop/Coder Desktop/SystemExtension.swift +++ b/Coder Desktop/Coder Desktop/SystemExtension.swift @@ -11,13 +11,13 @@ enum SystemExtensionState: Equatable, Sendable { var description: String { switch self { case .uninstalled: - return "VPN SystemExtension is waiting to be activated" + "VPN SystemExtension is waiting to be activated" case .needsUserApproval: - return "VPN SystemExtension needs user approval to activate" + "VPN SystemExtension needs user approval to activate" case .installed: - return "VPN SystemExtension is installed" + "VPN SystemExtension is installed" case let .failed(error): - return "VPN SystemExtension failed with error: \(error)" + "VPN SystemExtension failed with error: \(error)" } } } diff --git a/Coder Desktop/Coder Desktop/VPNService.swift b/Coder Desktop/Coder Desktop/VPNService.swift index 4510634..46c3cab 100644 --- a/Coder Desktop/Coder Desktop/VPNService.swift +++ b/Coder Desktop/Coder Desktop/VPNService.swift @@ -29,13 +29,13 @@ enum VPNServiceError: Error, Equatable { var description: String { switch self { case .longTestError: - return "This is a long error to test the UI with long errors" + "This is a long error to test the UI with long errors" case let .internalError(description): - return "Internal Error: \(description)" + "Internal Error: \(description)" case let .systemExtensionError(state): - return state.description + state.description case let .networkExtensionError(state): - return state.description + state.description } } } diff --git a/Coder Desktop/Coder Desktop/Views/Agent.swift b/Coder Desktop/Coder Desktop/Views/Agent.swift index da57cc5..7b5bbc2 100644 --- a/Coder Desktop/Coder Desktop/Views/Agent.swift +++ b/Coder Desktop/Coder Desktop/Views/Agent.swift @@ -16,10 +16,10 @@ enum AgentStatus: Equatable { public var color: Color { switch self { - case .okay: return .green - case .warn: return .yellow - case .error: return .red - case .off: return .gray + case .okay: .green + case .warn: .yellow + case .error: .red + case .off: .gray } } } @@ -41,7 +41,7 @@ struct AgentRowView: View { private var wsURL: URL { // TODO: CoderVPN currently only supports owned workspaces - return baseAccessURL.appending(path: "@me").appending(path: workspace.workspaceName) + baseAccessURL.appending(path: "@me").appending(path: workspace.workspaceName) } var body: some View { diff --git a/Coder Desktop/Coder Desktop/Views/Agents.swift b/Coder Desktop/Coder Desktop/Views/Agents.swift index 42f12c9..35333c9 100644 --- a/Coder Desktop/Coder Desktop/Views/Agents.swift +++ b/Coder Desktop/Coder Desktop/Views/Agents.swift @@ -27,6 +27,6 @@ struct Agents: View { }.toggleStyle(.button).buttonStyle(.plain) } } - }.onReceive(inspection.notice) { self.inspection.visit(self, $0) } // ViewInspector + }.onReceive(inspection.notice) { inspection.visit(self, $0) } // ViewInspector } } diff --git a/Coder Desktop/Coder Desktop/Views/LoginForm.swift b/Coder Desktop/Coder Desktop/Views/LoginForm.swift index 10fa6b0..653e493 100644 --- a/Coder Desktop/Coder Desktop/Views/LoginForm.swift +++ b/Coder Desktop/Coder Desktop/Views/LoginForm.swift @@ -55,7 +55,7 @@ struct LoginForm: View { }.disabled(loading) .frame(width: 550) .fixedSize() - .onReceive(inspection.notice) { self.inspection.visit(self, $0) } // ViewInspector + .onReceive(inspection.notice) { inspection.visit(self, $0) } // ViewInspector } func submit() async { @@ -177,9 +177,9 @@ enum LoginError { var description: String { switch self { case .invalidURL: - return "Invalid URL" + "Invalid URL" case let .failedAuth(err): - return "Could not authenticate with Coder deployment:\n\(err.description)" + "Could not authenticate with Coder deployment:\n\(err.description)" } } } diff --git a/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeaderModal.swift b/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeaderModal.swift index 9e2ea2a..bfb4a10 100644 --- a/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeaderModal.swift +++ b/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeaderModal.swift @@ -26,8 +26,8 @@ struct LiteralHeaderModal: View { }.padding(20) }.onAppear { if let existingHeader { - self.header = existingHeader.header - self.value = existingHeader.value + header = existingHeader.header + value = existingHeader.value } } } diff --git a/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeadersSection.swift b/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeadersSection.swift index aa27203..9c03263 100644 --- a/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeadersSection.swift +++ b/Coder Desktop/Coder Desktop/Views/Settings/LiteralHeadersSection.swift @@ -66,6 +66,6 @@ struct LiteralHeadersSection: View { }.onTapGesture { selectedHeader = nil }.disabled(vpn.state != .disabled) - .onReceive(inspection.notice) { self.inspection.visit(self, $0) } // ViewInspector + .onReceive(inspection.notice) { inspection.visit(self, $0) } // ViewInspector } } diff --git a/Coder Desktop/Coder Desktop/Views/VPNMenu.swift b/Coder Desktop/Coder Desktop/Views/VPNMenu.swift index 5ba76e0..26266c8 100644 --- a/Coder Desktop/Coder Desktop/Views/VPNMenu.swift +++ b/Coder Desktop/Coder Desktop/Views/VPNMenu.swift @@ -14,9 +14,9 @@ struct VPNMenu: View { VStack(alignment: .leading, spacing: Theme.Size.trayPadding) { HStack { Toggle(isOn: Binding( - get: { self.vpn.state == .connected || self.vpn.state == .connecting }, + get: { vpn.state == .connected || vpn.state == .connecting }, set: { isOn in Task { - if isOn { await self.vpn.start() } else { await self.vpn.stop() } + if isOn { await vpn.start() } else { await vpn.stop() } } } )) { @@ -78,11 +78,11 @@ struct VPNMenu: View { }.padding(.bottom, Theme.Size.trayMargin) .environmentObject(vpn) .environmentObject(session) - .onReceive(inspection.notice) { self.inspection.visit(self, $0) } // ViewInspector + .onReceive(inspection.notice) { inspection.visit(self, $0) } // ViewInspector } private var vpnDisabled: Bool { - return !session.hasSession || + !session.hasSession || vpn.state == .connecting || vpn.state == .disconnecting } diff --git a/Coder Desktop/Coder DesktopTests/AgentsTests.swift b/Coder Desktop/Coder DesktopTests/AgentsTests.swift index 300d3e8..537bbfd 100644 --- a/Coder Desktop/Coder DesktopTests/AgentsTests.swift +++ b/Coder Desktop/Coder DesktopTests/AgentsTests.swift @@ -19,7 +19,7 @@ struct AgentsTests { } private func createMockAgents(count: Int) -> [Agent] { - return (1 ... count).map { + (1 ... count).map { Agent( id: UUID(), name: "a\($0)", diff --git a/Coder Desktop/Coder DesktopTests/Util.swift b/Coder Desktop/Coder DesktopTests/Util.swift index 244513e..2cf4d38 100644 --- a/Coder Desktop/Coder DesktopTests/Util.swift +++ b/Coder Desktop/Coder DesktopTests/Util.swift @@ -46,7 +46,7 @@ class MockSession: Session { } func tunnelProviderProtocol() -> NETunnelProviderProtocol? { - return nil + nil } } diff --git a/Coder Desktop/CoderSDK/Client.swift b/Coder Desktop/CoderSDK/Client.swift index 59a17cb..601c577 100644 --- a/Coder Desktop/CoderSDK/Client.swift +++ b/Coder Desktop/CoderSDK/Client.swift @@ -28,7 +28,7 @@ public struct Client { method: HTTPMethod, body: Data? = nil ) async throws(ClientError) -> HTTPResponse { - let url = self.url.appendingPathComponent(path) + let url = url.appendingPathComponent(path) var req = URLRequest(url: url) if let token { req.addValue(token, forHTTPHeaderField: Headers.sessionToken) } req.httpMethod = method.rawValue @@ -49,10 +49,10 @@ public struct Client { return HTTPResponse(resp: httpResponse, data: data, req: req) } - func request( + func request( _ path: String, method: HTTPMethod, - body: T + body: some Encodable & Sendable ) async throws(ClientError) -> HTTPResponse { let encodedBody: Data? do { @@ -67,7 +67,7 @@ public struct Client { _ path: String, method: HTTPMethod ) async throws(ClientError) -> HTTPResponse { - return try await doRequest(path: path, method: method) + try await doRequest(path: path, method: method) } func responseAsError(_ resp: HTTPResponse) -> ClientError { @@ -86,7 +86,7 @@ public struct Client { } } -public struct APIError: Decodable { +public struct APIError: Decodable, Sendable { let response: Response let statusCode: Int let method: String @@ -105,13 +105,13 @@ public struct APIError: Decodable { } } -public struct Response: Decodable { +public struct Response: Decodable, Sendable { let message: String let detail: String? let validations: [FieldValidation]? } -public struct FieldValidation: Decodable { +public struct FieldValidation: Decodable, Sendable { let field: String let detail: String } @@ -125,13 +125,13 @@ public enum ClientError: Error { public var description: String { switch self { case let .api(error): - return error.description + error.description case let .network(error): - return error.localizedDescription + error.localizedDescription case let .unexpectedResponse(data): - return "Unexpected or non HTTP response: \(data)" + "Unexpected or non HTTP response: \(data)" case let .encodeFailure(error): - return "Failed to encode body: \(error)" + "Failed to encode body: \(error)" } } } diff --git a/Coder Desktop/CoderSDK/Deployment.swift b/Coder Desktop/CoderSDK/Deployment.swift index ea1d23c..8144c0a 100644 --- a/Coder Desktop/CoderSDK/Deployment.swift +++ b/Coder Desktop/CoderSDK/Deployment.swift @@ -1,3 +1,5 @@ +import Foundation + public extension Client { func buildInfo() async throws(ClientError) -> BuildInfoResponse { let res = try await request("/api/v2/buildinfo", method: .get) @@ -25,7 +27,7 @@ public struct BuildInfoResponse: Encodable, Decodable, Equatable, Sendable { // `version` in the form `[0-9]+.[0-9]+.[0-9]+` public var semver: String? { - return try? NSRegularExpression(pattern: #"v(\d+\.\d+\.\d+)"#) + try? NSRegularExpression(pattern: #"v(\d+\.\d+\.\d+)"#) .firstMatch(in: version, range: NSRange(version.startIndex ..< version.endIndex, in: version)) .flatMap { Range($0.range(at: 1), in: version).map { String(version[$0]) } } } diff --git a/Coder Desktop/CoderSDK/HTTP.swift b/Coder Desktop/CoderSDK/HTTP.swift index 94b8cde..d10d469 100644 --- a/Coder Desktop/CoderSDK/HTTP.swift +++ b/Coder Desktop/CoderSDK/HTTP.swift @@ -1,3 +1,5 @@ +import Foundation + public struct HTTPResponse { let resp: HTTPURLResponse let data: Data diff --git a/Coder Desktop/CoderSDKTests/CoderSDKTests.swift b/Coder Desktop/CoderSDKTests/CoderSDKTests.swift index 33c61c4..69a4664 100644 --- a/Coder Desktop/CoderSDKTests/CoderSDKTests.swift +++ b/Coder Desktop/CoderSDKTests/CoderSDKTests.swift @@ -1,4 +1,5 @@ @testable import CoderSDK +import Foundation import Mocker import Testing diff --git a/Coder Desktop/VPN/Manager.swift b/Coder Desktop/VPN/Manager.swift index b441150..3ca0004 100644 --- a/Coder Desktop/VPN/Manager.swift +++ b/Coder Desktop/VPN/Manager.swift @@ -208,23 +208,23 @@ enum ManagerError: Error { var description: String { switch self { case let .download(err): - return "Download error: \(err)" + "Download error: \(err)" case let .tunnelSetup(err): - return "Tunnel setup error: \(err)" + "Tunnel setup error: \(err)" case let .handshake(err): - return "Handshake error: \(err)" + "Handshake error: \(err)" case let .validation(err): - return "Validation error: \(err)" + "Validation error: \(err)" case .incorrectResponse: - return "Received unexpected response over tunnel" + "Received unexpected response over tunnel" case let .failedRPC(err): - return "Failed rpc: \(err)" + "Failed rpc: \(err)" case let .serverInfo(msg): - return msg + msg case let .errorResponse(msg): - return msg + msg case .noTunnelFileDescriptor: - return "Could not find a tunnel file descriptor" + "Could not find a tunnel file descriptor" } } } diff --git a/Coder Desktop/VPN/TunnelHandle.swift b/Coder Desktop/VPN/TunnelHandle.swift index ea80002..720758e 100644 --- a/Coder Desktop/VPN/TunnelHandle.swift +++ b/Coder Desktop/VPN/TunnelHandle.swift @@ -75,11 +75,11 @@ enum TunnelHandleError: Error { var description: String { switch self { - case let .pipe(err): return "pipe error: \(err)" - case let .dylib(d): return d - case let .symbol(symbol, message): return "\(symbol): \(message)" - case let .openTunnel(error): return "OpenTunnel: \(error.message)" - case let .close(errs): return "close tunnel: \(errs.map(\.localizedDescription).joined(separator: ", "))" + case let .pipe(err): "pipe error: \(err)" + case let .dylib(d): d + case let .symbol(symbol, message): "\(symbol): \(message)" + case let .openTunnel(error): "OpenTunnel: \(error.message)" + case let .close(errs): "close tunnel: \(errs.map(\.localizedDescription).joined(separator: ", "))" } } } @@ -93,11 +93,11 @@ enum OpenTunnelError: Int32 { var message: String { switch self { - case .errDupReadFD: return "Failed to duplicate read file descriptor" - case .errDupWriteFD: return "Failed to duplicate write file descriptor" - case .errOpenPipe: return "Failed to open the pipe" - case .errNewTunnel: return "Failed to create a new tunnel" - case .unknown: return "Unknown error code" + case .errDupReadFD: "Failed to duplicate read file descriptor" + case .errDupWriteFD: "Failed to duplicate write file descriptor" + case .errOpenPipe: "Failed to open the pipe" + case .errNewTunnel: "Failed to create a new tunnel" + case .unknown: "Unknown error code" } } } diff --git a/Coder Desktop/VPN/VPN.entitlements b/Coder Desktop/VPN/VPN.entitlements index a515bd3..a5c12f4 100644 --- a/Coder Desktop/VPN/VPN.entitlements +++ b/Coder Desktop/VPN/VPN.entitlements @@ -14,5 +14,7 @@ com.apple.security.network.client + com.apple.security.network.server + diff --git a/Coder Desktop/VPNLib/Download.swift b/Coder Desktop/VPNLib/Download.swift index 75ff91b..35bfa2d 100644 --- a/Coder Desktop/VPNLib/Download.swift +++ b/Coder Desktop/VPNLib/Download.swift @@ -14,21 +14,21 @@ public enum ValidationError: Error { public var errorDescription: String? { switch self { case .fileNotFound: - return "The file does not exist." + "The file does not exist." case .unableToCreateStaticCode: - return "Unable to create a static code object." + "Unable to create a static code object." case .invalidSignature: - return "The file's signature is invalid." + "The file's signature is invalid." case .unableToRetrieveInfo: - return "Unable to retrieve signing information." + "Unable to retrieve signing information." case let .invalidIdentifier(identifier): - return "Invalid identifier: \(identifier ?? "unknown")." + "Invalid identifier: \(identifier ?? "unknown")." case let .invalidVersion(version): - return "Invalid runtime version: \(version ?? "unknown")." + "Invalid runtime version: \(version ?? "unknown")." case let .invalidTeamIdentifier(identifier): - return "Invalid team identifier: \(identifier ?? "unknown")." + "Invalid team identifier: \(identifier ?? "unknown")." case .missingInfoPList: - return "Info.plist is not embedded within the dylib." + "Info.plist is not embedded within the dylib." } } } @@ -159,13 +159,13 @@ public enum DownloadError: Error { var localizedDescription: String { switch self { case let .unexpectedStatusCode(code): - return "Unexpected HTTP status code: \(code)" + "Unexpected HTTP status code: \(code)" case let .networkError(error): - return "Network error: \(error.localizedDescription)" + "Network error: \(error.localizedDescription)" case let .fileOpError(error): - return "File operation error: \(error.localizedDescription)" + "File operation error: \(error.localizedDescription)" case .invalidResponse: - return "Received non-HTTP response" + "Received non-HTTP response" } } } diff --git a/Coder Desktop/VPNLib/Speaker.swift b/Coder Desktop/VPNLib/Speaker.swift index 3a7d690..384a8a7 100644 --- a/Coder Desktop/VPNLib/Speaker.swift +++ b/Coder Desktop/VPNLib/Speaker.swift @@ -95,7 +95,7 @@ public actor Speaker RecvMsg { - return try await withCheckedThrowingContinuation { continuation in + try await withCheckedThrowingContinuation { continuation in Task { [sender, secretary, logger] in let msgID = await secretary.record(continuation: continuation) var req = req @@ -199,7 +199,7 @@ actor Handshaker { } } - let vStr = versions.map { $0.description }.joined(separator: ",") + let vStr = versions.map(\.description).joined(separator: ",") let ours = String(format: "\(headerPreamble) \(role) \(vStr)\n") do { try writeFD.write(contentsOf: ours.data(using: .utf8)!) diff --git a/Coder Desktop/VPNLibTests/ProtoTests.swift b/Coder Desktop/VPNLibTests/ProtoTests.swift index 6a1bbd9..6a83794 100644 --- a/Coder Desktop/VPNLibTests/ProtoTests.swift +++ b/Coder Desktop/VPNLibTests/ProtoTests.swift @@ -104,7 +104,7 @@ struct HandshakerTests { let result: ProtoVersion var description: String { - return "\(tun) vs \(mgr) -> \(result)" + "\(tun) vs \(mgr) -> \(result)" } } diff --git a/Coder Desktop/project.yml b/Coder Desktop/project.yml new file mode 100644 index 0000000..67bba40 --- /dev/null +++ b/Coder Desktop/project.yml @@ -0,0 +1,296 @@ +name: "Coder Desktop" +options: + bundleIdPrefix: com.coder + deploymentTarget: + macOS: "14.6" + xcodeVersion: "1600" + minimumXcodeGenVersion: "2.42.0" + +settings: + base: + MARKETING_VERSION: "1.0" # Sets the version number. + CURRENT_PROJECT_VERSION: "1" # Sets the build number. + + ALWAYS_SEARCH_USER_PATHS: NO + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS: YES + COPY_PHASE_STRIP: NO + DEAD_CODE_STRIPPING: YES + DEVELOPMENT_TEAM: "4399GN35BJ" + GENERATE_INFOPLIST_FILE: YES + PRODUCT_NAME: "$(TARGET_NAME)" + SWIFT_VERSION: ${SWIFT_VERSION} + ENABLE_USER_SCRIPT_SANDBOXING: YES + LD_RUNPATH_SEARCH_PATHS: + - "$(inherited)" + - "@executable_path/../Frameworks" + - "@loader_path/Frameworks" + GCC_C_LANGUAGE_STANDARD: gnu17 + CLANG_CXX_LANGUAGE_STANDARD: "gnu++20" + CLANG_ENABLE_MODULES: YES + CLANG_ENABLE_OBJC_ARC: YES + CLANG_ENABLE_OBJC_WEAK: YES + ENABLE_STRICT_OBJC_MSGSEND: YES + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING: YES + CLANG_WARN_BOOL_CONVERSION: YES + CLANG_WARN_COMMA: YES + CLANG_WARN_CONSTANT_CONVERSION: YES + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS: YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE: YES_ERROR + CLANG_WARN_DOCUMENTATION_COMMENTS: YES + CLANG_WARN_EMPTY_BODY: YES + CLANG_WARN_ENUM_CONVERSION: YES + CLANG_WARN_INFINITE_RECURSION: YES + CLANG_WARN_INT_CONVERSION: YES + CLANG_WARN_NON_LITERAL_NULL_CONVERSION: YES + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF: YES + CLANG_WARN_OBJC_LITERAL_CONVERSION: YES + CLANG_WARN_OBJC_ROOT_CLASS: YES_ERROR + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER: YES + CLANG_WARN_RANGE_LOOP_ANALYSIS: YES + CLANG_WARN_STRICT_PROTOTYPES: YES + CLANG_WARN_SUSPICIOUS_MOVE: YES + CLANG_WARN_UNGUARDED_AVAILABILITY: YES_AGGRESSIVE + CLANG_WARN_UNREACHABLE_CODE: YES + CLANG_WARN__DUPLICATE_METHOD_MATCH: YES + GCC_WARN_64_TO_32_BIT_CONVERSION: YES + GCC_WARN_ABOUT_RETURN_TYPE: YES_ERROR + GCC_WARN_UNDECLARED_SELECTOR: YES + GCC_WARN_UNINITIALIZED_AUTOS: YES_AGGRESSIVE + GCC_WARN_UNUSED_FUNCTION: YES + GCC_WARN_UNUSED_VARIABLE: YES + GCC_NO_COMMON_BLOCKS: YES + CLANG_ANALYZER_NONNULL: YES + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION: YES_AGGRESSIVE + MTL_FAST_MATH: YES + LOCALIZATION_PREFERS_STRING_CATALOGS: YES + configs: + debug: + GCC_PREPROCESSOR_DEFINITIONS: + - "DEBUG=1" + - "$(inherited)" + ONLY_ACTIVE_ARCH: YES + SWIFT_ACTIVE_COMPILATION_CONDITIONS: "DEBUG $(inherited)" + SWIFT_OPTIMIZATION_LEVEL: "-Onone" + GCC_OPTIMIZATION_LEVEL: 0 + DEBUG_INFORMATION_FORMAT: dwarf + ENABLE_TESTABILITY: YES + MTL_ENABLE_DEBUG_INFO: INCLUDE_SOURCE + release: + SWIFT_COMPILATION_MODE: wholemodule + DEBUG_INFORMATION_FORMAT: "dwarf-with-dsym" + ENABLE_NS_ASSERTIONS: NO + MTL_ENABLE_DEBUG_INFO: NO + +packages: + ViewInspector: + url: https://github.com/nalexn/ViewInspector + from: 0.10.0 + SwiftLintPlugins: + url: https://github.com/SimplyDanny/SwiftLintPlugins + from: 0.57.1 + FluidMenuBarExtra: + url: https://github.com/lfroms/fluid-menu-bar-extra + from: 1.1.0 + KeychainAccess: + url: https://github.com/kishikawakatsumi/KeychainAccess + branch: e0c7eebc5a4465a3c4680764f26b7a61f567cdaf + SwiftProtobuf: + url: https://github.com/apple/swift-protobuf.git + exactVersion: 1.28.2 + Mocker: + url: https://github.com/WeTransfer/Mocker + from: 3.0.2 + LaunchAtLogin: + url: https://github.com/sindresorhus/LaunchAtLogin-modern + from: 1.1.0 + +targets: + Coder Desktop: + type: application + platform: macOS + sources: + - path: Coder Desktop + entitlements: + path: Coder Desktop/Coder_Desktop.entitlements + properties: + com.apple.developer.networking.networkextension: + - packet-tunnel-provider + com.apple.developer.system-extension.install: true + com.apple.security.app-sandbox: true + com.apple.security.files.user-selected.read-only: true + com.apple.security.network.client: true + settings: + base: + ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon # Sets the app icon to "AppIcon". + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor + CODE_SIGN_IDENTITY: "Apple Development" + CODE_SIGN_STYLE: Automatic + COMBINE_HIDPI_IMAGES: YES + DEVELOPMENT_ASSET_PATHS: '"Coder Desktop/Preview Content"' # Adds development assets. + ENABLE_HARDENED_RUNTIME: YES + ENABLE_PREVIEWS: YES + INFOPLIST_KEY_LSUIElement: YES + INFOPLIST_KEY_NSHumanReadableCopyright: "" + SWIFT_EMIT_LOC_STRINGS: YES + PRODUCT_BUNDLE_IDENTIFIER: "com.coder.Coder-Desktop" + + # (ThomasK33): Install the application into the /Applications folder + # so that macOS stops complaining about the app being run from an + # untrusted folder. + DEPLOYMENT_LOCATION: YES + DSTROOT: $(LOCAL_APPS_DIR)/Coder + INSTALL_PATH: / + SKIP_INSTALL: NO + dependencies: + - target: CoderSDK + embed: true + - target: VPN + embed: without-signing # Embed without signing. + - package: FluidMenuBarExtra + - package: KeychainAccess + - package: LaunchAtLogin + scheme: + testPlans: + - path: Coder Desktop.xctestplan + testTargets: + - Coder DesktopTests + - Coder DesktopUITests + buildToolPlugins: + - plugin: SwiftLintBuildToolPlugin + package: SwiftLintPlugins + + Coder DesktopTests: + type: bundle.unit-test + platform: macOS + sources: + - path: Coder DesktopTests + settings: + base: + BUNDLE_LOADER: "$(TEST_HOST)" + TEST_HOST: "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop" + PRODUCT_BUNDLE_IDENTIFIER: "com.coder.Coder-DesktopTests" + dependencies: + - target: "Coder Desktop" + - target: CoderSDK + embed: false # Do not embed the framework. + - package: ViewInspector + - package: Mocker + + Coder DesktopUITests: + type: bundle.ui-testing + platform: macOS + sources: + - path: Coder DesktopUITests + settings: + base: + PRODUCT_BUNDLE_IDENTIFIER: "com.coder.Coder-DesktopUITests" + dependencies: + - target: Coder Desktop + + VPN: + type: system-extension + platform: macOS + sources: + - path: VPN + entitlements: + path: VPN/VPN.entitlements + properties: + com.apple.developer.networking.networkextension: + - packet-tunnel-provider + com.apple.security.app-sandbox: true + com.apple.security.application-groups: + - $(TeamIdentifierPrefix)com.coder.Coder-Desktop + com.apple.security.network.client: true + com.apple.security.network.server: true + settings: + base: + ENABLE_HARDENED_RUNTIME: YES + INFOPLIST_FILE: VPN/Info.plist + PRODUCT_BUNDLE_IDENTIFIER: "com.coder.Coder-Desktop.VPN" + PRODUCT_MODULE_NAME: "$(PRODUCT_NAME:c99extidentifier)" + PRODUCT_NAME: "$(PRODUCT_BUNDLE_IDENTIFIER)" + SWIFT_EMIT_LOC_STRINGS: YES + SWIFT_OBJC_BRIDGING_HEADER: "VPN/com_coder_Coder_Desktop_VPN-Bridging-Header.h" + dependencies: + - target: VPNLib + embed: true + - target: CoderSDK + embed: true + - sdk: NetworkExtension.framework + + VPNLib: + type: framework + platform: macOS + sources: + - path: VPNLib + settings: + base: + PRODUCT_NAME: "$(TARGET_NAME:c99extidentifier)" + SWIFT_EMIT_LOC_STRINGS: YES + PRODUCT_BUNDLE_IDENTIFIER: "com.coder.Coder-Desktop.VPNLib" + DYLIB_COMPATIBILITY_VERSION: 1 + DYLIB_CURRENT_VERSION: 1 + DYLIB_INSTALL_NAME_BASE: "@rpath" + CODE_SIGN_IDENTITY: "Apple Development" + CODE_SIGN_STYLE: Automatic + LD_RUNPATH_SEARCH_PATHS: + - "@executable_path/../Frameworks" + - "@loader_path/Frameworks" + scheme: + testTargets: + - VPNLibTests + dependencies: + - package: SwiftProtobuf + - package: SwiftProtobuf + product: SwiftProtobufPluginLibrary + - target: CoderSDK + embed: false + + VPNLibTests: + type: bundle.unit-test + platform: macOS + sources: + - path: VPNLibTests + settings: + base: + TEST_HOST: "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop" + PRODUCT_BUNDLE_IDENTIFIER: "com.coder.Coder-Desktop.VPNLibTests" + dependencies: + - target: Coder Desktop + - target: VPNLib + embed: false + - package: Mocker + + CoderSDK: + type: framework + platform: macOS + sources: + - path: CoderSDK + settings: + base: + INFOPLIST_KEY_NSHumanReadableCopyright: "" + PRODUCT_NAME: "$(TARGET_NAME:c99extidentifier)" + SWIFT_EMIT_LOC_STRINGS: YES + GENERATE_INFOPLIST_FILE: YES + DYLIB_COMPATIBILITY_VERSION: 1 + DYLIB_CURRENT_VERSION: 1 + DYLIB_INSTALL_NAME_BASE: "@rpath" + scheme: + testTargets: + - CoderSDKTests + dependencies: [] + + CoderSDKTests: + type: bundle.unit-test + platform: macOS + sources: + - path: CoderSDKTests + dependencies: + - target: "Coder Desktop" + - target: CoderSDK + embed: false # Do not embed the framework. + - package: Mocker + settings: + base: + TEST_HOST: "$(BUILT_PRODUCTS_DIR)/Coder Desktop.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Coder Desktop" + PRODUCT_BUNDLE_IDENTIFIER: com.coder.Coder-Desktop.CoderSDKTests diff --git a/Makefile b/Makefile index a428f06..e66eb59 100644 --- a/Makefile +++ b/Makefile @@ -6,31 +6,61 @@ LINTFLAGS := FMTFLAGS := endif -PROJECT := "Coder Desktop/Coder Desktop.xcodeproj" -SCHEME := "Coder Desktop" +PROJECT := Coder\ Desktop +XCPROJECT := Coder\ Desktop/Coder\ Desktop.xcodeproj +SCHEME := Coder\ Desktop +SWIFT_VERSION := 6.0 -fmt: +.PHONY: setup +setup: \ + $(XCPROJECT) \ + $(PROJECT)/VPNLib/vpn.pb.swift + +$(XCPROJECT): $(PROJECT)/project.yml + cd $(PROJECT); \ + SWIFT_VERSION=$(SWIFT_VERSION) xcodegen + +$(PROJECT)/VPNLib/vpn.pb.swift: $(PROJECT)/VPNLib/vpn.proto + protoc --swift_opt=Visibility=public --swift_out=. 'Coder Desktop/VPNLib/vpn.proto' + +.PHONY: fmt +fmt: ## Run Swift file formatter swiftformat \ --exclude '**.pb.swift' \ + --swiftversion $(SWIFT_VERSION) \ $(FMTFLAGS) . -test: +.PHONY: test +test: $(XCPROJECT) ## Run all tests set -o pipefail && xcodebuild test \ - -project $(PROJECT) \ + -project $(XCPROJECT) \ -scheme $(SCHEME) \ -testPlan $(SCHEME) \ -skipPackagePluginValidation \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGNING_ALLOWED=NO | xcbeautify -lint: +.PHONY: lint +lint: ## Lint swift files swiftlint \ --strict \ --quiet $(LINTFLAGS) -clean: +.PHONY: clean +clean: ## Clean Xcode project xcodebuild clean \ - -project $(PROJECT) + -project $(XCPROJECT) + rm -rf $(XCPROJECT) -proto: - protoc --swift_opt=Visibility=public --swift_out=. 'Coder Desktop/VPNLib/vpn.proto' +.PHONY: proto +proto: $(PROJECT)/VPNLib/vpn.pb.swift ## Generate Swift files from protobufs + +.PHONY: help +help: ## Show this help + @echo "Specify a command. The choices are:" + @grep -hE '^[0-9a-zA-Z_-]+:.*?## .*$$' ${MAKEFILE_LIST} | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[0;36m%-20s\033[m %s\n", $$1, $$2}' + @echo "" + +.PHONY: watch-gen +watch-gen: ## Generate Xcode project file and watch for changes + watchexec -w 'Coder Desktop/project.yml' make $(XCPROJECT) diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..5304bdf --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1737885589, + "narHash": "sha256-Zf0hSrtzaM1DEz8//+Xs51k/wdSajticVrATqDrfQjg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "852ff1d9e153d8875a83602e03fdef8a63f0ecf8", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..a83e4b3 --- /dev/null +++ b/flake.nix @@ -0,0 +1,49 @@ +{ + description = "Coder Desktop macOS"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = + { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachSystem + (with flake-utils.lib.system; [ + aarch64-darwin + x86_64-darwin + ]) + ( + system: + let + pkgs = import nixpkgs { + inherit system; + }; + + formatter = pkgs.nixfmt-rfc-style; + in + { + inherit formatter; + + devShells.default = pkgs.mkShellNoCC { + buildInputs = with pkgs; [ + apple-sdk_15 + clang + formatter + gnumake + protobuf_28 + protoc-gen-swift + swiftformat + swiftlint + watchexec + xcodegen + xcbeautify + ]; + }; + } + ); +}