feat: Add FRM connector list config#4958
Conversation
Add FRM connectors to the live-mode connector_list_for_live config pipeline, mirroring paymentProcessors, payoutProcessors, threedsAuth and vaultProcessors. - Add frmProcessors key to [default.connector_list_for_live] in config.toml - Add frmProcessorsLiveList to connectorListForLive type - Extract frmProcessors in getConnectorListForLive with frmConnectorListForLive fallback - FRMSelect uses the live list when isLiveMode is enabled Closes #4946
XyneSpaces
left a comment
There was a problem hiding this comment.
Automated Review Summary
PR: feat: Add FRM connector list config
Reviewer: XyneSpaces Automation
Findings
Found 1 critical issue that will break compilation:
🚨 Critical: Typo in FRM connector variant name
File: src/screens/Connectors/ConnectorUtils.res
The added frmConnectorListForLive uses FRM(Riskifyed) but the correct variant name in the codebase is RISKIFIED (spelled with "-ied", not "-yed").
Current (incorrect):
let frmConnectorListForLive: array<connectorTypes> = [
FRM(CybersourceDecisionManager),
FRM(Signifyd),
FRM(Riskifyed), // ❌ Wrong spelling
]Should be:
let frmConnectorListForLive: array<connectorTypes> = [
FRM(CybersourceDecisionManager),
FRM(Signifyd),
FRM(Riskified), // ✅ Correct spelling
]This typo will cause a compilation error since the variant Riskifyed does not exist in the FRMPlayer type definition.
Positive Notes
- Clean implementation following the existing pattern for
paymentProcessorsLiveList,payoutProcessorsLiveList, etc. - Proper fallback to default list when config is empty
- Good use of
FRMPlayerconnector type for typed extraction - Consistent with the existing config → atom → component consumption flow
Verdict: 🔴 Changes Requested — Fix the variant typo before merge.
XyneSpaces
left a comment
There was a problem hiding this comment.
Code Review: FRM Connector List Config
Following the control-center review checklist:
Tier 1 — High Signal Issues
✅ Naming Consistency — Pattern follows existing paymentProcessors, payoutProcessors convention. Field name frmProcessorsLiveList is consistent with siblings.
ConnectorUtils.res, line adds FRM(Riskifyed) but the variant name should be Riskified (typo: "Riskifyed" vs "Riskified"). Please verify this matches the actual variant definition in the codebase.
Other Findings
✅ Feature Flag Gating — Correctly uses featureFlagDetails.isLiveMode to toggle between config-driven and hardcoded lists.
✅ Blast Radius — New field frmProcessorsLiveList added to record type; fallback pattern mirrors other processor types.
Minor Suggestion
In config/config.toml, the config uses lowercase strings: ["signifyd","riskified","cybersourcedecisionmanager"]. Consider adding a comment noting these must match the string representations expected by getConnectorNameTypeFromString for the FRMPlayer branch.
📋 Review SummaryOverall Assessment: ✅ Looks good with minor note Key Findings
What was reviewed
Action Items
Reviewed by: Hyperswitch Reviewer Agent |
| let vaultProcessorList: array<connectorTypes> = [VaultProcessor(VGS)] | ||
|
|
||
| let frmConnectorListForLive: array<connectorTypes> = [ | ||
| FRM(CybersourceDecisionManager), |
There was a problem hiding this comment.
Should cybersourcedecisionmanager be added to prod? It was just added for a demo.
Type of Change
Description
Adds FRM (Fraud & Risk Management) connectors to the live-mode
connector_list_for_liveconfig pipeline, bringing FRM in line with howpaymentProcessors,payoutProcessors,threedsAuthProcessorsandvaultProcessorsare already configured.Previously the FRM processor selection screen always rendered the hardcoded
FRMInfo.frmList, with no way to control which FRM connectors are surfaced in live mode via config. This wires FRM through the sameconfig.toml→getConnectorListForLive→ Recoil atom flow as the other connector categories.Changes
frmProcessorskey under[default.connector_list_for_live].frmProcessorsLiveListto theconnectorListForLiverecord.frmProcessorsfrom config (typed viaFRMPlayer) with afrmConnectorListForLivefallback when config is empty.frmConnectorListForLivedefault list.frmProcessorsLiveListwhenisLiveModeis enabled, otherwise the existingfrmList.Motivation and Context
Closes #4946
How did you test it?
npm run re:buildcompiles cleanly with no type errors.FRMSelect.res.jsresolvesfeatureFlagDetails.isLiveMode ? frmProcessorsLiveList : FRMInfo.frmList.signifyd,riskified,cybersourcedecisionmanager) match theFRMPlayerbranch ofgetConnectorNameTypeFromString, so they resolve to the correctFRM(...)variants.Checklist
npm run re:format