@vpdev2/metakyc 1.0.48 → 1.0.51
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/README.md +44 -8
- package/dist/client/config.d.ts +6 -0
- package/dist/client/config.d.ts.map +1 -1
- package/dist/client/session.d.ts +6 -0
- package/dist/client/session.d.ts.map +1 -1
- package/dist/hooks/useKycWorkflow.d.ts +2 -2
- package/dist/hooks/useKycWorkflow.d.ts.map +1 -1
- package/dist/index.cjs +15 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1183 -1194
- package/dist/index.js.map +1 -1
- package/dist/utils/storage.d.ts +7 -5
- package/dist/utils/storage.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,6 +13,7 @@ A comprehensive React SDK for MetaKYC due diligence workflows with configurable
|
|
|
13
13
|
- ✅ **Dynamic Form Validation** - Automatic zod schema generation from API rules
|
|
14
14
|
- ✅ **Identity Provider Integration** - Sumsub, Onfido, and SardinAI support
|
|
15
15
|
- ✅ **TypeScript** - Full type safety with types generated from C# DTOs
|
|
16
|
+
- ✅ **Session Token Auth** - Server-side token creation with optional `externalRefId` scoping guard
|
|
16
17
|
- ✅ **Dark Mode** - Built-in dark mode support
|
|
17
18
|
|
|
18
19
|
## Installation
|
|
@@ -27,20 +28,53 @@ pnpm add @metakyc/sdk
|
|
|
27
28
|
|
|
28
29
|
## Quick Start
|
|
29
30
|
|
|
30
|
-
### 1
|
|
31
|
+
### Step 1 — Server: create a session token
|
|
32
|
+
|
|
33
|
+
Create a short-lived session token on your backend. The API key and secret never leave your server.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// ── Server-side (Next.js API route, Express, etc.) ──
|
|
37
|
+
import { MetaKYCSession } from '@vpdev2/metakyc';
|
|
38
|
+
|
|
39
|
+
export async function POST() {
|
|
40
|
+
const { accessToken, expiresInSeconds } = await MetaKYCSession.createToken({
|
|
41
|
+
baseUrl: 'https://api.example.com',
|
|
42
|
+
clientId: 'your-client-id', // or tenantId: 1
|
|
43
|
+
apiKey: process.env.METAKYC_API_KEY!,
|
|
44
|
+
secretKey: process.env.METAKYC_SECRET_KEY!,
|
|
45
|
+
externalRefId: 'USER-12345', // optional — scopes the token to this user
|
|
46
|
+
});
|
|
47
|
+
return Response.json({ accessToken, expiresInSeconds });
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Parameter | Type | Required | Description |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| `baseUrl` | `string` | Yes | MetaKYC API base URL |
|
|
54
|
+
| `apiKey` | `string` | Yes | Your tenant API key |
|
|
55
|
+
| `secretKey` | `string` | Yes | Your tenant secret key |
|
|
56
|
+
| `tenantId` | `number` | One of | Numeric tenant ID (provide this **or** `clientId`) |
|
|
57
|
+
| `clientId` | `string` | One of | String client ID (provide this **or** `tenantId`) |
|
|
58
|
+
| `externalRefId` | `string` | No | When set, the returned token is **scoped**: all API calls made with it can only create or access applicants matching this `externalRefId`. Tokens created without it remain unrestricted (backward-compatible). |
|
|
59
|
+
|
|
60
|
+
### Step 2 — Client: initialize the SDK
|
|
61
|
+
|
|
62
|
+
Pass the token to the frontend SDK via `getAccessToken`:
|
|
31
63
|
|
|
32
64
|
```tsx
|
|
33
|
-
import { MetaKYCProvider } from '@metakyc
|
|
34
|
-
import '@metakyc/sdk/styles';
|
|
65
|
+
import { MetaKYCProvider } from '@vpdev2/metakyc';
|
|
35
66
|
|
|
36
67
|
function App() {
|
|
37
68
|
return (
|
|
38
69
|
<MetaKYCProvider
|
|
39
70
|
config={{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
baseUrl:
|
|
71
|
+
getAccessToken: () => fetchSessionToken(), // returns the accessToken string
|
|
72
|
+
clientId: 'your-client-id',
|
|
73
|
+
baseUrl: 'https://api.example.com',
|
|
43
74
|
endpoints: { pattern: 'host-controller' },
|
|
75
|
+
applicantForm: {
|
|
76
|
+
externalRefId: 'USER-12345',
|
|
77
|
+
},
|
|
44
78
|
// Optional: Configure identity providers (e.g., SardinAI)
|
|
45
79
|
identityProviders: {
|
|
46
80
|
sardinai: process.env.SARDINAI_CLIENT_ID ? {
|
|
@@ -59,7 +93,9 @@ function App() {
|
|
|
59
93
|
}
|
|
60
94
|
```
|
|
61
95
|
|
|
62
|
-
|
|
96
|
+
> **Tip:** You can also pass `apiKey` directly instead of `getAccessToken` for quick testing, but session tokens are recommended for production since they keep your secret key on the server.
|
|
97
|
+
|
|
98
|
+
### Step 3 — Use the workflow component
|
|
63
99
|
|
|
64
100
|
```tsx
|
|
65
101
|
import { KycWorkflow } from '@metakyc/sdk';
|
|
@@ -75,7 +111,7 @@ function KYCPage() {
|
|
|
75
111
|
}
|
|
76
112
|
```
|
|
77
113
|
|
|
78
|
-
###
|
|
114
|
+
### Step 4 — Or build custom UI with hooks
|
|
79
115
|
|
|
80
116
|
```tsx
|
|
81
117
|
import { useKycWorkflow, useQuestionnaire } from '@metakyc/sdk';
|
package/dist/client/config.d.ts
CHANGED
|
@@ -133,6 +133,12 @@ export interface MetaKYCClientConfig {
|
|
|
133
133
|
locale?: string;
|
|
134
134
|
/** Identity provider configurations */
|
|
135
135
|
identityProviders?: IdentityProviderConfigs;
|
|
136
|
+
/**
|
|
137
|
+
* Existing applicant ID to continue a previous KYC session.
|
|
138
|
+
* When provided, the SDK skips applicant creation and goes straight to the workflow.
|
|
139
|
+
* When omitted or null, the SDK starts with the applicant creation form.
|
|
140
|
+
*/
|
|
141
|
+
applicantId?: number;
|
|
136
142
|
/** Applicant form configuration */
|
|
137
143
|
applicantForm?: ApplicantFormConfig;
|
|
138
144
|
/** Theme configuration (optional - will fetch from backend if not provided) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"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"}
|
package/dist/client/session.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ export interface CreateSessionTokenParams {
|
|
|
6
6
|
tenantId?: number;
|
|
7
7
|
/** String client ID (non-ABP projects). Provide this OR tenantId. */
|
|
8
8
|
clientId?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Optional external reference ID to bind the session token to a specific user.
|
|
11
|
+
* When set, the server enforces that all API calls made with this token
|
|
12
|
+
* can only create/access applicants matching this externalRefId.
|
|
13
|
+
*/
|
|
14
|
+
externalRefId?: string;
|
|
9
15
|
}
|
|
10
16
|
export interface SessionTokenResult {
|
|
11
17
|
accessToken: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc;WACZ,WAAW,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA+BxF"}
|
|
@@ -2,11 +2,11 @@ import { ProgressApplicantResult, ApplicantProgressStatus } from '../types';
|
|
|
2
2
|
import { WorkflowOrchestrator } from '../state';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Hook to manage KYC workflow state and progression
|
|
5
|
+
* Hook to manage KYC workflow state and progression
|
|
6
6
|
*/
|
|
7
7
|
export declare function useKycWorkflow(applicantId?: number): {
|
|
8
8
|
progress: ProgressApplicantResult | null;
|
|
9
|
-
applicantId: number |
|
|
9
|
+
applicantId: number | undefined;
|
|
10
10
|
currentStep: import('..').FlowStep | null;
|
|
11
11
|
steps: import('..').StepInfo[];
|
|
12
12
|
status: ApplicantProgressStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKycWorkflow.d.ts","sourceRoot":"","sources":["../../src/hooks/useKycWorkflow.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useKycWorkflow.d.ts","sourceRoot":"","sources":["../../src/hooks/useKycWorkflow.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;8BA+HE,GAAG;;EAkDvD"}
|