Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
bec04d7
feat: add override functionality to remote feature flags
asalsys Nov 30, 2025
e78270a
fix lint
asalsys Dec 1, 2025
fe7db8b
fix lint
asalsys Dec 2, 2025
4413b2d
fix lint
asalsys Dec 2, 2025
e07e67c
fix lint
asalsys Dec 2, 2025
ec17188
edit changelog
asalsys Dec 2, 2025
fbdbd14
update pr info on changelog
asalsys Dec 2, 2025
c9cd5aa
fix test
asalsys Dec 2, 2025
4d02e47
fix transaction-controller test
asalsys Dec 2, 2025
e3a4f8f
fix prettier
asalsys Dec 2, 2025
35b8470
fix transaction pay test
asalsys Dec 2, 2025
4201e40
remove get actions
asalsys Dec 4, 2025
7ae47a3
update changelog and fix lint
asalsys Dec 4, 2025
71e4b7a
fix lint
asalsys Dec 8, 2025
ca479c8
fix tests
asalsys Dec 9, 2025
0063bce
update tests
asalsys Dec 9, 2025
9bbf745
update objects in tests
asalsys Dec 9, 2025
414f0f0
Merge branch 'main' into feat/override-functionality-to-remote-featur…
asalsys Dec 9, 2025
f17c947
fix tests
asalsys Dec 9, 2025
4d349ed
update to use the processVersionBasedFlag
asalsys Dec 10, 2025
6a6b98f
spread state
asalsys Dec 11, 2025
7e3500d
fix lint
asalsys Dec 11, 2025
434c892
Merge branch 'main' into feat/override-functionality-to-remote-featur…
asalsys Dec 11, 2025
6c75509
use rawRemoteFeatureFlags instead of processing each flag
asalsys Dec 11, 2025
e562809
fix update Cache
asalsys Dec 11, 2025
a09ceaa
fix lint
asalsys Dec 11, 2025
ffd58e9
update tests
asalsys Dec 11, 2025
c1af969
fix lint
asalsys Dec 11, 2025
9d99264
Update packages/remote-feature-flag-controller/src/remote-feature-fla…
asalsys Dec 12, 2025
1f49998
Update packages/remote-feature-flag-controller/CHANGELOG.md
asalsys Dec 12, 2025
e8f2ff1
Update packages/remote-feature-flag-controller/src/remote-feature-fla…
asalsys Dec 12, 2025
83017de
Update packages/remote-feature-flag-controller/src/remote-feature-fla…
asalsys Dec 12, 2025
6447545
Update packages/remote-feature-flag-controller/src/remote-feature-fla…
asalsys Dec 12, 2025
28a8548
Update packages/remote-feature-flag-controller/src/remote-feature-fla…
asalsys Dec 12, 2025
c3d09e5
Update packages/remote-feature-flag-controller/CHANGELOG.md
asalsys Dec 12, 2025
10c168d
add changes
asalsys Dec 12, 2025
d1357b7
address comments and fix changes
asalsys Dec 12, 2025
fb818a8
fix lint
asalsys Dec 12, 2025
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
Prev Previous commit
Next Next commit
add changes
  • Loading branch information
