@vesant-sdk/fraud 0.1.2-next.9d10f2c → 0.1.3-dev.ddb1fa4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +55 -1
- package/dist/index.d.ts +55 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -436,6 +436,60 @@ interface FraudScoreResponseEnvelope<T> {
|
|
|
436
436
|
metadata?: FraudScoreResponseMetadata;
|
|
437
437
|
timestamp: Timestamp;
|
|
438
438
|
}
|
|
439
|
+
/**
|
|
440
|
+
* How a `fraud.alert.callback` decision was produced.
|
|
441
|
+
*
|
|
442
|
+
* - `sync` — resolved inline with the `/fraud/score` call; confirms a decision
|
|
443
|
+
* the SDK response already returned.
|
|
444
|
+
* - `deferred` — a rule configured with deferred timing re-scored the event
|
|
445
|
+
* after a delay; the decision must be applied retroactively.
|
|
446
|
+
* - `event_triggered` — a later related event caused a re-score of the original.
|
|
447
|
+
*/
|
|
448
|
+
type FraudCallbackTrigger = 'sync' | 'deferred' | 'event_triggered' | (string & Record<string, never>);
|
|
449
|
+
/**
|
|
450
|
+
* Outbound webhook body delivered to a tenant's configured fraud webhook URL
|
|
451
|
+
* when a fraud rule resolves to a decision — including rules with **deferred**
|
|
452
|
+
* or **event-triggered** timing that cannot return a verdict inline with the
|
|
453
|
+
* `/fraud/score` call. Signed with `X-Webhook-Signature: sha256=<hex>`
|
|
454
|
+
* (HMAC-SHA256 of the raw body). See the Fraud Integration guide.
|
|
455
|
+
*/
|
|
456
|
+
interface FraudAlertCallbackEvent {
|
|
457
|
+
/** Unique event ID — dedup on this; duplicate delivery is possible. */
|
|
458
|
+
event_id: string;
|
|
459
|
+
/** Always `"fraud.alert.callback"` — the wire event type to dispatch on. */
|
|
460
|
+
event_type: 'fraud.alert.callback';
|
|
461
|
+
/** Event-bus aggregate key (alert ID when an alert exists, else the reference). */
|
|
462
|
+
aggregate_id: string;
|
|
463
|
+
tenant_id: string;
|
|
464
|
+
/** ISO 8601 timestamp of the decision. */
|
|
465
|
+
timestamp: Timestamp;
|
|
466
|
+
version?: number;
|
|
467
|
+
correlation_id?: string;
|
|
468
|
+
causation_id?: string;
|
|
469
|
+
user_id?: string;
|
|
470
|
+
/** Fraud reference (e.g. `"FRD-e4b108d7"`) — matches the sync score `reference`. */
|
|
471
|
+
reference: string;
|
|
472
|
+
/** Tenant customer ID the decision applies to. */
|
|
473
|
+
customer_id: string;
|
|
474
|
+
/** Originating Sift event type (`$create_account`, `$transaction`, …). */
|
|
475
|
+
source_event_type: SupportedFraudEventType | (string & Record<string, never>);
|
|
476
|
+
decision: FraudDecision;
|
|
477
|
+
risk_level: RiskLevel;
|
|
478
|
+
risk_score: number;
|
|
479
|
+
/** Whether the decision arrived inline (`sync`) or as a later re-score. */
|
|
480
|
+
trigger: FraudCallbackTrigger;
|
|
481
|
+
/**
|
|
482
|
+
* Tenant-scope reactions to apply on your platform — populated identically to
|
|
483
|
+
* the sync `/fraud/score` response's `tenant_actions`. Always an array (never
|
|
484
|
+
* null); empty when the rule resolved only to Vesant-scope reactions.
|
|
485
|
+
*/
|
|
486
|
+
tenant_actions: TenantAction[];
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Type guard for the deferred/async fraud webhook body. Narrows an already
|
|
490
|
+
* signature-verified, parsed payload to {@link FraudAlertCallbackEvent}.
|
|
491
|
+
*/
|
|
492
|
+
declare function isFraudAlertCallbackEvent(value: unknown): value is FraudAlertCallbackEvent;
|
|
439
493
|
|
|
440
494
|
/**
|
|
441
495
|
* Fraud scoring API client.
|
|
@@ -481,4 +535,4 @@ declare function normalizeSiftPaymentMethods(methods: SiftPaymentMethod[] | unde
|
|
|
481
535
|
metadata?: Record<string, unknown>;
|
|
482
536
|
};
|
|
483
537
|
|
|
484
|
-
export { CHARGEBACK_FRAUD_EVENT_TYPE, type ChargebackFraudEventType, ChargebackReason, type ChargebackScoreRequest, type ChargebackScoreResponseData, ChargebackState, type CreateAccountScoreRequest, type CreateOrderScoreRequest, FraudClient, type FraudCustomMetadata, type FraudDecision, type FraudEventType, type FraudReactionType, type FraudRiskLevel, type FraudRuleSignalMetadata, type FraudScoreRequest, type FraudScoreRequestBase, type FraudScoreResponseData, type FraudScoreResponseEnvelope, type FraudScoreResponseMetadata, LOGIN_RULE_SIGNAL_KEYS, type LoginRuleSignals, type LoginScoreRequest, LoginStatus, type LogoutScoreRequest, PLANNED_FRAUD_EVENT_TYPES, PasswordUpdateReason, PasswordUpdateStatus, PaymentType, type PlannedFraudEventType, SCORED_FRAUD_EVENT_TYPES, SUPPORTED_FRAUD_EVENT_TYPES, type ScoredFraudEventType, type ScoredFraudScoreRequest, type SiftApp, type SiftBillingAddress, type SiftBrowser, type SiftChargebackReason, SiftChargebackReasonValues, type SiftChargebackState, SiftChargebackStateValues, type SiftLoginFailureReason, SiftLoginFailureReasonValues, type SiftLoginStatus, SiftLoginStatusValues, type SiftPassThroughMetadata, type SiftPasswordUpdateReason, SiftPasswordUpdateReasonValues, type SiftPasswordUpdateStatus, SiftPasswordUpdateStatusValues, type SiftPaymentMethod, type SiftPaymentType, SiftPaymentTypeValues, type SiftTransactionStatus, SiftTransactionStatusValues, type SiftTransactionType, SiftTransactionTypeValues, type SiftWagerStatus, SiftWagerStatusValues, type SiftWalletType, SiftWalletTypeValues, type SupportedFraudEventType, TRANSACTION_RULE_SIGNAL_KEYS, TYPED_SIFT_METADATA_KEYS, type TenantAction, type TransactionRuleSignals, type TransactionScoreRequest, TransactionStatus, TransactionType, UPDATE_ACCOUNT_RULE_SIGNAL_KEYS, type UpdateAccountRuleSignals, type UpdateAccountScoreRequest, type UpdatePasswordScoreRequest, type WagerScoreRequest, WagerStatus, WalletType, buildScoreRequestPreview, findMetadataConflictWithTypedFields, isPlannedFraudEventType, isSupportedFraudEventType, normalizeScoreRequestForApi, normalizeSiftPaymentMethod, normalizeSiftPaymentMethods, normalizeSiftPaymentType, toSiftAccountNumberLast5, validateScoreRequest };
|
|
538
|
+
export { CHARGEBACK_FRAUD_EVENT_TYPE, type ChargebackFraudEventType, ChargebackReason, type ChargebackScoreRequest, type ChargebackScoreResponseData, ChargebackState, type CreateAccountScoreRequest, type CreateOrderScoreRequest, type FraudAlertCallbackEvent, type FraudCallbackTrigger, FraudClient, type FraudCustomMetadata, type FraudDecision, type FraudEventType, type FraudReactionType, type FraudRiskLevel, type FraudRuleSignalMetadata, type FraudScoreRequest, type FraudScoreRequestBase, type FraudScoreResponseData, type FraudScoreResponseEnvelope, type FraudScoreResponseMetadata, LOGIN_RULE_SIGNAL_KEYS, type LoginRuleSignals, type LoginScoreRequest, LoginStatus, type LogoutScoreRequest, PLANNED_FRAUD_EVENT_TYPES, PasswordUpdateReason, PasswordUpdateStatus, PaymentType, type PlannedFraudEventType, SCORED_FRAUD_EVENT_TYPES, SUPPORTED_FRAUD_EVENT_TYPES, type ScoredFraudEventType, type ScoredFraudScoreRequest, type SiftApp, type SiftBillingAddress, type SiftBrowser, type SiftChargebackReason, SiftChargebackReasonValues, type SiftChargebackState, SiftChargebackStateValues, type SiftLoginFailureReason, SiftLoginFailureReasonValues, type SiftLoginStatus, SiftLoginStatusValues, type SiftPassThroughMetadata, type SiftPasswordUpdateReason, SiftPasswordUpdateReasonValues, type SiftPasswordUpdateStatus, SiftPasswordUpdateStatusValues, type SiftPaymentMethod, type SiftPaymentType, SiftPaymentTypeValues, type SiftTransactionStatus, SiftTransactionStatusValues, type SiftTransactionType, SiftTransactionTypeValues, type SiftWagerStatus, SiftWagerStatusValues, type SiftWalletType, SiftWalletTypeValues, type SupportedFraudEventType, TRANSACTION_RULE_SIGNAL_KEYS, TYPED_SIFT_METADATA_KEYS, type TenantAction, type TransactionRuleSignals, type TransactionScoreRequest, TransactionStatus, TransactionType, UPDATE_ACCOUNT_RULE_SIGNAL_KEYS, type UpdateAccountRuleSignals, type UpdateAccountScoreRequest, type UpdatePasswordScoreRequest, type WagerScoreRequest, WagerStatus, WalletType, buildScoreRequestPreview, findMetadataConflictWithTypedFields, isFraudAlertCallbackEvent, isPlannedFraudEventType, isSupportedFraudEventType, normalizeScoreRequestForApi, normalizeSiftPaymentMethod, normalizeSiftPaymentMethods, normalizeSiftPaymentType, toSiftAccountNumberLast5, validateScoreRequest };
|
package/dist/index.d.ts
CHANGED
|
@@ -436,6 +436,60 @@ interface FraudScoreResponseEnvelope<T> {
|
|
|
436
436
|
metadata?: FraudScoreResponseMetadata;
|
|
437
437
|
timestamp: Timestamp;
|
|
438
438
|
}
|
|
439
|
+
/**
|
|
440
|
+
* How a `fraud.alert.callback` decision was produced.
|
|
441
|
+
*
|
|
442
|
+
* - `sync` — resolved inline with the `/fraud/score` call; confirms a decision
|
|
443
|
+
* the SDK response already returned.
|
|
444
|
+
* - `deferred` — a rule configured with deferred timing re-scored the event
|
|
445
|
+
* after a delay; the decision must be applied retroactively.
|
|
446
|
+
* - `event_triggered` — a later related event caused a re-score of the original.
|
|
447
|
+
*/
|
|
448
|
+
type FraudCallbackTrigger = 'sync' | 'deferred' | 'event_triggered' | (string & Record<string, never>);
|
|
449
|
+
/**
|
|
450
|
+
* Outbound webhook body delivered to a tenant's configured fraud webhook URL
|
|
451
|
+
* when a fraud rule resolves to a decision — including rules with **deferred**
|
|
452
|
+
* or **event-triggered** timing that cannot return a verdict inline with the
|
|
453
|
+
* `/fraud/score` call. Signed with `X-Webhook-Signature: sha256=<hex>`
|
|
454
|
+
* (HMAC-SHA256 of the raw body). See the Fraud Integration guide.
|
|
455
|
+
*/
|
|
456
|
+
interface FraudAlertCallbackEvent {
|
|
457
|
+
/** Unique event ID — dedup on this; duplicate delivery is possible. */
|
|
458
|
+
event_id: string;
|
|
459
|
+
/** Always `"fraud.alert.callback"` — the wire event type to dispatch on. */
|
|
460
|
+
event_type: 'fraud.alert.callback';
|
|
461
|
+
/** Event-bus aggregate key (alert ID when an alert exists, else the reference). */
|
|
462
|
+
aggregate_id: string;
|
|
463
|
+
tenant_id: string;
|
|
464
|
+
/** ISO 8601 timestamp of the decision. */
|
|
465
|
+
timestamp: Timestamp;
|
|
466
|
+
version?: number;
|
|
467
|
+
correlation_id?: string;
|
|
468
|
+
causation_id?: string;
|
|
469
|
+
user_id?: string;
|
|
470
|
+
/** Fraud reference (e.g. `"FRD-e4b108d7"`) — matches the sync score `reference`. */
|
|
471
|
+
reference: string;
|
|
472
|
+
/** Tenant customer ID the decision applies to. */
|
|
473
|
+
customer_id: string;
|
|
474
|
+
/** Originating Sift event type (`$create_account`, `$transaction`, …). */
|
|
475
|
+
source_event_type: SupportedFraudEventType | (string & Record<string, never>);
|
|
476
|
+
decision: FraudDecision;
|
|
477
|
+
risk_level: RiskLevel;
|
|
478
|
+
risk_score: number;
|
|
479
|
+
/** Whether the decision arrived inline (`sync`) or as a later re-score. */
|
|
480
|
+
trigger: FraudCallbackTrigger;
|
|
481
|
+
/**
|
|
482
|
+
* Tenant-scope reactions to apply on your platform — populated identically to
|
|
483
|
+
* the sync `/fraud/score` response's `tenant_actions`. Always an array (never
|
|
484
|
+
* null); empty when the rule resolved only to Vesant-scope reactions.
|
|
485
|
+
*/
|
|
486
|
+
tenant_actions: TenantAction[];
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Type guard for the deferred/async fraud webhook body. Narrows an already
|
|
490
|
+
* signature-verified, parsed payload to {@link FraudAlertCallbackEvent}.
|
|
491
|
+
*/
|
|
492
|
+
declare function isFraudAlertCallbackEvent(value: unknown): value is FraudAlertCallbackEvent;
|
|
439
493
|
|
|
440
494
|
/**
|
|
441
495
|
* Fraud scoring API client.
|
|
@@ -481,4 +535,4 @@ declare function normalizeSiftPaymentMethods(methods: SiftPaymentMethod[] | unde
|
|
|
481
535
|
metadata?: Record<string, unknown>;
|
|
482
536
|
};
|
|
483
537
|
|
|
484
|
-
export { CHARGEBACK_FRAUD_EVENT_TYPE, type ChargebackFraudEventType, ChargebackReason, type ChargebackScoreRequest, type ChargebackScoreResponseData, ChargebackState, type CreateAccountScoreRequest, type CreateOrderScoreRequest, FraudClient, type FraudCustomMetadata, type FraudDecision, type FraudEventType, type FraudReactionType, type FraudRiskLevel, type FraudRuleSignalMetadata, type FraudScoreRequest, type FraudScoreRequestBase, type FraudScoreResponseData, type FraudScoreResponseEnvelope, type FraudScoreResponseMetadata, LOGIN_RULE_SIGNAL_KEYS, type LoginRuleSignals, type LoginScoreRequest, LoginStatus, type LogoutScoreRequest, PLANNED_FRAUD_EVENT_TYPES, PasswordUpdateReason, PasswordUpdateStatus, PaymentType, type PlannedFraudEventType, SCORED_FRAUD_EVENT_TYPES, SUPPORTED_FRAUD_EVENT_TYPES, type ScoredFraudEventType, type ScoredFraudScoreRequest, type SiftApp, type SiftBillingAddress, type SiftBrowser, type SiftChargebackReason, SiftChargebackReasonValues, type SiftChargebackState, SiftChargebackStateValues, type SiftLoginFailureReason, SiftLoginFailureReasonValues, type SiftLoginStatus, SiftLoginStatusValues, type SiftPassThroughMetadata, type SiftPasswordUpdateReason, SiftPasswordUpdateReasonValues, type SiftPasswordUpdateStatus, SiftPasswordUpdateStatusValues, type SiftPaymentMethod, type SiftPaymentType, SiftPaymentTypeValues, type SiftTransactionStatus, SiftTransactionStatusValues, type SiftTransactionType, SiftTransactionTypeValues, type SiftWagerStatus, SiftWagerStatusValues, type SiftWalletType, SiftWalletTypeValues, type SupportedFraudEventType, TRANSACTION_RULE_SIGNAL_KEYS, TYPED_SIFT_METADATA_KEYS, type TenantAction, type TransactionRuleSignals, type TransactionScoreRequest, TransactionStatus, TransactionType, UPDATE_ACCOUNT_RULE_SIGNAL_KEYS, type UpdateAccountRuleSignals, type UpdateAccountScoreRequest, type UpdatePasswordScoreRequest, type WagerScoreRequest, WagerStatus, WalletType, buildScoreRequestPreview, findMetadataConflictWithTypedFields, isPlannedFraudEventType, isSupportedFraudEventType, normalizeScoreRequestForApi, normalizeSiftPaymentMethod, normalizeSiftPaymentMethods, normalizeSiftPaymentType, toSiftAccountNumberLast5, validateScoreRequest };
|
|
538
|
+
export { CHARGEBACK_FRAUD_EVENT_TYPE, type ChargebackFraudEventType, ChargebackReason, type ChargebackScoreRequest, type ChargebackScoreResponseData, ChargebackState, type CreateAccountScoreRequest, type CreateOrderScoreRequest, type FraudAlertCallbackEvent, type FraudCallbackTrigger, FraudClient, type FraudCustomMetadata, type FraudDecision, type FraudEventType, type FraudReactionType, type FraudRiskLevel, type FraudRuleSignalMetadata, type FraudScoreRequest, type FraudScoreRequestBase, type FraudScoreResponseData, type FraudScoreResponseEnvelope, type FraudScoreResponseMetadata, LOGIN_RULE_SIGNAL_KEYS, type LoginRuleSignals, type LoginScoreRequest, LoginStatus, type LogoutScoreRequest, PLANNED_FRAUD_EVENT_TYPES, PasswordUpdateReason, PasswordUpdateStatus, PaymentType, type PlannedFraudEventType, SCORED_FRAUD_EVENT_TYPES, SUPPORTED_FRAUD_EVENT_TYPES, type ScoredFraudEventType, type ScoredFraudScoreRequest, type SiftApp, type SiftBillingAddress, type SiftBrowser, type SiftChargebackReason, SiftChargebackReasonValues, type SiftChargebackState, SiftChargebackStateValues, type SiftLoginFailureReason, SiftLoginFailureReasonValues, type SiftLoginStatus, SiftLoginStatusValues, type SiftPassThroughMetadata, type SiftPasswordUpdateReason, SiftPasswordUpdateReasonValues, type SiftPasswordUpdateStatus, SiftPasswordUpdateStatusValues, type SiftPaymentMethod, type SiftPaymentType, SiftPaymentTypeValues, type SiftTransactionStatus, SiftTransactionStatusValues, type SiftTransactionType, SiftTransactionTypeValues, type SiftWagerStatus, SiftWagerStatusValues, type SiftWalletType, SiftWalletTypeValues, type SupportedFraudEventType, TRANSACTION_RULE_SIGNAL_KEYS, TYPED_SIFT_METADATA_KEYS, type TenantAction, type TransactionRuleSignals, type TransactionScoreRequest, TransactionStatus, TransactionType, UPDATE_ACCOUNT_RULE_SIGNAL_KEYS, type UpdateAccountRuleSignals, type UpdateAccountScoreRequest, type UpdatePasswordScoreRequest, type WagerScoreRequest, WagerStatus, WalletType, buildScoreRequestPreview, findMetadataConflictWithTypedFields, isFraudAlertCallbackEvent, isPlannedFraudEventType, isSupportedFraudEventType, normalizeScoreRequestForApi, normalizeSiftPaymentMethod, normalizeSiftPaymentMethods, normalizeSiftPaymentType, toSiftAccountNumberLast5, validateScoreRequest };
|
package/dist/index.js
CHANGED
|
@@ -1057,6 +1057,11 @@ var FraudClient = class extends core.BaseClient {
|
|
|
1057
1057
|
}
|
|
1058
1058
|
};
|
|
1059
1059
|
|
|
1060
|
+
// src/types.ts
|
|
1061
|
+
function isFraudAlertCallbackEvent(value) {
|
|
1062
|
+
return typeof value === "object" && value !== null && value.event_type === "fraud.alert.callback";
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1060
1065
|
exports.CHARGEBACK_FRAUD_EVENT_TYPE = CHARGEBACK_FRAUD_EVENT_TYPE;
|
|
1061
1066
|
exports.ChargebackReason = ChargebackReason;
|
|
1062
1067
|
exports.ChargebackState = ChargebackState;
|
|
@@ -1089,6 +1094,7 @@ exports.WagerStatus = WagerStatus;
|
|
|
1089
1094
|
exports.WalletType = WalletType;
|
|
1090
1095
|
exports.buildScoreRequestPreview = buildScoreRequestPreview;
|
|
1091
1096
|
exports.findMetadataConflictWithTypedFields = findMetadataConflictWithTypedFields;
|
|
1097
|
+
exports.isFraudAlertCallbackEvent = isFraudAlertCallbackEvent;
|
|
1092
1098
|
exports.isPlannedFraudEventType = isPlannedFraudEventType;
|
|
1093
1099
|
exports.isSupportedFraudEventType = isSupportedFraudEventType;
|
|
1094
1100
|
exports.normalizeScoreRequestForApi = normalizeScoreRequestForApi;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/enums.ts","../src/types/rule-signals.ts","../src/normalization/payment-methods.ts","../src/normalization/sift-keys.ts","../src/normalization/normalize.ts","../src/normalization/preview.ts","../src/types/events.ts","../src/types/metadata.ts","../src/validation/helpers.ts","../src/validation/rules.ts","../src/client.ts"],"names":["rawType","ValidationError","BaseClient"],"mappings":";;;;;;;AAkBO,IAAM,yBAAA,GAA4B;AAAA,EACvC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,OAAA;AAAA,EACN,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,WAAA;AAAA,EACV,GAAA,EAAK,MAAA;AAAA,EACL,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS;AACX;AASO,IAAM,yBAAA,GAA4B;AAAA,EACvC,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,WAAA;AAAA,EACV,GAAA,EAAK,MAAA;AAAA,EACL,IAAA,EAAM;AACR;AAgBO,IAAM,0BAAA,GAA6B;AAAA,EACxC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,uBAAA;AAAA,EACA,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF;AAEO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,KAAA,EAAO,QAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,kBAAA,EAAoB,uBAAA;AAAA,EACpB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,aAAA,EAAe,gBAAA;AAAA,EACf,gBAAA,EAAkB,oBAAA;AAAA,EAClB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,aAAA,EAAe,iBAAA;AAAA,EACf,SAAA,EAAW,aAAA;AAAA,EACX,WAAA,EAAa,eAAA;AAAA,EACb,KAAA,EAAO;AACT;AAIO,IAAM,qBAAA,GAAwB,CAAC,UAAA,EAAY,UAAU;AAErD,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS;AACX;AAQO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;AAOO,IAAM,8BAAA,GAAiC;AAAA,EAC5C,cAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF;AAEO,IAAM,oBAAA,GAAuB;AAAA,EAClC,UAAA,EAAY,+BAA+B,CAAC,CAAA;AAAA,EAC5C,cAAA,EAAgB,+BAA+B,CAAC,CAAA;AAAA,EAChD,WAAA,EAAa,+BAA+B,CAAC;AAC/C;AAIO,IAAM,8BAAA,GAAiC;AAAA,EAC5C,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAEO,IAAM,oBAAA,GAAuB;AAAA,EAClC,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS;AACX;AAIO,IAAM,qBAAA,GAAwB,CAAC,SAAA,EAAW,SAAS;AAEnD,IAAM,WAAA,GAAc;AAAA,EACzB,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ;AACV;AAIO,IAAM,2BAAA,GAA8B;AAAA,EACzC,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS,UAAA;AAAA,EACT,OAAA,EAAS;AACX;AA4BO,IAAM,qBAAA,GAAwB;AAAA,EACnC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,2BAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,UAAA,EAAY,cAAA;AAAA,EACZ,cAAA,EAAgB,kBAAA;AAAA,EAChB,SAAA,EAAW,aAAA;AAAA,EACX,aAAA,EAAe,iBAAA;AAAA,EACf,sBAAA,EAAwB,2BAAA;AAAA,EACxB,SAAA,EAAW,YAAA;AAAA,EACX,QAAA,EAAU,YAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,aAAA,EAAe,kBAAA;AAAA,EACf,UAAA,EAAY,cAAA;AAAA,EACZ,MAAA,EAAQ,SAAA;AAAA,EACR,WAAA,EAAa,eAAA;AAAA,EACb,WAAA,EAAa,eAAA;AAAA,EACb,mBAAA,EAAqB,wBAAA;AAAA,EACrB,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,cAAA;AAAA,EACZ,iBAAA,EAAmB,sBAAA;AAAA,EACnB,eAAA,EAAiB,oBAAA;AAAA,EACjB,SAAA,EAAW,aAAA;AAAA,EACX,QAAA,EAAU,YAAA;AAAA,EACV,UAAA,EAAY,cAAA;AAAA,EACZ,SAAA,EAAW;AACb;AAIO,IAAM,oBAAA,GAAuB,CAAC,SAAA,EAAW,UAAA,EAAY,OAAO;AAE5D,IAAM,UAAA,GAAa;AAAA,EACxB,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM;AACR;;;AC1PO,IAAM,sBAAA,GAAyB,CAAC,qBAAqB;AAErD,IAAM,+BAAA,GAAkC;AAAA,EAC7C,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;AAEO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,2BAAA;AAAA,EACA,eAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA,2BAAA;AAAA,EACA,8BAAA;AAAA,EACA,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF;;;AC/CA,IAAM,oBAAA,GAAwD;AAAA,EAC5D,YAAA,EAAc,2BAAA;AAAA,EACd,wBAAA,EAA0B,2BAAA;AAAA,EAC1B,WAAA,EAAa,cAAA;AAAA,EACb,eAAA,EAAiB,kBAAA;AAAA,EACjB,UAAA,EAAY,aAAA;AAAA,EACZ,cAAA,EAAgB,iBAAA;AAAA,EAChB,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,UAAA;AAAA,EACT,eAAA,EAAiB,kBAAA;AAAA,EACjB,WAAA,EAAa,cAAA;AAAA,EACb,MAAA,EAAQ,SAAA;AAAA,EACR,YAAA,EAAc,eAAA;AAAA,EACd,YAAA,EAAc,eAAA;AAAA,EACd,qBAAA,EAAuB,wBAAA;AAAA,EACvB,OAAA,EAAS,UAAA;AAAA,EACT,WAAA,EAAa,cAAA;AAAA,EACb,mBAAA,EAAqB,sBAAA;AAAA,EACrB,iBAAA,EAAmB,oBAAA;AAAA,EACnB,UAAA,EAAY,aAAA;AAAA,EACZ,SAAA,EAAW,YAAA;AAAA,EACX,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,6BAAA,uBAAoC,GAAA,CAAI;AAAA,EAC5C,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,8BAAA,GAAiC;AAAA,EACrC,sBAAA;AAAA,EACA,YAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,YAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,gBAAA,GAA4B;AACnC,EAAA,OAAO,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,KAAK,QAAA,KAAa,YAAA;AACrE;AAEA,SAAS,kBAAkB,GAAA,EAAmB;AAC5C,EAAA,IAAI,CAAC,kBAAiB,EAAG;AACzB,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,oBAAA,EACE,uFAAA;AAAA,IACF,UAAA,EAAY,sEAAA;AAAA,IACZ,oBAAA,EACE,gFAAA;AAAA,IACF,eAAA,EACE,6FAAA;AAAA,IACF,OAAA,EAAS;AAAA,GACX;AACA,EAAA,MAAM,OAAA,GAAU,SAAS,GAAG,CAAA;AAC5B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EACtB;AACF;AAMO,SAAS,yBACd,KAAA,EAC6B;AAC7B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAK;AACnC,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,MAAA;AAE3B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,CAAW,GAAG,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,OAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,UAAA,CAAW,WAAA,EAAa,CAAA;AAC3D,EAAA,IAAI,OAAO,OAAO,KAAA;AAElB,EAAA,MAAM,UAAA,GAAa,IAAI,UAAU,CAAA,CAAA;AACjC,EAAA,IAAK,qBAAA,CAA4C,QAAA,CAAS,UAAU,CAAA,EAAG;AACrE,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,yBAAyB,KAAA,EAAoC;AAC3E,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,MAAM,SAAS,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC9C,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAChC,EAAA,IAAI,OAAO,MAAA,IAAU,CAAA,EAAG,OAAO,MAAA,CAAO,MAAM,EAAE,CAAA;AAC9C,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAC/B;AAOA,SAAS,oBAAA,CACP,cAAA,EACA,GAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,cAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AACxB;AAKO,SAAS,2BACd,GAAA,EACqC;AACrC,EAAA,MAAM,iBAA0C,EAAC;AACjD,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,MAAM,cAAA,GACJ,GAAA,CAAI,YAAA,KAAiB,MAAA,GACjB,OAAO,GAAA,CAAI,YAAY,CAAA,GACvB,GAAA,CAAI,aAAA,KAAkB,MAAA,GACpB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,GACxB,MAAA;AAER,EAAA,MAAM,cAAA,GAAiB,yBAAyB,cAAc,CAAA;AAC9D,EAAA,IAAI,cAAA,KAAmB,MAAA,IAAa,cAAA,KAAmB,MAAA,EAAW;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,IAAA,MAAA,CAAO,YAAA,GAAe,cAAA;AAAA,EACxB;AAEA,EAAA,KAAA,MAAW,OAAO,8BAAA,EAAgC;AAChD,IAAA,IAAI,GAAA,IAAO,GAAA,EAAK,iBAAA,CAAkB,GAAG,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,oBAAA,IAAwB,GAAA,CAAI,qBAAA;AACrD,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,oBAAA,IAAwB,GAAA,CAAI,qBAAA;AACrD,EAAA,MAAM,aAAA,GAAgB,wBAAA,CAAyB,YAAA,IAAgB,YAAY,CAAA;AAC3E,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,MAAA,CAAO,oBAAA,GAAuB,aAAA;AAAA,EAChC;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,GAAA,KAAQ,cAAA,IAAkB,GAAA,KAAQ,eAAA,EAAiB;AACvD,IAAA,IAAI,GAAA,KAAQ,sBAAA,IAA0B,GAAA,KAAQ,uBAAA,EAAyB;AACvE,IAAA,IAAI,GAAA,KAAQ,sBAAA,IAA0B,GAAA,KAAQ,uBAAA,EAAyB;AAEvE,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAEtD,IAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,oBAAA,CAAqB,cAAA,EAAgB,sBAAA,EAAwB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC5E,CAAA,MAAO;AACL,QAAA,oBAAA,CAAqB,cAAA,EAAgB,UAAU,KAAK,CAAA;AAAA,MACtD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,6BAAA,CAA8B,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChD,MAAA,oBAAA,CAAqB,cAAA,EAAgB,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA;AAAA,EACrB;AAEA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,cAAc,EAAE,MAAA,GAAS,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,GAAI,WAAA,GAAc,EAAE,cAAA,KAAmB;AAAC,GAC1C;AACF;AAEA,SAAS,eAAA,CACP,QACA,SAAA,EACM;AACN,EAAA,MAAM,WAAW,MAAA,CAAO,qBAAA;AACxB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,oBAAA,KAAyB,QAAA,EAAU;AACnD,IAAA,MAAA,CAAO,qBAAA,GAAwB,CAAC,MAAA,CAAO,oBAAA,EAAsB,SAAS,CAAA;AACtE,IAAA,OAAO,MAAA,CAAO,oBAAA;AACd,IAAA;AAAA,EACF;AACA,EAAA,MAAA,CAAO,oBAAA,GAAuB,SAAA;AAChC;AAKO,SAAS,4BACd,OAAA,EAC+E;AAC/E,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,OAAO,EAAC;AAEnC,EAAA,MAAM,aAAkC,EAAC;AACzC,EAAA,MAAM,WAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,MAAA,GAAS,2BAA2B,GAA8B,CAAA;AACxE,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,UAAA,CAAW,IAAA,CAAK,OAAO,MAAM,CAAA;AAE7B,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA,EAAG;AAChE,QAAA,IAAI,GAAA,KAAQ,sBAAA,IAA0B,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/D,UAAA,eAAA,CAAgB,UAAU,KAAK,CAAA;AAAA,QACjC,CAAA,MAAA,IAAW,GAAA,IAAO,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAC,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClF,UAAA,QAAA,CAAS,GAAG,IAAI,CAAC,GAAI,SAAS,GAAG,CAAA,EAAiB,GAAG,KAAK,CAAA;AAAA,QAC5D,CAAA,MAAA,IAAW,EAAE,GAAA,IAAO,QAAA,CAAA,EAAW;AAC7B,UAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,GAAS,CAAA;AACnD,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,UAAA;AAAA,IACjB,GAAI,WAAA,GAAc,EAAE,QAAA,KAAa;AAAC,GACpC;AACF;;;AChQA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,OAAO,IAAI,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA;AAC5C;AAKO,SAAS,kBAAkB,KAAA,EAAyB;AACzD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC5E,MAAA,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAC,CAAA,GAAI,kBAAkB,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;;;ACPA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,YAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,2BAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,2BAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,aAAA,CACP,MACA,MAAA,EACqB;AACrB,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,MAAA,EAAO;AAC9B;AAEA,SAAS,kBAAA,CACP,SACA,IAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,OAAA,EAAQ;AAC1B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,OAAO,KAAK,GAAG,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAA,CACP,IAAA,EACA,QAAA,EACA,SAAA,EACyB;AACzB,EAAA,OAAO,kBAAA;AAAA,IACL,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,cAAc,QAAA,EAAU,EAAE,CAAA,EAAE;AAAA,IACjD;AAAA,GACF;AACF;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,QAAA,EACA,YAAA,EACA,mBAAmB,KAAA,EACM;AACzB,EAAA,IAAI,CAAC,gBAAA,IAAoB,MAAA,CAAO,KAAK,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AAC7D,IAAA,IAAA,CAAK,QAAA,GAAW,aAAA,CAAc,QAAA,EAAU,YAAY,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAA,CACP,SACA,IAAA,EACqB;AACrB,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,sBAAsB,IAAA,EAAoD;AACjF,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,yBAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAEJ,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,GAAK,YAAgD;AAAC,GACxD;AAEA,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,YAAA,CAAa,WAAA,GAAc,UAAA;AACzD,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,YAAA,CAAa,WAAA,GAAc,UAAA;AACzD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,KAAA,GAAQ,IAAA;AAC7C,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,MAAA,GAAS,KAAA;AAE/C,EAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,IAAA,IAAI,iCAAA,EAAmC;AACrC,MAAA,YAAA,CAAa,eAAA,GAAkB,kBAAkB,mBAAmB,CAAA;AAAA,IACtE,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,0BAAA;AAAA,QACb;AAAA,OACF;AACA,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,YAAA,CAAa,eAAA,GAAkB,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA;AAC9D,QAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,UAAA,MAAA,CAAO,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,cAAc,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,IAAI,iCAAA,EAAmC;AACrC,MAAA,YAAA,CAAa,gBAAA,GAAmB,kBAAkB,eAAe,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,eAAA,EAAiB,UAAA,EAAY,QAAA,EAAU,YAAW,GAAI,2BAAA;AAAA,QAC5D;AAAA,OACF;AACA,MAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,QAAA,YAAA,CAAa,gBAAA,GAAmB,kBAAkB,UAAU,CAAA;AAAA,MAC9D;AACA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,MAAA,CAAO,cAAc,UAAU,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,YAAA,CAAa,gBAAA,GAAmB,kBAAkB,eAAe,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,IAAA,YAAA,CAAa,iBAAA,GAAoB,kBAAkB,gBAAgB,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,YAAA,CAAa,IAAA,GAAO,kBAAkB,GAAG,CAAA;AAChE,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,YAAA,CAAa,QAAA,GAAW,kBAAkB,OAAO,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,UAAA,KAAe,eAAA,IAAmB,UAAA,KAAe,iBAAA,EAAmB;AACtE,IAAA,IAAI,8BAA8B,MAAA,EAAW;AAC3C,MAAA,YAAA,CAAa,0BAAA,GAA6B,yBAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,IAAI,QAAA,KAAa,MAAA,EAAW,YAAA,CAAa,SAAA,GAAY,QAAA;AACrD,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,YAAA,CAAa,OAAA,GAAU,MAAA;AACjD,IAAA,IAAI,aAAA,KAAkB,MAAA,EAAW,YAAA,CAAa,cAAA,GAAiB,aAAA;AAC/D,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,YAAA,CAAa,cAAA,GAAiB,kBAAkB,aAAa,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,kBAAA,KAAuB,MAAA,EAAW,YAAA,CAAa,mBAAA,GAAsB,kBAAA;AACzE,IAAA,IAAI,eAAA,KAAoB,MAAA,EAAW,YAAA,CAAa,gBAAA,GAAmB,eAAA;AACnE,IAAA,IAAI,gBAAA,KAAqB,MAAA,EAAW,YAAA,CAAa,iBAAA,GAAoB,gBAAA;AACrE,IAAA,IAAI,8BAA8B,MAAA,EAAW;AAC3C,MAAA,YAAA,CAAa,0BAAA,GAA6B,yBAAA;AAAA,IAC5C;AACA,IAAA,IAAI,UAAA,KAAe,MAAA,EAAW,YAAA,CAAa,WAAA,GAAc,UAAA;AACzD,IAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,YAAA,CAAa,aAAA,GAAgB,YAAA;AAC7D,IAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,YAAA,CAAa,YAAA,GAAe,WAAA;AAC3D,IAAA,IAAI,EAAA,KAAO,MAAA,EAAW,YAAA,CAAa,GAAA,GAAM,EAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,wBAAwB,IAAA,EAAwD;AACvF,EAAA,MAAM,YAAA,GAAe,sBAAsB,IAAI,CAAA;AAC/C,EAAA,MAAM,WAAW,kBAAA,CAAmB,IAAA,EAAM,CAAC,GAAG,oBAAoB,CAAC,CAAA;AAEnE,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACxC,IAAA,QAAA,CAAS,QAAA,GAAW,YAAA;AAAA,EACtB;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,OAAA,EACA,IAAA,EACA,SAAA,EACyB;AACzB,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,EAAS,IAAI,CAAA;AACpD,EAAA,MAAM,WAAW,kBAAA,CAAmB,IAAA,EAAM,CAAC,GAAG,SAAS,CAAC,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AACvC,IAAA,QAAA,CAAS,QAAA,GAAW,aAAA;AAAA,MAClB,QAAA,CAAS,QAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,wBACP,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAiB,QAAA,EAAU,GAAG,MAAK,GAAI,OAAA;AAChE,EAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAiC,QAAA,EAAU;AAAA,IACvE,iBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,OAAA,EAAS,mBAAmB,oBAAA,CAAqB,UAAA;AAAA,IACjD,OAAA,EAAS,mBAAmB,oBAAA,CAAqB;AAAA,GACnD;AACA,EAAA,IAAA,GAAO,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,YAAY,CAAA;AACrD,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAEA,SAAS,eACP,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,YAAY,YAAA,EAAc,gBAAA,EAAkB,kBAAkB,cAAA,EAAgB,QAAA,EAAU,GAAG,IAAA,EAAK,GACtG,OAAA;AACF,EAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAiC,QAAA,EAAU;AAAA,IACvE,YAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,WAAA,EAAa,UAAA;AAAA,IACb,aAAA,EAAe;AAAA,GACjB;AACA,EAAA,IAAI,gBAAA,eAA+B,iBAAA,GAAoB,gBAAA;AACvD,EAAA,IAAI,gBAAA,eAA+B,iBAAA,GAAoB,gBAAA;AACvD,EAAA,IAAI,cAAA,eAA6B,eAAA,GAAkB,cAAA;AACnD,EAAA,IAAA,GAAO,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,YAAY,CAAA;AACrD,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAEA,SAAS,eACP,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,YAAA,EAAc,oBAAA,EAAsB,QAAA,EAAU,GAAG,MAAK,GAAI,OAAA;AAClE,EAAA,MAAM,eAAA,GAAkB,gBAAgB,WAAA,CAAY,OAAA;AACpD,EAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAiC,QAAA,EAAU;AAAA,IACvE,cAAA;AAAA,IACA,sBAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACD,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,aAAA,EAAe;AAAA,GACjB;AACA,EAAA,IAAI,eAAA,KAAoB,WAAA,CAAY,OAAA,IAAW,oBAAA,EAAsB;AACnE,IAAA,YAAA,CAAa,eAAA,GAAkB,oBAAA;AAAA,EACjC;AACA,EAAA,IAAA,GAAO,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,YAAY,CAAA;AACrD,EAAA,IAAA,GAAO,gBAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAEA,SAAS,qBACP,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,kBAAA,EAAoB,gBAAA,EAAkB,4BAA4B,QAAA,EAAU,GAAG,MAAK,GAC1F,OAAA;AACF,EAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAiC,QAAA,EAAU;AAAA,IACvE,oBAAA;AAAA,IACA,kBAAA;AAAA,IACA,4BAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACD,EAAA,MAAM,eAAoC,EAAC;AAC3C,EAAA,IAAI,kBAAA,eAAiC,mBAAA,GAAsB,kBAAA;AAC3D,EAAA,IAAI,gBAAA,eAA+B,iBAAA,GAAoB,gBAAA;AACvD,EAAA,IAAI,0BAAA,EAA4B;AAC9B,IAAA,YAAA,CAAa,2BAAA,GAA8B,0BAAA;AAAA,EAC7C;AACA,EAAA,IAAA,GAAO,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AAC3D,EAAA,IAAA,GAAO,gBAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,4BAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAEA,SAAS,uBACP,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,OAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAiC,QAAA,EAAU;AAAA,IACvE,GAAG;AAAA,GACJ,CAAA;AACD,EAAA,IAAA,GAAO,gBAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,+BAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAEA,SAAS,qBACP,OAAA,EACyB;AACzB,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAG,MAAK,GAAI,OAAA;AACrD,EAAA,IAAI,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAiC,QAAA,EAAU;AAAA,IACvE,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAA,GAAoC;AAAA,IACxC,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB;AAAA,GAClB;AACA,EAAA,IAAA,GAAO,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,YAAY,CAAA;AACrD,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAEA,SAAS,iBAAiB,OAAA,EAAqD;AAC7E,EAAA,OAAO,uBAAA,CAAwB,EAAE,GAAG,OAAA,EAAoC,CAAA;AAC1E;AAEO,SAAS,4BAA4B,OAAA,EAAqD;AAC/F,EAAA,QAAQ,QAAQ,UAAA;AAAY,IAC1B,KAAK,kBAAA;AACH,MAAA,OAAO,wBAAwB,OAAO,CAAA;AAAA,IACxC,KAAK,QAAA;AACH,MAAA,OAAO,eAAe,OAAO,CAAA;AAAA,IAC/B,KAAK,QAAA;AACH,MAAA,OAAO,eAAe,OAAO,CAAA;AAAA,IAC/B,KAAK,cAAA;AACH,MAAA,OAAO,qBAAqB,OAAO,CAAA;AAAA,IACrC,KAAK,iBAAA;AACH,MAAA,OAAO,uBAAuB,OAAO,CAAA;AAAA,IACvC,KAAK,eAAA;AACH,MAAA,OAAO,qBAAqB,OAAO,CAAA;AAAA,IACrC;AACE,MAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA;AAErC;;;AChXO,SAAS,yBAAyB,OAAA,EAAqD;AAC5F,EAAA,OAAO,4BAA4B,OAAO,CAAA;AAC5C;;;ACYO,IAAM,wBAAA,GAA4D;AAAA,EACvE,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF;AAEO,IAAM,2BAAA,GAA8B;AAEpC,IAAM,2BAAA,GAAkE;AAAA,EAC7E,GAAG,wBAAA;AAAA,EACH;AACF;AAEO,IAAM,yBAAA,GAA4B;AAAA,EACvC,eAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF;AAaO,SAAS,wBACd,SAAA,EACyD;AACzD,EAAA,OAAQ,yBAAA,CAAgD,SAAS,SAAS,CAAA;AAC5E;AAEO,SAAS,0BACd,SAAA,EACsC;AACtC,EAAA,OAAQ,2BAAA,CAAkD,SAAS,SAAS,CAAA;AAC9E;;;ACjCO,IAAM,wBAAA,GAA6D;AAAA,EACxE,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY,aAAA;AAAA,EACZ,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,mBAAA,EAAqB,iBAAA;AAAA,EACrB,eAAA,EAAiB,kBAAA;AAAA,EACjB,eAAA,EAAiB,kBAAA;AAAA,EACjB,GAAA,EAAK,MAAA;AAAA,EACL,yBAAA,EAA2B,4BAAA;AAAA,EAC3B,QAAA,EAAU,WAAA;AAAA,EACV,aAAA,EAAe,gBAAA;AAAA,EACf,gBAAA,EAAkB,mBAAA;AAAA,EAClB,kBAAA,EAAoB,qBAAA;AAAA,EACpB,eAAA,EAAiB,kBAAA;AAAA,EACjB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,yBAAA,EAA2B,4BAAA;AAAA,EAC3B,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,eAAA;AAAA,EACd,WAAA,EAAa,cAAA;AAAA,EACb,EAAA,EAAI;AACN;AAEO,SAAS,mCAAA,CACd,UACA,OAAA,EACoB;AACpB,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,wBAAwB,CAAA,EAAG;AACvE,IAAA,IAAI,QAAQ,KAAK,CAAA,KAAM,UAAa,QAAA,CAAS,OAAO,MAAM,MAAA,EAAW;AACnE,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;AClEO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,OAAO,KAAA,KAAU,MAAA,GAAY,EAAA,GAAK,CAAA,SAAA,EAAY,KAAK,CAAA,EAAA,CAAA;AACrD;AAEO,SAAS,cAAA,CACd,KAAA,EACA,KAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,CAAA,YAAA,CAAc,CAAA;AAAA,EAC7C;AACF;AAEO,SAAS,UAAA,CACd,KAAA,EACA,OAAA,EACA,KAAA,EACA,QACA,MAAA,EACM;AACN,EAAA,IAAI,UAAU,MAAA,EAAW;AACzB,EAAA,IAAI,CAAE,OAAA,CAA8B,QAAA,CAAS,KAAK,CAAA,EAAG;AACnD,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,oBAAoB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACvE;AACF;AAEO,SAAS,oBAAA,CACd,MAAA,EACA,KAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,IAAU,CAAA,EAAG;AACvC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,CAAA,uBAAA,CAAyB,CAAA;AAAA,EACxD;AACF;AAEO,SAAS,gBAAA,CACd,QAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,MAAM,WAAA,GAAc,mCAAA;AAAA,IAClB,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,WAAW,kFAAkF,WAAW,CAAA,0BAAA;AAAA,KAC/H;AAAA,EACF;AACF;;;AC3BA,IAAM,kBAAA,GAAqB,mBAAA;AAE3B,SAAS,sBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,EAAE,eAAA,EAAiB,iCAAA,EAAmC,iBAAA,EAAkB,GAAI,OAAA;AAElF,EAAA,IAAI,oBAAoB,MAAA,EAAW;AAEnC,EAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,4DAAA,CAA8D,CAAA;AACnF,IAAA;AAAA,EACF;AAEA,EAAA,eAAA,CAAgB,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACzC,IAAA,MAAM,GAAA,GAAM,MAAA;AAEZ,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,QAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACtD,QAAA,IAAI,CAAC,6BAAA,CAA8B,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChD,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,CAAA,EAAG,MAAM,CAAA,gBAAA,EAAmB,KAAK,KAAK,QAAQ,CAAA,yCAAA;AAAA,WAChD;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAMA,WACJ,GAAA,CAAI,YAAA,KAAiB,SAAY,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,GAAI,MAAA;AAC9D,MAAA,IAAIA,QAAAA,KAAY,MAAA,IAAa,wBAAA,CAAyBA,QAAO,MAAM,MAAA,EAAW;AAC5E,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAG,MAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,+CAAA;AAAA,SACnC;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GACJ,GAAA,CAAI,YAAA,KAAiB,MAAA,GACjB,OAAO,GAAA,CAAI,YAAY,CAAA,GACvB,GAAA,CAAI,aAAA,KAAkB,MAAA,GACpB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,GACxB,MAAA;AAER,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,MAAM,MAAA,GAAS,2BAA2B,GAAG,CAAA;AAC7C,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAG,MAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,+CAAA;AAAA,SACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,YAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,cAAA,CAAe,OAAA,CAAQ,WAAA,EAAa,aAAA,EAAe,MAAA,EAAQ,MAAM,CAAA;AACjE,EAAA,cAAA,CAAe,OAAA,CAAQ,YAAA,EAAc,cAAA,EAAgB,MAAA,EAAQ,MAAM,CAAA;AACnE,EAAA,cAAA,CAAe,OAAA,CAAQ,UAAA,EAAY,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA;AAC/D,EAAA,gBAAA,CAAiB,OAAA,CAAQ,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAC5D;AAEA,SAAS,aAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,UAAA,CAAW,OAAA,CAAQ,YAAA,EAAc,qBAAA,EAAuB,cAAA,EAAgB,QAAQ,MAAM,CAAA;AACtF,EAAA,IAAI,OAAA,CAAQ,yBAAyB,MAAA,EAAW;AAC9C,IAAA,IAAI,OAAA,CAAQ,iBAAiB,UAAA,EAAY;AACvC,MAAA,UAAA;AAAA,QACE,OAAA,CAAQ,oBAAA;AAAA,QACR,4BAAA;AAAA,QACA,sBAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,oEAAA,CAAsE,CAAA;AAAA,IAC7F;AAAA,EACF;AACF;AAEA,SAAS,sBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,UAAA;AAAA,IACE,OAAA,CAAQ,eAAA;AAAA,IACR,8BAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,UAAA;AAAA,IACE,OAAA,CAAQ,eAAA;AAAA,IACR,8BAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,mBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,oBAAA,CAAqB,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAC7D,EAAA,cAAA,CAAe,OAAA,CAAQ,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA;AAC3D,EAAA,UAAA,CAAW,OAAA,CAAQ,gBAAA,EAAkB,yBAAA,EAA2B,kBAAA,EAAoB,QAAQ,MAAM,CAAA;AAClG,EAAA,UAAA;AAAA,IACE,OAAA,CAAQ,kBAAA;AAAA,IACR,2BAAA;AAAA,IACA,oBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,OAAA,CAAQ,gBAAA,KAAqB,MAAA,IAAa,OAAA,CAAQ,uBAAuB,UAAA,EAAY;AACvF,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,GAAG,MAAM,CAAA,sEAAA;AAAA,KACX;AAAA,EACF;AAEA,EAAA,IACE,QAAQ,0BAAA,KAA+B,MAAA,IACvC,OAAA,CAAQ,gBAAA,KAAqB,gBAAgB,QAAA,EAC7C;AACA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,GAAG,MAAM,CAAA,+EAAA;AAAA,KACX;AAAA,EACF;AACF;AAEA,SAAS,aAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,cAAA,CAAe,OAAA,CAAQ,cAAA,EAAgB,gBAAA,EAAkB,MAAA,EAAQ,MAAM,CAAA;AACvE,EAAA,cAAA,CAAe,OAAA,CAAQ,UAAA,EAAY,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA;AAC/D,EAAA,UAAA,CAAW,OAAA,CAAQ,YAAA,EAAc,qBAAA,EAAuB,cAAA,EAAgB,QAAQ,MAAM,CAAA;AACtF,EAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,EACjD;AACA,EAAA,oBAAA,CAAqB,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAC7D,EAAA,cAAA,CAAe,OAAA,CAAQ,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA;AAC7D;AAEA,SAAS,qBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,sBAAA,CAAuB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAChD;AAEA,SAAS,qBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,sBAAA,CAAuB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAE9C,EAAA,IAAI,OAAA,CAAQ,8BAA8B,MAAA,EAAW;AACnD,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,QAAQ,yBAAA,CAA0B,IAAA,EAAM,CAAA,EAAG;AACtE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,2DAAA,CAA6D,CAAA;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,mBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,oBAAA,CAAqB,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAC7D,EAAA,cAAA,CAAe,OAAA,CAAQ,aAAA,EAAe,eAAA,EAAiB,MAAA,EAAQ,MAAM,CAAA;AAErE,EAAA,sBAAA,CAAuB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAE9C,EAAA,IAAI,OAAA,CAAQ,8BAA8B,MAAA,EAAW;AACnD,IAAA,MAAM,QAAA,GAAW,QAAQ,yBAAA,CAA0B,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,KAAM,EAAE,CAAA;AAC9E,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,qDAAA,CAAuD,CAAA;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAAS,kBAAA,CACP,OAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAC,OAAA,CAAQ,gBAAgB,IAAA,EAAK;AACxD,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,OAAA,CAAQ,UAAU,IAAA,EAAK;AAC5C,EAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,UAAA,EAAY;AACpC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,sCAAA,CAAwC,CAAA;AAAA,EAC/D;AACA,EAAA,UAAA,CAAW,OAAA,CAAQ,gBAAA,EAAkB,yBAAA,EAA2B,kBAAA,EAAoB,QAAQ,MAAM,CAAA;AAClG,EAAA,UAAA;AAAA,IACE,OAAA,CAAQ,iBAAA;AAAA,IACR,0BAAA;AAAA,IACA,mBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,QAAQ,eAAA,KAAoB,MAAA,IAAa,QAAQ,eAAA,CAAgB,IAAA,OAAW,EAAA,EAAI;AAClF,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,QAAQ,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,uDAAA,CAAyD,CAAA;AAAA,IAChF;AAAA,EACF;AACF;AAEA,SAAS,mBAAA,CAAoB,OAAA,EAA4B,MAAA,EAAkB,MAAA,EAAsB;AAC/F,EAAA,QAAQ,QAAQ,UAAA;AAAY,IAC1B,KAAK,QAAA;AACH,MAAA,aAAA,CAAc,OAAA,EAAS,QAAQ,MAAM,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,kBAAA;AACH,MAAA,sBAAA,CAAuB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC9C,MAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA,mBAAA,CAAoB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC3C,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,aAAA,CAAc,OAAA,EAAS,QAAQ,MAAM,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,eAAA;AACH,MAAA,mBAAA,CAAoB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC3C,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,kBAAA,CAAmB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC1C,MAAA;AAAA,IACF,KAAK,iBAAA;AACH,MAAA,qBAAA,CAAsB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC7C,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA;AAAA,IACF,KAAK,iBAAA;AACH,MAAA,qBAAA,CAAsB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC7C,MAAA;AAEA;AAEN;AAEO,SAAS,oBAAA,CAAqB,SAA4B,KAAA,EAAsB;AACrF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAEhC,EAAA,YAAA,CAAa,OAAA,EAAS,QAAQ,MAAM,CAAA;AAEpC,EAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,uBAAA,CAAwB,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrE,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,CAAA,EAAG,MAAM,CAAA,WAAA,EAAc,OAAA,CAAQ,UAAU,CAAA,0DAAA,EAA6D,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC9I;AAAA,EACF,WAAW,OAAA,CAAQ,UAAA,IAAc,CAAC,yBAAA,CAA0B,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC/E,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,GAAG,MAAM,CAAA,2BAAA,EAA8B,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC/E;AAAA,EACF,CAAA,MAAA,IAAW,yBAAA,CAA0B,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxD,IAAA,mBAAA,CAAoB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAIC,qBAAgB,CAAA,6BAAA,EAAgC,MAAA,CAAO,KAAK,IAAI,CAAC,IAAI,MAAM,CAAA;AAAA,EACvF;AACF;;;ACpSO,IAAM,WAAA,GAAN,cAA0BC,eAAA,CAAW;AAAA,EAC1C,MAAM,UAAA,CACJ,OAAA,EACA,cAAA,EAC6D;AAC7D,IAAA,oBAAA,CAAqB,OAAO,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,4BAA4B,OAAO,CAAA;AAEhD,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACV,qBAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,OAC3B;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACJ,QAAA,EACA,cAAA,EAC+D;AAC/D,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AACrD,MAAA,MAAM,IAAID,oBAAAA;AAAA,QACR,oEAAA;AAAA,QACA,CAAC,UAAU;AAAA,OACb;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAC9C,MAAA,oBAAA,CAAqB,SAAS,KAAK,CAAA;AACnC,MAAA,OAAO,4BAA4B,OAAO,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACV,0BAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,OAC7B;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\n * Sift-aligned enum types and const objects for fraud scoring requests.\n */\n\nexport type SiftTransactionType =\n | '$sale'\n | '$authorize'\n | '$capture'\n | '$void'\n | '$refund'\n | '$deposit'\n | '$withdrawal'\n | '$transfer'\n | '$buy'\n | '$sell'\n | '$send'\n | '$receive';\n\nexport const SiftTransactionTypeValues = [\n '$sale',\n '$authorize',\n '$capture',\n '$void',\n '$refund',\n '$deposit',\n '$withdrawal',\n '$transfer',\n '$buy',\n '$sell',\n '$send',\n '$receive',\n] as const satisfies readonly SiftTransactionType[];\n\nexport const TransactionType = {\n Sale: '$sale',\n Authorize: '$authorize',\n Capture: '$capture',\n Void: '$void',\n Refund: '$refund',\n Deposit: '$deposit',\n Withdrawal: '$withdrawal',\n Transfer: '$transfer',\n Buy: '$buy',\n Sell: '$sell',\n Send: '$send',\n Receive: '$receive',\n} as const satisfies Record<string, SiftTransactionType>;\n\nexport type SiftChargebackState =\n | '$received'\n | '$accepted'\n | '$disputed'\n | '$won'\n | '$lost';\n\nexport const SiftChargebackStateValues = [\n '$received',\n '$accepted',\n '$disputed',\n '$won',\n '$lost',\n] as const satisfies readonly SiftChargebackState[];\n\nexport const ChargebackState = {\n Received: '$received',\n Accepted: '$accepted',\n Disputed: '$disputed',\n Won: '$won',\n Lost: '$lost',\n} as const satisfies Record<string, SiftChargebackState>;\n\nexport type SiftChargebackReason =\n | '$fraud'\n | '$duplicate'\n | '$product_not_received'\n | '$product_unacceptable'\n | '$authorization'\n | '$consumer_disputes'\n | '$processing_errors'\n | '$cancel_subscription'\n | '$friendly_fraud'\n | '$ach_return'\n | '$ach_reversal'\n | '$other';\n\nexport const SiftChargebackReasonValues = [\n '$fraud',\n '$duplicate',\n '$product_not_received',\n '$product_unacceptable',\n '$authorization',\n '$consumer_disputes',\n '$processing_errors',\n '$cancel_subscription',\n '$friendly_fraud',\n '$ach_return',\n '$ach_reversal',\n '$other',\n] as const satisfies readonly SiftChargebackReason[];\n\nexport const ChargebackReason = {\n Fraud: '$fraud',\n Duplicate: '$duplicate',\n ProductNotReceived: '$product_not_received',\n ProductUnacceptable: '$product_unacceptable',\n Authorization: '$authorization',\n ConsumerDisputes: '$consumer_disputes',\n ProcessingErrors: '$processing_errors',\n CancelSubscription: '$cancel_subscription',\n FriendlyFraud: '$friendly_fraud',\n AchReturn: '$ach_return',\n AchReversal: '$ach_reversal',\n Other: '$other',\n} as const satisfies Record<string, SiftChargebackReason>;\n\nexport type SiftLoginStatus = '$success' | '$failure';\n\nexport const SiftLoginStatusValues = ['$success', '$failure'] as const satisfies readonly SiftLoginStatus[];\n\nexport const LoginStatus = {\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftLoginStatus>;\n\nexport type SiftLoginFailureReason =\n | '$account_unknown'\n | '$account_suspended'\n | '$account_disabled'\n | '$wrong_password';\n\nexport const SiftLoginFailureReasonValues = [\n '$account_unknown',\n '$account_suspended',\n '$account_disabled',\n '$wrong_password',\n] as const satisfies readonly SiftLoginFailureReason[];\n\nexport type SiftPasswordUpdateReason =\n | '$user_update'\n | '$forgot_password'\n | '$forced_reset';\n\nexport const SiftPasswordUpdateReasonValues = [\n '$user_update',\n '$forgot_password',\n '$forced_reset',\n] as const satisfies readonly SiftPasswordUpdateReason[];\n\nexport const PasswordUpdateReason = {\n UserUpdate: SiftPasswordUpdateReasonValues[0],\n ForgotPassword: SiftPasswordUpdateReasonValues[1],\n ForcedReset: SiftPasswordUpdateReasonValues[2],\n} as const satisfies Record<string, SiftPasswordUpdateReason>;\n\nexport type SiftPasswordUpdateStatus = '$pending' | '$success' | '$failure';\n\nexport const SiftPasswordUpdateStatusValues = [\n '$pending',\n '$success',\n '$failure',\n] as const satisfies readonly SiftPasswordUpdateStatus[];\n\nexport const PasswordUpdateStatus = {\n Pending: '$pending',\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftPasswordUpdateStatus>;\n\nexport type SiftWagerStatus = '$accept' | '$cancel';\n\nexport const SiftWagerStatusValues = ['$accept', '$cancel'] as const satisfies readonly SiftWagerStatus[];\n\nexport const WagerStatus = {\n Accept: '$accept',\n Cancel: '$cancel',\n} as const satisfies Record<string, SiftWagerStatus>;\n\nexport type SiftTransactionStatus = '$success' | '$failure' | '$pending';\n\nexport const SiftTransactionStatusValues = [\n '$success',\n '$failure',\n '$pending',\n] as const satisfies readonly SiftTransactionStatus[];\n\nexport const TransactionStatus = {\n Success: '$success',\n Failure: '$failure',\n Pending: '$pending',\n} as const satisfies Record<string, SiftTransactionStatus>;\n\nexport type SiftPaymentType =\n | '$cash'\n | '$check'\n | '$credit_card'\n | '$crypto_currency'\n | '$debit_card'\n | '$digital_wallet'\n | '$electronic_fund_transfer'\n | '$financing'\n | '$gift_card'\n | '$invoice'\n | '$in_app_purchase'\n | '$money_order'\n | '$points'\n | '$prepaid_card'\n | '$store_credit'\n | '$third_party_processor'\n | '$voucher'\n | '$sepa_credit'\n | '$sepa_instant_credit'\n | '$sepa_direct_debit'\n | '$ach_credit'\n | '$ach_debit'\n | '$wire_credit'\n | '$wire_debit';\n\nexport const SiftPaymentTypeValues = [\n '$cash',\n '$check',\n '$credit_card',\n '$crypto_currency',\n '$debit_card',\n '$digital_wallet',\n '$electronic_fund_transfer',\n '$financing',\n '$gift_card',\n '$invoice',\n '$in_app_purchase',\n '$money_order',\n '$points',\n '$prepaid_card',\n '$store_credit',\n '$third_party_processor',\n '$voucher',\n '$sepa_credit',\n '$sepa_instant_credit',\n '$sepa_direct_debit',\n '$ach_credit',\n '$ach_debit',\n '$wire_credit',\n '$wire_debit',\n] as const satisfies readonly SiftPaymentType[];\n\nexport const PaymentType = {\n Cash: '$cash',\n Check: '$check',\n CreditCard: '$credit_card',\n CryptoCurrency: '$crypto_currency',\n DebitCard: '$debit_card',\n DigitalWallet: '$digital_wallet',\n ElectronicFundTransfer: '$electronic_fund_transfer',\n Financing: '$financing',\n GiftCard: '$gift_card',\n Invoice: '$invoice',\n InAppPurchase: '$in_app_purchase',\n MoneyOrder: '$money_order',\n Points: '$points',\n PrepaidCard: '$prepaid_card',\n StoreCredit: '$store_credit',\n ThirdPartyProcessor: '$third_party_processor',\n Voucher: '$voucher',\n SepaCredit: '$sepa_credit',\n SepaInstantCredit: '$sepa_instant_credit',\n SepaDirectDebit: '$sepa_direct_debit',\n AchCredit: '$ach_credit',\n AchDebit: '$ach_debit',\n WireCredit: '$wire_credit',\n WireDebit: '$wire_debit',\n} as const satisfies Record<string, SiftPaymentType>;\n\nexport type SiftWalletType = '$crypto' | '$digital' | '$fiat';\n\nexport const SiftWalletTypeValues = ['$crypto', '$digital', '$fiat'] as const satisfies readonly SiftWalletType[];\n\nexport const WalletType = {\n Crypto: '$crypto',\n Digital: '$digital',\n Fiat: '$fiat',\n} as const satisfies Record<string, SiftWalletType>;\n\nexport type FraudRiskLevel = 'low' | 'medium' | 'high' | 'critical';\n","/**\n * Optional top-level rule-signal fields copied into plain metadata on the wire.\n */\n\nexport interface LoginRuleSignals {\n ip_country_mismatch?: boolean;\n}\n\nexport interface UpdateAccountRuleSignals {\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n}\n\nexport interface TransactionRuleSignals {\n payment_method?: string;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\nexport const LOGIN_RULE_SIGNAL_KEYS = ['ip_country_mismatch'] as const;\n\nexport const UPDATE_ACCOUNT_RULE_SIGNAL_KEYS = [\n 'two_fa_enabled',\n 'two_fa_disabled',\n 'two_fa_method_changed',\n] as const;\n\nexport const TRANSACTION_RULE_SIGNAL_KEYS = [\n 'payment_method',\n 'is_first_deposit',\n 'cumulative_deposit_amount',\n 'deposit_count',\n 'failed_deposit_count',\n 'is_first_withdrawal',\n 'withdrawal_method_differs',\n 'cumulative_withdrawal_amount',\n 'withdrawal_count',\n 'hours_since_last_deposit',\n 'days_since_last_activity',\n 'hours_since_account_creation',\n] as const;\n","import { SiftPaymentTypeValues, type SiftPaymentType } from '../types/enums';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\n\nconst PAYMENT_TYPE_ALIASES: Record<string, SiftPaymentType> = {\n bank_account: '$electronic_fund_transfer',\n electronic_fund_transfer: '$electronic_fund_transfer',\n credit_card: '$credit_card',\n crypto_currency: '$crypto_currency',\n debit_card: '$debit_card',\n digital_wallet: '$digital_wallet',\n cash: '$cash',\n check: '$check',\n financing: '$financing',\n gift_card: '$gift_card',\n invoice: '$invoice',\n in_app_purchase: '$in_app_purchase',\n money_order: '$money_order',\n points: '$points',\n prepaid_card: '$prepaid_card',\n store_credit: '$store_credit',\n third_party_processor: '$third_party_processor',\n voucher: '$voucher',\n sepa_credit: '$sepa_credit',\n sepa_instant_credit: '$sepa_instant_credit',\n sepa_direct_debit: '$sepa_direct_debit',\n ach_credit: '$ach_credit',\n ach_debit: '$ach_debit',\n wire_credit: '$wire_credit',\n wire_debit: '$wire_debit',\n};\n\nconst SIFT_PAYMENT_METHOD_WHITELIST = new Set([\n 'payment_type',\n 'payment_gateway',\n 'card_bin',\n 'card_last4',\n 'avs_result_code',\n 'cvv_result_code',\n 'verification_status',\n 'routing_number',\n 'account_holder_name',\n 'account_number_last5',\n 'bank_name',\n 'bank_country',\n 'wallet_address',\n 'wallet_type',\n 'paypal_payer_id',\n 'paypal_payer_email',\n]);\n\nconst DEPRECATED_PAYMENT_METHOD_KEYS = [\n 'account_number_last4',\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n] as const;\n\nconst METADATA_STRIP_KEYS = new Set([\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n]);\n\nfunction isDevEnvironment(): boolean {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n}\n\nfunction warnDeprecatedKey(key: string): void {\n if (!isDevEnvironment()) return;\n const messages: Record<string, string> = {\n account_number_last4:\n '[vesant-sdk/fraud] account_number_last4 is not a Sift field; use account_number_last5',\n account_id: '[vesant-sdk/fraud] account_id is not a Sift field; moved to metadata',\n wallet_address_last4:\n '[vesant-sdk/fraud] wallet_address_last4 is not a Sift field; moved to metadata',\n crypto_currency:\n '[vesant-sdk/fraud] crypto_currency is not a Sift field on payment_method; moved to metadata',\n network: '[vesant-sdk/fraud] network is not a Sift field on payment_method; moved to metadata',\n };\n const message = messages[key];\n if (message) {\n console.warn(message);\n }\n}\n\n/**\n * Maps tenant-internal payment type signals to Sift-valid $payment_type values.\n * Returns undefined when the value cannot be mapped.\n */\nexport function normalizeSiftPaymentType(\n value: string | undefined\n): SiftPaymentType | undefined {\n if (value === undefined || value === null) return undefined;\n const trimmed = String(value).trim();\n if (trimmed === '') return undefined;\n\n const normalized = trimmed.startsWith('$') ? trimmed.slice(1) : trimmed;\n const alias = PAYMENT_TYPE_ALIASES[normalized.toLowerCase()];\n if (alias) return alias;\n\n const withPrefix = `$${normalized}` as SiftPaymentType;\n if ((SiftPaymentTypeValues as readonly string[]).includes(withPrefix)) {\n return withPrefix;\n }\n\n return undefined;\n}\n\n/**\n * Normalizes last-4/last-5 account digits for Sift $account_number_last5.\n */\nexport function toSiftAccountNumberLast5(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const digits = String(value).replace(/\\D/g, '');\n if (digits.length === 0) return undefined;\n if (digits.length >= 5) return digits.slice(-5);\n return digits.padStart(5, '0');\n}\n\nexport type NormalizePaymentMethodResult = {\n method: SiftPaymentMethod;\n metadataExtras?: Record<string, unknown>;\n};\n\nfunction collectMetadataExtra(\n metadataExtras: Record<string, unknown>,\n key: string,\n value: unknown\n): void {\n if (value === undefined) return;\n metadataExtras[key] = value;\n}\n\n/**\n * Normalizes a single payment method object for Sift wire format.\n */\nexport function normalizeSiftPaymentMethod(\n raw: Record<string, unknown>\n): NormalizePaymentMethodResult | null {\n const metadataExtras: Record<string, unknown> = {};\n const method: SiftPaymentMethod = {};\n\n const rawPaymentType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n const normalizedType = normalizeSiftPaymentType(rawPaymentType);\n if (rawPaymentType !== undefined && normalizedType === undefined) {\n return null;\n }\n if (normalizedType !== undefined) {\n method.payment_type = normalizedType;\n }\n\n for (const key of DEPRECATED_PAYMENT_METHOD_KEYS) {\n if (key in raw) warnDeprecatedKey(key);\n }\n\n const accountLast4 = raw.account_number_last4 ?? raw.$account_number_last4;\n const accountLast5 = raw.account_number_last5 ?? raw.$account_number_last5;\n const resolvedLast5 = toSiftAccountNumberLast5(accountLast5 ?? accountLast4);\n if (resolvedLast5 !== undefined) {\n method.account_number_last5 = resolvedLast5;\n }\n\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'payment_type' || key === '$payment_type') continue;\n if (key === 'account_number_last4' || key === '$account_number_last4') continue;\n if (key === 'account_number_last5' || key === '$account_number_last5') continue;\n\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n\n if (METADATA_STRIP_KEYS.has(plainKey)) {\n if (plainKey === 'account_id') {\n collectMetadataExtra(metadataExtras, 'linkmoney_account_id', String(value));\n } else {\n collectMetadataExtra(metadataExtras, plainKey, value);\n }\n continue;\n }\n\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n collectMetadataExtra(metadataExtras, `payment_method_${plainKey}`, value);\n continue;\n }\n\n if (plainKey === 'payment_type') {\n continue;\n }\n\n method[plainKey] = value;\n }\n\n const hasMetadata = Object.keys(metadataExtras).length > 0;\n return {\n method,\n ...(hasMetadata ? { metadataExtras } : {}),\n };\n}\n\nfunction mergeAccountIds(\n target: Record<string, unknown>,\n accountId: string\n): void {\n const existing = target.linkmoney_account_ids;\n if (Array.isArray(existing)) {\n existing.push(accountId);\n return;\n }\n if (typeof target.linkmoney_account_id === 'string') {\n target.linkmoney_account_ids = [target.linkmoney_account_id, accountId];\n delete target.linkmoney_account_id;\n return;\n }\n target.linkmoney_account_id = accountId;\n}\n\n/**\n * Normalizes payment method arrays and aggregates stripped metadata.\n */\nexport function normalizeSiftPaymentMethods(\n methods: SiftPaymentMethod[] | undefined\n): { payment_methods?: SiftPaymentMethod[]; metadata?: Record<string, unknown> } {\n if (methods === undefined) return {};\n\n const normalized: SiftPaymentMethod[] = [];\n const metadata: Record<string, unknown> = {};\n\n for (const raw of methods) {\n const result = normalizeSiftPaymentMethod(raw as Record<string, unknown>);\n if (result === null) continue;\n normalized.push(result.method);\n\n if (result.metadataExtras) {\n for (const [key, value] of Object.entries(result.metadataExtras)) {\n if (key === 'linkmoney_account_id' && typeof value === 'string') {\n mergeAccountIds(metadata, value);\n } else if (key in metadata && Array.isArray(metadata[key]) && Array.isArray(value)) {\n metadata[key] = [...(metadata[key] as unknown[]), ...value];\n } else if (!(key in metadata)) {\n metadata[key] = value;\n }\n }\n }\n }\n\n const hasMetadata = Object.keys(metadata).length > 0;\n return {\n payment_methods: normalized,\n ...(hasMetadata ? { metadata } : {}),\n };\n}\n\nexport { SIFT_PAYMENT_METHOD_WHITELIST };\n","function siftKey(key: string): string {\n return key.startsWith('$') ? key : `$${key}`;\n}\n\n/**\n * Recursively prefix object keys with $ for Sift wire format (no double-prefix).\n */\nexport function toSiftKeyedObject(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toSiftKeyedObject(item));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n out[siftKey(key)] = toSiftKeyedObject(nested);\n }\n return out;\n }\n return value;\n}\n","import { LoginStatus, PasswordUpdateReason, PasswordUpdateStatus } from '../types/enums';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequest } from '../types/requests';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\nimport {\n LOGIN_RULE_SIGNAL_KEYS,\n TRANSACTION_RULE_SIGNAL_KEYS,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n} from '../types/rule-signals';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentMethods,\n} from './payment-methods';\nimport { toSiftKeyedObject } from './sift-keys';\n\nconst BASE_SIFT_FIELD_KEYS = [\n 'session_id',\n 'user_email',\n 'name',\n 'phone',\n 'sift_payment_method',\n 'payment_methods',\n 'billing_address',\n 'shipping_address',\n 'app',\n 'browser',\n 'verification_phone_number',\n 'order_id',\n 'exchange_rate',\n 'expedited_shipping',\n 'shipping_method',\n 'shipping_carrier',\n 'shipping_tracking_numbers',\n 'brand_name',\n 'site_country',\n 'site_domain',\n 'ip',\n 'skip_payment_method_normalization',\n] as const;\n\nfunction mergeMetadata(\n base: FraudCustomMetadata | undefined,\n extras: FraudCustomMetadata\n): FraudCustomMetadata {\n return { ...base, ...extras };\n}\n\nfunction stripSdkOnlyFields(\n request: Record<string, unknown>,\n keys: string[]\n): Record<string, unknown> {\n const body = { ...request };\n for (const key of keys) {\n delete body[key];\n }\n return body;\n}\n\nfunction createStrippedBody(\n rest: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n stripKeys: string[]\n): Record<string, unknown> {\n return stripSdkOnlyFields(\n { ...rest, metadata: mergeMetadata(metadata, {}) },\n stripKeys\n );\n}\n\nfunction applySiftMetadata(\n body: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n siftMetadata: FraudCustomMetadata,\n onlyWhenNonEmpty = false\n): Record<string, unknown> {\n if (!onlyWhenNonEmpty || Object.keys(siftMetadata).length > 0) {\n body.metadata = mergeMetadata(metadata, siftMetadata);\n }\n return body;\n}\n\nfunction collectRuleSignals(\n request: Record<string, unknown>,\n keys: readonly string[]\n): FraudCustomMetadata {\n const signals: FraudCustomMetadata = {};\n for (const key of keys) {\n const value = request[key];\n if (value !== undefined) {\n signals[key] = value;\n }\n }\n return signals;\n}\n\nfunction buildBaseSiftMetadata(body: Record<string, unknown>): FraudCustomMetadata {\n const {\n event_type,\n session_id,\n user_email,\n name,\n phone,\n sift_payment_method,\n payment_methods,\n billing_address,\n shipping_address,\n app,\n browser,\n verification_phone_number,\n order_id,\n amount,\n currency_code,\n exchange_rate,\n expedited_shipping,\n shipping_method,\n shipping_carrier,\n shipping_tracking_numbers,\n brand_name,\n site_country,\n site_domain,\n ip,\n metadata,\n skip_payment_method_normalization,\n } = body;\n\n const siftMetadata: FraudCustomMetadata = {\n ...((metadata as FraudCustomMetadata | undefined) ?? {}),\n };\n\n if (session_id !== undefined) siftMetadata.$session_id = session_id;\n if (user_email !== undefined) siftMetadata.$user_email = user_email;\n if (name !== undefined) siftMetadata.$name = name;\n if (phone !== undefined) siftMetadata.$phone = phone;\n\n if (sift_payment_method !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_method = toSiftKeyedObject(sift_payment_method) as FraudCustomMetadata[string];\n } else {\n const result = normalizeSiftPaymentMethod(\n sift_payment_method as Record<string, unknown>\n );\n if (result !== null) {\n siftMetadata.$payment_method = toSiftKeyedObject(result.method) as FraudCustomMetadata[string];\n if (result.metadataExtras) {\n Object.assign(siftMetadata, result.metadataExtras);\n }\n }\n }\n }\n\n if (payment_methods !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_methods = toSiftKeyedObject(payment_methods) as FraudCustomMetadata[string];\n } else {\n const { payment_methods: normalized, metadata: pmMetadata } = normalizeSiftPaymentMethods(\n payment_methods as SiftPaymentMethod[]\n );\n if (normalized !== undefined) {\n siftMetadata.$payment_methods = toSiftKeyedObject(normalized) as FraudCustomMetadata[string];\n }\n if (pmMetadata) {\n Object.assign(siftMetadata, pmMetadata);\n }\n }\n }\n if (billing_address !== undefined) {\n siftMetadata.$billing_address = toSiftKeyedObject(billing_address) as FraudCustomMetadata[string];\n }\n if (shipping_address !== undefined) {\n siftMetadata.$shipping_address = toSiftKeyedObject(shipping_address) as FraudCustomMetadata[string];\n }\n if (app !== undefined) siftMetadata.$app = toSiftKeyedObject(app) as FraudCustomMetadata[string];\n if (browser !== undefined) {\n siftMetadata.$browser = toSiftKeyedObject(browser) as FraudCustomMetadata[string];\n }\n if (event_type === '$create_order' || event_type === '$update_account') {\n if (verification_phone_number !== undefined) {\n siftMetadata.$verification_phone_number = verification_phone_number;\n }\n }\n if (event_type === '$create_order') {\n if (order_id !== undefined) siftMetadata.$order_id = order_id;\n if (amount !== undefined) siftMetadata.$amount = amount;\n if (currency_code !== undefined) siftMetadata.$currency_code = currency_code;\n if (exchange_rate !== undefined) {\n siftMetadata.$exchange_rate = toSiftKeyedObject(exchange_rate) as FraudCustomMetadata[string];\n }\n if (expedited_shipping !== undefined) siftMetadata.$expedited_shipping = expedited_shipping;\n if (shipping_method !== undefined) siftMetadata.$shipping_method = shipping_method;\n if (shipping_carrier !== undefined) siftMetadata.$shipping_carrier = shipping_carrier;\n if (shipping_tracking_numbers !== undefined) {\n siftMetadata.$shipping_tracking_numbers = shipping_tracking_numbers;\n }\n if (brand_name !== undefined) siftMetadata.$brand_name = brand_name;\n if (site_country !== undefined) siftMetadata.$site_country = site_country;\n if (site_domain !== undefined) siftMetadata.$site_domain = site_domain;\n if (ip !== undefined) siftMetadata.$ip = ip;\n }\n\n return siftMetadata;\n}\n\nfunction normalizeBaseSiftFields(body: Record<string, unknown>): Record<string, unknown> {\n const siftMetadata = buildBaseSiftMetadata(body);\n const stripped = stripSdkOnlyFields(body, [...BASE_SIFT_FIELD_KEYS]);\n\n if (Object.keys(siftMetadata).length > 0) {\n stripped.metadata = siftMetadata;\n }\n\n return stripped;\n}\n\nfunction applyRuleSignals(\n body: Record<string, unknown>,\n request: Record<string, unknown>,\n keys: readonly string[],\n stripKeys: readonly string[]\n): Record<string, unknown> {\n const ruleSignals = collectRuleSignals(request, keys);\n const stripped = stripSdkOnlyFields(body, [...stripKeys]);\n if (Object.keys(ruleSignals).length > 0) {\n stripped.metadata = mergeMetadata(\n stripped.metadata as FraudCustomMetadata | undefined,\n ruleSignals\n );\n }\n return stripped;\n}\n\nfunction normalizeUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>\n): Record<string, unknown> {\n const { password_reason, password_status, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'password_reason',\n 'password_status',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $reason: password_reason ?? PasswordUpdateReason.UserUpdate,\n $status: password_status ?? PasswordUpdateStatus.Success,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>\n): Record<string, unknown> {\n const { wager_type, wager_status, wager_event_type, wager_event_name, wager_event_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'wager_type',\n 'wager_status',\n 'wager_event_type',\n 'wager_event_name',\n 'wager_event_id',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $wager_type: wager_type,\n $wager_status: wager_status,\n };\n if (wager_event_type) siftMetadata.$wager_event_type = wager_event_type;\n if (wager_event_name) siftMetadata.$wager_event_name = wager_event_name;\n if (wager_event_id) siftMetadata.$wager_event_id = wager_event_id;\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>\n): Record<string, unknown> {\n const { login_status, login_failure_reason, metadata, ...rest } = request;\n const effectiveStatus = login_status ?? LoginStatus.Success;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'login_status',\n 'login_failure_reason',\n ...LOGIN_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $login_status: effectiveStatus,\n };\n if (effectiveStatus === LoginStatus.Failure && login_failure_reason) {\n siftMetadata.$failure_reason = login_failure_reason;\n }\n body = applySiftMetadata(body, metadata, siftMetadata);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n LOGIN_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>\n): Record<string, unknown> {\n const { transaction_status, decline_category, transfer_recipient_user_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'transaction_status',\n 'decline_category',\n 'transfer_recipient_user_id',\n ...TRANSACTION_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {};\n if (transaction_status) siftMetadata.$transaction_status = transaction_status;\n if (decline_category) siftMetadata.$decline_category = decline_category;\n if (transfer_recipient_user_id) {\n siftMetadata.$transfer_recipient_user_id = transfer_recipient_user_id;\n }\n body = applySiftMetadata(body, metadata, siftMetadata, true);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n TRANSACTION_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>\n): Record<string, unknown> {\n const { metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n ...UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n ]);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>\n): Record<string, unknown> {\n const { amount, currency_code, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'amount',\n 'currency_code',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $amount: amount,\n $currency_code: currency_code,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeDefault(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeBaseSiftFields({ ...request } as Record<string, unknown>);\n}\n\nexport function normalizeScoreRequestForApi(request: FraudScoreRequest): Record<string, unknown> {\n switch (request.event_type) {\n case '$update_password':\n return normalizeUpdatePassword(request);\n case '$wager':\n return normalizeWager(request);\n case '$login':\n return normalizeLogin(request);\n case '$transaction':\n return normalizeTransaction(request);\n case '$update_account':\n return normalizeUpdateAccount(request);\n case '$create_order':\n return normalizeCreateOrder(request);\n default:\n return normalizeDefault(request);\n }\n}\n","import type { FraudScoreRequest } from '../types/requests';\nimport { normalizeScoreRequestForApi } from './normalize';\n\n/**\n * Returns the JSON body that would be sent to POST /api/v1/fraud/score after normalization.\n * Useful for debugging without calling the API.\n */\nexport function buildScoreRequestPreview(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeScoreRequestForApi(request);\n}\n","/**\n * Fraud event type unions aligned with fraud-service support matrix.\n */\n\n/** Events that run Sift scoring + rule engine */\nexport type ScoredFraudEventType =\n | '$create_account'\n | '$create_order'\n | '$login'\n | '$logout'\n | '$update_account'\n | '$update_password'\n | '$transaction'\n | '$wager';\n\n/** Feedback-only; no meaningful fraud score in response */\nexport type ChargebackFraudEventType = '$chargeback';\n\n/** Union accepted by scoreEvent / scoreEventsBulk */\nexport type SupportedFraudEventType = ScoredFraudEventType | ChargebackFraudEventType;\n\nexport const SCORED_FRAUD_EVENT_TYPES: readonly ScoredFraudEventType[] = [\n '$create_account',\n '$create_order',\n '$login',\n '$logout',\n '$update_account',\n '$update_password',\n '$transaction',\n '$wager',\n] as const;\n\nexport const CHARGEBACK_FRAUD_EVENT_TYPE = '$chargeback' as const;\n\nexport const SUPPORTED_FRAUD_EVENT_TYPES: readonly SupportedFraudEventType[] = [\n ...SCORED_FRAUD_EVENT_TYPES,\n CHARGEBACK_FRAUD_EVENT_TYPE,\n] as const;\n\nexport const PLANNED_FRAUD_EVENT_TYPES = [\n '$verification',\n '$link_session_to_user',\n '$security_notification',\n '$update_order',\n '$order_status',\n '$add_promotion',\n] as const;\n\n/**\n * Listed in Vesant dashboard / future API — NOT valid for scoreEvent today.\n * @deprecated Not supported by POST /api/v1/fraud/score\n */\nexport type PlannedFraudEventType = (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\n/**\n * @deprecated Use SupportedFraudEventType; kept for migration\n */\nexport type FraudEventType = SupportedFraudEventType | (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\nexport function isPlannedFraudEventType(\n eventType: string\n): eventType is (typeof PLANNED_FRAUD_EVENT_TYPES)[number] {\n return (PLANNED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n\nexport function isSupportedFraudEventType(\n eventType: string\n): eventType is SupportedFraudEventType {\n return (SUPPORTED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n","/**\n * Metadata for fraud score requests.\n * Plain keys are Vesant rule signals; $-prefixed keys are Sift pass-through (or set via typed fields).\n */\n\nexport interface FraudRuleSignalMetadata {\n /** Rule signal payment method (e.g. \"$credit_card\"), not Sift $payment_method object */\n payment_method?: string;\n country?: string;\n /** Customer date of birth, ISO 8601 (YYYY-MM-DD). Useful on onboarding ($create_account). */\n date_of_birth?: string;\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n ip_country_mismatch?: boolean;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\n/** Extra Sift fields forwarded verbatim in metadata (e.g. $referrer_user_id, $promotions). */\nexport type SiftPassThroughMetadata = Record<`$${string}`, unknown>;\n\nexport type FraudCustomMetadata = FraudRuleSignalMetadata &\n SiftPassThroughMetadata &\n Record<string, unknown>;\n\n/** Maps typed request fields to metadata keys they populate (typed values win on normalize). */\nexport const TYPED_SIFT_METADATA_KEYS: Readonly<Record<string, string>> = {\n session_id: '$session_id',\n user_email: '$user_email',\n name: '$name',\n phone: '$phone',\n sift_payment_method: '$payment_method',\n billing_address: '$billing_address',\n payment_methods: '$payment_methods',\n app: '$app',\n verification_phone_number: '$verification_phone_number',\n order_id: '$order_id',\n exchange_rate: '$exchange_rate',\n shipping_address: '$shipping_address',\n expedited_shipping: '$expedited_shipping',\n shipping_method: '$shipping_method',\n shipping_carrier: '$shipping_carrier',\n shipping_tracking_numbers: '$shipping_tracking_numbers',\n browser: '$browser',\n brand_name: '$brand_name',\n site_country: '$site_country',\n site_domain: '$site_domain',\n ip: '$ip',\n};\n\nexport function findMetadataConflictWithTypedFields(\n metadata: FraudCustomMetadata,\n request: Record<string, unknown>\n): string | undefined {\n for (const [field, metaKey] of Object.entries(TYPED_SIFT_METADATA_KEYS)) {\n if (request[field] !== undefined && metadata[metaKey] !== undefined) {\n return metaKey;\n }\n }\n return undefined;\n}\n","import { findMetadataConflictWithTypedFields } from '../types/metadata';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequestBase } from '../types/requests';\n\nexport function fieldPrefix(index?: number): string {\n return index === undefined ? '' : `requests[${index}].`;\n}\n\nexport function assertNonEmpty(\n value: string | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (!value?.trim()) {\n errors.push(`${prefix}${field} is required`);\n }\n}\n\nexport function assertEnum<T extends string>(\n value: string | undefined,\n allowed: readonly T[],\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (value === undefined) return;\n if (!(allowed as readonly string[]).includes(value)) {\n errors.push(`${prefix}${field} must be one of: ${allowed.join(', ')}`);\n }\n}\n\nexport function assertPositiveAmount(\n amount: number | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (amount === undefined || amount <= 0) {\n errors.push(`${prefix}${field} must be greater than 0`);\n }\n}\n\nexport function validateMetadata(\n metadata: FraudCustomMetadata | undefined,\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n if (!metadata) return;\n const conflictKey = findMetadataConflictWithTypedFields(\n metadata,\n request as unknown as Record<string, unknown>\n );\n if (conflictKey) {\n errors.push(\n `${prefix}metadata.${conflictKey} conflicts with a typed request field that maps to the same key; omit metadata.${conflictKey} or remove the typed field`\n );\n }\n}\n","import { ValidationError } from '@vesant-sdk/core';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentType,\n SIFT_PAYMENT_METHOD_WHITELIST,\n} from '../normalization/payment-methods';\nimport {\n SiftChargebackReasonValues,\n SiftChargebackStateValues,\n SiftLoginFailureReasonValues,\n SiftLoginStatusValues,\n SiftPasswordUpdateReasonValues,\n SiftPasswordUpdateStatusValues,\n SiftTransactionStatusValues,\n SiftTransactionTypeValues,\n SiftWagerStatusValues,\n TransactionType,\n} from '../types/enums';\nimport {\n isPlannedFraudEventType,\n isSupportedFraudEventType,\n SUPPORTED_FRAUD_EVENT_TYPES,\n} from '../types/events';\nimport type { FraudScoreRequest, FraudScoreRequestBase } from '../types/requests';\nimport {\n assertEnum,\n assertNonEmpty,\n assertPositiveAmount,\n fieldPrefix,\n validateMetadata,\n} from './helpers';\n\nconst E164_PHONE_PATTERN = /^\\+[1-9]\\d{7,14}$/;\n\nfunction validatePaymentMethods(\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n const { payment_methods, skip_payment_method_normalization: skipNormalization } = request;\n\n if (payment_methods === undefined) return;\n\n if (payment_methods.length === 0) {\n errors.push(`${prefix}payment_methods must include at least one item when provided`);\n return;\n }\n\n payment_methods.forEach((method, index) => {\n const raw = method as Record<string, unknown>;\n\n if (skipNormalization) {\n for (const key of Object.keys(raw)) {\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n errors.push(\n `${prefix}payment_methods[${index}].${plainKey} is not a valid Sift payment method field`\n );\n }\n }\n const rawType =\n raw.payment_type !== undefined ? String(raw.payment_type) : undefined;\n if (rawType !== undefined && normalizeSiftPaymentType(rawType) === undefined) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n return;\n }\n\n const rawType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n if (rawType !== undefined) {\n const result = normalizeSiftPaymentMethod(raw);\n if (result === null) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n }\n });\n}\n\nfunction validateBase(\n request: FraudScoreRequest,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.customer_id, 'customer_id', errors, prefix);\n assertNonEmpty(request.sift_user_id, 'sift_user_id', errors, prefix);\n assertNonEmpty(request.event_type, 'event_type', errors, prefix);\n validateMetadata(request.metadata, request, errors, prefix);\n}\n\nfunction validateLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(request.login_status, SiftLoginStatusValues, 'login_status', errors, prefix);\n if (request.login_failure_reason !== undefined) {\n if (request.login_status === '$failure') {\n assertEnum(\n request.login_failure_reason,\n SiftLoginFailureReasonValues,\n 'login_failure_reason',\n errors,\n prefix\n );\n } else {\n errors.push(`${prefix}login_failure_reason is only allowed when login_status is '$failure'`);\n }\n }\n}\n\nfunction validateUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(\n request.password_reason,\n SiftPasswordUpdateReasonValues,\n 'password_reason',\n errors,\n prefix\n );\n assertEnum(\n request.password_status,\n SiftPasswordUpdateStatusValues,\n 'password_status',\n errors,\n prefix\n );\n}\n\nfunction validateTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n assertEnum(request.transaction_type, SiftTransactionTypeValues, 'transaction_type', errors, prefix);\n assertEnum(\n request.transaction_status,\n SiftTransactionStatusValues,\n 'transaction_status',\n errors,\n prefix\n );\n\n if (request.decline_category !== undefined && request.transaction_status !== '$failure') {\n errors.push(\n `${prefix}decline_category is only allowed when transaction_status is '$failure'`\n );\n }\n\n if (\n request.transfer_recipient_user_id !== undefined &&\n request.transaction_type !== TransactionType.Transfer\n ) {\n errors.push(\n `${prefix}transfer_recipient_user_id is only allowed when transaction_type is '$transfer'`\n );\n }\n}\n\nfunction validateWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.transaction_id, 'transaction_id', errors, prefix);\n assertNonEmpty(request.wager_type, 'wager_type', errors, prefix);\n assertEnum(request.wager_status, SiftWagerStatusValues, 'wager_status', errors, prefix);\n if (!request.wager_status) {\n errors.push(`${prefix}wager_status is required`);\n }\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n}\n\nfunction validateCreateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$create_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n}\n\nfunction validateUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n\n if (request.verification_phone_number !== undefined) {\n if (!E164_PHONE_PATTERN.test(request.verification_phone_number.trim())) {\n errors.push(`${prefix}verification_phone_number must be E.164 (e.g. +14155550123)`);\n }\n }\n}\n\nfunction validateCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency_code, 'currency_code', errors, prefix);\n\n validatePaymentMethods(request, errors, prefix);\n\n if (request.shipping_tracking_numbers !== undefined) {\n const hasEmpty = request.shipping_tracking_numbers.some((n) => n.trim() === '');\n if (hasEmpty) {\n errors.push(`${prefix}shipping_tracking_numbers cannot contain empty values`);\n }\n }\n}\n\nfunction validateChargeback(\n request: Extract<FraudScoreRequest, { event_type: '$chargeback' }>,\n errors: string[],\n prefix: string\n): void {\n const hasTransactionId = !!request.transaction_id?.trim();\n const hasOrderId = !!request.order_id?.trim();\n if (!hasTransactionId && !hasOrderId) {\n errors.push(`${prefix}transaction_id or order_id is required`);\n }\n assertEnum(request.chargeback_state, SiftChargebackStateValues, 'chargeback_state', errors, prefix);\n assertEnum(\n request.chargeback_reason,\n SiftChargebackReasonValues,\n 'chargeback_reason',\n errors,\n prefix\n );\n if (request.ach_return_code !== undefined && request.ach_return_code.trim() !== '') {\n if (!/^R\\d{2}$/i.test(request.ach_return_code.trim())) {\n errors.push(`${prefix}ach_return_code must match NACHA R## pattern (e.g. R01)`);\n }\n }\n}\n\nfunction validateByEventType(request: FraudScoreRequest, errors: string[], prefix: string): void {\n switch (request.event_type) {\n case '$login':\n validateLogin(request, errors, prefix);\n break;\n case '$update_password':\n validateUpdatePassword(request, errors, prefix);\n break;\n case '$transaction':\n validateTransaction(request, errors, prefix);\n break;\n case '$wager':\n validateWager(request, errors, prefix);\n break;\n case '$create_order':\n validateCreateOrder(request, errors, prefix);\n break;\n case '$chargeback':\n validateChargeback(request, errors, prefix);\n break;\n case '$create_account':\n validateCreateAccount(request, errors, prefix);\n break;\n case '$logout':\n break;\n case '$update_account':\n validateUpdateAccount(request, errors, prefix);\n break;\n default:\n break;\n }\n}\n\nexport function validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n const errors: string[] = [];\n const prefix = fieldPrefix(index);\n\n validateBase(request, errors, prefix);\n\n if (request.event_type && isPlannedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type ${request.event_type} is not supported by POST /api/v1/fraud/score. Supported: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (request.event_type && !isSupportedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type must be one of: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (isSupportedFraudEventType(request.event_type)) {\n validateByEventType(request, errors, prefix);\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n }\n}\n","/**\n * Fraud scoring API client.\n */\n\nimport { BaseClient } from '@vesant-sdk/core';\nimport type { RequestOptions } from '@vesant-sdk/core';\nimport { ValidationError } from '@vesant-sdk/core';\nimport { normalizeScoreRequestForApi } from './normalization';\nimport type {\n FraudScoreRequest,\n FraudScoreResponseData,\n FraudScoreResponseEnvelope,\n} from './types';\nimport { validateScoreRequest } from './validation/rules';\n\nexport class FraudClient extends BaseClient {\n async scoreEvent(\n request: FraudScoreRequest,\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n validateScoreRequest(request);\n const body = normalizeScoreRequestForApi(request);\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n '/api/v1/fraud/score',\n {\n method: 'POST',\n body: JSON.stringify(body),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n\n async scoreEventsBulk(\n requests: FraudScoreRequest[],\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>> {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Invalid bulk score request: at least one score request is required',\n ['requests']\n );\n }\n\n const bodies = requests.map((request, index) => {\n validateScoreRequest(request, index);\n return normalizeScoreRequestForApi(request);\n });\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n '/api/v1/fraud/score/bulk',\n {\n method: 'POST',\n body: JSON.stringify(bodies),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/enums.ts","../src/types/rule-signals.ts","../src/normalization/payment-methods.ts","../src/normalization/sift-keys.ts","../src/normalization/normalize.ts","../src/normalization/preview.ts","../src/types/events.ts","../src/types/metadata.ts","../src/validation/helpers.ts","../src/validation/rules.ts","../src/client.ts","../src/types.ts"],"names":["rawType","ValidationError","BaseClient"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Sift-aligned enum types and const objects for fraud scoring requests.\n */\n\nexport type SiftTransactionType =\n | '$sale'\n | '$authorize'\n | '$capture'\n | '$void'\n | '$refund'\n | '$deposit'\n | '$withdrawal'\n | '$transfer'\n | '$buy'\n | '$sell'\n | '$send'\n | '$receive';\n\nexport const SiftTransactionTypeValues = [\n '$sale',\n '$authorize',\n '$capture',\n '$void',\n '$refund',\n '$deposit',\n '$withdrawal',\n '$transfer',\n '$buy',\n '$sell',\n '$send',\n '$receive',\n] as const satisfies readonly SiftTransactionType[];\n\nexport const TransactionType = {\n Sale: '$sale',\n Authorize: '$authorize',\n Capture: '$capture',\n Void: '$void',\n Refund: '$refund',\n Deposit: '$deposit',\n Withdrawal: '$withdrawal',\n Transfer: '$transfer',\n Buy: '$buy',\n Sell: '$sell',\n Send: '$send',\n Receive: '$receive',\n} as const satisfies Record<string, SiftTransactionType>;\n\nexport type SiftChargebackState =\n | '$received'\n | '$accepted'\n | '$disputed'\n | '$won'\n | '$lost';\n\nexport const SiftChargebackStateValues = [\n '$received',\n '$accepted',\n '$disputed',\n '$won',\n '$lost',\n] as const satisfies readonly SiftChargebackState[];\n\nexport const ChargebackState = {\n Received: '$received',\n Accepted: '$accepted',\n Disputed: '$disputed',\n Won: '$won',\n Lost: '$lost',\n} as const satisfies Record<string, SiftChargebackState>;\n\nexport type SiftChargebackReason =\n | '$fraud'\n | '$duplicate'\n | '$product_not_received'\n | '$product_unacceptable'\n | '$authorization'\n | '$consumer_disputes'\n | '$processing_errors'\n | '$cancel_subscription'\n | '$friendly_fraud'\n | '$ach_return'\n | '$ach_reversal'\n | '$other';\n\nexport const SiftChargebackReasonValues = [\n '$fraud',\n '$duplicate',\n '$product_not_received',\n '$product_unacceptable',\n '$authorization',\n '$consumer_disputes',\n '$processing_errors',\n '$cancel_subscription',\n '$friendly_fraud',\n '$ach_return',\n '$ach_reversal',\n '$other',\n] as const satisfies readonly SiftChargebackReason[];\n\nexport const ChargebackReason = {\n Fraud: '$fraud',\n Duplicate: '$duplicate',\n ProductNotReceived: '$product_not_received',\n ProductUnacceptable: '$product_unacceptable',\n Authorization: '$authorization',\n ConsumerDisputes: '$consumer_disputes',\n ProcessingErrors: '$processing_errors',\n CancelSubscription: '$cancel_subscription',\n FriendlyFraud: '$friendly_fraud',\n AchReturn: '$ach_return',\n AchReversal: '$ach_reversal',\n Other: '$other',\n} as const satisfies Record<string, SiftChargebackReason>;\n\nexport type SiftLoginStatus = '$success' | '$failure';\n\nexport const SiftLoginStatusValues = ['$success', '$failure'] as const satisfies readonly SiftLoginStatus[];\n\nexport const LoginStatus = {\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftLoginStatus>;\n\nexport type SiftLoginFailureReason =\n | '$account_unknown'\n | '$account_suspended'\n | '$account_disabled'\n | '$wrong_password';\n\nexport const SiftLoginFailureReasonValues = [\n '$account_unknown',\n '$account_suspended',\n '$account_disabled',\n '$wrong_password',\n] as const satisfies readonly SiftLoginFailureReason[];\n\nexport type SiftPasswordUpdateReason =\n | '$user_update'\n | '$forgot_password'\n | '$forced_reset';\n\nexport const SiftPasswordUpdateReasonValues = [\n '$user_update',\n '$forgot_password',\n '$forced_reset',\n] as const satisfies readonly SiftPasswordUpdateReason[];\n\nexport const PasswordUpdateReason = {\n UserUpdate: SiftPasswordUpdateReasonValues[0],\n ForgotPassword: SiftPasswordUpdateReasonValues[1],\n ForcedReset: SiftPasswordUpdateReasonValues[2],\n} as const satisfies Record<string, SiftPasswordUpdateReason>;\n\nexport type SiftPasswordUpdateStatus = '$pending' | '$success' | '$failure';\n\nexport const SiftPasswordUpdateStatusValues = [\n '$pending',\n '$success',\n '$failure',\n] as const satisfies readonly SiftPasswordUpdateStatus[];\n\nexport const PasswordUpdateStatus = {\n Pending: '$pending',\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftPasswordUpdateStatus>;\n\nexport type SiftWagerStatus = '$accept' | '$cancel';\n\nexport const SiftWagerStatusValues = ['$accept', '$cancel'] as const satisfies readonly SiftWagerStatus[];\n\nexport const WagerStatus = {\n Accept: '$accept',\n Cancel: '$cancel',\n} as const satisfies Record<string, SiftWagerStatus>;\n\nexport type SiftTransactionStatus = '$success' | '$failure' | '$pending';\n\nexport const SiftTransactionStatusValues = [\n '$success',\n '$failure',\n '$pending',\n] as const satisfies readonly SiftTransactionStatus[];\n\nexport const TransactionStatus = {\n Success: '$success',\n Failure: '$failure',\n Pending: '$pending',\n} as const satisfies Record<string, SiftTransactionStatus>;\n\nexport type SiftPaymentType =\n | '$cash'\n | '$check'\n | '$credit_card'\n | '$crypto_currency'\n | '$debit_card'\n | '$digital_wallet'\n | '$electronic_fund_transfer'\n | '$financing'\n | '$gift_card'\n | '$invoice'\n | '$in_app_purchase'\n | '$money_order'\n | '$points'\n | '$prepaid_card'\n | '$store_credit'\n | '$third_party_processor'\n | '$voucher'\n | '$sepa_credit'\n | '$sepa_instant_credit'\n | '$sepa_direct_debit'\n | '$ach_credit'\n | '$ach_debit'\n | '$wire_credit'\n | '$wire_debit';\n\nexport const SiftPaymentTypeValues = [\n '$cash',\n '$check',\n '$credit_card',\n '$crypto_currency',\n '$debit_card',\n '$digital_wallet',\n '$electronic_fund_transfer',\n '$financing',\n '$gift_card',\n '$invoice',\n '$in_app_purchase',\n '$money_order',\n '$points',\n '$prepaid_card',\n '$store_credit',\n '$third_party_processor',\n '$voucher',\n '$sepa_credit',\n '$sepa_instant_credit',\n '$sepa_direct_debit',\n '$ach_credit',\n '$ach_debit',\n '$wire_credit',\n '$wire_debit',\n] as const satisfies readonly SiftPaymentType[];\n\nexport const PaymentType = {\n Cash: '$cash',\n Check: '$check',\n CreditCard: '$credit_card',\n CryptoCurrency: '$crypto_currency',\n DebitCard: '$debit_card',\n DigitalWallet: '$digital_wallet',\n ElectronicFundTransfer: '$electronic_fund_transfer',\n Financing: '$financing',\n GiftCard: '$gift_card',\n Invoice: '$invoice',\n InAppPurchase: '$in_app_purchase',\n MoneyOrder: '$money_order',\n Points: '$points',\n PrepaidCard: '$prepaid_card',\n StoreCredit: '$store_credit',\n ThirdPartyProcessor: '$third_party_processor',\n Voucher: '$voucher',\n SepaCredit: '$sepa_credit',\n SepaInstantCredit: '$sepa_instant_credit',\n SepaDirectDebit: '$sepa_direct_debit',\n AchCredit: '$ach_credit',\n AchDebit: '$ach_debit',\n WireCredit: '$wire_credit',\n WireDebit: '$wire_debit',\n} as const satisfies Record<string, SiftPaymentType>;\n\nexport type SiftWalletType = '$crypto' | '$digital' | '$fiat';\n\nexport const SiftWalletTypeValues = ['$crypto', '$digital', '$fiat'] as const satisfies readonly SiftWalletType[];\n\nexport const WalletType = {\n Crypto: '$crypto',\n Digital: '$digital',\n Fiat: '$fiat',\n} as const satisfies Record<string, SiftWalletType>;\n\nexport type FraudRiskLevel = 'low' | 'medium' | 'high' | 'critical';\n","/**\n * Optional top-level rule-signal fields copied into plain metadata on the wire.\n */\n\nexport interface LoginRuleSignals {\n ip_country_mismatch?: boolean;\n}\n\nexport interface UpdateAccountRuleSignals {\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n}\n\nexport interface TransactionRuleSignals {\n payment_method?: string;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\nexport const LOGIN_RULE_SIGNAL_KEYS = ['ip_country_mismatch'] as const;\n\nexport const UPDATE_ACCOUNT_RULE_SIGNAL_KEYS = [\n 'two_fa_enabled',\n 'two_fa_disabled',\n 'two_fa_method_changed',\n] as const;\n\nexport const TRANSACTION_RULE_SIGNAL_KEYS = [\n 'payment_method',\n 'is_first_deposit',\n 'cumulative_deposit_amount',\n 'deposit_count',\n 'failed_deposit_count',\n 'is_first_withdrawal',\n 'withdrawal_method_differs',\n 'cumulative_withdrawal_amount',\n 'withdrawal_count',\n 'hours_since_last_deposit',\n 'days_since_last_activity',\n 'hours_since_account_creation',\n] as const;\n","import { SiftPaymentTypeValues, type SiftPaymentType } from '../types/enums';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\n\nconst PAYMENT_TYPE_ALIASES: Record<string, SiftPaymentType> = {\n bank_account: '$electronic_fund_transfer',\n electronic_fund_transfer: '$electronic_fund_transfer',\n credit_card: '$credit_card',\n crypto_currency: '$crypto_currency',\n debit_card: '$debit_card',\n digital_wallet: '$digital_wallet',\n cash: '$cash',\n check: '$check',\n financing: '$financing',\n gift_card: '$gift_card',\n invoice: '$invoice',\n in_app_purchase: '$in_app_purchase',\n money_order: '$money_order',\n points: '$points',\n prepaid_card: '$prepaid_card',\n store_credit: '$store_credit',\n third_party_processor: '$third_party_processor',\n voucher: '$voucher',\n sepa_credit: '$sepa_credit',\n sepa_instant_credit: '$sepa_instant_credit',\n sepa_direct_debit: '$sepa_direct_debit',\n ach_credit: '$ach_credit',\n ach_debit: '$ach_debit',\n wire_credit: '$wire_credit',\n wire_debit: '$wire_debit',\n};\n\nconst SIFT_PAYMENT_METHOD_WHITELIST = new Set([\n 'payment_type',\n 'payment_gateway',\n 'card_bin',\n 'card_last4',\n 'avs_result_code',\n 'cvv_result_code',\n 'verification_status',\n 'routing_number',\n 'account_holder_name',\n 'account_number_last5',\n 'bank_name',\n 'bank_country',\n 'wallet_address',\n 'wallet_type',\n 'paypal_payer_id',\n 'paypal_payer_email',\n]);\n\nconst DEPRECATED_PAYMENT_METHOD_KEYS = [\n 'account_number_last4',\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n] as const;\n\nconst METADATA_STRIP_KEYS = new Set([\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n]);\n\nfunction isDevEnvironment(): boolean {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n}\n\nfunction warnDeprecatedKey(key: string): void {\n if (!isDevEnvironment()) return;\n const messages: Record<string, string> = {\n account_number_last4:\n '[vesant-sdk/fraud] account_number_last4 is not a Sift field; use account_number_last5',\n account_id: '[vesant-sdk/fraud] account_id is not a Sift field; moved to metadata',\n wallet_address_last4:\n '[vesant-sdk/fraud] wallet_address_last4 is not a Sift field; moved to metadata',\n crypto_currency:\n '[vesant-sdk/fraud] crypto_currency is not a Sift field on payment_method; moved to metadata',\n network: '[vesant-sdk/fraud] network is not a Sift field on payment_method; moved to metadata',\n };\n const message = messages[key];\n if (message) {\n console.warn(message);\n }\n}\n\n/**\n * Maps tenant-internal payment type signals to Sift-valid $payment_type values.\n * Returns undefined when the value cannot be mapped.\n */\nexport function normalizeSiftPaymentType(\n value: string | undefined\n): SiftPaymentType | undefined {\n if (value === undefined || value === null) return undefined;\n const trimmed = String(value).trim();\n if (trimmed === '') return undefined;\n\n const normalized = trimmed.startsWith('$') ? trimmed.slice(1) : trimmed;\n const alias = PAYMENT_TYPE_ALIASES[normalized.toLowerCase()];\n if (alias) return alias;\n\n const withPrefix = `$${normalized}` as SiftPaymentType;\n if ((SiftPaymentTypeValues as readonly string[]).includes(withPrefix)) {\n return withPrefix;\n }\n\n return undefined;\n}\n\n/**\n * Normalizes last-4/last-5 account digits for Sift $account_number_last5.\n */\nexport function toSiftAccountNumberLast5(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const digits = String(value).replace(/\\D/g, '');\n if (digits.length === 0) return undefined;\n if (digits.length >= 5) return digits.slice(-5);\n return digits.padStart(5, '0');\n}\n\nexport type NormalizePaymentMethodResult = {\n method: SiftPaymentMethod;\n metadataExtras?: Record<string, unknown>;\n};\n\nfunction collectMetadataExtra(\n metadataExtras: Record<string, unknown>,\n key: string,\n value: unknown\n): void {\n if (value === undefined) return;\n metadataExtras[key] = value;\n}\n\n/**\n * Normalizes a single payment method object for Sift wire format.\n */\nexport function normalizeSiftPaymentMethod(\n raw: Record<string, unknown>\n): NormalizePaymentMethodResult | null {\n const metadataExtras: Record<string, unknown> = {};\n const method: SiftPaymentMethod = {};\n\n const rawPaymentType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n const normalizedType = normalizeSiftPaymentType(rawPaymentType);\n if (rawPaymentType !== undefined && normalizedType === undefined) {\n return null;\n }\n if (normalizedType !== undefined) {\n method.payment_type = normalizedType;\n }\n\n for (const key of DEPRECATED_PAYMENT_METHOD_KEYS) {\n if (key in raw) warnDeprecatedKey(key);\n }\n\n const accountLast4 = raw.account_number_last4 ?? raw.$account_number_last4;\n const accountLast5 = raw.account_number_last5 ?? raw.$account_number_last5;\n const resolvedLast5 = toSiftAccountNumberLast5(accountLast5 ?? accountLast4);\n if (resolvedLast5 !== undefined) {\n method.account_number_last5 = resolvedLast5;\n }\n\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'payment_type' || key === '$payment_type') continue;\n if (key === 'account_number_last4' || key === '$account_number_last4') continue;\n if (key === 'account_number_last5' || key === '$account_number_last5') continue;\n\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n\n if (METADATA_STRIP_KEYS.has(plainKey)) {\n if (plainKey === 'account_id') {\n collectMetadataExtra(metadataExtras, 'linkmoney_account_id', String(value));\n } else {\n collectMetadataExtra(metadataExtras, plainKey, value);\n }\n continue;\n }\n\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n collectMetadataExtra(metadataExtras, `payment_method_${plainKey}`, value);\n continue;\n }\n\n if (plainKey === 'payment_type') {\n continue;\n }\n\n method[plainKey] = value;\n }\n\n const hasMetadata = Object.keys(metadataExtras).length > 0;\n return {\n method,\n ...(hasMetadata ? { metadataExtras } : {}),\n };\n}\n\nfunction mergeAccountIds(\n target: Record<string, unknown>,\n accountId: string\n): void {\n const existing = target.linkmoney_account_ids;\n if (Array.isArray(existing)) {\n existing.push(accountId);\n return;\n }\n if (typeof target.linkmoney_account_id === 'string') {\n target.linkmoney_account_ids = [target.linkmoney_account_id, accountId];\n delete target.linkmoney_account_id;\n return;\n }\n target.linkmoney_account_id = accountId;\n}\n\n/**\n * Normalizes payment method arrays and aggregates stripped metadata.\n */\nexport function normalizeSiftPaymentMethods(\n methods: SiftPaymentMethod[] | undefined\n): { payment_methods?: SiftPaymentMethod[]; metadata?: Record<string, unknown> } {\n if (methods === undefined) return {};\n\n const normalized: SiftPaymentMethod[] = [];\n const metadata: Record<string, unknown> = {};\n\n for (const raw of methods) {\n const result = normalizeSiftPaymentMethod(raw as Record<string, unknown>);\n if (result === null) continue;\n normalized.push(result.method);\n\n if (result.metadataExtras) {\n for (const [key, value] of Object.entries(result.metadataExtras)) {\n if (key === 'linkmoney_account_id' && typeof value === 'string') {\n mergeAccountIds(metadata, value);\n } else if (key in metadata && Array.isArray(metadata[key]) && Array.isArray(value)) {\n metadata[key] = [...(metadata[key] as unknown[]), ...value];\n } else if (!(key in metadata)) {\n metadata[key] = value;\n }\n }\n }\n }\n\n const hasMetadata = Object.keys(metadata).length > 0;\n return {\n payment_methods: normalized,\n ...(hasMetadata ? { metadata } : {}),\n };\n}\n\nexport { SIFT_PAYMENT_METHOD_WHITELIST };\n","function siftKey(key: string): string {\n return key.startsWith('$') ? key : `$${key}`;\n}\n\n/**\n * Recursively prefix object keys with $ for Sift wire format (no double-prefix).\n */\nexport function toSiftKeyedObject(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toSiftKeyedObject(item));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n out[siftKey(key)] = toSiftKeyedObject(nested);\n }\n return out;\n }\n return value;\n}\n","import { LoginStatus, PasswordUpdateReason, PasswordUpdateStatus } from '../types/enums';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequest } from '../types/requests';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\nimport {\n LOGIN_RULE_SIGNAL_KEYS,\n TRANSACTION_RULE_SIGNAL_KEYS,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n} from '../types/rule-signals';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentMethods,\n} from './payment-methods';\nimport { toSiftKeyedObject } from './sift-keys';\n\nconst BASE_SIFT_FIELD_KEYS = [\n 'session_id',\n 'user_email',\n 'name',\n 'phone',\n 'sift_payment_method',\n 'payment_methods',\n 'billing_address',\n 'shipping_address',\n 'app',\n 'browser',\n 'verification_phone_number',\n 'order_id',\n 'exchange_rate',\n 'expedited_shipping',\n 'shipping_method',\n 'shipping_carrier',\n 'shipping_tracking_numbers',\n 'brand_name',\n 'site_country',\n 'site_domain',\n 'ip',\n 'skip_payment_method_normalization',\n] as const;\n\nfunction mergeMetadata(\n base: FraudCustomMetadata | undefined,\n extras: FraudCustomMetadata\n): FraudCustomMetadata {\n return { ...base, ...extras };\n}\n\nfunction stripSdkOnlyFields(\n request: Record<string, unknown>,\n keys: string[]\n): Record<string, unknown> {\n const body = { ...request };\n for (const key of keys) {\n delete body[key];\n }\n return body;\n}\n\nfunction createStrippedBody(\n rest: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n stripKeys: string[]\n): Record<string, unknown> {\n return stripSdkOnlyFields(\n { ...rest, metadata: mergeMetadata(metadata, {}) },\n stripKeys\n );\n}\n\nfunction applySiftMetadata(\n body: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n siftMetadata: FraudCustomMetadata,\n onlyWhenNonEmpty = false\n): Record<string, unknown> {\n if (!onlyWhenNonEmpty || Object.keys(siftMetadata).length > 0) {\n body.metadata = mergeMetadata(metadata, siftMetadata);\n }\n return body;\n}\n\nfunction collectRuleSignals(\n request: Record<string, unknown>,\n keys: readonly string[]\n): FraudCustomMetadata {\n const signals: FraudCustomMetadata = {};\n for (const key of keys) {\n const value = request[key];\n if (value !== undefined) {\n signals[key] = value;\n }\n }\n return signals;\n}\n\nfunction buildBaseSiftMetadata(body: Record<string, unknown>): FraudCustomMetadata {\n const {\n event_type,\n session_id,\n user_email,\n name,\n phone,\n sift_payment_method,\n payment_methods,\n billing_address,\n shipping_address,\n app,\n browser,\n verification_phone_number,\n order_id,\n amount,\n currency_code,\n exchange_rate,\n expedited_shipping,\n shipping_method,\n shipping_carrier,\n shipping_tracking_numbers,\n brand_name,\n site_country,\n site_domain,\n ip,\n metadata,\n skip_payment_method_normalization,\n } = body;\n\n const siftMetadata: FraudCustomMetadata = {\n ...((metadata as FraudCustomMetadata | undefined) ?? {}),\n };\n\n if (session_id !== undefined) siftMetadata.$session_id = session_id;\n if (user_email !== undefined) siftMetadata.$user_email = user_email;\n if (name !== undefined) siftMetadata.$name = name;\n if (phone !== undefined) siftMetadata.$phone = phone;\n\n if (sift_payment_method !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_method = toSiftKeyedObject(sift_payment_method) as FraudCustomMetadata[string];\n } else {\n const result = normalizeSiftPaymentMethod(\n sift_payment_method as Record<string, unknown>\n );\n if (result !== null) {\n siftMetadata.$payment_method = toSiftKeyedObject(result.method) as FraudCustomMetadata[string];\n if (result.metadataExtras) {\n Object.assign(siftMetadata, result.metadataExtras);\n }\n }\n }\n }\n\n if (payment_methods !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_methods = toSiftKeyedObject(payment_methods) as FraudCustomMetadata[string];\n } else {\n const { payment_methods: normalized, metadata: pmMetadata } = normalizeSiftPaymentMethods(\n payment_methods as SiftPaymentMethod[]\n );\n if (normalized !== undefined) {\n siftMetadata.$payment_methods = toSiftKeyedObject(normalized) as FraudCustomMetadata[string];\n }\n if (pmMetadata) {\n Object.assign(siftMetadata, pmMetadata);\n }\n }\n }\n if (billing_address !== undefined) {\n siftMetadata.$billing_address = toSiftKeyedObject(billing_address) as FraudCustomMetadata[string];\n }\n if (shipping_address !== undefined) {\n siftMetadata.$shipping_address = toSiftKeyedObject(shipping_address) as FraudCustomMetadata[string];\n }\n if (app !== undefined) siftMetadata.$app = toSiftKeyedObject(app) as FraudCustomMetadata[string];\n if (browser !== undefined) {\n siftMetadata.$browser = toSiftKeyedObject(browser) as FraudCustomMetadata[string];\n }\n if (event_type === '$create_order' || event_type === '$update_account') {\n if (verification_phone_number !== undefined) {\n siftMetadata.$verification_phone_number = verification_phone_number;\n }\n }\n if (event_type === '$create_order') {\n if (order_id !== undefined) siftMetadata.$order_id = order_id;\n if (amount !== undefined) siftMetadata.$amount = amount;\n if (currency_code !== undefined) siftMetadata.$currency_code = currency_code;\n if (exchange_rate !== undefined) {\n siftMetadata.$exchange_rate = toSiftKeyedObject(exchange_rate) as FraudCustomMetadata[string];\n }\n if (expedited_shipping !== undefined) siftMetadata.$expedited_shipping = expedited_shipping;\n if (shipping_method !== undefined) siftMetadata.$shipping_method = shipping_method;\n if (shipping_carrier !== undefined) siftMetadata.$shipping_carrier = shipping_carrier;\n if (shipping_tracking_numbers !== undefined) {\n siftMetadata.$shipping_tracking_numbers = shipping_tracking_numbers;\n }\n if (brand_name !== undefined) siftMetadata.$brand_name = brand_name;\n if (site_country !== undefined) siftMetadata.$site_country = site_country;\n if (site_domain !== undefined) siftMetadata.$site_domain = site_domain;\n if (ip !== undefined) siftMetadata.$ip = ip;\n }\n\n return siftMetadata;\n}\n\nfunction normalizeBaseSiftFields(body: Record<string, unknown>): Record<string, unknown> {\n const siftMetadata = buildBaseSiftMetadata(body);\n const stripped = stripSdkOnlyFields(body, [...BASE_SIFT_FIELD_KEYS]);\n\n if (Object.keys(siftMetadata).length > 0) {\n stripped.metadata = siftMetadata;\n }\n\n return stripped;\n}\n\nfunction applyRuleSignals(\n body: Record<string, unknown>,\n request: Record<string, unknown>,\n keys: readonly string[],\n stripKeys: readonly string[]\n): Record<string, unknown> {\n const ruleSignals = collectRuleSignals(request, keys);\n const stripped = stripSdkOnlyFields(body, [...stripKeys]);\n if (Object.keys(ruleSignals).length > 0) {\n stripped.metadata = mergeMetadata(\n stripped.metadata as FraudCustomMetadata | undefined,\n ruleSignals\n );\n }\n return stripped;\n}\n\nfunction normalizeUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>\n): Record<string, unknown> {\n const { password_reason, password_status, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'password_reason',\n 'password_status',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $reason: password_reason ?? PasswordUpdateReason.UserUpdate,\n $status: password_status ?? PasswordUpdateStatus.Success,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>\n): Record<string, unknown> {\n const { wager_type, wager_status, wager_event_type, wager_event_name, wager_event_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'wager_type',\n 'wager_status',\n 'wager_event_type',\n 'wager_event_name',\n 'wager_event_id',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $wager_type: wager_type,\n $wager_status: wager_status,\n };\n if (wager_event_type) siftMetadata.$wager_event_type = wager_event_type;\n if (wager_event_name) siftMetadata.$wager_event_name = wager_event_name;\n if (wager_event_id) siftMetadata.$wager_event_id = wager_event_id;\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>\n): Record<string, unknown> {\n const { login_status, login_failure_reason, metadata, ...rest } = request;\n const effectiveStatus = login_status ?? LoginStatus.Success;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'login_status',\n 'login_failure_reason',\n ...LOGIN_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $login_status: effectiveStatus,\n };\n if (effectiveStatus === LoginStatus.Failure && login_failure_reason) {\n siftMetadata.$failure_reason = login_failure_reason;\n }\n body = applySiftMetadata(body, metadata, siftMetadata);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n LOGIN_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>\n): Record<string, unknown> {\n const { transaction_status, decline_category, transfer_recipient_user_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'transaction_status',\n 'decline_category',\n 'transfer_recipient_user_id',\n ...TRANSACTION_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {};\n if (transaction_status) siftMetadata.$transaction_status = transaction_status;\n if (decline_category) siftMetadata.$decline_category = decline_category;\n if (transfer_recipient_user_id) {\n siftMetadata.$transfer_recipient_user_id = transfer_recipient_user_id;\n }\n body = applySiftMetadata(body, metadata, siftMetadata, true);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n TRANSACTION_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>\n): Record<string, unknown> {\n const { metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n ...UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n ]);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>\n): Record<string, unknown> {\n const { amount, currency_code, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'amount',\n 'currency_code',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $amount: amount,\n $currency_code: currency_code,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeDefault(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeBaseSiftFields({ ...request } as Record<string, unknown>);\n}\n\nexport function normalizeScoreRequestForApi(request: FraudScoreRequest): Record<string, unknown> {\n switch (request.event_type) {\n case '$update_password':\n return normalizeUpdatePassword(request);\n case '$wager':\n return normalizeWager(request);\n case '$login':\n return normalizeLogin(request);\n case '$transaction':\n return normalizeTransaction(request);\n case '$update_account':\n return normalizeUpdateAccount(request);\n case '$create_order':\n return normalizeCreateOrder(request);\n default:\n return normalizeDefault(request);\n }\n}\n","import type { FraudScoreRequest } from '../types/requests';\nimport { normalizeScoreRequestForApi } from './normalize';\n\n/**\n * Returns the JSON body that would be sent to POST /api/v1/fraud/score after normalization.\n * Useful for debugging without calling the API.\n */\nexport function buildScoreRequestPreview(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeScoreRequestForApi(request);\n}\n","/**\n * Fraud event type unions aligned with fraud-service support matrix.\n */\n\n/** Events that run Sift scoring + rule engine */\nexport type ScoredFraudEventType =\n | '$create_account'\n | '$create_order'\n | '$login'\n | '$logout'\n | '$update_account'\n | '$update_password'\n | '$transaction'\n | '$wager';\n\n/** Feedback-only; no meaningful fraud score in response */\nexport type ChargebackFraudEventType = '$chargeback';\n\n/** Union accepted by scoreEvent / scoreEventsBulk */\nexport type SupportedFraudEventType = ScoredFraudEventType | ChargebackFraudEventType;\n\nexport const SCORED_FRAUD_EVENT_TYPES: readonly ScoredFraudEventType[] = [\n '$create_account',\n '$create_order',\n '$login',\n '$logout',\n '$update_account',\n '$update_password',\n '$transaction',\n '$wager',\n] as const;\n\nexport const CHARGEBACK_FRAUD_EVENT_TYPE = '$chargeback' as const;\n\nexport const SUPPORTED_FRAUD_EVENT_TYPES: readonly SupportedFraudEventType[] = [\n ...SCORED_FRAUD_EVENT_TYPES,\n CHARGEBACK_FRAUD_EVENT_TYPE,\n] as const;\n\nexport const PLANNED_FRAUD_EVENT_TYPES = [\n '$verification',\n '$link_session_to_user',\n '$security_notification',\n '$update_order',\n '$order_status',\n '$add_promotion',\n] as const;\n\n/**\n * Listed in Vesant dashboard / future API — NOT valid for scoreEvent today.\n * @deprecated Not supported by POST /api/v1/fraud/score\n */\nexport type PlannedFraudEventType = (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\n/**\n * @deprecated Use SupportedFraudEventType; kept for migration\n */\nexport type FraudEventType = SupportedFraudEventType | (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\nexport function isPlannedFraudEventType(\n eventType: string\n): eventType is (typeof PLANNED_FRAUD_EVENT_TYPES)[number] {\n return (PLANNED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n\nexport function isSupportedFraudEventType(\n eventType: string\n): eventType is SupportedFraudEventType {\n return (SUPPORTED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n","/**\n * Metadata for fraud score requests.\n * Plain keys are Vesant rule signals; $-prefixed keys are Sift pass-through (or set via typed fields).\n */\n\nexport interface FraudRuleSignalMetadata {\n /** Rule signal payment method (e.g. \"$credit_card\"), not Sift $payment_method object */\n payment_method?: string;\n country?: string;\n /** Customer date of birth, ISO 8601 (YYYY-MM-DD). Useful on onboarding ($create_account). */\n date_of_birth?: string;\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n ip_country_mismatch?: boolean;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\n/** Extra Sift fields forwarded verbatim in metadata (e.g. $referrer_user_id, $promotions). */\nexport type SiftPassThroughMetadata = Record<`$${string}`, unknown>;\n\nexport type FraudCustomMetadata = FraudRuleSignalMetadata &\n SiftPassThroughMetadata &\n Record<string, unknown>;\n\n/** Maps typed request fields to metadata keys they populate (typed values win on normalize). */\nexport const TYPED_SIFT_METADATA_KEYS: Readonly<Record<string, string>> = {\n session_id: '$session_id',\n user_email: '$user_email',\n name: '$name',\n phone: '$phone',\n sift_payment_method: '$payment_method',\n billing_address: '$billing_address',\n payment_methods: '$payment_methods',\n app: '$app',\n verification_phone_number: '$verification_phone_number',\n order_id: '$order_id',\n exchange_rate: '$exchange_rate',\n shipping_address: '$shipping_address',\n expedited_shipping: '$expedited_shipping',\n shipping_method: '$shipping_method',\n shipping_carrier: '$shipping_carrier',\n shipping_tracking_numbers: '$shipping_tracking_numbers',\n browser: '$browser',\n brand_name: '$brand_name',\n site_country: '$site_country',\n site_domain: '$site_domain',\n ip: '$ip',\n};\n\nexport function findMetadataConflictWithTypedFields(\n metadata: FraudCustomMetadata,\n request: Record<string, unknown>\n): string | undefined {\n for (const [field, metaKey] of Object.entries(TYPED_SIFT_METADATA_KEYS)) {\n if (request[field] !== undefined && metadata[metaKey] !== undefined) {\n return metaKey;\n }\n }\n return undefined;\n}\n","import { findMetadataConflictWithTypedFields } from '../types/metadata';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequestBase } from '../types/requests';\n\nexport function fieldPrefix(index?: number): string {\n return index === undefined ? '' : `requests[${index}].`;\n}\n\nexport function assertNonEmpty(\n value: string | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (!value?.trim()) {\n errors.push(`${prefix}${field} is required`);\n }\n}\n\nexport function assertEnum<T extends string>(\n value: string | undefined,\n allowed: readonly T[],\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (value === undefined) return;\n if (!(allowed as readonly string[]).includes(value)) {\n errors.push(`${prefix}${field} must be one of: ${allowed.join(', ')}`);\n }\n}\n\nexport function assertPositiveAmount(\n amount: number | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (amount === undefined || amount <= 0) {\n errors.push(`${prefix}${field} must be greater than 0`);\n }\n}\n\nexport function validateMetadata(\n metadata: FraudCustomMetadata | undefined,\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n if (!metadata) return;\n const conflictKey = findMetadataConflictWithTypedFields(\n metadata,\n request as unknown as Record<string, unknown>\n );\n if (conflictKey) {\n errors.push(\n `${prefix}metadata.${conflictKey} conflicts with a typed request field that maps to the same key; omit metadata.${conflictKey} or remove the typed field`\n );\n }\n}\n","import { ValidationError } from '@vesant-sdk/core';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentType,\n SIFT_PAYMENT_METHOD_WHITELIST,\n} from '../normalization/payment-methods';\nimport {\n SiftChargebackReasonValues,\n SiftChargebackStateValues,\n SiftLoginFailureReasonValues,\n SiftLoginStatusValues,\n SiftPasswordUpdateReasonValues,\n SiftPasswordUpdateStatusValues,\n SiftTransactionStatusValues,\n SiftTransactionTypeValues,\n SiftWagerStatusValues,\n TransactionType,\n} from '../types/enums';\nimport {\n isPlannedFraudEventType,\n isSupportedFraudEventType,\n SUPPORTED_FRAUD_EVENT_TYPES,\n} from '../types/events';\nimport type { FraudScoreRequest, FraudScoreRequestBase } from '../types/requests';\nimport {\n assertEnum,\n assertNonEmpty,\n assertPositiveAmount,\n fieldPrefix,\n validateMetadata,\n} from './helpers';\n\nconst E164_PHONE_PATTERN = /^\\+[1-9]\\d{7,14}$/;\n\nfunction validatePaymentMethods(\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n const { payment_methods, skip_payment_method_normalization: skipNormalization } = request;\n\n if (payment_methods === undefined) return;\n\n if (payment_methods.length === 0) {\n errors.push(`${prefix}payment_methods must include at least one item when provided`);\n return;\n }\n\n payment_methods.forEach((method, index) => {\n const raw = method as Record<string, unknown>;\n\n if (skipNormalization) {\n for (const key of Object.keys(raw)) {\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n errors.push(\n `${prefix}payment_methods[${index}].${plainKey} is not a valid Sift payment method field`\n );\n }\n }\n const rawType =\n raw.payment_type !== undefined ? String(raw.payment_type) : undefined;\n if (rawType !== undefined && normalizeSiftPaymentType(rawType) === undefined) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n return;\n }\n\n const rawType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n if (rawType !== undefined) {\n const result = normalizeSiftPaymentMethod(raw);\n if (result === null) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n }\n });\n}\n\nfunction validateBase(\n request: FraudScoreRequest,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.customer_id, 'customer_id', errors, prefix);\n assertNonEmpty(request.sift_user_id, 'sift_user_id', errors, prefix);\n assertNonEmpty(request.event_type, 'event_type', errors, prefix);\n validateMetadata(request.metadata, request, errors, prefix);\n}\n\nfunction validateLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(request.login_status, SiftLoginStatusValues, 'login_status', errors, prefix);\n if (request.login_failure_reason !== undefined) {\n if (request.login_status === '$failure') {\n assertEnum(\n request.login_failure_reason,\n SiftLoginFailureReasonValues,\n 'login_failure_reason',\n errors,\n prefix\n );\n } else {\n errors.push(`${prefix}login_failure_reason is only allowed when login_status is '$failure'`);\n }\n }\n}\n\nfunction validateUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(\n request.password_reason,\n SiftPasswordUpdateReasonValues,\n 'password_reason',\n errors,\n prefix\n );\n assertEnum(\n request.password_status,\n SiftPasswordUpdateStatusValues,\n 'password_status',\n errors,\n prefix\n );\n}\n\nfunction validateTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n assertEnum(request.transaction_type, SiftTransactionTypeValues, 'transaction_type', errors, prefix);\n assertEnum(\n request.transaction_status,\n SiftTransactionStatusValues,\n 'transaction_status',\n errors,\n prefix\n );\n\n if (request.decline_category !== undefined && request.transaction_status !== '$failure') {\n errors.push(\n `${prefix}decline_category is only allowed when transaction_status is '$failure'`\n );\n }\n\n if (\n request.transfer_recipient_user_id !== undefined &&\n request.transaction_type !== TransactionType.Transfer\n ) {\n errors.push(\n `${prefix}transfer_recipient_user_id is only allowed when transaction_type is '$transfer'`\n );\n }\n}\n\nfunction validateWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.transaction_id, 'transaction_id', errors, prefix);\n assertNonEmpty(request.wager_type, 'wager_type', errors, prefix);\n assertEnum(request.wager_status, SiftWagerStatusValues, 'wager_status', errors, prefix);\n if (!request.wager_status) {\n errors.push(`${prefix}wager_status is required`);\n }\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n}\n\nfunction validateCreateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$create_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n}\n\nfunction validateUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n\n if (request.verification_phone_number !== undefined) {\n if (!E164_PHONE_PATTERN.test(request.verification_phone_number.trim())) {\n errors.push(`${prefix}verification_phone_number must be E.164 (e.g. +14155550123)`);\n }\n }\n}\n\nfunction validateCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency_code, 'currency_code', errors, prefix);\n\n validatePaymentMethods(request, errors, prefix);\n\n if (request.shipping_tracking_numbers !== undefined) {\n const hasEmpty = request.shipping_tracking_numbers.some((n) => n.trim() === '');\n if (hasEmpty) {\n errors.push(`${prefix}shipping_tracking_numbers cannot contain empty values`);\n }\n }\n}\n\nfunction validateChargeback(\n request: Extract<FraudScoreRequest, { event_type: '$chargeback' }>,\n errors: string[],\n prefix: string\n): void {\n const hasTransactionId = !!request.transaction_id?.trim();\n const hasOrderId = !!request.order_id?.trim();\n if (!hasTransactionId && !hasOrderId) {\n errors.push(`${prefix}transaction_id or order_id is required`);\n }\n assertEnum(request.chargeback_state, SiftChargebackStateValues, 'chargeback_state', errors, prefix);\n assertEnum(\n request.chargeback_reason,\n SiftChargebackReasonValues,\n 'chargeback_reason',\n errors,\n prefix\n );\n if (request.ach_return_code !== undefined && request.ach_return_code.trim() !== '') {\n if (!/^R\\d{2}$/i.test(request.ach_return_code.trim())) {\n errors.push(`${prefix}ach_return_code must match NACHA R## pattern (e.g. R01)`);\n }\n }\n}\n\nfunction validateByEventType(request: FraudScoreRequest, errors: string[], prefix: string): void {\n switch (request.event_type) {\n case '$login':\n validateLogin(request, errors, prefix);\n break;\n case '$update_password':\n validateUpdatePassword(request, errors, prefix);\n break;\n case '$transaction':\n validateTransaction(request, errors, prefix);\n break;\n case '$wager':\n validateWager(request, errors, prefix);\n break;\n case '$create_order':\n validateCreateOrder(request, errors, prefix);\n break;\n case '$chargeback':\n validateChargeback(request, errors, prefix);\n break;\n case '$create_account':\n validateCreateAccount(request, errors, prefix);\n break;\n case '$logout':\n break;\n case '$update_account':\n validateUpdateAccount(request, errors, prefix);\n break;\n default:\n break;\n }\n}\n\nexport function validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n const errors: string[] = [];\n const prefix = fieldPrefix(index);\n\n validateBase(request, errors, prefix);\n\n if (request.event_type && isPlannedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type ${request.event_type} is not supported by POST /api/v1/fraud/score. Supported: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (request.event_type && !isSupportedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type must be one of: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (isSupportedFraudEventType(request.event_type)) {\n validateByEventType(request, errors, prefix);\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n }\n}\n","/**\n * Fraud scoring API client.\n */\n\nimport { BaseClient } from '@vesant-sdk/core';\nimport type { RequestOptions } from '@vesant-sdk/core';\nimport { ValidationError } from '@vesant-sdk/core';\nimport { normalizeScoreRequestForApi } from './normalization';\nimport type {\n FraudScoreRequest,\n FraudScoreResponseData,\n FraudScoreResponseEnvelope,\n} from './types';\nimport { validateScoreRequest } from './validation/rules';\n\nexport class FraudClient extends BaseClient {\n async scoreEvent(\n request: FraudScoreRequest,\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n validateScoreRequest(request);\n const body = normalizeScoreRequestForApi(request);\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n '/api/v1/fraud/score',\n {\n method: 'POST',\n body: JSON.stringify(body),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n\n async scoreEventsBulk(\n requests: FraudScoreRequest[],\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>> {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Invalid bulk score request: at least one score request is required',\n ['requests']\n );\n }\n\n const bodies = requests.map((request, index) => {\n validateScoreRequest(request, index);\n return normalizeScoreRequestForApi(request);\n });\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n '/api/v1/fraud/score/bulk',\n {\n method: 'POST',\n body: JSON.stringify(bodies),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n}\n","/**\n * Fraud scoring types — responses and re-exports.\n */\n\nimport type { RiskLevel, Timestamp } from '@vesant-sdk/core';\nimport type { SupportedFraudEventType } from './types/events';\n\nexport * from './types/events';\nexport * from './types/enums';\nexport * from './types/metadata';\nexport * from './types/requests';\nexport * from './types/rule-signals';\nexport * from './types/sift-fields';\n\nexport type FraudReactionType =\n | 'approve'\n | 'reject'\n | 'hold'\n | 'restrict'\n | 'block'\n | 'refund'\n | 'void_transaction'\n | 'reverse_transaction'\n | 'freeze_account'\n | 'block_withdrawal'\n | 'limit_withdrawal'\n | 'disable_payment_method'\n | 'revoke_session'\n | 'require_reauth'\n | 'trigger_alert'\n | 'no_alert'\n | 'escalate'\n | 'increase_priority'\n | 'create_case'\n | 'auto_lock_account'\n | 'notify_team'\n | (string & Record<string, never>);\n\nexport interface TenantAction {\n type: FraudReactionType;\n params?: Record<string, unknown>;\n}\n\nexport type FraudDecision = 'approve' | 'review' | 'block' | 'reject' | (string & Record<string, never>);\n\nexport interface FraudScoreResponseData {\n reference: string;\n score: number;\n risk_level: RiskLevel;\n decision: FraudDecision;\n signals: string[];\n matched_rule_ids: string[];\n matched_rule_names: string[];\n applied_reactions: string[];\n alert_created: boolean;\n alert_reference?: string;\n tenant_actions: TenantAction[];\n}\n\n/**\n * Chargeback feedback responses may omit meaningful score/decision values.\n */\nexport interface ChargebackScoreResponseData extends Omit<FraudScoreResponseData, 'score' | 'decision'> {\n score?: number;\n decision?: FraudDecision;\n}\n\nexport interface FraudScoreResponseMetadata {\n request_id?: string;\n processing_ms?: number;\n tenant_id?: string;\n version?: string;\n}\n\nexport interface FraudScoreResponseEnvelope<T> {\n success: boolean;\n message: string;\n data: T;\n metadata?: FraudScoreResponseMetadata;\n timestamp: Timestamp;\n}\n\n/**\n * How a `fraud.alert.callback` decision was produced.\n *\n * - `sync` — resolved inline with the `/fraud/score` call; confirms a decision\n * the SDK response already returned.\n * - `deferred` — a rule configured with deferred timing re-scored the event\n * after a delay; the decision must be applied retroactively.\n * - `event_triggered` — a later related event caused a re-score of the original.\n */\nexport type FraudCallbackTrigger =\n | 'sync'\n | 'deferred'\n | 'event_triggered'\n | (string & Record<string, never>);\n\n/**\n * Outbound webhook body delivered to a tenant's configured fraud webhook URL\n * when a fraud rule resolves to a decision — including rules with **deferred**\n * or **event-triggered** timing that cannot return a verdict inline with the\n * `/fraud/score` call. Signed with `X-Webhook-Signature: sha256=<hex>`\n * (HMAC-SHA256 of the raw body). See the Fraud Integration guide.\n */\nexport interface FraudAlertCallbackEvent {\n /** Unique event ID — dedup on this; duplicate delivery is possible. */\n event_id: string;\n /** Always `\"fraud.alert.callback\"` — the wire event type to dispatch on. */\n event_type: 'fraud.alert.callback';\n /** Event-bus aggregate key (alert ID when an alert exists, else the reference). */\n aggregate_id: string;\n tenant_id: string;\n /** ISO 8601 timestamp of the decision. */\n timestamp: Timestamp;\n version?: number;\n correlation_id?: string;\n causation_id?: string;\n user_id?: string;\n /** Fraud reference (e.g. `\"FRD-e4b108d7\"`) — matches the sync score `reference`. */\n reference: string;\n /** Tenant customer ID the decision applies to. */\n customer_id: string;\n /** Originating Sift event type (`$create_account`, `$transaction`, …). */\n source_event_type: SupportedFraudEventType | (string & Record<string, never>);\n decision: FraudDecision;\n risk_level: RiskLevel;\n risk_score: number;\n /** Whether the decision arrived inline (`sync`) or as a later re-score. */\n trigger: FraudCallbackTrigger;\n /**\n * Tenant-scope reactions to apply on your platform — populated identically to\n * the sync `/fraud/score` response's `tenant_actions`. Always an array (never\n * null); empty when the rule resolved only to Vesant-scope reactions.\n */\n tenant_actions: TenantAction[];\n}\n\n/**\n * Type guard for the deferred/async fraud webhook body. Narrows an already\n * signature-verified, parsed payload to {@link FraudAlertCallbackEvent}.\n */\nexport function isFraudAlertCallbackEvent(\n value: unknown\n): value is FraudAlertCallbackEvent {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { event_type?: unknown }).event_type === 'fraud.alert.callback'\n );\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1055,6 +1055,11 @@ var FraudClient = class extends BaseClient {
|
|
|
1055
1055
|
}
|
|
1056
1056
|
};
|
|
1057
1057
|
|
|
1058
|
-
|
|
1058
|
+
// src/types.ts
|
|
1059
|
+
function isFraudAlertCallbackEvent(value) {
|
|
1060
|
+
return typeof value === "object" && value !== null && value.event_type === "fraud.alert.callback";
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
export { CHARGEBACK_FRAUD_EVENT_TYPE, ChargebackReason, ChargebackState, FraudClient, LOGIN_RULE_SIGNAL_KEYS, LoginStatus, PLANNED_FRAUD_EVENT_TYPES, PasswordUpdateReason, PasswordUpdateStatus, PaymentType, SCORED_FRAUD_EVENT_TYPES, SUPPORTED_FRAUD_EVENT_TYPES, SiftChargebackReasonValues, SiftChargebackStateValues, SiftLoginFailureReasonValues, SiftLoginStatusValues, SiftPasswordUpdateReasonValues, SiftPasswordUpdateStatusValues, SiftPaymentTypeValues, SiftTransactionStatusValues, SiftTransactionTypeValues, SiftWagerStatusValues, SiftWalletTypeValues, TRANSACTION_RULE_SIGNAL_KEYS, TYPED_SIFT_METADATA_KEYS, TransactionStatus, TransactionType, UPDATE_ACCOUNT_RULE_SIGNAL_KEYS, WagerStatus, WalletType, buildScoreRequestPreview, findMetadataConflictWithTypedFields, isFraudAlertCallbackEvent, isPlannedFraudEventType, isSupportedFraudEventType, normalizeScoreRequestForApi, normalizeSiftPaymentMethod, normalizeSiftPaymentMethods, normalizeSiftPaymentType, toSiftAccountNumberLast5, validateScoreRequest };
|
|
1059
1064
|
//# sourceMappingURL=index.mjs.map
|
|
1060
1065
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/enums.ts","../src/types/rule-signals.ts","../src/normalization/payment-methods.ts","../src/normalization/sift-keys.ts","../src/normalization/normalize.ts","../src/normalization/preview.ts","../src/types/events.ts","../src/types/metadata.ts","../src/validation/helpers.ts","../src/validation/rules.ts","../src/client.ts"],"names":["rawType","ValidationError"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Sift-aligned enum types and const objects for fraud scoring requests.\n */\n\nexport type SiftTransactionType =\n | '$sale'\n | '$authorize'\n | '$capture'\n | '$void'\n | '$refund'\n | '$deposit'\n | '$withdrawal'\n | '$transfer'\n | '$buy'\n | '$sell'\n | '$send'\n | '$receive';\n\nexport const SiftTransactionTypeValues = [\n '$sale',\n '$authorize',\n '$capture',\n '$void',\n '$refund',\n '$deposit',\n '$withdrawal',\n '$transfer',\n '$buy',\n '$sell',\n '$send',\n '$receive',\n] as const satisfies readonly SiftTransactionType[];\n\nexport const TransactionType = {\n Sale: '$sale',\n Authorize: '$authorize',\n Capture: '$capture',\n Void: '$void',\n Refund: '$refund',\n Deposit: '$deposit',\n Withdrawal: '$withdrawal',\n Transfer: '$transfer',\n Buy: '$buy',\n Sell: '$sell',\n Send: '$send',\n Receive: '$receive',\n} as const satisfies Record<string, SiftTransactionType>;\n\nexport type SiftChargebackState =\n | '$received'\n | '$accepted'\n | '$disputed'\n | '$won'\n | '$lost';\n\nexport const SiftChargebackStateValues = [\n '$received',\n '$accepted',\n '$disputed',\n '$won',\n '$lost',\n] as const satisfies readonly SiftChargebackState[];\n\nexport const ChargebackState = {\n Received: '$received',\n Accepted: '$accepted',\n Disputed: '$disputed',\n Won: '$won',\n Lost: '$lost',\n} as const satisfies Record<string, SiftChargebackState>;\n\nexport type SiftChargebackReason =\n | '$fraud'\n | '$duplicate'\n | '$product_not_received'\n | '$product_unacceptable'\n | '$authorization'\n | '$consumer_disputes'\n | '$processing_errors'\n | '$cancel_subscription'\n | '$friendly_fraud'\n | '$ach_return'\n | '$ach_reversal'\n | '$other';\n\nexport const SiftChargebackReasonValues = [\n '$fraud',\n '$duplicate',\n '$product_not_received',\n '$product_unacceptable',\n '$authorization',\n '$consumer_disputes',\n '$processing_errors',\n '$cancel_subscription',\n '$friendly_fraud',\n '$ach_return',\n '$ach_reversal',\n '$other',\n] as const satisfies readonly SiftChargebackReason[];\n\nexport const ChargebackReason = {\n Fraud: '$fraud',\n Duplicate: '$duplicate',\n ProductNotReceived: '$product_not_received',\n ProductUnacceptable: '$product_unacceptable',\n Authorization: '$authorization',\n ConsumerDisputes: '$consumer_disputes',\n ProcessingErrors: '$processing_errors',\n CancelSubscription: '$cancel_subscription',\n FriendlyFraud: '$friendly_fraud',\n AchReturn: '$ach_return',\n AchReversal: '$ach_reversal',\n Other: '$other',\n} as const satisfies Record<string, SiftChargebackReason>;\n\nexport type SiftLoginStatus = '$success' | '$failure';\n\nexport const SiftLoginStatusValues = ['$success', '$failure'] as const satisfies readonly SiftLoginStatus[];\n\nexport const LoginStatus = {\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftLoginStatus>;\n\nexport type SiftLoginFailureReason =\n | '$account_unknown'\n | '$account_suspended'\n | '$account_disabled'\n | '$wrong_password';\n\nexport const SiftLoginFailureReasonValues = [\n '$account_unknown',\n '$account_suspended',\n '$account_disabled',\n '$wrong_password',\n] as const satisfies readonly SiftLoginFailureReason[];\n\nexport type SiftPasswordUpdateReason =\n | '$user_update'\n | '$forgot_password'\n | '$forced_reset';\n\nexport const SiftPasswordUpdateReasonValues = [\n '$user_update',\n '$forgot_password',\n '$forced_reset',\n] as const satisfies readonly SiftPasswordUpdateReason[];\n\nexport const PasswordUpdateReason = {\n UserUpdate: SiftPasswordUpdateReasonValues[0],\n ForgotPassword: SiftPasswordUpdateReasonValues[1],\n ForcedReset: SiftPasswordUpdateReasonValues[2],\n} as const satisfies Record<string, SiftPasswordUpdateReason>;\n\nexport type SiftPasswordUpdateStatus = '$pending' | '$success' | '$failure';\n\nexport const SiftPasswordUpdateStatusValues = [\n '$pending',\n '$success',\n '$failure',\n] as const satisfies readonly SiftPasswordUpdateStatus[];\n\nexport const PasswordUpdateStatus = {\n Pending: '$pending',\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftPasswordUpdateStatus>;\n\nexport type SiftWagerStatus = '$accept' | '$cancel';\n\nexport const SiftWagerStatusValues = ['$accept', '$cancel'] as const satisfies readonly SiftWagerStatus[];\n\nexport const WagerStatus = {\n Accept: '$accept',\n Cancel: '$cancel',\n} as const satisfies Record<string, SiftWagerStatus>;\n\nexport type SiftTransactionStatus = '$success' | '$failure' | '$pending';\n\nexport const SiftTransactionStatusValues = [\n '$success',\n '$failure',\n '$pending',\n] as const satisfies readonly SiftTransactionStatus[];\n\nexport const TransactionStatus = {\n Success: '$success',\n Failure: '$failure',\n Pending: '$pending',\n} as const satisfies Record<string, SiftTransactionStatus>;\n\nexport type SiftPaymentType =\n | '$cash'\n | '$check'\n | '$credit_card'\n | '$crypto_currency'\n | '$debit_card'\n | '$digital_wallet'\n | '$electronic_fund_transfer'\n | '$financing'\n | '$gift_card'\n | '$invoice'\n | '$in_app_purchase'\n | '$money_order'\n | '$points'\n | '$prepaid_card'\n | '$store_credit'\n | '$third_party_processor'\n | '$voucher'\n | '$sepa_credit'\n | '$sepa_instant_credit'\n | '$sepa_direct_debit'\n | '$ach_credit'\n | '$ach_debit'\n | '$wire_credit'\n | '$wire_debit';\n\nexport const SiftPaymentTypeValues = [\n '$cash',\n '$check',\n '$credit_card',\n '$crypto_currency',\n '$debit_card',\n '$digital_wallet',\n '$electronic_fund_transfer',\n '$financing',\n '$gift_card',\n '$invoice',\n '$in_app_purchase',\n '$money_order',\n '$points',\n '$prepaid_card',\n '$store_credit',\n '$third_party_processor',\n '$voucher',\n '$sepa_credit',\n '$sepa_instant_credit',\n '$sepa_direct_debit',\n '$ach_credit',\n '$ach_debit',\n '$wire_credit',\n '$wire_debit',\n] as const satisfies readonly SiftPaymentType[];\n\nexport const PaymentType = {\n Cash: '$cash',\n Check: '$check',\n CreditCard: '$credit_card',\n CryptoCurrency: '$crypto_currency',\n DebitCard: '$debit_card',\n DigitalWallet: '$digital_wallet',\n ElectronicFundTransfer: '$electronic_fund_transfer',\n Financing: '$financing',\n GiftCard: '$gift_card',\n Invoice: '$invoice',\n InAppPurchase: '$in_app_purchase',\n MoneyOrder: '$money_order',\n Points: '$points',\n PrepaidCard: '$prepaid_card',\n StoreCredit: '$store_credit',\n ThirdPartyProcessor: '$third_party_processor',\n Voucher: '$voucher',\n SepaCredit: '$sepa_credit',\n SepaInstantCredit: '$sepa_instant_credit',\n SepaDirectDebit: '$sepa_direct_debit',\n AchCredit: '$ach_credit',\n AchDebit: '$ach_debit',\n WireCredit: '$wire_credit',\n WireDebit: '$wire_debit',\n} as const satisfies Record<string, SiftPaymentType>;\n\nexport type SiftWalletType = '$crypto' | '$digital' | '$fiat';\n\nexport const SiftWalletTypeValues = ['$crypto', '$digital', '$fiat'] as const satisfies readonly SiftWalletType[];\n\nexport const WalletType = {\n Crypto: '$crypto',\n Digital: '$digital',\n Fiat: '$fiat',\n} as const satisfies Record<string, SiftWalletType>;\n\nexport type FraudRiskLevel = 'low' | 'medium' | 'high' | 'critical';\n","/**\n * Optional top-level rule-signal fields copied into plain metadata on the wire.\n */\n\nexport interface LoginRuleSignals {\n ip_country_mismatch?: boolean;\n}\n\nexport interface UpdateAccountRuleSignals {\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n}\n\nexport interface TransactionRuleSignals {\n payment_method?: string;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\nexport const LOGIN_RULE_SIGNAL_KEYS = ['ip_country_mismatch'] as const;\n\nexport const UPDATE_ACCOUNT_RULE_SIGNAL_KEYS = [\n 'two_fa_enabled',\n 'two_fa_disabled',\n 'two_fa_method_changed',\n] as const;\n\nexport const TRANSACTION_RULE_SIGNAL_KEYS = [\n 'payment_method',\n 'is_first_deposit',\n 'cumulative_deposit_amount',\n 'deposit_count',\n 'failed_deposit_count',\n 'is_first_withdrawal',\n 'withdrawal_method_differs',\n 'cumulative_withdrawal_amount',\n 'withdrawal_count',\n 'hours_since_last_deposit',\n 'days_since_last_activity',\n 'hours_since_account_creation',\n] as const;\n","import { SiftPaymentTypeValues, type SiftPaymentType } from '../types/enums';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\n\nconst PAYMENT_TYPE_ALIASES: Record<string, SiftPaymentType> = {\n bank_account: '$electronic_fund_transfer',\n electronic_fund_transfer: '$electronic_fund_transfer',\n credit_card: '$credit_card',\n crypto_currency: '$crypto_currency',\n debit_card: '$debit_card',\n digital_wallet: '$digital_wallet',\n cash: '$cash',\n check: '$check',\n financing: '$financing',\n gift_card: '$gift_card',\n invoice: '$invoice',\n in_app_purchase: '$in_app_purchase',\n money_order: '$money_order',\n points: '$points',\n prepaid_card: '$prepaid_card',\n store_credit: '$store_credit',\n third_party_processor: '$third_party_processor',\n voucher: '$voucher',\n sepa_credit: '$sepa_credit',\n sepa_instant_credit: '$sepa_instant_credit',\n sepa_direct_debit: '$sepa_direct_debit',\n ach_credit: '$ach_credit',\n ach_debit: '$ach_debit',\n wire_credit: '$wire_credit',\n wire_debit: '$wire_debit',\n};\n\nconst SIFT_PAYMENT_METHOD_WHITELIST = new Set([\n 'payment_type',\n 'payment_gateway',\n 'card_bin',\n 'card_last4',\n 'avs_result_code',\n 'cvv_result_code',\n 'verification_status',\n 'routing_number',\n 'account_holder_name',\n 'account_number_last5',\n 'bank_name',\n 'bank_country',\n 'wallet_address',\n 'wallet_type',\n 'paypal_payer_id',\n 'paypal_payer_email',\n]);\n\nconst DEPRECATED_PAYMENT_METHOD_KEYS = [\n 'account_number_last4',\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n] as const;\n\nconst METADATA_STRIP_KEYS = new Set([\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n]);\n\nfunction isDevEnvironment(): boolean {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n}\n\nfunction warnDeprecatedKey(key: string): void {\n if (!isDevEnvironment()) return;\n const messages: Record<string, string> = {\n account_number_last4:\n '[vesant-sdk/fraud] account_number_last4 is not a Sift field; use account_number_last5',\n account_id: '[vesant-sdk/fraud] account_id is not a Sift field; moved to metadata',\n wallet_address_last4:\n '[vesant-sdk/fraud] wallet_address_last4 is not a Sift field; moved to metadata',\n crypto_currency:\n '[vesant-sdk/fraud] crypto_currency is not a Sift field on payment_method; moved to metadata',\n network: '[vesant-sdk/fraud] network is not a Sift field on payment_method; moved to metadata',\n };\n const message = messages[key];\n if (message) {\n console.warn(message);\n }\n}\n\n/**\n * Maps tenant-internal payment type signals to Sift-valid $payment_type values.\n * Returns undefined when the value cannot be mapped.\n */\nexport function normalizeSiftPaymentType(\n value: string | undefined\n): SiftPaymentType | undefined {\n if (value === undefined || value === null) return undefined;\n const trimmed = String(value).trim();\n if (trimmed === '') return undefined;\n\n const normalized = trimmed.startsWith('$') ? trimmed.slice(1) : trimmed;\n const alias = PAYMENT_TYPE_ALIASES[normalized.toLowerCase()];\n if (alias) return alias;\n\n const withPrefix = `$${normalized}` as SiftPaymentType;\n if ((SiftPaymentTypeValues as readonly string[]).includes(withPrefix)) {\n return withPrefix;\n }\n\n return undefined;\n}\n\n/**\n * Normalizes last-4/last-5 account digits for Sift $account_number_last5.\n */\nexport function toSiftAccountNumberLast5(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const digits = String(value).replace(/\\D/g, '');\n if (digits.length === 0) return undefined;\n if (digits.length >= 5) return digits.slice(-5);\n return digits.padStart(5, '0');\n}\n\nexport type NormalizePaymentMethodResult = {\n method: SiftPaymentMethod;\n metadataExtras?: Record<string, unknown>;\n};\n\nfunction collectMetadataExtra(\n metadataExtras: Record<string, unknown>,\n key: string,\n value: unknown\n): void {\n if (value === undefined) return;\n metadataExtras[key] = value;\n}\n\n/**\n * Normalizes a single payment method object for Sift wire format.\n */\nexport function normalizeSiftPaymentMethod(\n raw: Record<string, unknown>\n): NormalizePaymentMethodResult | null {\n const metadataExtras: Record<string, unknown> = {};\n const method: SiftPaymentMethod = {};\n\n const rawPaymentType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n const normalizedType = normalizeSiftPaymentType(rawPaymentType);\n if (rawPaymentType !== undefined && normalizedType === undefined) {\n return null;\n }\n if (normalizedType !== undefined) {\n method.payment_type = normalizedType;\n }\n\n for (const key of DEPRECATED_PAYMENT_METHOD_KEYS) {\n if (key in raw) warnDeprecatedKey(key);\n }\n\n const accountLast4 = raw.account_number_last4 ?? raw.$account_number_last4;\n const accountLast5 = raw.account_number_last5 ?? raw.$account_number_last5;\n const resolvedLast5 = toSiftAccountNumberLast5(accountLast5 ?? accountLast4);\n if (resolvedLast5 !== undefined) {\n method.account_number_last5 = resolvedLast5;\n }\n\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'payment_type' || key === '$payment_type') continue;\n if (key === 'account_number_last4' || key === '$account_number_last4') continue;\n if (key === 'account_number_last5' || key === '$account_number_last5') continue;\n\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n\n if (METADATA_STRIP_KEYS.has(plainKey)) {\n if (plainKey === 'account_id') {\n collectMetadataExtra(metadataExtras, 'linkmoney_account_id', String(value));\n } else {\n collectMetadataExtra(metadataExtras, plainKey, value);\n }\n continue;\n }\n\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n collectMetadataExtra(metadataExtras, `payment_method_${plainKey}`, value);\n continue;\n }\n\n if (plainKey === 'payment_type') {\n continue;\n }\n\n method[plainKey] = value;\n }\n\n const hasMetadata = Object.keys(metadataExtras).length > 0;\n return {\n method,\n ...(hasMetadata ? { metadataExtras } : {}),\n };\n}\n\nfunction mergeAccountIds(\n target: Record<string, unknown>,\n accountId: string\n): void {\n const existing = target.linkmoney_account_ids;\n if (Array.isArray(existing)) {\n existing.push(accountId);\n return;\n }\n if (typeof target.linkmoney_account_id === 'string') {\n target.linkmoney_account_ids = [target.linkmoney_account_id, accountId];\n delete target.linkmoney_account_id;\n return;\n }\n target.linkmoney_account_id = accountId;\n}\n\n/**\n * Normalizes payment method arrays and aggregates stripped metadata.\n */\nexport function normalizeSiftPaymentMethods(\n methods: SiftPaymentMethod[] | undefined\n): { payment_methods?: SiftPaymentMethod[]; metadata?: Record<string, unknown> } {\n if (methods === undefined) return {};\n\n const normalized: SiftPaymentMethod[] = [];\n const metadata: Record<string, unknown> = {};\n\n for (const raw of methods) {\n const result = normalizeSiftPaymentMethod(raw as Record<string, unknown>);\n if (result === null) continue;\n normalized.push(result.method);\n\n if (result.metadataExtras) {\n for (const [key, value] of Object.entries(result.metadataExtras)) {\n if (key === 'linkmoney_account_id' && typeof value === 'string') {\n mergeAccountIds(metadata, value);\n } else if (key in metadata && Array.isArray(metadata[key]) && Array.isArray(value)) {\n metadata[key] = [...(metadata[key] as unknown[]), ...value];\n } else if (!(key in metadata)) {\n metadata[key] = value;\n }\n }\n }\n }\n\n const hasMetadata = Object.keys(metadata).length > 0;\n return {\n payment_methods: normalized,\n ...(hasMetadata ? { metadata } : {}),\n };\n}\n\nexport { SIFT_PAYMENT_METHOD_WHITELIST };\n","function siftKey(key: string): string {\n return key.startsWith('$') ? key : `$${key}`;\n}\n\n/**\n * Recursively prefix object keys with $ for Sift wire format (no double-prefix).\n */\nexport function toSiftKeyedObject(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toSiftKeyedObject(item));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n out[siftKey(key)] = toSiftKeyedObject(nested);\n }\n return out;\n }\n return value;\n}\n","import { LoginStatus, PasswordUpdateReason, PasswordUpdateStatus } from '../types/enums';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequest } from '../types/requests';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\nimport {\n LOGIN_RULE_SIGNAL_KEYS,\n TRANSACTION_RULE_SIGNAL_KEYS,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n} from '../types/rule-signals';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentMethods,\n} from './payment-methods';\nimport { toSiftKeyedObject } from './sift-keys';\n\nconst BASE_SIFT_FIELD_KEYS = [\n 'session_id',\n 'user_email',\n 'name',\n 'phone',\n 'sift_payment_method',\n 'payment_methods',\n 'billing_address',\n 'shipping_address',\n 'app',\n 'browser',\n 'verification_phone_number',\n 'order_id',\n 'exchange_rate',\n 'expedited_shipping',\n 'shipping_method',\n 'shipping_carrier',\n 'shipping_tracking_numbers',\n 'brand_name',\n 'site_country',\n 'site_domain',\n 'ip',\n 'skip_payment_method_normalization',\n] as const;\n\nfunction mergeMetadata(\n base: FraudCustomMetadata | undefined,\n extras: FraudCustomMetadata\n): FraudCustomMetadata {\n return { ...base, ...extras };\n}\n\nfunction stripSdkOnlyFields(\n request: Record<string, unknown>,\n keys: string[]\n): Record<string, unknown> {\n const body = { ...request };\n for (const key of keys) {\n delete body[key];\n }\n return body;\n}\n\nfunction createStrippedBody(\n rest: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n stripKeys: string[]\n): Record<string, unknown> {\n return stripSdkOnlyFields(\n { ...rest, metadata: mergeMetadata(metadata, {}) },\n stripKeys\n );\n}\n\nfunction applySiftMetadata(\n body: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n siftMetadata: FraudCustomMetadata,\n onlyWhenNonEmpty = false\n): Record<string, unknown> {\n if (!onlyWhenNonEmpty || Object.keys(siftMetadata).length > 0) {\n body.metadata = mergeMetadata(metadata, siftMetadata);\n }\n return body;\n}\n\nfunction collectRuleSignals(\n request: Record<string, unknown>,\n keys: readonly string[]\n): FraudCustomMetadata {\n const signals: FraudCustomMetadata = {};\n for (const key of keys) {\n const value = request[key];\n if (value !== undefined) {\n signals[key] = value;\n }\n }\n return signals;\n}\n\nfunction buildBaseSiftMetadata(body: Record<string, unknown>): FraudCustomMetadata {\n const {\n event_type,\n session_id,\n user_email,\n name,\n phone,\n sift_payment_method,\n payment_methods,\n billing_address,\n shipping_address,\n app,\n browser,\n verification_phone_number,\n order_id,\n amount,\n currency_code,\n exchange_rate,\n expedited_shipping,\n shipping_method,\n shipping_carrier,\n shipping_tracking_numbers,\n brand_name,\n site_country,\n site_domain,\n ip,\n metadata,\n skip_payment_method_normalization,\n } = body;\n\n const siftMetadata: FraudCustomMetadata = {\n ...((metadata as FraudCustomMetadata | undefined) ?? {}),\n };\n\n if (session_id !== undefined) siftMetadata.$session_id = session_id;\n if (user_email !== undefined) siftMetadata.$user_email = user_email;\n if (name !== undefined) siftMetadata.$name = name;\n if (phone !== undefined) siftMetadata.$phone = phone;\n\n if (sift_payment_method !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_method = toSiftKeyedObject(sift_payment_method) as FraudCustomMetadata[string];\n } else {\n const result = normalizeSiftPaymentMethod(\n sift_payment_method as Record<string, unknown>\n );\n if (result !== null) {\n siftMetadata.$payment_method = toSiftKeyedObject(result.method) as FraudCustomMetadata[string];\n if (result.metadataExtras) {\n Object.assign(siftMetadata, result.metadataExtras);\n }\n }\n }\n }\n\n if (payment_methods !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_methods = toSiftKeyedObject(payment_methods) as FraudCustomMetadata[string];\n } else {\n const { payment_methods: normalized, metadata: pmMetadata } = normalizeSiftPaymentMethods(\n payment_methods as SiftPaymentMethod[]\n );\n if (normalized !== undefined) {\n siftMetadata.$payment_methods = toSiftKeyedObject(normalized) as FraudCustomMetadata[string];\n }\n if (pmMetadata) {\n Object.assign(siftMetadata, pmMetadata);\n }\n }\n }\n if (billing_address !== undefined) {\n siftMetadata.$billing_address = toSiftKeyedObject(billing_address) as FraudCustomMetadata[string];\n }\n if (shipping_address !== undefined) {\n siftMetadata.$shipping_address = toSiftKeyedObject(shipping_address) as FraudCustomMetadata[string];\n }\n if (app !== undefined) siftMetadata.$app = toSiftKeyedObject(app) as FraudCustomMetadata[string];\n if (browser !== undefined) {\n siftMetadata.$browser = toSiftKeyedObject(browser) as FraudCustomMetadata[string];\n }\n if (event_type === '$create_order' || event_type === '$update_account') {\n if (verification_phone_number !== undefined) {\n siftMetadata.$verification_phone_number = verification_phone_number;\n }\n }\n if (event_type === '$create_order') {\n if (order_id !== undefined) siftMetadata.$order_id = order_id;\n if (amount !== undefined) siftMetadata.$amount = amount;\n if (currency_code !== undefined) siftMetadata.$currency_code = currency_code;\n if (exchange_rate !== undefined) {\n siftMetadata.$exchange_rate = toSiftKeyedObject(exchange_rate) as FraudCustomMetadata[string];\n }\n if (expedited_shipping !== undefined) siftMetadata.$expedited_shipping = expedited_shipping;\n if (shipping_method !== undefined) siftMetadata.$shipping_method = shipping_method;\n if (shipping_carrier !== undefined) siftMetadata.$shipping_carrier = shipping_carrier;\n if (shipping_tracking_numbers !== undefined) {\n siftMetadata.$shipping_tracking_numbers = shipping_tracking_numbers;\n }\n if (brand_name !== undefined) siftMetadata.$brand_name = brand_name;\n if (site_country !== undefined) siftMetadata.$site_country = site_country;\n if (site_domain !== undefined) siftMetadata.$site_domain = site_domain;\n if (ip !== undefined) siftMetadata.$ip = ip;\n }\n\n return siftMetadata;\n}\n\nfunction normalizeBaseSiftFields(body: Record<string, unknown>): Record<string, unknown> {\n const siftMetadata = buildBaseSiftMetadata(body);\n const stripped = stripSdkOnlyFields(body, [...BASE_SIFT_FIELD_KEYS]);\n\n if (Object.keys(siftMetadata).length > 0) {\n stripped.metadata = siftMetadata;\n }\n\n return stripped;\n}\n\nfunction applyRuleSignals(\n body: Record<string, unknown>,\n request: Record<string, unknown>,\n keys: readonly string[],\n stripKeys: readonly string[]\n): Record<string, unknown> {\n const ruleSignals = collectRuleSignals(request, keys);\n const stripped = stripSdkOnlyFields(body, [...stripKeys]);\n if (Object.keys(ruleSignals).length > 0) {\n stripped.metadata = mergeMetadata(\n stripped.metadata as FraudCustomMetadata | undefined,\n ruleSignals\n );\n }\n return stripped;\n}\n\nfunction normalizeUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>\n): Record<string, unknown> {\n const { password_reason, password_status, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'password_reason',\n 'password_status',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $reason: password_reason ?? PasswordUpdateReason.UserUpdate,\n $status: password_status ?? PasswordUpdateStatus.Success,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>\n): Record<string, unknown> {\n const { wager_type, wager_status, wager_event_type, wager_event_name, wager_event_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'wager_type',\n 'wager_status',\n 'wager_event_type',\n 'wager_event_name',\n 'wager_event_id',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $wager_type: wager_type,\n $wager_status: wager_status,\n };\n if (wager_event_type) siftMetadata.$wager_event_type = wager_event_type;\n if (wager_event_name) siftMetadata.$wager_event_name = wager_event_name;\n if (wager_event_id) siftMetadata.$wager_event_id = wager_event_id;\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>\n): Record<string, unknown> {\n const { login_status, login_failure_reason, metadata, ...rest } = request;\n const effectiveStatus = login_status ?? LoginStatus.Success;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'login_status',\n 'login_failure_reason',\n ...LOGIN_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $login_status: effectiveStatus,\n };\n if (effectiveStatus === LoginStatus.Failure && login_failure_reason) {\n siftMetadata.$failure_reason = login_failure_reason;\n }\n body = applySiftMetadata(body, metadata, siftMetadata);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n LOGIN_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>\n): Record<string, unknown> {\n const { transaction_status, decline_category, transfer_recipient_user_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'transaction_status',\n 'decline_category',\n 'transfer_recipient_user_id',\n ...TRANSACTION_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {};\n if (transaction_status) siftMetadata.$transaction_status = transaction_status;\n if (decline_category) siftMetadata.$decline_category = decline_category;\n if (transfer_recipient_user_id) {\n siftMetadata.$transfer_recipient_user_id = transfer_recipient_user_id;\n }\n body = applySiftMetadata(body, metadata, siftMetadata, true);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n TRANSACTION_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>\n): Record<string, unknown> {\n const { metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n ...UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n ]);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>\n): Record<string, unknown> {\n const { amount, currency_code, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'amount',\n 'currency_code',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $amount: amount,\n $currency_code: currency_code,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeDefault(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeBaseSiftFields({ ...request } as Record<string, unknown>);\n}\n\nexport function normalizeScoreRequestForApi(request: FraudScoreRequest): Record<string, unknown> {\n switch (request.event_type) {\n case '$update_password':\n return normalizeUpdatePassword(request);\n case '$wager':\n return normalizeWager(request);\n case '$login':\n return normalizeLogin(request);\n case '$transaction':\n return normalizeTransaction(request);\n case '$update_account':\n return normalizeUpdateAccount(request);\n case '$create_order':\n return normalizeCreateOrder(request);\n default:\n return normalizeDefault(request);\n }\n}\n","import type { FraudScoreRequest } from '../types/requests';\nimport { normalizeScoreRequestForApi } from './normalize';\n\n/**\n * Returns the JSON body that would be sent to POST /api/v1/fraud/score after normalization.\n * Useful for debugging without calling the API.\n */\nexport function buildScoreRequestPreview(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeScoreRequestForApi(request);\n}\n","/**\n * Fraud event type unions aligned with fraud-service support matrix.\n */\n\n/** Events that run Sift scoring + rule engine */\nexport type ScoredFraudEventType =\n | '$create_account'\n | '$create_order'\n | '$login'\n | '$logout'\n | '$update_account'\n | '$update_password'\n | '$transaction'\n | '$wager';\n\n/** Feedback-only; no meaningful fraud score in response */\nexport type ChargebackFraudEventType = '$chargeback';\n\n/** Union accepted by scoreEvent / scoreEventsBulk */\nexport type SupportedFraudEventType = ScoredFraudEventType | ChargebackFraudEventType;\n\nexport const SCORED_FRAUD_EVENT_TYPES: readonly ScoredFraudEventType[] = [\n '$create_account',\n '$create_order',\n '$login',\n '$logout',\n '$update_account',\n '$update_password',\n '$transaction',\n '$wager',\n] as const;\n\nexport const CHARGEBACK_FRAUD_EVENT_TYPE = '$chargeback' as const;\n\nexport const SUPPORTED_FRAUD_EVENT_TYPES: readonly SupportedFraudEventType[] = [\n ...SCORED_FRAUD_EVENT_TYPES,\n CHARGEBACK_FRAUD_EVENT_TYPE,\n] as const;\n\nexport const PLANNED_FRAUD_EVENT_TYPES = [\n '$verification',\n '$link_session_to_user',\n '$security_notification',\n '$update_order',\n '$order_status',\n '$add_promotion',\n] as const;\n\n/**\n * Listed in Vesant dashboard / future API — NOT valid for scoreEvent today.\n * @deprecated Not supported by POST /api/v1/fraud/score\n */\nexport type PlannedFraudEventType = (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\n/**\n * @deprecated Use SupportedFraudEventType; kept for migration\n */\nexport type FraudEventType = SupportedFraudEventType | (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\nexport function isPlannedFraudEventType(\n eventType: string\n): eventType is (typeof PLANNED_FRAUD_EVENT_TYPES)[number] {\n return (PLANNED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n\nexport function isSupportedFraudEventType(\n eventType: string\n): eventType is SupportedFraudEventType {\n return (SUPPORTED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n","/**\n * Metadata for fraud score requests.\n * Plain keys are Vesant rule signals; $-prefixed keys are Sift pass-through (or set via typed fields).\n */\n\nexport interface FraudRuleSignalMetadata {\n /** Rule signal payment method (e.g. \"$credit_card\"), not Sift $payment_method object */\n payment_method?: string;\n country?: string;\n /** Customer date of birth, ISO 8601 (YYYY-MM-DD). Useful on onboarding ($create_account). */\n date_of_birth?: string;\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n ip_country_mismatch?: boolean;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\n/** Extra Sift fields forwarded verbatim in metadata (e.g. $referrer_user_id, $promotions). */\nexport type SiftPassThroughMetadata = Record<`$${string}`, unknown>;\n\nexport type FraudCustomMetadata = FraudRuleSignalMetadata &\n SiftPassThroughMetadata &\n Record<string, unknown>;\n\n/** Maps typed request fields to metadata keys they populate (typed values win on normalize). */\nexport const TYPED_SIFT_METADATA_KEYS: Readonly<Record<string, string>> = {\n session_id: '$session_id',\n user_email: '$user_email',\n name: '$name',\n phone: '$phone',\n sift_payment_method: '$payment_method',\n billing_address: '$billing_address',\n payment_methods: '$payment_methods',\n app: '$app',\n verification_phone_number: '$verification_phone_number',\n order_id: '$order_id',\n exchange_rate: '$exchange_rate',\n shipping_address: '$shipping_address',\n expedited_shipping: '$expedited_shipping',\n shipping_method: '$shipping_method',\n shipping_carrier: '$shipping_carrier',\n shipping_tracking_numbers: '$shipping_tracking_numbers',\n browser: '$browser',\n brand_name: '$brand_name',\n site_country: '$site_country',\n site_domain: '$site_domain',\n ip: '$ip',\n};\n\nexport function findMetadataConflictWithTypedFields(\n metadata: FraudCustomMetadata,\n request: Record<string, unknown>\n): string | undefined {\n for (const [field, metaKey] of Object.entries(TYPED_SIFT_METADATA_KEYS)) {\n if (request[field] !== undefined && metadata[metaKey] !== undefined) {\n return metaKey;\n }\n }\n return undefined;\n}\n","import { findMetadataConflictWithTypedFields } from '../types/metadata';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequestBase } from '../types/requests';\n\nexport function fieldPrefix(index?: number): string {\n return index === undefined ? '' : `requests[${index}].`;\n}\n\nexport function assertNonEmpty(\n value: string | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (!value?.trim()) {\n errors.push(`${prefix}${field} is required`);\n }\n}\n\nexport function assertEnum<T extends string>(\n value: string | undefined,\n allowed: readonly T[],\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (value === undefined) return;\n if (!(allowed as readonly string[]).includes(value)) {\n errors.push(`${prefix}${field} must be one of: ${allowed.join(', ')}`);\n }\n}\n\nexport function assertPositiveAmount(\n amount: number | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (amount === undefined || amount <= 0) {\n errors.push(`${prefix}${field} must be greater than 0`);\n }\n}\n\nexport function validateMetadata(\n metadata: FraudCustomMetadata | undefined,\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n if (!metadata) return;\n const conflictKey = findMetadataConflictWithTypedFields(\n metadata,\n request as unknown as Record<string, unknown>\n );\n if (conflictKey) {\n errors.push(\n `${prefix}metadata.${conflictKey} conflicts with a typed request field that maps to the same key; omit metadata.${conflictKey} or remove the typed field`\n );\n }\n}\n","import { ValidationError } from '@vesant-sdk/core';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentType,\n SIFT_PAYMENT_METHOD_WHITELIST,\n} from '../normalization/payment-methods';\nimport {\n SiftChargebackReasonValues,\n SiftChargebackStateValues,\n SiftLoginFailureReasonValues,\n SiftLoginStatusValues,\n SiftPasswordUpdateReasonValues,\n SiftPasswordUpdateStatusValues,\n SiftTransactionStatusValues,\n SiftTransactionTypeValues,\n SiftWagerStatusValues,\n TransactionType,\n} from '../types/enums';\nimport {\n isPlannedFraudEventType,\n isSupportedFraudEventType,\n SUPPORTED_FRAUD_EVENT_TYPES,\n} from '../types/events';\nimport type { FraudScoreRequest, FraudScoreRequestBase } from '../types/requests';\nimport {\n assertEnum,\n assertNonEmpty,\n assertPositiveAmount,\n fieldPrefix,\n validateMetadata,\n} from './helpers';\n\nconst E164_PHONE_PATTERN = /^\\+[1-9]\\d{7,14}$/;\n\nfunction validatePaymentMethods(\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n const { payment_methods, skip_payment_method_normalization: skipNormalization } = request;\n\n if (payment_methods === undefined) return;\n\n if (payment_methods.length === 0) {\n errors.push(`${prefix}payment_methods must include at least one item when provided`);\n return;\n }\n\n payment_methods.forEach((method, index) => {\n const raw = method as Record<string, unknown>;\n\n if (skipNormalization) {\n for (const key of Object.keys(raw)) {\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n errors.push(\n `${prefix}payment_methods[${index}].${plainKey} is not a valid Sift payment method field`\n );\n }\n }\n const rawType =\n raw.payment_type !== undefined ? String(raw.payment_type) : undefined;\n if (rawType !== undefined && normalizeSiftPaymentType(rawType) === undefined) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n return;\n }\n\n const rawType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n if (rawType !== undefined) {\n const result = normalizeSiftPaymentMethod(raw);\n if (result === null) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n }\n });\n}\n\nfunction validateBase(\n request: FraudScoreRequest,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.customer_id, 'customer_id', errors, prefix);\n assertNonEmpty(request.sift_user_id, 'sift_user_id', errors, prefix);\n assertNonEmpty(request.event_type, 'event_type', errors, prefix);\n validateMetadata(request.metadata, request, errors, prefix);\n}\n\nfunction validateLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(request.login_status, SiftLoginStatusValues, 'login_status', errors, prefix);\n if (request.login_failure_reason !== undefined) {\n if (request.login_status === '$failure') {\n assertEnum(\n request.login_failure_reason,\n SiftLoginFailureReasonValues,\n 'login_failure_reason',\n errors,\n prefix\n );\n } else {\n errors.push(`${prefix}login_failure_reason is only allowed when login_status is '$failure'`);\n }\n }\n}\n\nfunction validateUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(\n request.password_reason,\n SiftPasswordUpdateReasonValues,\n 'password_reason',\n errors,\n prefix\n );\n assertEnum(\n request.password_status,\n SiftPasswordUpdateStatusValues,\n 'password_status',\n errors,\n prefix\n );\n}\n\nfunction validateTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n assertEnum(request.transaction_type, SiftTransactionTypeValues, 'transaction_type', errors, prefix);\n assertEnum(\n request.transaction_status,\n SiftTransactionStatusValues,\n 'transaction_status',\n errors,\n prefix\n );\n\n if (request.decline_category !== undefined && request.transaction_status !== '$failure') {\n errors.push(\n `${prefix}decline_category is only allowed when transaction_status is '$failure'`\n );\n }\n\n if (\n request.transfer_recipient_user_id !== undefined &&\n request.transaction_type !== TransactionType.Transfer\n ) {\n errors.push(\n `${prefix}transfer_recipient_user_id is only allowed when transaction_type is '$transfer'`\n );\n }\n}\n\nfunction validateWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.transaction_id, 'transaction_id', errors, prefix);\n assertNonEmpty(request.wager_type, 'wager_type', errors, prefix);\n assertEnum(request.wager_status, SiftWagerStatusValues, 'wager_status', errors, prefix);\n if (!request.wager_status) {\n errors.push(`${prefix}wager_status is required`);\n }\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n}\n\nfunction validateCreateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$create_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n}\n\nfunction validateUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n\n if (request.verification_phone_number !== undefined) {\n if (!E164_PHONE_PATTERN.test(request.verification_phone_number.trim())) {\n errors.push(`${prefix}verification_phone_number must be E.164 (e.g. +14155550123)`);\n }\n }\n}\n\nfunction validateCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency_code, 'currency_code', errors, prefix);\n\n validatePaymentMethods(request, errors, prefix);\n\n if (request.shipping_tracking_numbers !== undefined) {\n const hasEmpty = request.shipping_tracking_numbers.some((n) => n.trim() === '');\n if (hasEmpty) {\n errors.push(`${prefix}shipping_tracking_numbers cannot contain empty values`);\n }\n }\n}\n\nfunction validateChargeback(\n request: Extract<FraudScoreRequest, { event_type: '$chargeback' }>,\n errors: string[],\n prefix: string\n): void {\n const hasTransactionId = !!request.transaction_id?.trim();\n const hasOrderId = !!request.order_id?.trim();\n if (!hasTransactionId && !hasOrderId) {\n errors.push(`${prefix}transaction_id or order_id is required`);\n }\n assertEnum(request.chargeback_state, SiftChargebackStateValues, 'chargeback_state', errors, prefix);\n assertEnum(\n request.chargeback_reason,\n SiftChargebackReasonValues,\n 'chargeback_reason',\n errors,\n prefix\n );\n if (request.ach_return_code !== undefined && request.ach_return_code.trim() !== '') {\n if (!/^R\\d{2}$/i.test(request.ach_return_code.trim())) {\n errors.push(`${prefix}ach_return_code must match NACHA R## pattern (e.g. R01)`);\n }\n }\n}\n\nfunction validateByEventType(request: FraudScoreRequest, errors: string[], prefix: string): void {\n switch (request.event_type) {\n case '$login':\n validateLogin(request, errors, prefix);\n break;\n case '$update_password':\n validateUpdatePassword(request, errors, prefix);\n break;\n case '$transaction':\n validateTransaction(request, errors, prefix);\n break;\n case '$wager':\n validateWager(request, errors, prefix);\n break;\n case '$create_order':\n validateCreateOrder(request, errors, prefix);\n break;\n case '$chargeback':\n validateChargeback(request, errors, prefix);\n break;\n case '$create_account':\n validateCreateAccount(request, errors, prefix);\n break;\n case '$logout':\n break;\n case '$update_account':\n validateUpdateAccount(request, errors, prefix);\n break;\n default:\n break;\n }\n}\n\nexport function validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n const errors: string[] = [];\n const prefix = fieldPrefix(index);\n\n validateBase(request, errors, prefix);\n\n if (request.event_type && isPlannedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type ${request.event_type} is not supported by POST /api/v1/fraud/score. Supported: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (request.event_type && !isSupportedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type must be one of: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (isSupportedFraudEventType(request.event_type)) {\n validateByEventType(request, errors, prefix);\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n }\n}\n","/**\n * Fraud scoring API client.\n */\n\nimport { BaseClient } from '@vesant-sdk/core';\nimport type { RequestOptions } from '@vesant-sdk/core';\nimport { ValidationError } from '@vesant-sdk/core';\nimport { normalizeScoreRequestForApi } from './normalization';\nimport type {\n FraudScoreRequest,\n FraudScoreResponseData,\n FraudScoreResponseEnvelope,\n} from './types';\nimport { validateScoreRequest } from './validation/rules';\n\nexport class FraudClient extends BaseClient {\n async scoreEvent(\n request: FraudScoreRequest,\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n validateScoreRequest(request);\n const body = normalizeScoreRequestForApi(request);\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n '/api/v1/fraud/score',\n {\n method: 'POST',\n body: JSON.stringify(body),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n\n async scoreEventsBulk(\n requests: FraudScoreRequest[],\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>> {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Invalid bulk score request: at least one score request is required',\n ['requests']\n );\n }\n\n const bodies = requests.map((request, index) => {\n validateScoreRequest(request, index);\n return normalizeScoreRequestForApi(request);\n });\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n '/api/v1/fraud/score/bulk',\n {\n method: 'POST',\n body: JSON.stringify(bodies),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/enums.ts","../src/types/rule-signals.ts","../src/normalization/payment-methods.ts","../src/normalization/sift-keys.ts","../src/normalization/normalize.ts","../src/normalization/preview.ts","../src/types/events.ts","../src/types/metadata.ts","../src/validation/helpers.ts","../src/validation/rules.ts","../src/client.ts","../src/types.ts"],"names":["rawType","ValidationError"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Sift-aligned enum types and const objects for fraud scoring requests.\n */\n\nexport type SiftTransactionType =\n | '$sale'\n | '$authorize'\n | '$capture'\n | '$void'\n | '$refund'\n | '$deposit'\n | '$withdrawal'\n | '$transfer'\n | '$buy'\n | '$sell'\n | '$send'\n | '$receive';\n\nexport const SiftTransactionTypeValues = [\n '$sale',\n '$authorize',\n '$capture',\n '$void',\n '$refund',\n '$deposit',\n '$withdrawal',\n '$transfer',\n '$buy',\n '$sell',\n '$send',\n '$receive',\n] as const satisfies readonly SiftTransactionType[];\n\nexport const TransactionType = {\n Sale: '$sale',\n Authorize: '$authorize',\n Capture: '$capture',\n Void: '$void',\n Refund: '$refund',\n Deposit: '$deposit',\n Withdrawal: '$withdrawal',\n Transfer: '$transfer',\n Buy: '$buy',\n Sell: '$sell',\n Send: '$send',\n Receive: '$receive',\n} as const satisfies Record<string, SiftTransactionType>;\n\nexport type SiftChargebackState =\n | '$received'\n | '$accepted'\n | '$disputed'\n | '$won'\n | '$lost';\n\nexport const SiftChargebackStateValues = [\n '$received',\n '$accepted',\n '$disputed',\n '$won',\n '$lost',\n] as const satisfies readonly SiftChargebackState[];\n\nexport const ChargebackState = {\n Received: '$received',\n Accepted: '$accepted',\n Disputed: '$disputed',\n Won: '$won',\n Lost: '$lost',\n} as const satisfies Record<string, SiftChargebackState>;\n\nexport type SiftChargebackReason =\n | '$fraud'\n | '$duplicate'\n | '$product_not_received'\n | '$product_unacceptable'\n | '$authorization'\n | '$consumer_disputes'\n | '$processing_errors'\n | '$cancel_subscription'\n | '$friendly_fraud'\n | '$ach_return'\n | '$ach_reversal'\n | '$other';\n\nexport const SiftChargebackReasonValues = [\n '$fraud',\n '$duplicate',\n '$product_not_received',\n '$product_unacceptable',\n '$authorization',\n '$consumer_disputes',\n '$processing_errors',\n '$cancel_subscription',\n '$friendly_fraud',\n '$ach_return',\n '$ach_reversal',\n '$other',\n] as const satisfies readonly SiftChargebackReason[];\n\nexport const ChargebackReason = {\n Fraud: '$fraud',\n Duplicate: '$duplicate',\n ProductNotReceived: '$product_not_received',\n ProductUnacceptable: '$product_unacceptable',\n Authorization: '$authorization',\n ConsumerDisputes: '$consumer_disputes',\n ProcessingErrors: '$processing_errors',\n CancelSubscription: '$cancel_subscription',\n FriendlyFraud: '$friendly_fraud',\n AchReturn: '$ach_return',\n AchReversal: '$ach_reversal',\n Other: '$other',\n} as const satisfies Record<string, SiftChargebackReason>;\n\nexport type SiftLoginStatus = '$success' | '$failure';\n\nexport const SiftLoginStatusValues = ['$success', '$failure'] as const satisfies readonly SiftLoginStatus[];\n\nexport const LoginStatus = {\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftLoginStatus>;\n\nexport type SiftLoginFailureReason =\n | '$account_unknown'\n | '$account_suspended'\n | '$account_disabled'\n | '$wrong_password';\n\nexport const SiftLoginFailureReasonValues = [\n '$account_unknown',\n '$account_suspended',\n '$account_disabled',\n '$wrong_password',\n] as const satisfies readonly SiftLoginFailureReason[];\n\nexport type SiftPasswordUpdateReason =\n | '$user_update'\n | '$forgot_password'\n | '$forced_reset';\n\nexport const SiftPasswordUpdateReasonValues = [\n '$user_update',\n '$forgot_password',\n '$forced_reset',\n] as const satisfies readonly SiftPasswordUpdateReason[];\n\nexport const PasswordUpdateReason = {\n UserUpdate: SiftPasswordUpdateReasonValues[0],\n ForgotPassword: SiftPasswordUpdateReasonValues[1],\n ForcedReset: SiftPasswordUpdateReasonValues[2],\n} as const satisfies Record<string, SiftPasswordUpdateReason>;\n\nexport type SiftPasswordUpdateStatus = '$pending' | '$success' | '$failure';\n\nexport const SiftPasswordUpdateStatusValues = [\n '$pending',\n '$success',\n '$failure',\n] as const satisfies readonly SiftPasswordUpdateStatus[];\n\nexport const PasswordUpdateStatus = {\n Pending: '$pending',\n Success: '$success',\n Failure: '$failure',\n} as const satisfies Record<string, SiftPasswordUpdateStatus>;\n\nexport type SiftWagerStatus = '$accept' | '$cancel';\n\nexport const SiftWagerStatusValues = ['$accept', '$cancel'] as const satisfies readonly SiftWagerStatus[];\n\nexport const WagerStatus = {\n Accept: '$accept',\n Cancel: '$cancel',\n} as const satisfies Record<string, SiftWagerStatus>;\n\nexport type SiftTransactionStatus = '$success' | '$failure' | '$pending';\n\nexport const SiftTransactionStatusValues = [\n '$success',\n '$failure',\n '$pending',\n] as const satisfies readonly SiftTransactionStatus[];\n\nexport const TransactionStatus = {\n Success: '$success',\n Failure: '$failure',\n Pending: '$pending',\n} as const satisfies Record<string, SiftTransactionStatus>;\n\nexport type SiftPaymentType =\n | '$cash'\n | '$check'\n | '$credit_card'\n | '$crypto_currency'\n | '$debit_card'\n | '$digital_wallet'\n | '$electronic_fund_transfer'\n | '$financing'\n | '$gift_card'\n | '$invoice'\n | '$in_app_purchase'\n | '$money_order'\n | '$points'\n | '$prepaid_card'\n | '$store_credit'\n | '$third_party_processor'\n | '$voucher'\n | '$sepa_credit'\n | '$sepa_instant_credit'\n | '$sepa_direct_debit'\n | '$ach_credit'\n | '$ach_debit'\n | '$wire_credit'\n | '$wire_debit';\n\nexport const SiftPaymentTypeValues = [\n '$cash',\n '$check',\n '$credit_card',\n '$crypto_currency',\n '$debit_card',\n '$digital_wallet',\n '$electronic_fund_transfer',\n '$financing',\n '$gift_card',\n '$invoice',\n '$in_app_purchase',\n '$money_order',\n '$points',\n '$prepaid_card',\n '$store_credit',\n '$third_party_processor',\n '$voucher',\n '$sepa_credit',\n '$sepa_instant_credit',\n '$sepa_direct_debit',\n '$ach_credit',\n '$ach_debit',\n '$wire_credit',\n '$wire_debit',\n] as const satisfies readonly SiftPaymentType[];\n\nexport const PaymentType = {\n Cash: '$cash',\n Check: '$check',\n CreditCard: '$credit_card',\n CryptoCurrency: '$crypto_currency',\n DebitCard: '$debit_card',\n DigitalWallet: '$digital_wallet',\n ElectronicFundTransfer: '$electronic_fund_transfer',\n Financing: '$financing',\n GiftCard: '$gift_card',\n Invoice: '$invoice',\n InAppPurchase: '$in_app_purchase',\n MoneyOrder: '$money_order',\n Points: '$points',\n PrepaidCard: '$prepaid_card',\n StoreCredit: '$store_credit',\n ThirdPartyProcessor: '$third_party_processor',\n Voucher: '$voucher',\n SepaCredit: '$sepa_credit',\n SepaInstantCredit: '$sepa_instant_credit',\n SepaDirectDebit: '$sepa_direct_debit',\n AchCredit: '$ach_credit',\n AchDebit: '$ach_debit',\n WireCredit: '$wire_credit',\n WireDebit: '$wire_debit',\n} as const satisfies Record<string, SiftPaymentType>;\n\nexport type SiftWalletType = '$crypto' | '$digital' | '$fiat';\n\nexport const SiftWalletTypeValues = ['$crypto', '$digital', '$fiat'] as const satisfies readonly SiftWalletType[];\n\nexport const WalletType = {\n Crypto: '$crypto',\n Digital: '$digital',\n Fiat: '$fiat',\n} as const satisfies Record<string, SiftWalletType>;\n\nexport type FraudRiskLevel = 'low' | 'medium' | 'high' | 'critical';\n","/**\n * Optional top-level rule-signal fields copied into plain metadata on the wire.\n */\n\nexport interface LoginRuleSignals {\n ip_country_mismatch?: boolean;\n}\n\nexport interface UpdateAccountRuleSignals {\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n}\n\nexport interface TransactionRuleSignals {\n payment_method?: string;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\nexport const LOGIN_RULE_SIGNAL_KEYS = ['ip_country_mismatch'] as const;\n\nexport const UPDATE_ACCOUNT_RULE_SIGNAL_KEYS = [\n 'two_fa_enabled',\n 'two_fa_disabled',\n 'two_fa_method_changed',\n] as const;\n\nexport const TRANSACTION_RULE_SIGNAL_KEYS = [\n 'payment_method',\n 'is_first_deposit',\n 'cumulative_deposit_amount',\n 'deposit_count',\n 'failed_deposit_count',\n 'is_first_withdrawal',\n 'withdrawal_method_differs',\n 'cumulative_withdrawal_amount',\n 'withdrawal_count',\n 'hours_since_last_deposit',\n 'days_since_last_activity',\n 'hours_since_account_creation',\n] as const;\n","import { SiftPaymentTypeValues, type SiftPaymentType } from '../types/enums';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\n\nconst PAYMENT_TYPE_ALIASES: Record<string, SiftPaymentType> = {\n bank_account: '$electronic_fund_transfer',\n electronic_fund_transfer: '$electronic_fund_transfer',\n credit_card: '$credit_card',\n crypto_currency: '$crypto_currency',\n debit_card: '$debit_card',\n digital_wallet: '$digital_wallet',\n cash: '$cash',\n check: '$check',\n financing: '$financing',\n gift_card: '$gift_card',\n invoice: '$invoice',\n in_app_purchase: '$in_app_purchase',\n money_order: '$money_order',\n points: '$points',\n prepaid_card: '$prepaid_card',\n store_credit: '$store_credit',\n third_party_processor: '$third_party_processor',\n voucher: '$voucher',\n sepa_credit: '$sepa_credit',\n sepa_instant_credit: '$sepa_instant_credit',\n sepa_direct_debit: '$sepa_direct_debit',\n ach_credit: '$ach_credit',\n ach_debit: '$ach_debit',\n wire_credit: '$wire_credit',\n wire_debit: '$wire_debit',\n};\n\nconst SIFT_PAYMENT_METHOD_WHITELIST = new Set([\n 'payment_type',\n 'payment_gateway',\n 'card_bin',\n 'card_last4',\n 'avs_result_code',\n 'cvv_result_code',\n 'verification_status',\n 'routing_number',\n 'account_holder_name',\n 'account_number_last5',\n 'bank_name',\n 'bank_country',\n 'wallet_address',\n 'wallet_type',\n 'paypal_payer_id',\n 'paypal_payer_email',\n]);\n\nconst DEPRECATED_PAYMENT_METHOD_KEYS = [\n 'account_number_last4',\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n] as const;\n\nconst METADATA_STRIP_KEYS = new Set([\n 'account_id',\n 'wallet_address_last4',\n 'crypto_currency',\n 'network',\n]);\n\nfunction isDevEnvironment(): boolean {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n}\n\nfunction warnDeprecatedKey(key: string): void {\n if (!isDevEnvironment()) return;\n const messages: Record<string, string> = {\n account_number_last4:\n '[vesant-sdk/fraud] account_number_last4 is not a Sift field; use account_number_last5',\n account_id: '[vesant-sdk/fraud] account_id is not a Sift field; moved to metadata',\n wallet_address_last4:\n '[vesant-sdk/fraud] wallet_address_last4 is not a Sift field; moved to metadata',\n crypto_currency:\n '[vesant-sdk/fraud] crypto_currency is not a Sift field on payment_method; moved to metadata',\n network: '[vesant-sdk/fraud] network is not a Sift field on payment_method; moved to metadata',\n };\n const message = messages[key];\n if (message) {\n console.warn(message);\n }\n}\n\n/**\n * Maps tenant-internal payment type signals to Sift-valid $payment_type values.\n * Returns undefined when the value cannot be mapped.\n */\nexport function normalizeSiftPaymentType(\n value: string | undefined\n): SiftPaymentType | undefined {\n if (value === undefined || value === null) return undefined;\n const trimmed = String(value).trim();\n if (trimmed === '') return undefined;\n\n const normalized = trimmed.startsWith('$') ? trimmed.slice(1) : trimmed;\n const alias = PAYMENT_TYPE_ALIASES[normalized.toLowerCase()];\n if (alias) return alias;\n\n const withPrefix = `$${normalized}` as SiftPaymentType;\n if ((SiftPaymentTypeValues as readonly string[]).includes(withPrefix)) {\n return withPrefix;\n }\n\n return undefined;\n}\n\n/**\n * Normalizes last-4/last-5 account digits for Sift $account_number_last5.\n */\nexport function toSiftAccountNumberLast5(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const digits = String(value).replace(/\\D/g, '');\n if (digits.length === 0) return undefined;\n if (digits.length >= 5) return digits.slice(-5);\n return digits.padStart(5, '0');\n}\n\nexport type NormalizePaymentMethodResult = {\n method: SiftPaymentMethod;\n metadataExtras?: Record<string, unknown>;\n};\n\nfunction collectMetadataExtra(\n metadataExtras: Record<string, unknown>,\n key: string,\n value: unknown\n): void {\n if (value === undefined) return;\n metadataExtras[key] = value;\n}\n\n/**\n * Normalizes a single payment method object for Sift wire format.\n */\nexport function normalizeSiftPaymentMethod(\n raw: Record<string, unknown>\n): NormalizePaymentMethodResult | null {\n const metadataExtras: Record<string, unknown> = {};\n const method: SiftPaymentMethod = {};\n\n const rawPaymentType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n const normalizedType = normalizeSiftPaymentType(rawPaymentType);\n if (rawPaymentType !== undefined && normalizedType === undefined) {\n return null;\n }\n if (normalizedType !== undefined) {\n method.payment_type = normalizedType;\n }\n\n for (const key of DEPRECATED_PAYMENT_METHOD_KEYS) {\n if (key in raw) warnDeprecatedKey(key);\n }\n\n const accountLast4 = raw.account_number_last4 ?? raw.$account_number_last4;\n const accountLast5 = raw.account_number_last5 ?? raw.$account_number_last5;\n const resolvedLast5 = toSiftAccountNumberLast5(accountLast5 ?? accountLast4);\n if (resolvedLast5 !== undefined) {\n method.account_number_last5 = resolvedLast5;\n }\n\n for (const [key, value] of Object.entries(raw)) {\n if (key === 'payment_type' || key === '$payment_type') continue;\n if (key === 'account_number_last4' || key === '$account_number_last4') continue;\n if (key === 'account_number_last5' || key === '$account_number_last5') continue;\n\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n\n if (METADATA_STRIP_KEYS.has(plainKey)) {\n if (plainKey === 'account_id') {\n collectMetadataExtra(metadataExtras, 'linkmoney_account_id', String(value));\n } else {\n collectMetadataExtra(metadataExtras, plainKey, value);\n }\n continue;\n }\n\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n collectMetadataExtra(metadataExtras, `payment_method_${plainKey}`, value);\n continue;\n }\n\n if (plainKey === 'payment_type') {\n continue;\n }\n\n method[plainKey] = value;\n }\n\n const hasMetadata = Object.keys(metadataExtras).length > 0;\n return {\n method,\n ...(hasMetadata ? { metadataExtras } : {}),\n };\n}\n\nfunction mergeAccountIds(\n target: Record<string, unknown>,\n accountId: string\n): void {\n const existing = target.linkmoney_account_ids;\n if (Array.isArray(existing)) {\n existing.push(accountId);\n return;\n }\n if (typeof target.linkmoney_account_id === 'string') {\n target.linkmoney_account_ids = [target.linkmoney_account_id, accountId];\n delete target.linkmoney_account_id;\n return;\n }\n target.linkmoney_account_id = accountId;\n}\n\n/**\n * Normalizes payment method arrays and aggregates stripped metadata.\n */\nexport function normalizeSiftPaymentMethods(\n methods: SiftPaymentMethod[] | undefined\n): { payment_methods?: SiftPaymentMethod[]; metadata?: Record<string, unknown> } {\n if (methods === undefined) return {};\n\n const normalized: SiftPaymentMethod[] = [];\n const metadata: Record<string, unknown> = {};\n\n for (const raw of methods) {\n const result = normalizeSiftPaymentMethod(raw as Record<string, unknown>);\n if (result === null) continue;\n normalized.push(result.method);\n\n if (result.metadataExtras) {\n for (const [key, value] of Object.entries(result.metadataExtras)) {\n if (key === 'linkmoney_account_id' && typeof value === 'string') {\n mergeAccountIds(metadata, value);\n } else if (key in metadata && Array.isArray(metadata[key]) && Array.isArray(value)) {\n metadata[key] = [...(metadata[key] as unknown[]), ...value];\n } else if (!(key in metadata)) {\n metadata[key] = value;\n }\n }\n }\n }\n\n const hasMetadata = Object.keys(metadata).length > 0;\n return {\n payment_methods: normalized,\n ...(hasMetadata ? { metadata } : {}),\n };\n}\n\nexport { SIFT_PAYMENT_METHOD_WHITELIST };\n","function siftKey(key: string): string {\n return key.startsWith('$') ? key : `$${key}`;\n}\n\n/**\n * Recursively prefix object keys with $ for Sift wire format (no double-prefix).\n */\nexport function toSiftKeyedObject(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => toSiftKeyedObject(item));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n out[siftKey(key)] = toSiftKeyedObject(nested);\n }\n return out;\n }\n return value;\n}\n","import { LoginStatus, PasswordUpdateReason, PasswordUpdateStatus } from '../types/enums';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequest } from '../types/requests';\nimport type { SiftPaymentMethod } from '../types/sift-fields';\nimport {\n LOGIN_RULE_SIGNAL_KEYS,\n TRANSACTION_RULE_SIGNAL_KEYS,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n} from '../types/rule-signals';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentMethods,\n} from './payment-methods';\nimport { toSiftKeyedObject } from './sift-keys';\n\nconst BASE_SIFT_FIELD_KEYS = [\n 'session_id',\n 'user_email',\n 'name',\n 'phone',\n 'sift_payment_method',\n 'payment_methods',\n 'billing_address',\n 'shipping_address',\n 'app',\n 'browser',\n 'verification_phone_number',\n 'order_id',\n 'exchange_rate',\n 'expedited_shipping',\n 'shipping_method',\n 'shipping_carrier',\n 'shipping_tracking_numbers',\n 'brand_name',\n 'site_country',\n 'site_domain',\n 'ip',\n 'skip_payment_method_normalization',\n] as const;\n\nfunction mergeMetadata(\n base: FraudCustomMetadata | undefined,\n extras: FraudCustomMetadata\n): FraudCustomMetadata {\n return { ...base, ...extras };\n}\n\nfunction stripSdkOnlyFields(\n request: Record<string, unknown>,\n keys: string[]\n): Record<string, unknown> {\n const body = { ...request };\n for (const key of keys) {\n delete body[key];\n }\n return body;\n}\n\nfunction createStrippedBody(\n rest: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n stripKeys: string[]\n): Record<string, unknown> {\n return stripSdkOnlyFields(\n { ...rest, metadata: mergeMetadata(metadata, {}) },\n stripKeys\n );\n}\n\nfunction applySiftMetadata(\n body: Record<string, unknown>,\n metadata: FraudCustomMetadata | undefined,\n siftMetadata: FraudCustomMetadata,\n onlyWhenNonEmpty = false\n): Record<string, unknown> {\n if (!onlyWhenNonEmpty || Object.keys(siftMetadata).length > 0) {\n body.metadata = mergeMetadata(metadata, siftMetadata);\n }\n return body;\n}\n\nfunction collectRuleSignals(\n request: Record<string, unknown>,\n keys: readonly string[]\n): FraudCustomMetadata {\n const signals: FraudCustomMetadata = {};\n for (const key of keys) {\n const value = request[key];\n if (value !== undefined) {\n signals[key] = value;\n }\n }\n return signals;\n}\n\nfunction buildBaseSiftMetadata(body: Record<string, unknown>): FraudCustomMetadata {\n const {\n event_type,\n session_id,\n user_email,\n name,\n phone,\n sift_payment_method,\n payment_methods,\n billing_address,\n shipping_address,\n app,\n browser,\n verification_phone_number,\n order_id,\n amount,\n currency_code,\n exchange_rate,\n expedited_shipping,\n shipping_method,\n shipping_carrier,\n shipping_tracking_numbers,\n brand_name,\n site_country,\n site_domain,\n ip,\n metadata,\n skip_payment_method_normalization,\n } = body;\n\n const siftMetadata: FraudCustomMetadata = {\n ...((metadata as FraudCustomMetadata | undefined) ?? {}),\n };\n\n if (session_id !== undefined) siftMetadata.$session_id = session_id;\n if (user_email !== undefined) siftMetadata.$user_email = user_email;\n if (name !== undefined) siftMetadata.$name = name;\n if (phone !== undefined) siftMetadata.$phone = phone;\n\n if (sift_payment_method !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_method = toSiftKeyedObject(sift_payment_method) as FraudCustomMetadata[string];\n } else {\n const result = normalizeSiftPaymentMethod(\n sift_payment_method as Record<string, unknown>\n );\n if (result !== null) {\n siftMetadata.$payment_method = toSiftKeyedObject(result.method) as FraudCustomMetadata[string];\n if (result.metadataExtras) {\n Object.assign(siftMetadata, result.metadataExtras);\n }\n }\n }\n }\n\n if (payment_methods !== undefined) {\n if (skip_payment_method_normalization) {\n siftMetadata.$payment_methods = toSiftKeyedObject(payment_methods) as FraudCustomMetadata[string];\n } else {\n const { payment_methods: normalized, metadata: pmMetadata } = normalizeSiftPaymentMethods(\n payment_methods as SiftPaymentMethod[]\n );\n if (normalized !== undefined) {\n siftMetadata.$payment_methods = toSiftKeyedObject(normalized) as FraudCustomMetadata[string];\n }\n if (pmMetadata) {\n Object.assign(siftMetadata, pmMetadata);\n }\n }\n }\n if (billing_address !== undefined) {\n siftMetadata.$billing_address = toSiftKeyedObject(billing_address) as FraudCustomMetadata[string];\n }\n if (shipping_address !== undefined) {\n siftMetadata.$shipping_address = toSiftKeyedObject(shipping_address) as FraudCustomMetadata[string];\n }\n if (app !== undefined) siftMetadata.$app = toSiftKeyedObject(app) as FraudCustomMetadata[string];\n if (browser !== undefined) {\n siftMetadata.$browser = toSiftKeyedObject(browser) as FraudCustomMetadata[string];\n }\n if (event_type === '$create_order' || event_type === '$update_account') {\n if (verification_phone_number !== undefined) {\n siftMetadata.$verification_phone_number = verification_phone_number;\n }\n }\n if (event_type === '$create_order') {\n if (order_id !== undefined) siftMetadata.$order_id = order_id;\n if (amount !== undefined) siftMetadata.$amount = amount;\n if (currency_code !== undefined) siftMetadata.$currency_code = currency_code;\n if (exchange_rate !== undefined) {\n siftMetadata.$exchange_rate = toSiftKeyedObject(exchange_rate) as FraudCustomMetadata[string];\n }\n if (expedited_shipping !== undefined) siftMetadata.$expedited_shipping = expedited_shipping;\n if (shipping_method !== undefined) siftMetadata.$shipping_method = shipping_method;\n if (shipping_carrier !== undefined) siftMetadata.$shipping_carrier = shipping_carrier;\n if (shipping_tracking_numbers !== undefined) {\n siftMetadata.$shipping_tracking_numbers = shipping_tracking_numbers;\n }\n if (brand_name !== undefined) siftMetadata.$brand_name = brand_name;\n if (site_country !== undefined) siftMetadata.$site_country = site_country;\n if (site_domain !== undefined) siftMetadata.$site_domain = site_domain;\n if (ip !== undefined) siftMetadata.$ip = ip;\n }\n\n return siftMetadata;\n}\n\nfunction normalizeBaseSiftFields(body: Record<string, unknown>): Record<string, unknown> {\n const siftMetadata = buildBaseSiftMetadata(body);\n const stripped = stripSdkOnlyFields(body, [...BASE_SIFT_FIELD_KEYS]);\n\n if (Object.keys(siftMetadata).length > 0) {\n stripped.metadata = siftMetadata;\n }\n\n return stripped;\n}\n\nfunction applyRuleSignals(\n body: Record<string, unknown>,\n request: Record<string, unknown>,\n keys: readonly string[],\n stripKeys: readonly string[]\n): Record<string, unknown> {\n const ruleSignals = collectRuleSignals(request, keys);\n const stripped = stripSdkOnlyFields(body, [...stripKeys]);\n if (Object.keys(ruleSignals).length > 0) {\n stripped.metadata = mergeMetadata(\n stripped.metadata as FraudCustomMetadata | undefined,\n ruleSignals\n );\n }\n return stripped;\n}\n\nfunction normalizeUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>\n): Record<string, unknown> {\n const { password_reason, password_status, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'password_reason',\n 'password_status',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $reason: password_reason ?? PasswordUpdateReason.UserUpdate,\n $status: password_status ?? PasswordUpdateStatus.Success,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>\n): Record<string, unknown> {\n const { wager_type, wager_status, wager_event_type, wager_event_name, wager_event_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'wager_type',\n 'wager_status',\n 'wager_event_type',\n 'wager_event_name',\n 'wager_event_id',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $wager_type: wager_type,\n $wager_status: wager_status,\n };\n if (wager_event_type) siftMetadata.$wager_event_type = wager_event_type;\n if (wager_event_name) siftMetadata.$wager_event_name = wager_event_name;\n if (wager_event_id) siftMetadata.$wager_event_id = wager_event_id;\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>\n): Record<string, unknown> {\n const { login_status, login_failure_reason, metadata, ...rest } = request;\n const effectiveStatus = login_status ?? LoginStatus.Success;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'login_status',\n 'login_failure_reason',\n ...LOGIN_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $login_status: effectiveStatus,\n };\n if (effectiveStatus === LoginStatus.Failure && login_failure_reason) {\n siftMetadata.$failure_reason = login_failure_reason;\n }\n body = applySiftMetadata(body, metadata, siftMetadata);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n LOGIN_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>\n): Record<string, unknown> {\n const { transaction_status, decline_category, transfer_recipient_user_id, metadata, ...rest } =\n request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'transaction_status',\n 'decline_category',\n 'transfer_recipient_user_id',\n ...TRANSACTION_RULE_SIGNAL_KEYS,\n ]);\n const siftMetadata: FraudCustomMetadata = {};\n if (transaction_status) siftMetadata.$transaction_status = transaction_status;\n if (decline_category) siftMetadata.$decline_category = decline_category;\n if (transfer_recipient_user_id) {\n siftMetadata.$transfer_recipient_user_id = transfer_recipient_user_id;\n }\n body = applySiftMetadata(body, metadata, siftMetadata, true);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n TRANSACTION_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>\n): Record<string, unknown> {\n const { metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n ...UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n ]);\n body = applyRuleSignals(\n body,\n request as unknown as Record<string, unknown>,\n UPDATE_ACCOUNT_RULE_SIGNAL_KEYS,\n []\n );\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>\n): Record<string, unknown> {\n const { amount, currency_code, metadata, ...rest } = request;\n let body = createStrippedBody(rest as Record<string, unknown>, metadata, [\n 'amount',\n 'currency_code',\n ]);\n const siftMetadata: FraudCustomMetadata = {\n $amount: amount,\n $currency_code: currency_code,\n };\n body = applySiftMetadata(body, metadata, siftMetadata);\n return normalizeBaseSiftFields(body);\n}\n\nfunction normalizeDefault(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeBaseSiftFields({ ...request } as Record<string, unknown>);\n}\n\nexport function normalizeScoreRequestForApi(request: FraudScoreRequest): Record<string, unknown> {\n switch (request.event_type) {\n case '$update_password':\n return normalizeUpdatePassword(request);\n case '$wager':\n return normalizeWager(request);\n case '$login':\n return normalizeLogin(request);\n case '$transaction':\n return normalizeTransaction(request);\n case '$update_account':\n return normalizeUpdateAccount(request);\n case '$create_order':\n return normalizeCreateOrder(request);\n default:\n return normalizeDefault(request);\n }\n}\n","import type { FraudScoreRequest } from '../types/requests';\nimport { normalizeScoreRequestForApi } from './normalize';\n\n/**\n * Returns the JSON body that would be sent to POST /api/v1/fraud/score after normalization.\n * Useful for debugging without calling the API.\n */\nexport function buildScoreRequestPreview(request: FraudScoreRequest): Record<string, unknown> {\n return normalizeScoreRequestForApi(request);\n}\n","/**\n * Fraud event type unions aligned with fraud-service support matrix.\n */\n\n/** Events that run Sift scoring + rule engine */\nexport type ScoredFraudEventType =\n | '$create_account'\n | '$create_order'\n | '$login'\n | '$logout'\n | '$update_account'\n | '$update_password'\n | '$transaction'\n | '$wager';\n\n/** Feedback-only; no meaningful fraud score in response */\nexport type ChargebackFraudEventType = '$chargeback';\n\n/** Union accepted by scoreEvent / scoreEventsBulk */\nexport type SupportedFraudEventType = ScoredFraudEventType | ChargebackFraudEventType;\n\nexport const SCORED_FRAUD_EVENT_TYPES: readonly ScoredFraudEventType[] = [\n '$create_account',\n '$create_order',\n '$login',\n '$logout',\n '$update_account',\n '$update_password',\n '$transaction',\n '$wager',\n] as const;\n\nexport const CHARGEBACK_FRAUD_EVENT_TYPE = '$chargeback' as const;\n\nexport const SUPPORTED_FRAUD_EVENT_TYPES: readonly SupportedFraudEventType[] = [\n ...SCORED_FRAUD_EVENT_TYPES,\n CHARGEBACK_FRAUD_EVENT_TYPE,\n] as const;\n\nexport const PLANNED_FRAUD_EVENT_TYPES = [\n '$verification',\n '$link_session_to_user',\n '$security_notification',\n '$update_order',\n '$order_status',\n '$add_promotion',\n] as const;\n\n/**\n * Listed in Vesant dashboard / future API — NOT valid for scoreEvent today.\n * @deprecated Not supported by POST /api/v1/fraud/score\n */\nexport type PlannedFraudEventType = (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\n/**\n * @deprecated Use SupportedFraudEventType; kept for migration\n */\nexport type FraudEventType = SupportedFraudEventType | (typeof PLANNED_FRAUD_EVENT_TYPES)[number];\n\nexport function isPlannedFraudEventType(\n eventType: string\n): eventType is (typeof PLANNED_FRAUD_EVENT_TYPES)[number] {\n return (PLANNED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n\nexport function isSupportedFraudEventType(\n eventType: string\n): eventType is SupportedFraudEventType {\n return (SUPPORTED_FRAUD_EVENT_TYPES as readonly string[]).includes(eventType);\n}\n","/**\n * Metadata for fraud score requests.\n * Plain keys are Vesant rule signals; $-prefixed keys are Sift pass-through (or set via typed fields).\n */\n\nexport interface FraudRuleSignalMetadata {\n /** Rule signal payment method (e.g. \"$credit_card\"), not Sift $payment_method object */\n payment_method?: string;\n country?: string;\n /** Customer date of birth, ISO 8601 (YYYY-MM-DD). Useful on onboarding ($create_account). */\n date_of_birth?: string;\n two_fa_enabled?: boolean;\n two_fa_disabled?: boolean;\n two_fa_method_changed?: boolean;\n ip_country_mismatch?: boolean;\n is_first_deposit?: boolean;\n cumulative_deposit_amount?: number;\n deposit_count?: number;\n failed_deposit_count?: number;\n is_first_withdrawal?: boolean;\n withdrawal_method_differs?: boolean;\n cumulative_withdrawal_amount?: number;\n withdrawal_count?: number;\n hours_since_last_deposit?: number;\n days_since_last_activity?: number;\n hours_since_account_creation?: number;\n}\n\n/** Extra Sift fields forwarded verbatim in metadata (e.g. $referrer_user_id, $promotions). */\nexport type SiftPassThroughMetadata = Record<`$${string}`, unknown>;\n\nexport type FraudCustomMetadata = FraudRuleSignalMetadata &\n SiftPassThroughMetadata &\n Record<string, unknown>;\n\n/** Maps typed request fields to metadata keys they populate (typed values win on normalize). */\nexport const TYPED_SIFT_METADATA_KEYS: Readonly<Record<string, string>> = {\n session_id: '$session_id',\n user_email: '$user_email',\n name: '$name',\n phone: '$phone',\n sift_payment_method: '$payment_method',\n billing_address: '$billing_address',\n payment_methods: '$payment_methods',\n app: '$app',\n verification_phone_number: '$verification_phone_number',\n order_id: '$order_id',\n exchange_rate: '$exchange_rate',\n shipping_address: '$shipping_address',\n expedited_shipping: '$expedited_shipping',\n shipping_method: '$shipping_method',\n shipping_carrier: '$shipping_carrier',\n shipping_tracking_numbers: '$shipping_tracking_numbers',\n browser: '$browser',\n brand_name: '$brand_name',\n site_country: '$site_country',\n site_domain: '$site_domain',\n ip: '$ip',\n};\n\nexport function findMetadataConflictWithTypedFields(\n metadata: FraudCustomMetadata,\n request: Record<string, unknown>\n): string | undefined {\n for (const [field, metaKey] of Object.entries(TYPED_SIFT_METADATA_KEYS)) {\n if (request[field] !== undefined && metadata[metaKey] !== undefined) {\n return metaKey;\n }\n }\n return undefined;\n}\n","import { findMetadataConflictWithTypedFields } from '../types/metadata';\nimport type { FraudCustomMetadata } from '../types/metadata';\nimport type { FraudScoreRequestBase } from '../types/requests';\n\nexport function fieldPrefix(index?: number): string {\n return index === undefined ? '' : `requests[${index}].`;\n}\n\nexport function assertNonEmpty(\n value: string | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (!value?.trim()) {\n errors.push(`${prefix}${field} is required`);\n }\n}\n\nexport function assertEnum<T extends string>(\n value: string | undefined,\n allowed: readonly T[],\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (value === undefined) return;\n if (!(allowed as readonly string[]).includes(value)) {\n errors.push(`${prefix}${field} must be one of: ${allowed.join(', ')}`);\n }\n}\n\nexport function assertPositiveAmount(\n amount: number | undefined,\n field: string,\n errors: string[],\n prefix: string\n): void {\n if (amount === undefined || amount <= 0) {\n errors.push(`${prefix}${field} must be greater than 0`);\n }\n}\n\nexport function validateMetadata(\n metadata: FraudCustomMetadata | undefined,\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n if (!metadata) return;\n const conflictKey = findMetadataConflictWithTypedFields(\n metadata,\n request as unknown as Record<string, unknown>\n );\n if (conflictKey) {\n errors.push(\n `${prefix}metadata.${conflictKey} conflicts with a typed request field that maps to the same key; omit metadata.${conflictKey} or remove the typed field`\n );\n }\n}\n","import { ValidationError } from '@vesant-sdk/core';\nimport {\n normalizeSiftPaymentMethod,\n normalizeSiftPaymentType,\n SIFT_PAYMENT_METHOD_WHITELIST,\n} from '../normalization/payment-methods';\nimport {\n SiftChargebackReasonValues,\n SiftChargebackStateValues,\n SiftLoginFailureReasonValues,\n SiftLoginStatusValues,\n SiftPasswordUpdateReasonValues,\n SiftPasswordUpdateStatusValues,\n SiftTransactionStatusValues,\n SiftTransactionTypeValues,\n SiftWagerStatusValues,\n TransactionType,\n} from '../types/enums';\nimport {\n isPlannedFraudEventType,\n isSupportedFraudEventType,\n SUPPORTED_FRAUD_EVENT_TYPES,\n} from '../types/events';\nimport type { FraudScoreRequest, FraudScoreRequestBase } from '../types/requests';\nimport {\n assertEnum,\n assertNonEmpty,\n assertPositiveAmount,\n fieldPrefix,\n validateMetadata,\n} from './helpers';\n\nconst E164_PHONE_PATTERN = /^\\+[1-9]\\d{7,14}$/;\n\nfunction validatePaymentMethods(\n request: FraudScoreRequestBase,\n errors: string[],\n prefix: string\n): void {\n const { payment_methods, skip_payment_method_normalization: skipNormalization } = request;\n\n if (payment_methods === undefined) return;\n\n if (payment_methods.length === 0) {\n errors.push(`${prefix}payment_methods must include at least one item when provided`);\n return;\n }\n\n payment_methods.forEach((method, index) => {\n const raw = method as Record<string, unknown>;\n\n if (skipNormalization) {\n for (const key of Object.keys(raw)) {\n const plainKey = key.startsWith('$') ? key.slice(1) : key;\n if (!SIFT_PAYMENT_METHOD_WHITELIST.has(plainKey)) {\n errors.push(\n `${prefix}payment_methods[${index}].${plainKey} is not a valid Sift payment method field`\n );\n }\n }\n const rawType =\n raw.payment_type !== undefined ? String(raw.payment_type) : undefined;\n if (rawType !== undefined && normalizeSiftPaymentType(rawType) === undefined) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n return;\n }\n\n const rawType =\n raw.payment_type !== undefined\n ? String(raw.payment_type)\n : raw.$payment_type !== undefined\n ? String(raw.$payment_type)\n : undefined;\n\n if (rawType !== undefined) {\n const result = normalizeSiftPaymentMethod(raw);\n if (result === null) {\n errors.push(\n `${prefix}payment_methods[${index}].payment_type is not a valid Sift payment type`\n );\n }\n }\n });\n}\n\nfunction validateBase(\n request: FraudScoreRequest,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.customer_id, 'customer_id', errors, prefix);\n assertNonEmpty(request.sift_user_id, 'sift_user_id', errors, prefix);\n assertNonEmpty(request.event_type, 'event_type', errors, prefix);\n validateMetadata(request.metadata, request, errors, prefix);\n}\n\nfunction validateLogin(\n request: Extract<FraudScoreRequest, { event_type: '$login' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(request.login_status, SiftLoginStatusValues, 'login_status', errors, prefix);\n if (request.login_failure_reason !== undefined) {\n if (request.login_status === '$failure') {\n assertEnum(\n request.login_failure_reason,\n SiftLoginFailureReasonValues,\n 'login_failure_reason',\n errors,\n prefix\n );\n } else {\n errors.push(`${prefix}login_failure_reason is only allowed when login_status is '$failure'`);\n }\n }\n}\n\nfunction validateUpdatePassword(\n request: Extract<FraudScoreRequest, { event_type: '$update_password' }>,\n errors: string[],\n prefix: string\n): void {\n assertEnum(\n request.password_reason,\n SiftPasswordUpdateReasonValues,\n 'password_reason',\n errors,\n prefix\n );\n assertEnum(\n request.password_status,\n SiftPasswordUpdateStatusValues,\n 'password_status',\n errors,\n prefix\n );\n}\n\nfunction validateTransaction(\n request: Extract<FraudScoreRequest, { event_type: '$transaction' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n assertEnum(request.transaction_type, SiftTransactionTypeValues, 'transaction_type', errors, prefix);\n assertEnum(\n request.transaction_status,\n SiftTransactionStatusValues,\n 'transaction_status',\n errors,\n prefix\n );\n\n if (request.decline_category !== undefined && request.transaction_status !== '$failure') {\n errors.push(\n `${prefix}decline_category is only allowed when transaction_status is '$failure'`\n );\n }\n\n if (\n request.transfer_recipient_user_id !== undefined &&\n request.transaction_type !== TransactionType.Transfer\n ) {\n errors.push(\n `${prefix}transfer_recipient_user_id is only allowed when transaction_type is '$transfer'`\n );\n }\n}\n\nfunction validateWager(\n request: Extract<FraudScoreRequest, { event_type: '$wager' }>,\n errors: string[],\n prefix: string\n): void {\n assertNonEmpty(request.transaction_id, 'transaction_id', errors, prefix);\n assertNonEmpty(request.wager_type, 'wager_type', errors, prefix);\n assertEnum(request.wager_status, SiftWagerStatusValues, 'wager_status', errors, prefix);\n if (!request.wager_status) {\n errors.push(`${prefix}wager_status is required`);\n }\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency, 'currency', errors, prefix);\n}\n\nfunction validateCreateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$create_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n}\n\nfunction validateUpdateAccount(\n request: Extract<FraudScoreRequest, { event_type: '$update_account' }>,\n errors: string[],\n prefix: string\n): void {\n validatePaymentMethods(request, errors, prefix);\n\n if (request.verification_phone_number !== undefined) {\n if (!E164_PHONE_PATTERN.test(request.verification_phone_number.trim())) {\n errors.push(`${prefix}verification_phone_number must be E.164 (e.g. +14155550123)`);\n }\n }\n}\n\nfunction validateCreateOrder(\n request: Extract<FraudScoreRequest, { event_type: '$create_order' }>,\n errors: string[],\n prefix: string\n): void {\n assertPositiveAmount(request.amount, 'amount', errors, prefix);\n assertNonEmpty(request.currency_code, 'currency_code', errors, prefix);\n\n validatePaymentMethods(request, errors, prefix);\n\n if (request.shipping_tracking_numbers !== undefined) {\n const hasEmpty = request.shipping_tracking_numbers.some((n) => n.trim() === '');\n if (hasEmpty) {\n errors.push(`${prefix}shipping_tracking_numbers cannot contain empty values`);\n }\n }\n}\n\nfunction validateChargeback(\n request: Extract<FraudScoreRequest, { event_type: '$chargeback' }>,\n errors: string[],\n prefix: string\n): void {\n const hasTransactionId = !!request.transaction_id?.trim();\n const hasOrderId = !!request.order_id?.trim();\n if (!hasTransactionId && !hasOrderId) {\n errors.push(`${prefix}transaction_id or order_id is required`);\n }\n assertEnum(request.chargeback_state, SiftChargebackStateValues, 'chargeback_state', errors, prefix);\n assertEnum(\n request.chargeback_reason,\n SiftChargebackReasonValues,\n 'chargeback_reason',\n errors,\n prefix\n );\n if (request.ach_return_code !== undefined && request.ach_return_code.trim() !== '') {\n if (!/^R\\d{2}$/i.test(request.ach_return_code.trim())) {\n errors.push(`${prefix}ach_return_code must match NACHA R## pattern (e.g. R01)`);\n }\n }\n}\n\nfunction validateByEventType(request: FraudScoreRequest, errors: string[], prefix: string): void {\n switch (request.event_type) {\n case '$login':\n validateLogin(request, errors, prefix);\n break;\n case '$update_password':\n validateUpdatePassword(request, errors, prefix);\n break;\n case '$transaction':\n validateTransaction(request, errors, prefix);\n break;\n case '$wager':\n validateWager(request, errors, prefix);\n break;\n case '$create_order':\n validateCreateOrder(request, errors, prefix);\n break;\n case '$chargeback':\n validateChargeback(request, errors, prefix);\n break;\n case '$create_account':\n validateCreateAccount(request, errors, prefix);\n break;\n case '$logout':\n break;\n case '$update_account':\n validateUpdateAccount(request, errors, prefix);\n break;\n default:\n break;\n }\n}\n\nexport function validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n const errors: string[] = [];\n const prefix = fieldPrefix(index);\n\n validateBase(request, errors, prefix);\n\n if (request.event_type && isPlannedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type ${request.event_type} is not supported by POST /api/v1/fraud/score. Supported: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (request.event_type && !isSupportedFraudEventType(request.event_type)) {\n errors.push(\n `${prefix}event_type must be one of: ${SUPPORTED_FRAUD_EVENT_TYPES.join(', ')}`\n );\n } else if (isSupportedFraudEventType(request.event_type)) {\n validateByEventType(request, errors, prefix);\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n }\n}\n","/**\n * Fraud scoring API client.\n */\n\nimport { BaseClient } from '@vesant-sdk/core';\nimport type { RequestOptions } from '@vesant-sdk/core';\nimport { ValidationError } from '@vesant-sdk/core';\nimport { normalizeScoreRequestForApi } from './normalization';\nimport type {\n FraudScoreRequest,\n FraudScoreResponseData,\n FraudScoreResponseEnvelope,\n} from './types';\nimport { validateScoreRequest } from './validation/rules';\n\nexport class FraudClient extends BaseClient {\n async scoreEvent(\n request: FraudScoreRequest,\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n validateScoreRequest(request);\n const body = normalizeScoreRequestForApi(request);\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n '/api/v1/fraud/score',\n {\n method: 'POST',\n body: JSON.stringify(body),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n\n async scoreEventsBulk(\n requests: FraudScoreRequest[],\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>> {\n if (!Array.isArray(requests) || requests.length === 0) {\n throw new ValidationError(\n 'Invalid bulk score request: at least one score request is required',\n ['requests']\n );\n }\n\n const bodies = requests.map((request, index) => {\n validateScoreRequest(request, index);\n return normalizeScoreRequestForApi(request);\n });\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n '/api/v1/fraud/score/bulk',\n {\n method: 'POST',\n body: JSON.stringify(bodies),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n}\n","/**\n * Fraud scoring types — responses and re-exports.\n */\n\nimport type { RiskLevel, Timestamp } from '@vesant-sdk/core';\nimport type { SupportedFraudEventType } from './types/events';\n\nexport * from './types/events';\nexport * from './types/enums';\nexport * from './types/metadata';\nexport * from './types/requests';\nexport * from './types/rule-signals';\nexport * from './types/sift-fields';\n\nexport type FraudReactionType =\n | 'approve'\n | 'reject'\n | 'hold'\n | 'restrict'\n | 'block'\n | 'refund'\n | 'void_transaction'\n | 'reverse_transaction'\n | 'freeze_account'\n | 'block_withdrawal'\n | 'limit_withdrawal'\n | 'disable_payment_method'\n | 'revoke_session'\n | 'require_reauth'\n | 'trigger_alert'\n | 'no_alert'\n | 'escalate'\n | 'increase_priority'\n | 'create_case'\n | 'auto_lock_account'\n | 'notify_team'\n | (string & Record<string, never>);\n\nexport interface TenantAction {\n type: FraudReactionType;\n params?: Record<string, unknown>;\n}\n\nexport type FraudDecision = 'approve' | 'review' | 'block' | 'reject' | (string & Record<string, never>);\n\nexport interface FraudScoreResponseData {\n reference: string;\n score: number;\n risk_level: RiskLevel;\n decision: FraudDecision;\n signals: string[];\n matched_rule_ids: string[];\n matched_rule_names: string[];\n applied_reactions: string[];\n alert_created: boolean;\n alert_reference?: string;\n tenant_actions: TenantAction[];\n}\n\n/**\n * Chargeback feedback responses may omit meaningful score/decision values.\n */\nexport interface ChargebackScoreResponseData extends Omit<FraudScoreResponseData, 'score' | 'decision'> {\n score?: number;\n decision?: FraudDecision;\n}\n\nexport interface FraudScoreResponseMetadata {\n request_id?: string;\n processing_ms?: number;\n tenant_id?: string;\n version?: string;\n}\n\nexport interface FraudScoreResponseEnvelope<T> {\n success: boolean;\n message: string;\n data: T;\n metadata?: FraudScoreResponseMetadata;\n timestamp: Timestamp;\n}\n\n/**\n * How a `fraud.alert.callback` decision was produced.\n *\n * - `sync` — resolved inline with the `/fraud/score` call; confirms a decision\n * the SDK response already returned.\n * - `deferred` — a rule configured with deferred timing re-scored the event\n * after a delay; the decision must be applied retroactively.\n * - `event_triggered` — a later related event caused a re-score of the original.\n */\nexport type FraudCallbackTrigger =\n | 'sync'\n | 'deferred'\n | 'event_triggered'\n | (string & Record<string, never>);\n\n/**\n * Outbound webhook body delivered to a tenant's configured fraud webhook URL\n * when a fraud rule resolves to a decision — including rules with **deferred**\n * or **event-triggered** timing that cannot return a verdict inline with the\n * `/fraud/score` call. Signed with `X-Webhook-Signature: sha256=<hex>`\n * (HMAC-SHA256 of the raw body). See the Fraud Integration guide.\n */\nexport interface FraudAlertCallbackEvent {\n /** Unique event ID — dedup on this; duplicate delivery is possible. */\n event_id: string;\n /** Always `\"fraud.alert.callback\"` — the wire event type to dispatch on. */\n event_type: 'fraud.alert.callback';\n /** Event-bus aggregate key (alert ID when an alert exists, else the reference). */\n aggregate_id: string;\n tenant_id: string;\n /** ISO 8601 timestamp of the decision. */\n timestamp: Timestamp;\n version?: number;\n correlation_id?: string;\n causation_id?: string;\n user_id?: string;\n /** Fraud reference (e.g. `\"FRD-e4b108d7\"`) — matches the sync score `reference`. */\n reference: string;\n /** Tenant customer ID the decision applies to. */\n customer_id: string;\n /** Originating Sift event type (`$create_account`, `$transaction`, …). */\n source_event_type: SupportedFraudEventType | (string & Record<string, never>);\n decision: FraudDecision;\n risk_level: RiskLevel;\n risk_score: number;\n /** Whether the decision arrived inline (`sync`) or as a later re-score. */\n trigger: FraudCallbackTrigger;\n /**\n * Tenant-scope reactions to apply on your platform — populated identically to\n * the sync `/fraud/score` response's `tenant_actions`. Always an array (never\n * null); empty when the rule resolved only to Vesant-scope reactions.\n */\n tenant_actions: TenantAction[];\n}\n\n/**\n * Type guard for the deferred/async fraud webhook body. Narrows an already\n * signature-verified, parsed payload to {@link FraudAlertCallbackEvent}.\n */\nexport function isFraudAlertCallbackEvent(\n value: unknown\n): value is FraudAlertCallbackEvent {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { event_type?: unknown }).event_type === 'fraud.alert.callback'\n );\n}\n"]}
|
package/package.json
CHANGED