From 7caa8dc8e11f011f02a2f8b35b74b5fac403bf8a Mon Sep 17 00:00:00 2001 From: jsbonin Date: Fri, 3 Jul 2026 12:25:18 -0400 Subject: [PATCH 1/2] wip --- .../base/AttributedString+Extensions.swift | 2 +- components/ios/base/PilotAccessibility.swift | 2 +- components/ios/base/PilotButtonView.swift | 2 +- components/ios/base/PilotImageProvider.swift | 2 +- components/ios/base/PilotLocalImage.swift | 2 +- components/ios/base/PilotPickerView.swift | 2 +- components/ios/base/PilotRichTextView.swift | 2 +- components/ios/base/PilotSwitchView.swift | 2 +- components/ios/base/PilotTextFieldView.swift | 2 +- .../ios/base/PilotTextStyleProvider.swift | 2 +- components/ios/base/PilotTextView.swift | 2 +- .../PilotKeyboardAutoCapitalization.swift | 2 +- .../Types/PilotKeyboardReturnKeyType.swift | 2 +- .../ios/base/Types/PilotKeyboardType.swift | 2 +- .../ios/base/Types/PilotTextContentType.swift | 2 +- .../base/Types/PilotTextObfuscationMode.swift | 2 +- .../ios/kingfisher/PilotRemoteImageView.swift | 2 +- .../build.gradle.kts | 31 +++++++ .../PilotSwiftExtensionsExtension.kt | 13 +++ .../PilotSwiftExtensionsPlugin.kt | 19 +++++ .../SyncSwiftExtensionsTask.kt | 81 +++++++++++++++++++ settings.gradle.kts | 1 + viewmodel/ios/NullableStateObservable.swift | 2 +- viewmodel/ios/StateObservable.swift | 2 +- viewmodel/ios/ViewModelLifecycleHandler.swift | 2 +- 25 files changed, 165 insertions(+), 20 deletions(-) create mode 100644 pilot-swift-extensions-plugin/build.gradle.kts create mode 100644 pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsExtension.kt create mode 100644 pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsPlugin.kt create mode 100644 pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/SyncSwiftExtensionsTask.kt diff --git a/components/ios/base/AttributedString+Extensions.swift b/components/ios/base/AttributedString+Extensions.swift index 43290a61..6df77146 100644 --- a/components/ios/base/AttributedString+Extensions.swift +++ b/components/ios/base/AttributedString+Extensions.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension AttributedString { diff --git a/components/ios/base/PilotAccessibility.swift b/components/ios/base/PilotAccessibility.swift index 5372dc1a..f4953c43 100644 --- a/components/ios/base/PilotAccessibility.swift +++ b/components/ios/base/PilotAccessibility.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension View { diff --git a/components/ios/base/PilotButtonView.swift b/components/ios/base/PilotButtonView.swift index 19dc782d..884aca6a 100644 --- a/components/ios/base/PilotButtonView.swift +++ b/components/ios/base/PilotButtonView.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotButtonView: View where Content: AnyObject, Label: View { diff --git a/components/ios/base/PilotImageProvider.swift b/components/ios/base/PilotImageProvider.swift index ff224794..0cb35492 100644 --- a/components/ios/base/PilotImageProvider.swift +++ b/components/ios/base/PilotImageProvider.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public protocol PilotImageProvider { diff --git a/components/ios/base/PilotLocalImage.swift b/components/ios/base/PilotLocalImage.swift index ed85ef33..4bb21b1e 100644 --- a/components/ios/base/PilotLocalImage.swift +++ b/components/ios/base/PilotLocalImage.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotLocalImage: View { diff --git a/components/ios/base/PilotPickerView.swift b/components/ios/base/PilotPickerView.swift index 3f9e3d3d..fcb66b2d 100644 --- a/components/ios/base/PilotPickerView.swift +++ b/components/ios/base/PilotPickerView.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotPickerView: View where Label: AnyObject, LabelView: View, Item: AnyObject, ItemView: View { diff --git a/components/ios/base/PilotRichTextView.swift b/components/ios/base/PilotRichTextView.swift index d37aaa67..71d1523a 100644 --- a/components/ios/base/PilotRichTextView.swift +++ b/components/ios/base/PilotRichTextView.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotRichTextView: View { diff --git a/components/ios/base/PilotSwitchView.swift b/components/ios/base/PilotSwitchView.swift index 8e9bed54..46b46fd1 100644 --- a/components/ios/base/PilotSwitchView.swift +++ b/components/ios/base/PilotSwitchView.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotSwitchView: View where Content: AnyObject, Label: View { diff --git a/components/ios/base/PilotTextFieldView.swift b/components/ios/base/PilotTextFieldView.swift index 392057b7..a3b85004 100644 --- a/components/ios/base/PilotTextFieldView.swift +++ b/components/ios/base/PilotTextFieldView.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotTextFieldView: View { diff --git a/components/ios/base/PilotTextStyleProvider.swift b/components/ios/base/PilotTextStyleProvider.swift index 8031603f..ac82a907 100644 --- a/components/ios/base/PilotTextStyleProvider.swift +++ b/components/ios/base/PilotTextStyleProvider.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public typealias PilotSpanStyle = [NSAttributedString.Key: Any] diff --git a/components/ios/base/PilotTextView.swift b/components/ios/base/PilotTextView.swift index 84d5830c..718c2aaf 100644 --- a/components/ios/base/PilotTextView.swift +++ b/components/ios/base/PilotTextView.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotTextView: View { diff --git a/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift b/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift index dbecd3ec..2f1bb3df 100644 --- a/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift +++ b/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension PilotKeyboardAutoCapitalization { diff --git a/components/ios/base/Types/PilotKeyboardReturnKeyType.swift b/components/ios/base/Types/PilotKeyboardReturnKeyType.swift index b90b71bc..8cc0eff7 100644 --- a/components/ios/base/Types/PilotKeyboardReturnKeyType.swift +++ b/components/ios/base/Types/PilotKeyboardReturnKeyType.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension PilotKeyboardReturnKeyType { diff --git a/components/ios/base/Types/PilotKeyboardType.swift b/components/ios/base/Types/PilotKeyboardType.swift index 782b6dba..90dc54f0 100644 --- a/components/ios/base/Types/PilotKeyboardType.swift +++ b/components/ios/base/Types/PilotKeyboardType.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension PilotKeyboardType { diff --git a/components/ios/base/Types/PilotTextContentType.swift b/components/ios/base/Types/PilotTextContentType.swift index 7e59fd82..e1ac41b0 100644 --- a/components/ios/base/Types/PilotTextContentType.swift +++ b/components/ios/base/Types/PilotTextContentType.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension PilotTextContentType { diff --git a/components/ios/base/Types/PilotTextObfuscationMode.swift b/components/ios/base/Types/PilotTextObfuscationMode.swift index 05519a1a..9cf821bd 100644 --- a/components/ios/base/Types/PilotTextObfuscationMode.swift +++ b/components/ios/base/Types/PilotTextObfuscationMode.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI extension PilotTextObfuscationMode: Equatable { diff --git a/components/ios/kingfisher/PilotRemoteImageView.swift b/components/ios/kingfisher/PilotRemoteImageView.swift index 1793d5ee..cc66042d 100644 --- a/components/ios/kingfisher/PilotRemoteImageView.swift +++ b/components/ios/kingfisher/PilotRemoteImageView.swift @@ -1,5 +1,5 @@ import Kingfisher -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public struct PilotRemoteImageView: View { diff --git a/pilot-swift-extensions-plugin/build.gradle.kts b/pilot-swift-extensions-plugin/build.gradle.kts new file mode 100644 index 00000000..e45869f6 --- /dev/null +++ b/pilot-swift-extensions-plugin/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + `kotlin-dsl` + `java-gradle-plugin` + id("mirego.publish") +} + +group = "com.mirego.pilot" + +gradlePlugin { + plugins { + create("pilotSwiftExtensions") { + id = "com.mirego.pilot.swift-extensions" + implementationClass = "com.mirego.pilot.swiftextensions.PilotSwiftExtensionsPlugin" + } + } +} + +tasks.named("processResources") { + from(rootProject.file("viewmodel/ios")) { + include("*.swift") + into("swift-extensions/viewmodel") + } + from(rootProject.file("components/ios/base")) { + include("**/*.swift") + into("swift-extensions/components") + } + from(rootProject.file("components/ios/kingfisher")) { + include("*.swift") + into("swift-extensions/components-kingfisher") + } +} diff --git a/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsExtension.kt b/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsExtension.kt new file mode 100644 index 00000000..54356573 --- /dev/null +++ b/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsExtension.kt @@ -0,0 +1,13 @@ +package com.mirego.pilot.swiftextensions + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property +import javax.inject.Inject + +abstract class PilotSwiftExtensionsExtension @Inject constructor(objects: ObjectFactory) { + val frameworkName: Property = objects.property(String::class.java) + val outputDir: DirectoryProperty = objects.directoryProperty() + val modules: ListProperty = objects.listProperty(String::class.java).convention(emptyList()) +} diff --git a/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsPlugin.kt b/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsPlugin.kt new file mode 100644 index 00000000..dd9443dd --- /dev/null +++ b/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/PilotSwiftExtensionsPlugin.kt @@ -0,0 +1,19 @@ +package com.mirego.pilot.swiftextensions + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class PilotSwiftExtensionsPlugin : Plugin { + override fun apply(project: Project) { + val extension = project.extensions.create( + "pilotSwiftExtensions", + PilotSwiftExtensionsExtension::class.java, + ) + + project.tasks.register("syncPilotSwiftExtensions", SyncSwiftExtensionsTask::class.java) { + frameworkName.set(extension.frameworkName) + modules.set(extension.modules) + outputDir.set(extension.outputDir) + } + } +} diff --git a/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/SyncSwiftExtensionsTask.kt b/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/SyncSwiftExtensionsTask.kt new file mode 100644 index 00000000..91fd2dd3 --- /dev/null +++ b/pilot-swift-extensions-plugin/src/main/kotlin/com/mirego/pilot/swiftextensions/SyncSwiftExtensionsTask.kt @@ -0,0 +1,81 @@ +package com.mirego.pilot.swiftextensions + +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.CacheableTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction +import java.io.File +import java.util.jar.JarFile + +@CacheableTask +abstract class SyncSwiftExtensionsTask : DefaultTask() { + + @get:Input + abstract val frameworkName: Property + + @get:Input + abstract val modules: ListProperty + + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @TaskAction + fun sync() { + val framework = frameworkName.get() + val requestedModules = modules.get().toSet() + val outDir = outputDir.get().asFile + + cleanOutputDirectory(outDir) + + val jarFile = JarFile(File(javaClass.protectionDomain.codeSource.location.toURI())) + var totalFiles = 0 + + jarFile.use { jar -> + for (entry in jar.entries()) { + if (!entry.name.startsWith(RESOURCES_PREFIX) || !entry.name.endsWith(".swift")) continue + + val relative = entry.name.removePrefix(RESOURCES_PREFIX) + val slash = relative.indexOf('/') + if (slash == -1) continue + + val moduleKey = relative.substring(0, slash) + val relativePath = relative.substring(slash + 1) + + // Skip modules the consumer didn't ask for (empty = sync all) + if (requestedModules.isNotEmpty() && moduleKey !in requestedModules) continue + + val content = jar.getInputStream(entry).bufferedReader().readText() + val processed = content.replace(FRAMEWORK_PLACEHOLDER, framework) + + val moduleOutDir = File(outDir, moduleKey) + val outFile = File(moduleOutDir, relativePath) + outFile.parentFile?.mkdirs() + outFile.writeText(processed) + totalFiles++ + } + } + + logger.lifecycle("Synced $totalFiles Swift files") + } + + private fun cleanOutputDirectory(outDir: File) { + if (!outDir.exists()) return + + outDir.walkTopDown() + .filter { it.isFile && it.extension == "swift" } + .forEach { it.delete() } + + outDir.walkBottomUp() + .filter { it.isDirectory && it != outDir && it.listFiles().isNullOrEmpty() } + .forEach { it.delete() } + } + + companion object { + private const val FRAMEWORK_PLACEHOLDER = "PILOT_FRAMEWORK_NAME" + private const val RESOURCES_PREFIX = "swift-extensions/" + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index cf21bc92..0944ae28 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,6 +24,7 @@ include( ":components-coil", ":components-coil3", ":components-material3", + ":pilot-swift-extensions-plugin", ) project(":navigation").projectDir = File("navigation/common") diff --git a/viewmodel/ios/NullableStateObservable.swift b/viewmodel/ios/NullableStateObservable.swift index 437cb213..b508a9e7 100644 --- a/viewmodel/ios/NullableStateObservable.swift +++ b/viewmodel/ios/NullableStateObservable.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public class NullableStateObservable: ObservableObject { diff --git a/viewmodel/ios/StateObservable.swift b/viewmodel/ios/StateObservable.swift index fede1eba..cd94cadb 100644 --- a/viewmodel/ios/StateObservable.swift +++ b/viewmodel/ios/StateObservable.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public class StateObservable: ObservableObject { diff --git a/viewmodel/ios/ViewModelLifecycleHandler.swift b/viewmodel/ios/ViewModelLifecycleHandler.swift index 83936867..8571c451 100644 --- a/viewmodel/ios/ViewModelLifecycleHandler.swift +++ b/viewmodel/ios/ViewModelLifecycleHandler.swift @@ -1,4 +1,4 @@ -import Shared +import PILOT_FRAMEWORK_NAME import SwiftUI public class ViewModelLifecycleHandler: ObservableObject { From 88de8055316061220a503af3fdf5c9e2719a9fd5 Mon Sep 17 00:00:00 2001 From: jsbonin Date: Fri, 3 Jul 2026 12:38:19 -0400 Subject: [PATCH 2/2] wip --- components/ios/base/AttributedString+Extensions.swift | 2 +- components/ios/base/PilotAccessibility.swift | 2 +- components/ios/base/PilotButtonView.swift | 2 +- components/ios/base/PilotImageProvider.swift | 2 +- components/ios/base/PilotLocalImage.swift | 2 +- components/ios/base/PilotPickerView.swift | 2 +- components/ios/base/PilotRichTextView.swift | 2 +- components/ios/base/PilotSwitchView.swift | 2 +- components/ios/base/PilotTextFieldView.swift | 2 +- components/ios/base/PilotTextStyleProvider.swift | 2 +- components/ios/base/PilotTextView.swift | 2 +- .../base/Types/PilotKeyboardAutoCapitalization.swift | 2 +- .../ios/base/Types/PilotKeyboardReturnKeyType.swift | 2 +- components/ios/base/Types/PilotKeyboardType.swift | 2 +- components/ios/base/Types/PilotTextContentType.swift | 2 +- .../ios/base/Types/PilotTextObfuscationMode.swift | 2 +- components/ios/kingfisher/PilotRemoteImageView.swift | 2 +- pilot-swift-extensions-plugin/build.gradle.kts | 11 +++++++++++ viewmodel/ios/NullableStateObservable.swift | 2 +- viewmodel/ios/StateObservable.swift | 2 +- viewmodel/ios/ViewModelLifecycleHandler.swift | 2 +- 21 files changed, 31 insertions(+), 20 deletions(-) diff --git a/components/ios/base/AttributedString+Extensions.swift b/components/ios/base/AttributedString+Extensions.swift index 6df77146..43290a61 100644 --- a/components/ios/base/AttributedString+Extensions.swift +++ b/components/ios/base/AttributedString+Extensions.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension AttributedString { diff --git a/components/ios/base/PilotAccessibility.swift b/components/ios/base/PilotAccessibility.swift index f4953c43..5372dc1a 100644 --- a/components/ios/base/PilotAccessibility.swift +++ b/components/ios/base/PilotAccessibility.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension View { diff --git a/components/ios/base/PilotButtonView.swift b/components/ios/base/PilotButtonView.swift index 884aca6a..19dc782d 100644 --- a/components/ios/base/PilotButtonView.swift +++ b/components/ios/base/PilotButtonView.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotButtonView: View where Content: AnyObject, Label: View { diff --git a/components/ios/base/PilotImageProvider.swift b/components/ios/base/PilotImageProvider.swift index 0cb35492..ff224794 100644 --- a/components/ios/base/PilotImageProvider.swift +++ b/components/ios/base/PilotImageProvider.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public protocol PilotImageProvider { diff --git a/components/ios/base/PilotLocalImage.swift b/components/ios/base/PilotLocalImage.swift index 4bb21b1e..ed85ef33 100644 --- a/components/ios/base/PilotLocalImage.swift +++ b/components/ios/base/PilotLocalImage.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotLocalImage: View { diff --git a/components/ios/base/PilotPickerView.swift b/components/ios/base/PilotPickerView.swift index fcb66b2d..3f9e3d3d 100644 --- a/components/ios/base/PilotPickerView.swift +++ b/components/ios/base/PilotPickerView.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotPickerView: View where Label: AnyObject, LabelView: View, Item: AnyObject, ItemView: View { diff --git a/components/ios/base/PilotRichTextView.swift b/components/ios/base/PilotRichTextView.swift index 71d1523a..d37aaa67 100644 --- a/components/ios/base/PilotRichTextView.swift +++ b/components/ios/base/PilotRichTextView.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotRichTextView: View { diff --git a/components/ios/base/PilotSwitchView.swift b/components/ios/base/PilotSwitchView.swift index 46b46fd1..8e9bed54 100644 --- a/components/ios/base/PilotSwitchView.swift +++ b/components/ios/base/PilotSwitchView.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotSwitchView: View where Content: AnyObject, Label: View { diff --git a/components/ios/base/PilotTextFieldView.swift b/components/ios/base/PilotTextFieldView.swift index a3b85004..392057b7 100644 --- a/components/ios/base/PilotTextFieldView.swift +++ b/components/ios/base/PilotTextFieldView.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotTextFieldView: View { diff --git a/components/ios/base/PilotTextStyleProvider.swift b/components/ios/base/PilotTextStyleProvider.swift index ac82a907..8031603f 100644 --- a/components/ios/base/PilotTextStyleProvider.swift +++ b/components/ios/base/PilotTextStyleProvider.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public typealias PilotSpanStyle = [NSAttributedString.Key: Any] diff --git a/components/ios/base/PilotTextView.swift b/components/ios/base/PilotTextView.swift index 718c2aaf..84d5830c 100644 --- a/components/ios/base/PilotTextView.swift +++ b/components/ios/base/PilotTextView.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotTextView: View { diff --git a/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift b/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift index 2f1bb3df..dbecd3ec 100644 --- a/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift +++ b/components/ios/base/Types/PilotKeyboardAutoCapitalization.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension PilotKeyboardAutoCapitalization { diff --git a/components/ios/base/Types/PilotKeyboardReturnKeyType.swift b/components/ios/base/Types/PilotKeyboardReturnKeyType.swift index 8cc0eff7..b90b71bc 100644 --- a/components/ios/base/Types/PilotKeyboardReturnKeyType.swift +++ b/components/ios/base/Types/PilotKeyboardReturnKeyType.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension PilotKeyboardReturnKeyType { diff --git a/components/ios/base/Types/PilotKeyboardType.swift b/components/ios/base/Types/PilotKeyboardType.swift index 90dc54f0..782b6dba 100644 --- a/components/ios/base/Types/PilotKeyboardType.swift +++ b/components/ios/base/Types/PilotKeyboardType.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension PilotKeyboardType { diff --git a/components/ios/base/Types/PilotTextContentType.swift b/components/ios/base/Types/PilotTextContentType.swift index e1ac41b0..7e59fd82 100644 --- a/components/ios/base/Types/PilotTextContentType.swift +++ b/components/ios/base/Types/PilotTextContentType.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension PilotTextContentType { diff --git a/components/ios/base/Types/PilotTextObfuscationMode.swift b/components/ios/base/Types/PilotTextObfuscationMode.swift index 9cf821bd..05519a1a 100644 --- a/components/ios/base/Types/PilotTextObfuscationMode.swift +++ b/components/ios/base/Types/PilotTextObfuscationMode.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI extension PilotTextObfuscationMode: Equatable { diff --git a/components/ios/kingfisher/PilotRemoteImageView.swift b/components/ios/kingfisher/PilotRemoteImageView.swift index cc66042d..1793d5ee 100644 --- a/components/ios/kingfisher/PilotRemoteImageView.swift +++ b/components/ios/kingfisher/PilotRemoteImageView.swift @@ -1,5 +1,5 @@ import Kingfisher -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public struct PilotRemoteImageView: View { diff --git a/pilot-swift-extensions-plugin/build.gradle.kts b/pilot-swift-extensions-plugin/build.gradle.kts index e45869f6..8ca6848a 100644 --- a/pilot-swift-extensions-plugin/build.gradle.kts +++ b/pilot-swift-extensions-plugin/build.gradle.kts @@ -15,17 +15,28 @@ gradlePlugin { } } +// The checked-in Swift sources use a literal `import Shared` — Pilot.podspec's CocoaPods +// consumers read these files as-is and need that to stay valid Swift. The +// PILOT_FRAMEWORK_NAME placeholder substitution below is applied only while packaging +// this plugin's own resources, not to the source files themselves. +fun CopySpec.substituteFrameworkImport() { + filter { line -> if (line == "import Shared") "import PILOT_FRAMEWORK_NAME" else line } +} + tasks.named("processResources") { from(rootProject.file("viewmodel/ios")) { include("*.swift") into("swift-extensions/viewmodel") + substituteFrameworkImport() } from(rootProject.file("components/ios/base")) { include("**/*.swift") into("swift-extensions/components") + substituteFrameworkImport() } from(rootProject.file("components/ios/kingfisher")) { include("*.swift") into("swift-extensions/components-kingfisher") + substituteFrameworkImport() } } diff --git a/viewmodel/ios/NullableStateObservable.swift b/viewmodel/ios/NullableStateObservable.swift index b508a9e7..437cb213 100644 --- a/viewmodel/ios/NullableStateObservable.swift +++ b/viewmodel/ios/NullableStateObservable.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public class NullableStateObservable: ObservableObject { diff --git a/viewmodel/ios/StateObservable.swift b/viewmodel/ios/StateObservable.swift index cd94cadb..fede1eba 100644 --- a/viewmodel/ios/StateObservable.swift +++ b/viewmodel/ios/StateObservable.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public class StateObservable: ObservableObject { diff --git a/viewmodel/ios/ViewModelLifecycleHandler.swift b/viewmodel/ios/ViewModelLifecycleHandler.swift index 8571c451..83936867 100644 --- a/viewmodel/ios/ViewModelLifecycleHandler.swift +++ b/viewmodel/ios/ViewModelLifecycleHandler.swift @@ -1,4 +1,4 @@ -import PILOT_FRAMEWORK_NAME +import Shared import SwiftUI public class ViewModelLifecycleHandler: ObservableObject {