Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/react-native/scripts/featureflags/generateFiles.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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'});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ function createGetter<T: boolean | number | string>(

return () => {
if (cachedValue == null) {
accessedFeatureFlags.add(configName);
cachedValue = customValueGetter() ?? defaultValue;
}
return cachedValue;
Expand All @@ -44,7 +43,10 @@ export function createJavaScriptFlagGetter<
): Getter<ReturnType<ReactNativeFeatureFlagsJsOnly[K]>> {
return createGetter(
configName,
() => overrides?.[configName]?.(),
() => {
accessedFeatureFlags.add(configName);
return overrides?.[configName]?.();
},
defaultValue,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down