diff --git a/packages/core/Package.swift b/packages/core/Package.swift new file mode 100644 index 000000000..7250c59da --- /dev/null +++ b/packages/core/Package.swift @@ -0,0 +1,61 @@ +// swift-tools-version: 6.0 + +import Foundation +import PackageDescription + +let reactHeaders: [Target.Dependency] = [ + .product(name: "ReactHeaders", package: "ReactNative"), + .product(name: "ReactNativeHeaders", package: "ReactNative"), + .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), + .product(name: "ReactAppHeaders", package: "React-GeneratedCode"), +] + +let usedRootEntries: Set = ["ios", "spm-support", "spm-headers", "Package.swift"] +let unusedRootEntries = try! FileManager.default.contentsOfDirectory(atPath: Context.packageDirectory) + .filter { !usedRootEntries.contains($0) } + .sorted() + +let package = Package( + name: "segment_analytics_react_native", + platforms: [.iOS("15.1")], + products: [ + .library(name: "segment_analytics_react_native", targets: ["segment_analytics_react_native", "SegmentAnalyticsObjC"]), + ], + dependencies: [ + .package(name: "ReactNative", path: "../../../../xcframeworks"), + .package(name: "React-GeneratedCode", path: "../../../ios"), + .package(name: "sovran_react_native", path: "../sovran_react_native"), + ], + targets: [ + .target( + name: "segment_analytics_react_native", + dependencies: [.product(name: "sovran_react_native", package: "sovran_react_native")] + reactHeaders, + path: ".", + exclude: unusedRootEntries + [ + "spm-headers", + "ios/AnalyticsReactNative.m", + "ios/AnalyticsReactNative-Bridging-Header.h", + "ios/AnalyticsReactNative.xcodeproj", + ], + sources: ["ios/AnalyticsReactNative.swift", "spm-support"], + resources: [.process("ios/PrivacyInfo.xcprivacy")] + ), + .target( + name: "SegmentAnalyticsObjC", + dependencies: [.target(name: "segment_analytics_react_native")] + reactHeaders, + path: ".", + exclude: unusedRootEntries + [ + "spm-support", + "ios/AnalyticsReactNative.swift", + "ios/AnalyticsReactNative-Bridging-Header.h", + "ios/AnalyticsReactNative.xcodeproj", + "ios/PrivacyInfo.xcprivacy", + ], + sources: ["ios/AnalyticsReactNative.m"], + publicHeadersPath: "spm-headers/public", + cSettings: [.define("RCT_NEW_ARCH_ENABLED", to: "1")], + cxxSettings: [.define("RCT_NEW_ARCH_ENABLED", to: "1")] + ), + ], + swiftLanguageModes: [.v5] +) diff --git a/packages/core/package.json b/packages/core/package.json index f2b531527..abcaa6cd1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -25,6 +25,9 @@ "react-native": "src/index", "types": "lib/typescript/src/index.d.ts", "files": [ + "Package.swift", + "spm-headers", + "spm-support", "src", "lib", "android", @@ -84,5 +87,11 @@ "module", "typescript" ] + }, + "swiftpmConfig": { + "name": "segment_analytics_react_native", + "dependencies": [ + "@segment/sovran-react-native" + ] } } diff --git a/packages/core/spm-headers/public/module.modulemap b/packages/core/spm-headers/public/module.modulemap new file mode 100644 index 000000000..375d96882 --- /dev/null +++ b/packages/core/spm-headers/public/module.modulemap @@ -0,0 +1,2 @@ +// Public module for the SegmentAnalyticsObjC adapter; no Objective-C headers are public. +module SegmentAnalyticsObjC { export * } diff --git a/packages/core/spm-support/React.swift b/packages/core/spm-support/React.swift new file mode 100644 index 000000000..29ad64865 --- /dev/null +++ b/packages/core/spm-support/React.swift @@ -0,0 +1 @@ +@_exported import React diff --git a/packages/sovran/Package.swift b/packages/sovran/Package.swift new file mode 100644 index 000000000..bfc6f9822 --- /dev/null +++ b/packages/sovran/Package.swift @@ -0,0 +1,48 @@ +// swift-tools-version: 6.0 + +import Foundation +import PackageDescription + +let reactHeaders: [Target.Dependency] = [ + .product(name: "ReactHeaders", package: "ReactNative"), + .product(name: "ReactNativeHeaders", package: "ReactNative"), + .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), + .product(name: "ReactAppHeaders", package: "React-GeneratedCode"), +] + +let usedRootEntries: Set = ["ios", "spm-headers", "Package.swift"] +let unusedRootEntries = try! FileManager.default.contentsOfDirectory(atPath: Context.packageDirectory) + .filter { !usedRootEntries.contains($0) } + .sorted() + +let package = Package( + name: "sovran_react_native", + platforms: [.iOS("15.1")], + products: [ + .library(name: "sovran_react_native", targets: ["sovran_react_native", "SovranObjC"]), + ], + dependencies: [ + .package(name: "ReactNative", path: "../../../../xcframeworks"), + .package(name: "React-GeneratedCode", path: "../../../ios"), + ], + targets: [ + .target( + name: "sovran_react_native", + dependencies: reactHeaders, + path: "ios", + exclude: ["Sovran.m", "Sovran-Bridging-Header.h", "Sovran.xcodeproj"], + sources: ["Sovran.swift"] + ), + .target( + name: "SovranObjC", + dependencies: [.target(name: "sovran_react_native")] + reactHeaders, + path: ".", + exclude: unusedRootEntries + ["ios/Sovran.swift", "ios/Sovran-Bridging-Header.h", "ios/Sovran.xcodeproj"], + sources: ["ios/Sovran.m"], + publicHeadersPath: "spm-headers/public", + cSettings: [.define("RCT_NEW_ARCH_ENABLED", to: "1")], + cxxSettings: [.define("RCT_NEW_ARCH_ENABLED", to: "1")] + ), + ], + swiftLanguageModes: [.v5] +) diff --git a/packages/sovran/package.json b/packages/sovran/package.json index c4ef0af67..64a6cf15a 100644 --- a/packages/sovran/package.json +++ b/packages/sovran/package.json @@ -8,6 +8,8 @@ "react-native": "src/index", "source": "src/index", "files": [ + "Package.swift", + "spm-headers", "src", "lib", "android", @@ -86,5 +88,8 @@ }, "resolutions": { "ansi-regex": "5.0.1" + }, + "swiftpmConfig": { + "name": "sovran_react_native" } } diff --git a/packages/sovran/spm-headers/public/module.modulemap b/packages/sovran/spm-headers/public/module.modulemap new file mode 100644 index 000000000..15222c92f --- /dev/null +++ b/packages/sovran/spm-headers/public/module.modulemap @@ -0,0 +1,2 @@ +// Public module for the SovranObjC adapter; no Objective-C headers are public. +module SovranObjC { export * }