Skip to content

Commit f34d5a2

Browse files
committed
feat(android): add codeConnectPackageName support for AndroidIconsEntry
1 parent 22da553 commit f34d5a2

9 files changed

Lines changed: 80 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [Unreleased]
6+
7+
### Features
8+
9+
- **android**: Add `codeConnectPackageName` to decouple Code Connect from Compose Extension generation
10+
511
## [2.7.0] - 2026-02-28
612

713
### Features

CONFIG.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -636,23 +636,25 @@ icons = new Android.IconsEntry {
636636
composePackageName = "com.example"
637637
// composeFormat = "resourceReference"
638638
// composeExtensionTarget = "com.example.app.ui.AppIcons"
639+
// codeConnectPackageName = "com.example"
639640
// codeConnectKotlin = "./main/src/java/com/example/Icons.figma.kt"
640641
// nameStyle = "snake_case"
641642
// pathPrecision = 4
642643
// strictPathValidation = false
643644
}
644645
```
645646

646-
| Field | Type | Required | Description |
647-
| ------------------------ | -------------------- | -------- | ----------------------------------------------------------- |
648-
| `output` | `String` | Yes | Output directory for vector drawables (relative to mainRes) |
649-
| `composePackageName` | `String?` | No | Package for Compose icon code |
650-
| `composeFormat` | `ComposeIconFormat?` | No | `"resourceReference"` (default) or `"imageVector"` |
651-
| `composeExtensionTarget` | `String?` | No | Extension target for ImageVector |
652-
| `nameStyle` | `NameStyle?` | No | Name style for generated names |
653-
| `pathPrecision` | `Int(1-6)?` | No | Coordinate precision for pathData (default: 4) |
654-
| `strictPathValidation` | `Boolean?` | No | Error on pathData > 32,767 bytes (default: false) |
655-
| `codeConnectKotlin` | `String?` | No | Path to generate Figma Code Connect Kotlin file |
647+
| Field | Type | Required | Description |
648+
| ------------------------ | -------------------- | -------- | ------------------------------------------------------------------ |
649+
| `output` | `String` | Yes | Output directory for vector drawables (relative to mainRes) |
650+
| `composePackageName` | `String?` | No | Package for Compose icon code (also used as Code Connect fallback) |
651+
| `composeFormat` | `ComposeIconFormat?` | No | `"resourceReference"` (default) or `"imageVector"` |
652+
| `composeExtensionTarget` | `String?` | No | Extension target for ImageVector |
653+
| `nameStyle` | `NameStyle?` | No | Name style for generated names |
654+
| `pathPrecision` | `Int(1-6)?` | No | Coordinate precision for pathData (default: 4) |
655+
| `strictPathValidation` | `Boolean?` | No | Error on pathData > 32,767 bytes (default: false) |
656+
| `codeConnectPackageName` | `String?` | No | Package for Code Connect only (overrides `composePackageName`) |
657+
| `codeConnectKotlin` | `String?` | No | Path to generate Figma Code Connect Kotlin file |
656658

657659
**Inherited from `FrameSource`:** `figmaFrameName`, `figmaPageName`, `figmaFileId`, `rtlProperty`, `nameValidateRegexp`, `nameReplaceRegexp`.
658660

Sources/ExFig-Android/Config/AndroidIconsEntry.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public extension Android.IconsEntry {
3333
return nameStyle.coreNameStyle
3434
}
3535

36+
/// Effective package name for Code Connect: prefers `codeConnectPackageName`, falls back to `composePackageName`.
37+
var effectiveCodeConnectPackageName: String? {
38+
codeConnectPackageName ?? composePackageName
39+
}
40+
3641
/// URL for Code Connect Kotlin file output.
3742
var codeConnectKotlinURL: URL? {
3843
codeConnectKotlin.map { URL(fileURLWithPath: $0) }

Sources/ExFig-Android/Export/AndroidIconsExporter.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ private extension AndroidIconsExporter {
172172
context: some IconsExportContext
173173
) throws -> FileContents? {
174174
guard let url = entry.codeConnectKotlinURL else { return nil }
175-
guard let packageName = entry.composePackageName else {
176-
context.warning("Code Connect skipped: 'composePackageName' is required")
175+
guard let packageName = entry.effectiveCodeConnectPackageName else {
176+
context.warning("Code Connect skipped: 'codeConnectPackageName' or 'composePackageName' is required")
177177
return nil
178178
}
179179
guard let resourcePackage = platformConfig.resourcePackage else {

Sources/ExFigCLI/Resources/Schemas/Android.pkl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ class IconsEntry extends Common.FrameSource {
120120
/// If true, exit with error when pathData exceeds 32,767 bytes.
121121
strictPathValidation: Boolean?
122122

123+
/// Package name for Figma Code Connect Kotlin file.
124+
/// Overrides composePackageName for Code Connect only.
125+
/// Use this to generate .figma.kt without triggering Icons.kt.
126+
codeConnectPackageName: String?
127+
123128
/// Path to generate Figma Code Connect Kotlin file for Jetpack Compose.
124129
codeConnectKotlin: String?
125130
}

Sources/ExFigCLI/Resources/androidConfig.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ android = new Android.AndroidConfig {
127127
// composeFormat = "resourceReference"
128128
// [optional] Extension target package for Compose icons
129129
// composeExtensionTarget = "androidx.compose.ui.graphics.vector.ImageVector"
130+
// [optional] Package name for Code Connect only (overrides composePackageName for .figma.kt).
131+
// Use this to generate Code Connect without triggering Icons.kt generation.
132+
// codeConnectPackageName = "com.example"
130133
// [optional] Path to generate Figma Code Connect Kotlin file for Jetpack Compose
131134
// codeConnectKotlin = "./main/src/java/com/example/Icons.figma.kt"
132135
}

Sources/ExFigConfig/Generated/Android.pkl.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ extension Android {
235235
/// If true, exit with error when pathData exceeds 32,767 bytes.
236236
public var strictPathValidation: Bool?
237237

238+
/// Package name for Figma Code Connect Kotlin file.
239+
/// Overrides composePackageName for Code Connect only.
240+
/// Use this to generate .figma.kt without triggering Icons.kt.
241+
public var codeConnectPackageName: String?
242+
238243
/// Path to generate Figma Code Connect Kotlin file for Jetpack Compose.
239244
public var codeConnectKotlin: String?
240245

@@ -274,6 +279,7 @@ extension Android {
274279
nameStyle: Common.NameStyle?,
275280
pathPrecision: Int?,
276281
strictPathValidation: Bool?,
282+
codeConnectPackageName: String?,
277283
codeConnectKotlin: String?,
278284
figmaFrameName: String?,
279285
figmaPageName: String?,
@@ -291,6 +297,7 @@ extension Android {
291297
self.nameStyle = nameStyle
292298
self.pathPrecision = pathPrecision
293299
self.strictPathValidation = strictPathValidation
300+
self.codeConnectPackageName = codeConnectPackageName
294301
self.codeConnectKotlin = codeConnectKotlin
295302
self.figmaFrameName = figmaFrameName
296303
self.figmaPageName = figmaPageName

Tests/ExFigTests/Config/EntryOverrideResolutionTests.swift

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,37 @@ final class AndroidEntryOverrideResolutionTests: XCTestCase {
118118
XCTAssertEqual(resolved, fallback)
119119
}
120120

121+
// MARK: - effectiveCodeConnectPackageName
122+
123+
func testIconsEntry_bothPackageNames_prefersCodeConnect() throws {
124+
let entry = try makeAndroidIconsEntry(
125+
composePackageName: "com.compose",
126+
codeConnectPackageName: "com.codeconnect"
127+
)
128+
129+
XCTAssertEqual(entry.effectiveCodeConnectPackageName, "com.codeconnect")
130+
}
131+
132+
func testIconsEntry_onlyComposePackageName_fallsBack() throws {
133+
let entry = try makeAndroidIconsEntry(composePackageName: "com.compose")
134+
135+
XCTAssertEqual(entry.effectiveCodeConnectPackageName, "com.compose")
136+
}
137+
138+
func testIconsEntry_onlyCodeConnectPackageName_returnsIt() throws {
139+
let entry = try makeAndroidIconsEntry(codeConnectPackageName: "com.codeconnect")
140+
141+
XCTAssertEqual(entry.effectiveCodeConnectPackageName, "com.codeconnect")
142+
}
143+
144+
func testIconsEntry_bothNil_returnsNil() throws {
145+
let entry = try makeAndroidIconsEntry()
146+
147+
XCTAssertNil(entry.effectiveCodeConnectPackageName)
148+
}
149+
150+
// MARK: - ImagesEntry mainRes
151+
121152
func testImagesEntry_mainResOverride_resolvesEntryValue() throws {
122153
let entry = try makeAndroidImagesEntry(mainRes: "/images/res")
123154
let fallback = URL(fileURLWithPath: "/default/res")
@@ -129,10 +160,16 @@ final class AndroidEntryOverrideResolutionTests: XCTestCase {
129160

130161
// MARK: - Helpers
131162

132-
private func makeAndroidIconsEntry(mainRes: String? = nil) throws -> AndroidIconsEntry {
163+
private func makeAndroidIconsEntry(
164+
mainRes: String? = nil,
165+
composePackageName: String? = nil,
166+
codeConnectPackageName: String? = nil
167+
) throws -> AndroidIconsEntry {
133168
var fields = [String]()
134169
fields.append("\"output\": \"drawable\"")
135170
if let mainRes { fields.append("\"mainRes\": \"\(mainRes)\"") }
171+
if let composePackageName { fields.append("\"composePackageName\": \"\(composePackageName)\"") }
172+
if let codeConnectPackageName { fields.append("\"codeConnectPackageName\": \"\(codeConnectPackageName)\"") }
136173
let json = "{ \(fields.joined(separator: ", ")) }"
137174
return try JSONDecoder().decode(AndroidIconsEntry.self, from: Data(json.utf8))
138175
}

Tests/ExFigTests/Input/EnumBridgingTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ final class EnumBridgingTests: XCTestCase {
191191
nameStyle: pklStyle,
192192
pathPrecision: nil,
193193
strictPathValidation: nil,
194+
codeConnectPackageName: nil,
194195
codeConnectKotlin: nil,
195196
figmaFrameName: nil,
196197
figmaPageName: nil,
@@ -217,6 +218,7 @@ final class EnumBridgingTests: XCTestCase {
217218
nameStyle: nil,
218219
pathPrecision: nil,
219220
strictPathValidation: nil,
221+
codeConnectPackageName: nil,
220222
codeConnectKotlin: nil,
221223
figmaFrameName: nil,
222224
figmaPageName: nil,

0 commit comments

Comments
 (0)