@vesant-sdk/fraud 0.1.0-dev.40d1c39

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.
@@ -0,0 +1,63 @@
1
+ import { Timestamp, RiskLevel, BaseClient, RequestOptions } from '@vesant-sdk/core';
2
+
3
+ /**
4
+ * Fraud scoring types.
5
+ */
6
+
7
+ type FraudEventType = '$create_account' | '$verification' | '$login' | '$logout' | '$update_account' | '$update_password' | '$link_session_to_user' | '$security_notification' | '$transaction' | '$wager' | '$chargeback' | '$create_order' | '$update_order' | '$order_status' | '$add_promotion';
8
+ interface FraudScoreRequest {
9
+ customer_id: string;
10
+ sift_user_id: string;
11
+ event_type: FraudEventType;
12
+ transaction_id?: string;
13
+ amount?: number;
14
+ currency?: string;
15
+ ip_address?: string;
16
+ device_id?: string;
17
+ user_agent?: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ type FraudReactionType = 'approve' | 'reject' | 'hold' | 'restrict' | 'block' | 'refund' | 'void_transaction' | 'reverse_transaction' | 'freeze_account' | 'block_withdrawal' | 'limit_withdrawal' | 'disable_payment_method' | 'revoke_session' | 'require_reauth' | 'trigger_alert' | 'no_alert' | 'escalate' | 'increase_priority' | 'create_case' | 'auto_lock_account' | 'notify_team' | (string & Record<string, never>);
21
+ interface TenantAction {
22
+ type: FraudReactionType;
23
+ params?: Record<string, unknown>;
24
+ }
25
+ type FraudDecision = 'approve' | 'review' | 'block' | 'reject' | (string & Record<string, never>);
26
+ interface FraudScoreResponseData {
27
+ reference: string;
28
+ score: number;
29
+ risk_level: RiskLevel;
30
+ decision: FraudDecision;
31
+ signals: string[];
32
+ matched_rule_ids: string[];
33
+ matched_rule_names: string[];
34
+ applied_reactions: string[];
35
+ alert_created: boolean;
36
+ alert_reference?: string;
37
+ tenant_actions: TenantAction[];
38
+ }
39
+ interface FraudScoreResponseMetadata {
40
+ request_id?: string;
41
+ processing_ms?: number;
42
+ tenant_id?: string;
43
+ version?: string;
44
+ }
45
+ interface FraudScoreResponseEnvelope<T> {
46
+ success: boolean;
47
+ message: string;
48
+ data: T;
49
+ metadata?: FraudScoreResponseMetadata;
50
+ timestamp: Timestamp;
51
+ }
52
+
53
+ /**
54
+ * Fraud scoring API client.
55
+ */
56
+
57
+ declare class FraudClient extends BaseClient {
58
+ scoreEvent(request: FraudScoreRequest, requestOptions?: RequestOptions): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>>;
59
+ scoreEventsBulk(requests: FraudScoreRequest[], requestOptions?: RequestOptions): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>;
60
+ private validateScoreRequest;
61
+ }
62
+
63
+ export { FraudClient, type FraudDecision, type FraudEventType, type FraudReactionType, type FraudScoreRequest, type FraudScoreResponseData, type FraudScoreResponseEnvelope, type FraudScoreResponseMetadata, type TenantAction };
@@ -0,0 +1,63 @@
1
+ import { Timestamp, RiskLevel, BaseClient, RequestOptions } from '@vesant-sdk/core';
2
+
3
+ /**
4
+ * Fraud scoring types.
5
+ */
6
+
7
+ type FraudEventType = '$create_account' | '$verification' | '$login' | '$logout' | '$update_account' | '$update_password' | '$link_session_to_user' | '$security_notification' | '$transaction' | '$wager' | '$chargeback' | '$create_order' | '$update_order' | '$order_status' | '$add_promotion';
8
+ interface FraudScoreRequest {
9
+ customer_id: string;
10
+ sift_user_id: string;
11
+ event_type: FraudEventType;
12
+ transaction_id?: string;
13
+ amount?: number;
14
+ currency?: string;
15
+ ip_address?: string;
16
+ device_id?: string;
17
+ user_agent?: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ type FraudReactionType = 'approve' | 'reject' | 'hold' | 'restrict' | 'block' | 'refund' | 'void_transaction' | 'reverse_transaction' | 'freeze_account' | 'block_withdrawal' | 'limit_withdrawal' | 'disable_payment_method' | 'revoke_session' | 'require_reauth' | 'trigger_alert' | 'no_alert' | 'escalate' | 'increase_priority' | 'create_case' | 'auto_lock_account' | 'notify_team' | (string & Record<string, never>);
21
+ interface TenantAction {
22
+ type: FraudReactionType;
23
+ params?: Record<string, unknown>;
24
+ }
25
+ type FraudDecision = 'approve' | 'review' | 'block' | 'reject' | (string & Record<string, never>);
26
+ interface FraudScoreResponseData {
27
+ reference: string;
28
+ score: number;
29
+ risk_level: RiskLevel;
30
+ decision: FraudDecision;
31
+ signals: string[];
32
+ matched_rule_ids: string[];
33
+ matched_rule_names: string[];
34
+ applied_reactions: string[];
35
+ alert_created: boolean;
36
+ alert_reference?: string;
37
+ tenant_actions: TenantAction[];
38
+ }
39
+ interface FraudScoreResponseMetadata {
40
+ request_id?: string;
41
+ processing_ms?: number;
42
+ tenant_id?: string;
43
+ version?: string;
44
+ }
45
+ interface FraudScoreResponseEnvelope<T> {
46
+ success: boolean;
47
+ message: string;
48
+ data: T;
49
+ metadata?: FraudScoreResponseMetadata;
50
+ timestamp: Timestamp;
51
+ }
52
+
53
+ /**
54
+ * Fraud scoring API client.
55
+ */
56
+
57
+ declare class FraudClient extends BaseClient {
58
+ scoreEvent(request: FraudScoreRequest, requestOptions?: RequestOptions): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>>;
59
+ scoreEventsBulk(requests: FraudScoreRequest[], requestOptions?: RequestOptions): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>;
60
+ private validateScoreRequest;
61
+ }
62
+
63
+ export { FraudClient, type FraudDecision, type FraudEventType, type FraudReactionType, type FraudScoreRequest, type FraudScoreResponseData, type FraudScoreResponseEnvelope, type FraudScoreResponseMetadata, type TenantAction };
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ var core = require('@vesant-sdk/core');
4
+
5
+ // src/client.ts
6
+ var FraudClient = class extends core.BaseClient {
7
+ async scoreEvent(request, requestOptions) {
8
+ this.validateScoreRequest(request);
9
+ return this.requestWithRetry(
10
+ "/api/v1/fraud/score",
11
+ {
12
+ method: "POST",
13
+ body: JSON.stringify(request)
14
+ },
15
+ void 0,
16
+ void 0,
17
+ requestOptions
18
+ );
19
+ }
20
+ async scoreEventsBulk(requests, requestOptions) {
21
+ if (!Array.isArray(requests) || requests.length === 0) {
22
+ throw new core.ValidationError(
23
+ "Invalid bulk score request: at least one score request is required",
24
+ ["requests"]
25
+ );
26
+ }
27
+ requests.forEach((request, index) => this.validateScoreRequest(request, index));
28
+ return this.requestWithRetry(
29
+ "/api/v1/fraud/score/bulk",
30
+ {
31
+ method: "POST",
32
+ body: JSON.stringify(requests)
33
+ },
34
+ void 0,
35
+ void 0,
36
+ requestOptions
37
+ );
38
+ }
39
+ validateScoreRequest(request, index) {
40
+ const errors = [];
41
+ const prefix = index === void 0 ? "" : `requests[${index}].`;
42
+ if (!request.customer_id?.trim()) {
43
+ errors.push(`${prefix}customer_id is required`);
44
+ }
45
+ if (!request.sift_user_id?.trim()) {
46
+ errors.push(`${prefix}sift_user_id is required`);
47
+ }
48
+ if (!request.event_type?.trim()) {
49
+ errors.push(`${prefix}event_type is required`);
50
+ }
51
+ if (errors.length > 0) {
52
+ throw new core.ValidationError(`Invalid fraud score request: ${errors.join(", ")}`, errors);
53
+ }
54
+ }
55
+ };
56
+
57
+ exports.FraudClient = FraudClient;
58
+ //# sourceMappingURL=index.js.map
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":["BaseClient","ValidationError"],"mappings":";;;;;AAaO,IAAM,WAAA,GAAN,cAA0BA,eAAA,CAAW;AAAA,EAC1C,MAAM,UAAA,CACJ,OAAA,EACA,cAAA,EAC6D;AAC7D,IAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAEjC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACV,qBAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC9B;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,IAAIC,oBAAA;AAAA,QACR,oEAAA;AAAA,QACA,CAAC,UAAU;AAAA,OACb;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU,KAAK,oBAAA,CAAqB,OAAA,EAAS,KAAK,CAAC,CAAA;AAE9E,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACV,0BAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,OAC/B;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,SAA4B,KAAA,EAAsB;AAC7E,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAA,KAAU,MAAA,GAAY,EAAA,GAAK,YAAY,KAAK,CAAA,EAAA,CAAA;AAE3D,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,EAAG;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,EAAc,IAAA,EAAK,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,EAAY,IAAA,EAAK,EAAG;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAIA,qBAAgB,CAAA,6BAAA,EAAgC,MAAA,CAAO,KAAK,IAAI,CAAC,IAAI,MAAM,CAAA;AAAA,IACvF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\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 type {\n FraudScoreRequest,\n FraudScoreResponseData,\n FraudScoreResponseEnvelope,\n} from './types';\n\nexport class FraudClient extends BaseClient {\n async scoreEvent(\n request: FraudScoreRequest,\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n this.validateScoreRequest(request);\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n '/api/v1/fraud/score',\n {\n method: 'POST',\n body: JSON.stringify(request),\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 requests.forEach((request, index) => this.validateScoreRequest(request, index));\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n '/api/v1/fraud/score/bulk',\n {\n method: 'POST',\n body: JSON.stringify(requests),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n\n private validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n const errors: string[] = [];\n const prefix = index === undefined ? '' : `requests[${index}].`;\n\n if (!request.customer_id?.trim()) {\n errors.push(`${prefix}customer_id is required`);\n }\n if (!request.sift_user_id?.trim()) {\n errors.push(`${prefix}sift_user_id is required`);\n }\n if (!request.event_type?.trim()) {\n errors.push(`${prefix}event_type is required`);\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n }\n }\n}\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,57 @@
1
+ import { BaseClient, ValidationError } from '@vesant-sdk/core';
2
+
3
+ // src/client.ts
4
+ var FraudClient = class extends BaseClient {
5
+ async scoreEvent(request, requestOptions) {
6
+ this.validateScoreRequest(request);
7
+ return this.requestWithRetry(
8
+ "/api/v1/fraud/score",
9
+ {
10
+ method: "POST",
11
+ body: JSON.stringify(request)
12
+ },
13
+ void 0,
14
+ void 0,
15
+ requestOptions
16
+ );
17
+ }
18
+ async scoreEventsBulk(requests, requestOptions) {
19
+ if (!Array.isArray(requests) || requests.length === 0) {
20
+ throw new ValidationError(
21
+ "Invalid bulk score request: at least one score request is required",
22
+ ["requests"]
23
+ );
24
+ }
25
+ requests.forEach((request, index) => this.validateScoreRequest(request, index));
26
+ return this.requestWithRetry(
27
+ "/api/v1/fraud/score/bulk",
28
+ {
29
+ method: "POST",
30
+ body: JSON.stringify(requests)
31
+ },
32
+ void 0,
33
+ void 0,
34
+ requestOptions
35
+ );
36
+ }
37
+ validateScoreRequest(request, index) {
38
+ const errors = [];
39
+ const prefix = index === void 0 ? "" : `requests[${index}].`;
40
+ if (!request.customer_id?.trim()) {
41
+ errors.push(`${prefix}customer_id is required`);
42
+ }
43
+ if (!request.sift_user_id?.trim()) {
44
+ errors.push(`${prefix}sift_user_id is required`);
45
+ }
46
+ if (!request.event_type?.trim()) {
47
+ errors.push(`${prefix}event_type is required`);
48
+ }
49
+ if (errors.length > 0) {
50
+ throw new ValidationError(`Invalid fraud score request: ${errors.join(", ")}`, errors);
51
+ }
52
+ }
53
+ };
54
+
55
+ export { FraudClient };
56
+ //# sourceMappingURL=index.mjs.map
57
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;AAaO,IAAM,WAAA,GAAN,cAA0B,UAAA,CAAW;AAAA,EAC1C,MAAM,UAAA,CACJ,OAAA,EACA,cAAA,EAC6D;AAC7D,IAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAEjC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACV,qBAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC9B;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,IAAI,eAAA;AAAA,QACR,oEAAA;AAAA,QACA,CAAC,UAAU;AAAA,OACb;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAA,KAAU,KAAK,oBAAA,CAAqB,OAAA,EAAS,KAAK,CAAC,CAAA;AAE9E,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACV,0BAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,OAC/B;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,SAA4B,KAAA,EAAsB;AAC7E,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAA,KAAU,MAAA,GAAY,EAAA,GAAK,YAAY,KAAK,CAAA,EAAA,CAAA;AAE3D,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,EAAG;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,EAAc,IAAA,EAAK,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,EAAY,IAAA,EAAK,EAAG;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,gBAAgB,CAAA,6BAAA,EAAgC,MAAA,CAAO,KAAK,IAAI,CAAC,IAAI,MAAM,CAAA;AAAA,IACvF;AAAA,EACF;AACF","file":"index.mjs","sourcesContent":["/**\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 type {\n FraudScoreRequest,\n FraudScoreResponseData,\n FraudScoreResponseEnvelope,\n} from './types';\n\nexport class FraudClient extends BaseClient {\n async scoreEvent(\n request: FraudScoreRequest,\n requestOptions?: RequestOptions\n ): Promise<FraudScoreResponseEnvelope<FraudScoreResponseData>> {\n this.validateScoreRequest(request);\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData>>(\n '/api/v1/fraud/score',\n {\n method: 'POST',\n body: JSON.stringify(request),\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 requests.forEach((request, index) => this.validateScoreRequest(request, index));\n\n return this.requestWithRetry<FraudScoreResponseEnvelope<FraudScoreResponseData[]>>(\n '/api/v1/fraud/score/bulk',\n {\n method: 'POST',\n body: JSON.stringify(requests),\n },\n undefined,\n undefined,\n requestOptions\n );\n }\n\n private validateScoreRequest(request: FraudScoreRequest, index?: number): void {\n const errors: string[] = [];\n const prefix = index === undefined ? '' : `requests[${index}].`;\n\n if (!request.customer_id?.trim()) {\n errors.push(`${prefix}customer_id is required`);\n }\n if (!request.sift_user_id?.trim()) {\n errors.push(`${prefix}sift_user_id is required`);\n }\n if (!request.event_type?.trim()) {\n errors.push(`${prefix}event_type is required`);\n }\n\n if (errors.length > 0) {\n throw new ValidationError(`Invalid fraud score request: ${errors.join(', ')}`, errors);\n }\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@vesant-sdk/fraud",
3
+ "version": "0.1.0-dev.40d1c39",
4
+ "description": "Fraud detection and scoring client for the Vesant Compliance Platform",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "type-check": "tsc --noEmit",
24
+ "lint": "eslint src --ext .ts"
25
+ },
26
+ "keywords": [
27
+ "vesant",
28
+ "compliance",
29
+ "fraud",
30
+ "fraud-detection",
31
+ "risk-scoring"
32
+ ],
33
+ "author": "Vesant Compliance",
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@vesant-sdk/core": "0.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "msw": "^2.4.0",
40
+ "tsup": "^8.0.0",
41
+ "typescript": "^5.3.0",
42
+ "vitest": "^2.0.0"
43
+ },
44
+ "sideEffects": false,
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/botcalm-compliance/vesant-sdk.git",
48
+ "directory": "typescript/packages/fraud"
49
+ }
50
+ }