Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,33 @@ on:
- main
pull_request:
branches:
- '*'
- "*"
workflow_dispatch:

jobs:
library:
name: macOS
strategy:
matrix:
xcode: ['26.2']
config: ['debug', 'release']
xcode: ["26.2"]
config: ["release"]
runs-on: macos-26
steps:
- uses: actions/checkout@v5
- name: Select Xcode ${{ matrix.xcode }}
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
- name: Build ${{ matrix.config }} without exports
run: swift build -c ${{ matrix.config }} -Xswiftc -D -Xswiftc EXCLUDE_EXPORTS
- name: Run ${{ matrix.config }} tests
run: swift test -c ${{ matrix.config }}

examples:
name: Examples
strategy:
matrix:
xcode: ['26.2']
config: ['debug']
scheme: ['Reminders', 'CaseStudies', 'SyncUps']
xcode: ["26.2"]
config: ["debug"]
scheme: ["Reminders", "CaseStudies", "SyncUps"]
runs-on: macos-26
continue-on-error: true
steps:
Expand Down
1 change: 1 addition & 0 deletions Examples/CaseStudies/DynamicQuery.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import GRDB
import SQLiteData
import SwiftUI

Expand Down
1 change: 1 addition & 0 deletions Examples/CaseStudies/TransactionDemo.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import GRDB
import SQLiteData
import SwiftUI

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion Examples/Reminders/RemindersApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ class RemindersSyncEngineDelegate: SyncEngineDelegate {
case .signIn:
break
case .signOut, .switchAccounts:
isDeleteLocalDataAlertPresented = true
await MainActor.run {
isDeleteLocalDataAlertPresented = true
}
@unknown default:
break
}
Expand Down
1 change: 1 addition & 0 deletions Examples/Reminders/SearchReminders.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import GRDB
import IssueReporting
import SQLiteData
import SwiftUI
Expand Down
1 change: 1 addition & 0 deletions Examples/Reminders/TagsForm.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import GRDB
import SQLiteData
import SwiftUI
import SwiftUINavigation
Expand Down
2 changes: 1 addition & 1 deletion Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 14 additions & 12 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -96,18 +96,20 @@ let package = Package(
swiftLanguageModes: [.v6]
)

let swiftSettings: [SwiftSetting] = [
.enableUpcomingFeature("MemberImportVisibility")
// .unsafeFlags([
// "-Xfrontend",
// "-warn-long-function-bodies=50",
// "-Xfrontend",
// "-warn-long-expression-type-checking=50",
// ])
]

