diff --git a/packages/react-native/scripts/featureflags/generateFiles.js b/packages/react-native/scripts/featureflags/generateFiles.js index f03df2163e64..8f155b1350ae 100644 --- a/packages/react-native/scripts/featureflags/generateFiles.js +++ b/packages/react-native/scripts/featureflags/generateFiles.js @@ -14,6 +14,7 @@ import generateAndroidModules from './generateAndroidModules'; import generateCommonCxxModules from './generateCommonCxxModules'; import generateJavaScriptModules from './generateJavaScriptModules'; import fs from 'fs'; +import path from 'path'; export default function generateFiles( generatorConfig: GeneratorConfig, @@ -65,6 +66,7 @@ export default function generateFiles( } for (const [modulePath, moduleContents] of Object.entries(generatedFiles)) { - fs.writeFileSync(modulePath, moduleContents, 'utf8'); + fs.mkdirSync(path.dirname(modulePath), {recursive: true}); + fs.writeFileSync(modulePath, moduleContents, {encoding: 'utf8'}); } } diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlagsBase.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlagsBase.js index 3223800bed4a..d7398c5358ca 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlagsBase.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlagsBase.js @@ -29,7 +29,6 @@ function createGetter( return () => { if (cachedValue == null) { - accessedFeatureFlags.add(configName); cachedValue = customValueGetter() ?? defaultValue; } return cachedValue; @@ -44,7 +43,10 @@ export function createJavaScriptFlagGetter< ): Getter> { return createGetter( configName, - () => overrides?.[configName]?.(), + () => { + accessedFeatureFlags.add(configName); + return overrides?.[configName]?.(); + }, defaultValue, ); } diff --git a/packages/react-native/src/private/featureflags/__tests__/ReactNativeFeatureFlags-test.js b/packages/react-native/src/private/featureflags/__tests__/ReactNativeFeatureFlags-test.js index 02d61696e10f..0b3ea72ec38b 100644 --- a/packages/react-native/src/private/featureflags/__tests__/ReactNativeFeatureFlags-test.js +++ b/packages/react-native/src/private/featureflags/__tests__/ReactNativeFeatureFlags-test.js @@ -84,20 +84,34 @@ describe('ReactNativeFeatureFlags', () => { expect(jsOnlyTestFlagFn).toHaveBeenCalledTimes(1); }); - it('should throw an error if any of the flags has been accessed before overridding', () => { + it('should throw an error if any of the JS flags has been accessed before overridding', () => { const ReactNativeFeatureFlags = require('../ReactNativeFeatureFlags'); - ReactNativeFeatureFlags.commonTestFlag(); + ReactNativeFeatureFlags.jsOnlyTestFlag(); expect(() => ReactNativeFeatureFlags.override({ jsOnlyTestFlag: () => true, }), ).toThrow( - 'Feature flags were accessed before being overridden: commonTestFlag', + 'Feature flags were accessed before being overridden: jsOnlyTestFlag', ); }); + it('should NOT throw an error if any of the common flags has been accessed before overridding', () => { + const ReactNativeFeatureFlags = require('../ReactNativeFeatureFlags'); + + ReactNativeFeatureFlags.commonTestFlag(); + + expect(() => { + ReactNativeFeatureFlags.override({ + jsOnlyTestFlag: () => true, + }); + }).not.toThrow(); + + expect(ReactNativeFeatureFlags.jsOnlyTestFlag()).toBe(true); + }); + it('should throw an error when trying to set overrides twice', () => { const ReactNativeFeatureFlags = require('../ReactNativeFeatureFlags');