From e40e80692e6b166cc2de2a23a25df07ee877c6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Kwas=CC=81niewski?= Date: Fri, 16 Jan 2026 11:04:29 +0100 Subject: [PATCH] refactor(brownie): hide kotlin codegen until ready for release - Remove kotlin from default platforms, require explicit -p kotlin - Make brownie config optional in package.json - Update docs to remove kotlin references - Update tests for new behavior --- apps/RNApp/package.json | 4 -- apps/TesterIntegrated/package.json | 5 -- docs/docs/brownie/codegen.mdx | 55 ++----------------- docs/docs/docs/cli/brownie.mdx | 47 ++-------------- .../__tests__/commands/codegen.test.ts | 32 +++++------ .../cli/src/brownie/__tests__/config.test.ts | 7 +-- packages/cli/src/brownie/commands/codegen.ts | 8 +-- packages/cli/src/brownie/config.ts | 8 +-- 8 files changed, 32 insertions(+), 134 deletions(-) diff --git a/apps/RNApp/package.json b/apps/RNApp/package.json index c2046bc8..0ba3f355 100644 --- a/apps/RNApp/package.json +++ b/apps/RNApp/package.json @@ -49,9 +49,5 @@ }, "engines": { "node": ">=20" - }, - "brownie": { - "kotlin": "./android/BrownfieldLib/src/main/java/com/rnapp/brownfieldlib/Generated", - "kotlinPackageName": "com.rnapp.brownfieldlib" } } diff --git a/apps/TesterIntegrated/package.json b/apps/TesterIntegrated/package.json index f70fc8c6..b5466126 100644 --- a/apps/TesterIntegrated/package.json +++ b/apps/TesterIntegrated/package.json @@ -35,10 +35,5 @@ }, "engines": { "node": ">=20" - }, - "brownie": { - "swift": "./swift/Generated", - "kotlin": "./kotlin/app/src/main/java/com/callstack/kotlinexample/Generated", - "kotlinPackageName": "com.callstack.kotlinexample" } } diff --git a/docs/docs/brownie/codegen.mdx b/docs/docs/brownie/codegen.mdx index ea3955bf..d842c5f1 100644 --- a/docs/docs/brownie/codegen.mdx +++ b/docs/docs/brownie/codegen.mdx @@ -5,34 +5,15 @@ The Brownfield CLI generates native types from your TypeScript store definitions ## Usage ```bash -brownfield codegen # Generate for all configured platforms -brownfield codegen -p swift # Generate Swift only -brownfield codegen --platform kotlin # Generate Kotlin only (coming soon) -brownfield --help # Show help -brownfield --version # Show version +brownfield codegen # Generate for all configured platforms +brownfield codegen -p swift # Generate Swift only +brownfield --help # Show help +brownfield --version # Show version ``` ## Configuration -Add to your app's `package.json`: - -```json -{ - "brownie": { - "kotlin": "./android/app/src/main/java/com/example/", - "kotlinPackageName": "com.example" - } -} -``` - -Note: This config is subject to change as Android support is rolled out. Ideally this will be removed in favor of auto-detection. - -| Field | Required | Description | -| ------------------- | -------- | ---------------------------------------------------------- | -| `kotlin` | No | Output directory for Kotlin files | -| `kotlinPackageName` | No | Kotlin package name (extracted from path if not specified) | - -**Note:** Swift files are always generated to `node_modules/@callstack/brownie/ios/Generated/`. This path is auto-resolved and not configurable. +Swift files are always generated to `node_modules/@callstack/brownie/ios/Generated/`. This path is auto-resolved and not configurable. ## Generated Output @@ -73,21 +54,6 @@ The generated struct: - Conforms to `BrownieStoreProtocol` with auto-generated `storeName` - Uses mutable `var` properties -### Kotlin Output (Coming Soon) - -```kotlin -package com.example - -data class BrownfieldStore( - val counter: Double, - val user: User -) - -data class User( - val name: String -) -``` - ## Auto-Generation Hooks ### iOS (Podfile) @@ -100,17 +66,6 @@ pre_install do |installer| end ``` -### Android (build.gradle.kts) - -Run codegen before build: - -```kotlin -tasks.register("generateBrownfieldStore") { - exec { commandLine("npx", "brownie", "codegen", "-p", "kotlin") } -} -preBuild.dependsOn("generateBrownfieldStore") -``` - ## How It Works 1. CLI recursively finds all `*.brownie.ts` files diff --git a/docs/docs/docs/cli/brownie.mdx b/docs/docs/docs/cli/brownie.mdx index 3d54367e..a2a01dab 100644 --- a/docs/docs/docs/cli/brownie.mdx +++ b/docs/docs/docs/cli/brownie.mdx @@ -5,35 +5,12 @@ The `brownfield codegen` CLI command generates `@callstack/brownie` (Brownie) st ## Usage ```bash -brownfield codegen # Generate for all configured platforms -brownfield codegen -p swift # Generate Swift only -brownfield codegen --platform kotlin # Generate Kotlin only -brownfield codegen --help # Show help for Brownie state management codegen -brownfield --version # Show version +brownfield codegen # Generate Swift types +brownfield codegen -p swift # Generate Swift only +brownfield codegen --help # Show help for Brownie state management codegen +brownfield --version # Show version ``` -## Configuration - -Add to your app's `package.json`: - -```json -{ - "brownie": { - "swift": "./ios/Generated/", - "kotlin": "./android/app/src/main/java/com/example/", - "kotlinPackageName": "com.example" - } -} -``` - -| Field | Required | Description | -| ------------------- | -------- | ----------------------------------------- | -| `swift` | No\* | Output directory for Swift files | -| `kotlin` | No\* | Output directory for Kotlin files | -| `kotlinPackageName` | No | Kotlin package name (extracted from path) | - -\*At least one of `swift` or `kotlin` is required. - ## Store Definition Stores are auto-discovered from `*.brownie.ts` files. Define your store shape using module augmentation: @@ -91,17 +68,7 @@ struct BrownfieldStore: Codable { } ``` -**Kotlin** (data class): - -```kotlin -package com.example - -data class BrownfieldStore ( - val counter: Double, - val isLoading: Boolean, - val user: String -) -``` +Swift files are always generated to `node_modules/@callstack/brownie/ios/Generated/`. This path is auto-resolved and not configurable. ### Store Discovery @@ -127,7 +94,5 @@ JSON Schema ▼ quicktype-core │ - ├──▶ Swift (lang: 'swift', mutable-properties: true) - │ - └──▶ Kotlin (lang: 'kotlin', framework: 'just-types') + └──▶ Swift (lang: 'swift', mutable-properties: true) ``` diff --git a/packages/cli/src/brownie/__tests__/commands/codegen.test.ts b/packages/cli/src/brownie/__tests__/commands/codegen.test.ts index e2abe9a2..6793ff19 100644 --- a/packages/cli/src/brownie/__tests__/commands/codegen.test.ts +++ b/packages/cli/src/brownie/__tests__/commands/codegen.test.ts @@ -92,7 +92,7 @@ describe('runCodegen', () => { expect(mockGenerateKotlin).not.toHaveBeenCalled(); }); - it('generates kotlin files for discovered store', async () => { + it('generates kotlin files when platform is kotlin', async () => { tempDir = createTempPackageJson({ brownie: { kotlin: './Generated', @@ -101,7 +101,7 @@ describe('runCodegen', () => { }); mockCwd.mockReturnValue(tempDir); - await runCodegen({}); + await runCodegen({ platform: 'kotlin' }); expect(mockGenerateKotlin).toHaveBeenCalledWith({ name: 'TestStore', @@ -110,10 +110,10 @@ describe('runCodegen', () => { outputPath: 'Generated/TestStore.kt', packageName: 'com.test', }); - expect(mockGenerateSwift).toHaveBeenCalled(); + expect(mockGenerateSwift).not.toHaveBeenCalled(); }); - it('generates both swift and kotlin when configured', async () => { + it('generates only swift by default even when kotlin is configured', async () => { tempDir = createTempPackageJson({ brownie: { kotlin: './Generated', @@ -124,7 +124,7 @@ describe('runCodegen', () => { await runCodegen({}); expect(mockGenerateSwift).toHaveBeenCalled(); - expect(mockGenerateKotlin).toHaveBeenCalled(); + expect(mockGenerateKotlin).not.toHaveBeenCalled(); }); it('generates only specified platform', async () => { @@ -172,19 +172,6 @@ describe('runCodegen', () => { }); }); - it('exits with error for invalid platform', async () => { - tempDir = createTempPackageJson({ - brownie: {}, - }); - mockCwd.mockReturnValue(tempDir); - - // @ts-expect-error - testing invalid input - await expect(runCodegen({ platform: 'invalid' })).rejects.toThrow( - 'process.exit(1)' - ); - expect(mockLoggerError).toHaveBeenCalled(); - }); - it('exits with error when generator fails', async () => { tempDir = createTempPackageJson({ brownie: {}, @@ -206,4 +193,13 @@ describe('runCodegen', () => { expect(mockGenerateKotlin).not.toHaveBeenCalled(); }); + + it('works without brownie config in package.json', async () => { + tempDir = createTempPackageJson({}); + mockCwd.mockReturnValue(tempDir); + + await runCodegen({}); + + expect(mockGenerateSwift).toHaveBeenCalled(); + }); }); diff --git a/packages/cli/src/brownie/__tests__/config.test.ts b/packages/cli/src/brownie/__tests__/config.test.ts index 5a470098..ba6f5305 100644 --- a/packages/cli/src/brownie/__tests__/config.test.ts +++ b/packages/cli/src/brownie/__tests__/config.test.ts @@ -43,12 +43,11 @@ describe('loadConfig', () => { expect(() => loadConfig()).toThrow('package.json not found'); }); - it('throws when brownie config missing', () => { + it('returns empty config when brownie config missing', () => { tempDir = createTempPackageJson({}); mockCwd.mockReturnValue(tempDir); - expect(() => loadConfig()).toThrow( - 'brownie config not found in package.json' - ); + const config = loadConfig(); + expect(config).toEqual({}); }); it('loads empty config', () => { diff --git a/packages/cli/src/brownie/commands/codegen.ts b/packages/cli/src/brownie/commands/codegen.ts index 184642bf..ce4a18a6 100644 --- a/packages/cli/src/brownie/commands/codegen.ts +++ b/packages/cli/src/brownie/commands/codegen.ts @@ -114,10 +114,8 @@ export async function runCodegen({ platform }: RunCodegenOptions) { if (platform) { platforms = [platform]; } else { + // Only generate Swift by default (Kotlin not yet released) platforms = ['swift']; - if (config.kotlin) { - platforms.push('kotlin'); - } } await generateForStore(store, config, platforms, isMultipleStores); @@ -131,8 +129,8 @@ export const codegenCommand = new Command('codegen') .addOption( new Option( '-p, --platform ', - 'Generate for specific platform (swift, kotlin)' - ).choices(['swift', 'kotlin']) + 'Generate for specific platform (swift)' + ).choices(['swift']) ) .action( actionRunner(async (options: RunCodegenOptions) => { diff --git a/packages/cli/src/brownie/config.ts b/packages/cli/src/brownie/config.ts index ae6aed30..7b3d2192 100644 --- a/packages/cli/src/brownie/config.ts +++ b/packages/cli/src/brownie/config.ts @@ -67,11 +67,5 @@ export function loadConfig(): BrownieConfig { const packageJson: PackageJson = JSON.parse( fs.readFileSync(packageJsonPath, 'utf-8') ); - const config = packageJson.brownie; - - if (!config) { - throw new Error('brownie config not found in package.json'); - } - - return config; + return packageJson.brownie ?? {}; }