From b914783a891f45bd188565e23dd5c285594a8018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Kwas=CC=81niewski?= Date: Tue, 9 Sep 2025 14:51:47 +0200 Subject: [PATCH 1/3] feat: brownie store feat: move to separate package feat: improve cli feat: improve plan and remaining todos feat: handle multiple stores feat: add tests for the cli feat: make DX of defining your store better feat: make hook work like useState feat: wip rewrite to shared cxx layer feat: improve swift api fix: use built-in folly methods feat: update the plan with re-render optimizations fix: sync yarn.lock fix: temporairly disable Android feat: check-in generated code feat: move store plan to ArchitecturePlan feat: move installed to separate class --- apps/TesterIntegrated/App.tsx | 112 ++-- .../BrownfieldStore.brownie.ts | 23 + .../Generated/BrownfieldStore.kt | 16 + .../kotlinexample/Generated/SettingsStore.kt | 16 + apps/TesterIntegrated/metro.config.cjs | 23 +- apps/TesterIntegrated/package.json | 21 +- apps/TesterIntegrated/react-native.config.js | 12 +- apps/TesterIntegrated/swift/App.swift | 82 ++- .../swift/Generated/BrownfieldStore.swift | 24 + .../swift/Generated/SettingsStore.swift | 23 + apps/TesterIntegrated/swift/Podfile.lock | 32 + .../SwiftExample.xcodeproj/project.pbxproj | 12 + apps/TesterIntegrated/tsconfig.json | 7 + package.json | 7 +- packages/brownie/ArchitectureOverview.md | 446 +++++++++++++ packages/brownie/Brownie.podspec | 31 + packages/brownie/babel.config.js | 8 + packages/brownie/bob.config.js | 26 + packages/brownie/cpp/BrownieHostObject.cpp | 52 ++ packages/brownie/cpp/BrownieHostObject.h | 26 + packages/brownie/cpp/BrownieInstaller.cpp | 31 + packages/brownie/cpp/BrownieInstaller.h | 12 + packages/brownie/cpp/BrownieStore.cpp | 53 ++ packages/brownie/cpp/BrownieStore.h | 30 + packages/brownie/cpp/BrownieStoreManager.cpp | 31 + packages/brownie/cpp/BrownieStoreManager.h | 26 + packages/brownie/ios/BrownieModule.h | 9 + packages/brownie/ios/BrownieModule.mm | 56 ++ packages/brownie/ios/BrownieStore.swift | 153 +++++ packages/brownie/ios/BrownieStoreBridge.h | 17 + packages/brownie/ios/BrownieStoreBridge.mm | 72 +++ packages/brownie/jest.config.js | 16 + packages/brownie/package.json | 95 +++ packages/brownie/react-native.config.js | 7 + .../__fixtures__/SecondStore.brownie.ts | 10 + .../scripts/__fixtures__/TestStore.brownie.ts | 11 + .../__tests__/commands/codegen.test.ts | 209 +++++++ .../brownie/scripts/__tests__/config.test.ts | 97 +++ .../scripts/__tests__/store-discovery.test.ts | 201 ++++++ .../brownie/scripts/__tests__/tsconfig.json | 20 + packages/brownie/scripts/cli.ts | 74 +++ packages/brownie/scripts/commands/codegen.ts | 146 +++++ packages/brownie/scripts/config.ts | 44 ++ packages/brownie/scripts/generators/kotlin.ts | 113 ++++ packages/brownie/scripts/generators/swift.ts | 85 +++ packages/brownie/scripts/store-discovery.ts | 108 ++++ packages/brownie/scripts/tsconfig.json | 17 + packages/brownie/src/NativeBrownieModule.ts | 11 + packages/brownie/src/index.ts | 117 ++++ packages/brownie/tsconfig.build.json | 3 + packages/brownie/tsconfig.json | 7 + .../ios/ReactNativeBrownfieldModule.h | 2 +- .../ios/ReactNativeBrownfieldModule.mm | 2 + .../react-native-brownfield/tsconfig.json | 30 +- tsconfig.json | 29 +- yarn.lock | 587 +++++++++++++++++- 56 files changed, 3364 insertions(+), 166 deletions(-) create mode 100644 apps/TesterIntegrated/BrownfieldStore.brownie.ts create mode 100644 apps/TesterIntegrated/kotlin/app/src/main/java/com/callstack/kotlinexample/Generated/BrownfieldStore.kt create mode 100644 apps/TesterIntegrated/kotlin/app/src/main/java/com/callstack/kotlinexample/Generated/SettingsStore.kt create mode 100644 apps/TesterIntegrated/swift/Generated/BrownfieldStore.swift create mode 100644 apps/TesterIntegrated/swift/Generated/SettingsStore.swift create mode 100644 apps/TesterIntegrated/tsconfig.json create mode 100644 packages/brownie/ArchitectureOverview.md create mode 100644 packages/brownie/Brownie.podspec create mode 100644 packages/brownie/babel.config.js create mode 100644 packages/brownie/bob.config.js create mode 100644 packages/brownie/cpp/BrownieHostObject.cpp create mode 100644 packages/brownie/cpp/BrownieHostObject.h create mode 100644 packages/brownie/cpp/BrownieInstaller.cpp create mode 100644 packages/brownie/cpp/BrownieInstaller.h create mode 100644 packages/brownie/cpp/BrownieStore.cpp create mode 100644 packages/brownie/cpp/BrownieStore.h create mode 100644 packages/brownie/cpp/BrownieStoreManager.cpp create mode 100644 packages/brownie/cpp/BrownieStoreManager.h create mode 100644 packages/brownie/ios/BrownieModule.h create mode 100644 packages/brownie/ios/BrownieModule.mm create mode 100644 packages/brownie/ios/BrownieStore.swift create mode 100644 packages/brownie/ios/BrownieStoreBridge.h create mode 100644 packages/brownie/ios/BrownieStoreBridge.mm create mode 100644 packages/brownie/jest.config.js create mode 100644 packages/brownie/package.json create mode 100644 packages/brownie/react-native.config.js create mode 100644 packages/brownie/scripts/__fixtures__/SecondStore.brownie.ts create mode 100644 packages/brownie/scripts/__fixtures__/TestStore.brownie.ts create mode 100644 packages/brownie/scripts/__tests__/commands/codegen.test.ts create mode 100644 packages/brownie/scripts/__tests__/config.test.ts create mode 100644 packages/brownie/scripts/__tests__/store-discovery.test.ts create mode 100644 packages/brownie/scripts/__tests__/tsconfig.json create mode 100644 packages/brownie/scripts/cli.ts create mode 100644 packages/brownie/scripts/commands/codegen.ts create mode 100644 packages/brownie/scripts/config.ts create mode 100644 packages/brownie/scripts/generators/kotlin.ts create mode 100644 packages/brownie/scripts/generators/swift.ts create mode 100644 packages/brownie/scripts/store-discovery.ts create mode 100644 packages/brownie/scripts/tsconfig.json create mode 100644 packages/brownie/src/NativeBrownieModule.ts create mode 100644 packages/brownie/src/index.ts create mode 100644 packages/brownie/tsconfig.build.json create mode 100644 packages/brownie/tsconfig.json diff --git a/apps/TesterIntegrated/App.tsx b/apps/TesterIntegrated/App.tsx index 8c52685f..c00aac3c 100644 --- a/apps/TesterIntegrated/App.tsx +++ b/apps/TesterIntegrated/App.tsx @@ -1,84 +1,40 @@ -import React, { useEffect } from 'react'; -import { StyleSheet, Text, View, Button } from 'react-native'; -import { - createNativeStackNavigator, - type NativeStackScreenProps, -} from '@react-navigation/native-stack'; -import ReactNativeBrownfield from '@callstack/react-native-brownfield'; -import { NavigationContainer } from '@react-navigation/native'; +import { StyleSheet, Text, View, Button, TextInput } from 'react-native'; +import { useBrownieStore } from '@callstack/brownie'; +import './BrownfieldStore.brownie'; -const getRandomValue = () => Math.round(Math.random() * 255); -const getRandomTheme = () => { - const primary = [getRandomValue(), getRandomValue(), getRandomValue()]; - const secondary = [ - 255 - (primary?.[0] || 0), - 255 - (primary?.[1] || 0), - 255 - (primary?.[2] || 0), - ]; - - return { - primary: `rgb(${primary[0]}, ${primary[1]}, ${primary[2]})`, - secondary: `rgb(${secondary[0]}, ${secondary[1]}, ${secondary[2]})`, - }; -}; - -type Props = NativeStackScreenProps; - -function HomeScreen({ navigation, route }: Props) { - const colors = route.params?.theme || getRandomTheme(); - - useEffect(() => { - const unsubscribe = navigation.addListener('focus', () => { - const isFirstRoute = !navigation.canGoBack(); - ReactNativeBrownfield.setNativeBackGestureAndButtonEnabled(isFirstRoute); - }); - return unsubscribe; - }, [navigation]); +function HomeScreen() { + const [state, setState] = useBrownieStore('BrownfieldStore'); return ( - - - React Native Screen + + React Native Side + Count: {state.counter} + + Has error: {state.hasError ? 'true' : 'false'} -