asalsys committed Dec 12, 2025
commit 10c168d8f09752a89ddd9c5d5436855c3e61599e
10 changes: 5 additions & 5 deletions packages/remote-feature-flag-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Add override functionality to remote feature flags ([#7271](https://github.com/MetaMask/core/pull/7271))
- `setFlagOverride(flagName, value)` - Set a local override for a specific feature flag
- `clearFlagOverride(flagName)` - Clear the local override for a specific feature flag
- `clearAllOverrides()` - Clear all local feature flag overrides
- `removeFlagOverride(flagName)` - Clear the local override for a specific feature flag
- `clearAllFlagOverrides()` - Clear all local feature flag overrides
- Add new controller state properties ([#7271](https://github.com/MetaMask/core/pull/7271))
- `localOverrides` - Local overrides for feature flags that take precedence over remote flags
- `rawRemoteFeatureFlags` - Raw flag value for arrays that were processed from arrays to single value
- `rawRemoteFeatureFlags` - Raw flag value for all feature flags
- Export additional controller action types ([#7271](https://github.com/MetaMask/core/pull/7271))
- `RemoteFeatureFlagControllerSetFlagOverrideAction`
- `RemoteFeatureFlagControllerClearFlagOverrideAction`
- `RemoteFeatureFlagControllerClearAllOverridesAction`
- `RemoteFeatureFlagControllerremoveFlagOverrideAction`
- `RemoteFeatureFlagControllerclearAllFlagOverridesAction`

### Changed

Expand Down
4 changes: 2 additions & 2 deletions packages/remote-feature-flag-controller/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ export type {
RemoteFeatureFlagControllerGetStateAction,
RemoteFeatureFlagControllerUpdateRemoteFeatureFlagsAction,
RemoteFeatureFlagControllerSetFlagOverrideAction,
RemoteFeatureFlagControllerClearFlagOverrideAction,
RemoteFeatureFlagControllerClearAllOverridesAction,
RemoteFeatureFlagControllerRemoveFlagOverrideAction,
RemoteFeatureFlagControllerClearAllFlagOverridesAction,
RemoteFeatureFlagControllerEvents,
RemoteFeatureFlagControllerStateChangeEvent,
} from './remote-feature-flag-controller';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -688,13 +688,13 @@ describe('RemoteFeatureFlagController', () => {
});
});

describe('clearFlagOverride', () => {
describe('removeFlagOverride', () => {
it('removes a specific override', () => {
const controller = createController();

controller.setFlagOverride('flag1', 'value1');
controller.setFlagOverride('flag2', 'value2');
controller.clearFlagOverride('flag1');
controller.removeFlagOverride('flag1');

expect(controller.state.localOverrides).toStrictEqual({
flag2: 'value2',
Expand All @@ -705,29 +705,29 @@ describe('RemoteFeatureFlagController', () => {
const controller = createController();

controller.setFlagOverride('flag1', 'value1');
controller.clearFlagOverride('nonExistentFlag');
controller.removeFlagOverride('nonExistentFlag');

expect(controller.state.localOverrides).toStrictEqual({
flag1: 'value1',
});
});
});

describe('clearAllOverrides', () => {
describe('clearAllFlagOverrides', () => {
it('removes all overrides', () => {
const controller = createController();

controller.setFlagOverride('flag1', 'value1');
controller.setFlagOverride('flag2', 'value2');
controller.clearAllOverrides();
controller.clearAllFlagOverrides();

expect(controller.state.localOverrides).toStrictEqual({});
});

it('does not affect state when no overrides exist', () => {
const controller = createController();

controller.clearAllOverrides();
controller.clearAllFlagOverrides();

expect(controller.state.localOverrides).toStrictEqual({});
});
Expand All @@ -745,7 +745,7 @@ describe('RemoteFeatureFlagController', () => {

await controller.updateRemoteFeatureFlags();

// Mock different remote response for second fetch
// Mock different remote response for updated fetch
jest
.spyOn(clientConfigApiService, 'fetchRemoteFeatureFlags')
.mockResolvedValueOnce({
Expand All @@ -769,27 +769,6 @@ describe('RemoteFeatureFlagController', () => {
remoteFlag: 'updatedRemoteValue',
});
});

it('overrides work with threshold-based feature flags', async () => {
const clientConfigApiService = buildClientConfigApiService({
remoteFeatureFlags: MOCK_FLAGS_WITH_THRESHOLD,
});
const controller = createController({
clientConfigApiService,
getMetaMetricsId: () => MOCK_METRICS_ID,
});

await controller.updateRemoteFeatureFlags();

// Override the threshold flag
controller.setFlagOverride('testFlagForThreshold', 'overriddenValue');

// Access flag value with override taking precedence
const flagValue =
controller.state.localOverrides.testFlagForThreshold ??
controller.state.remoteFeatureFlags.testFlagForThreshold;
expect(flagValue).toBe('overriddenValue');
});
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,22 +81,22 @@ export type RemoteFeatureFlagControllerSetFlagOverrideAction = {
handler: RemoteFeatureFlagController['setFlagOverride'];
};

export type RemoteFeatureFlagControllerClearFlagOverrideAction = {
type: `${typeof controllerName}:clearFlagOverride`;
handler: RemoteFeatureFlagController['clearFlagOverride'];
export type RemoteFeatureFlagControllerRemoveFlagOverrideAction = {
type: `${typeof controllerName}:removeFlagOverride`;
handler: RemoteFeatureFlagController['removeFlagOverride'];
};

export type RemoteFeatureFlagControllerClearAllOverridesAction = {
type: `${typeof controllerName}:clearAllOverrides`;
handler: RemoteFeatureFlagController['clearAllOverrides'];
export type RemoteFeatureFlagControllerClearAllFlagOverridesAction = {
type: `${typeof controllerName}:clearAllFlagOverrides`;
handler: RemoteFeatureFlagController['clearAllFlagOverrides'];
};

export type RemoteFeatureFlagControllerActions =
| RemoteFeatureFlagControllerGetStateAction
| RemoteFeatureFlagControllerUpdateRemoteFeatureFlagsAction
| RemoteFeatureFlagControllerSetFlagOverrideAction
| RemoteFeatureFlagControllerClearFlagOverrideAction
| RemoteFeatureFlagControllerClearAllOverridesAction;
| RemoteFeatureFlagControllerRemoveFlagOverrideAction
| RemoteFeatureFlagControllerClearAllFlagOverridesAction;

export type RemoteFeatureFlagControllerStateChangeEvent =
ControllerStateChangeEvent<
Expand Down Expand Up @@ -338,7 +338,6 @@ export class RemoteFeatureFlagController extends BaseController<
this.update((state) => {
state.localOverrides[flagName] = value;
});
});
}

/**
Expand Down
Loading