for index in package.targets.indices {
package.targets[index].swiftSettings = swiftSettings
for target in package.targets {
target.swiftSettings = target.swiftSettings ?? []
target.swiftSettings?.append(contentsOf: [
.enableUpcomingFeature("ExistentialAny"),
.enableUpcomingFeature("ImmutableWeakCaptures"),
.enableUpcomingFeature("InferIsolatedConformances"),
.enableUpcomingFeature("InternalImportsByDefault"),
.enableUpcomingFeature("MemberImportVisibility"),
])
#if compiler(>=6.4)
target.swiftSettings?.append(contentsOf: [
.treatAllWarnings(as: .error)
])
#endif
}

#if !os(Windows)
Expand Down
26 changes: 14 additions & 12 deletions Package@swift-6.0.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,18 +70,20 @@ let package = Package(
swiftLanguageModes: [.v6]
)

let swiftSettings: [SwiftSetting] = [
.enableUpcomingFeature("MemberImportVisibility")
// .unsafeFlags([
// "-Xfrontend",
// "-warn-long-function-bodies=50",
// "-Xfrontend",
// "-warn-long-expression-type-checking=50",
// ])
]

for index in package.targets.indices {
package.targets[index].swiftSettings = swiftSettings
for target in package.targets {
target.swiftSettings = target.swiftSettings ?? []
target.swiftSettings?.append(contentsOf: [
.enableUpcomingFeature("ExistentialAny"),
.enableUpcomingFeature("ImmutableWeakCaptures"),
.enableUpcomingFeature("InferIsolatedConformances"),
.enableUpcomingFeature("InternalImportsByDefault"),
.enableUpcomingFeature("MemberImportVisibility"),
])
#if compiler(>=6.4)
target.swiftSettings?.append(contentsOf: [
.treatAllWarnings(as: .error)
])
#endif
}

#if !os(Windows)
Expand Down
6 changes: 4 additions & 2 deletions Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#if canImport(CloudKit)
import CloudKit
public import CloudKit
import CryptoKit
import StructuredQueriesCore
import Dependencies
import IssueReporting
public import StructuredQueriesCore

extension CKRecord {
public typealias _AllFieldsRepresentation = SQLiteData._AllFieldsRepresentation<CKRecord>
Expand Down
26 changes: 14 additions & 12 deletions Sources/SQLiteData/CloudKit/CloudKitSharing.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
#if canImport(CloudKit)
import CloudKit
import Dependencies
import SwiftUI
public import CloudKit
public import Dependencies
import GRDB
public import SwiftUI
public import StructuredQueries

#if canImport(UIKit)
import UIKit
public import UIKit
#endif

/// A shared record that can be used to present a ``CloudSharingView``.
Expand Down Expand Up @@ -118,7 +120,7 @@
)
}
let recordName = record.recordName
let lastKnownServerRecord = try await {
let lastKnownServerRecord = try await { [rawIdentifier = record.primaryKey.rawIdentifier] in
let lastKnownServerRecord =
try await metadatabase.read { db in
try SyncMetadata
Expand All @@ -130,7 +132,7 @@
else {
throw SharingError(
recordTableName: T.tableName,
recordPrimaryKey: record.primaryKey.rawIdentifier,
recordPrimaryKey: rawIdentifier,
reason: .recordMetadataNotFound,
debugDescription: """
No sync metadata found for record. Has the record been saved to the database \
Expand Down Expand Up @@ -262,15 +264,15 @@
public struct CloudSharingView: View {
let sharedRecord: SharedRecord
let availablePermissions: UICloudSharingController.PermissionOptions
let didFinish: (Result<Void, Error>) -> Void
let didFinish: (Result<Void, any Error>) -> Void
let didStopSharing: () -> Void
let syncEngine: SyncEngine
@Dependency(\.context) var context
@Environment(\.dismiss) var dismiss
public init(
sharedRecord: SharedRecord,
availablePermissions: UICloudSharingController.PermissionOptions = [],
didFinish: @escaping (Result<Void, Error>) -> Void = { _ in },
didFinish: @escaping (Result<Void, any Error>) -> Void = { _ in },
didStopSharing: @escaping () -> Void = {},
syncEngine: SyncEngine = {
@Dependency(\.defaultSyncEngine) var defaultSyncEngine
Expand Down Expand Up @@ -381,13 +383,13 @@
private struct CloudSharingViewRepresentable: UIViewControllerRepresentable {
let sharedRecord: SharedRecord
let availablePermissions: UICloudSharingController.PermissionOptions
let didFinish: (Result<Void, Error>) -> Void
let didFinish: (Result<Void, any Error>) -> Void
let didStopSharing: () -> Void
let syncEngine: SyncEngine
public init(
sharedRecord: SharedRecord,
availablePermissions: UICloudSharingController.PermissionOptions = [],
didFinish: @escaping (Result<Void, Error>) -> Void = { _ in },
didFinish: @escaping (Result<Void, any Error>) -> Void = { _ in },
didStopSharing: @escaping () -> Void = {},
syncEngine: SyncEngine = {
@Dependency(\.defaultSyncEngine) var defaultSyncEngine
Expand Down Expand Up @@ -430,12 +432,12 @@
@available(iOS 17, macOS 14, tvOS 17, *)
public final class _CloudSharingDelegate: NSObject, UICloudSharingControllerDelegate {
let share: CKShare
let didFinish: (Result<Void, Error>) -> Void
let didFinish: (Result<Void, any Error>) -> Void
let didStopSharing: () -> Void
let syncEngine: SyncEngine
init(
share: CKShare,
didFinish: @escaping (Result<Void, Error>) -> Void,
didFinish: @escaping (Result<Void, any Error>) -> Void,
didStopSharing: @escaping () -> Void,
syncEngine: SyncEngine
) {
Expand Down
3 changes: 2 additions & 1 deletion Sources/SQLiteData/CloudKit/DefaultSyncEngine.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#if canImport(CloudKit)
import CloudKit
import Dependencies
import GRDB
public import Dependencies

@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
extension DependencyValues {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import Foundation
public import Foundation

/// A type that can be represented by a string identifier.
///
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLiteData/CloudKit/Internal/CloudContainer.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#if canImport(CloudKit)
import CloudKit
public import CloudKit

@available(iOS 15, tvOS 15, macOS 12, watchOS 8, *)
package protocol CloudContainer<Database>: AnyObject, Equatable, Hashable, Sendable {
Expand Down
2 changes: 1 addition & 1 deletion Sources/SQLiteData/CloudKit/Internal/CloudDatabase.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#if canImport(CloudKit)
import CloudKit
public import CloudKit

package protocol CloudDatabase: AnyObject, Hashable, Sendable {
var databaseScope: CKDatabase.Scope { get }
Expand Down
2 changes: 2 additions & 0 deletions Sources/SQLiteData/CloudKit/Internal/CloudKitFunctions.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#if canImport(CloudKit)
import CloudKit
import Dependencies
import Foundation
import StructuredQueriesSQLite

@DatabaseFunction("sqlitedata_icloud_currentTime")
func currentTime() -> Int64 {
Expand Down
5 changes: 3 additions & 2 deletions Sources/SQLiteData/CloudKit/Internal/DataManager.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#if canImport(CloudKit) && canImport(CryptoKit)
package import ConcurrencyExtras
import CryptoKit
import Dependencies
import Foundation
package import Foundation

@available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)
package protocol DataManager: Sendable {
Expand Down Expand Up @@ -96,7 +97,7 @@

@available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)
extension DependencyValues {
package var dataManager: DataManager {
package var dataManager: any DataManager {
get { self[DataManagerKey.self] }
set { self[DataManagerKey.self] = newValue }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#if canImport(CloudKit) && canImport(UIKit)
import UIKit
import Dependencies
package import UIKit

private enum DefaultNotificationCenterKey: DependencyKey {
static let liveValue = NotificationCenter.default
Expand Down
3 changes: 2 additions & 1 deletion Sources/SQLiteData/CloudKit/Internal/ForeignKey.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#if canImport(CloudKit)
import Foundation
import StructuredQueriesCore
import StructuredQueries
public import StructuredQueriesCore

@Table
package struct ForeignKey {
Expand Down
3 changes: 3 additions & 0 deletions Sources/SQLiteData/CloudKit/Internal/Metadatabase.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#if canImport(CloudKit)
import Dependencies
import GRDB
import Foundation
import os
import StructuredQueries

@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
func defaultMetadatabase(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#if canImport(CloudKit)
import CloudKit
package import ConcurrencyExtras
package import CloudKit
import Dependencies

@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
package final class MockCloudContainer: CloudContainer {
Expand Down
4 changes: 3 additions & 1 deletion Sources/SQLiteData/CloudKit/Internal/MockCloudDatabase.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#if canImport(CloudKit)
import CloudKit
package import ConcurrencyExtras
package import CloudKit
import Dependencies
import IssueReporting

@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
Expand Down
5 changes: 3 additions & 2 deletions Sources/SQLiteData/CloudKit/Internal/MockSyncEngine.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#if canImport(CloudKit)
import CloudKit
package import ConcurrencyExtras
package import CloudKit
import IssueReporting
import OrderedCollections
package import OrderedCollections

@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
package final class MockSyncEngine: SyncEngineProtocol {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#if canImport(CloudKit)
import CloudKit
package import CloudKit
import StructuredQueries
public import StructuredQueriesCore

@Table("sqlitedata_icloud_pendingRecordZoneChanges")
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
Expand Down
3 changes: 3 additions & 0 deletions Sources/SQLiteData/CloudKit/Internal/Pragmas.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#if canImport(CloudKit)
import StructuredQueries
public import StructuredQueriesCore

@Table
struct PragmaDatabaseList {
static var tableAlias: String? { "databases" }
Expand Down
Loading