@smartcomply/web-sdk 1.0.1 → 1.0.2
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/LICENSE.txt +7 -0
- package/README.md +67 -60
- package/dist/index.js +5 -5
- package/package.json +12 -3
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright (c) 2026 Smartcomply. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This software and its source code are the proprietary information of Smartcomply.
|
|
4
|
+
Unauthorized copying, modification, distribution, or any other use of this software without the express written consent of Smartcomply is strictly prohibited.
|
|
5
|
+
|
|
6
|
+
The use of this SDK is governed by the Smartcomply Terms of Service provided
|
|
7
|
+
at https://adhere.smartcomply.com.
|
package/README.md
CHANGED
|
@@ -1,73 +1,80 @@
|
|
|
1
|
-
|
|
1
|
+
## @smartcomply/web-sdk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The lightweight, secure, and performance-optimized Identity Verification SDK for Smartcomply.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### Overview
|
|
6
|
+
The Smartcomply Web SDK provides a seamless identity verification experience. Built with performance in mind, it features:
|
|
6
7
|
|
|
7
|
-
-
|
|
8
|
-
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
8
|
+
- **Ultra-Lightweight:** Only ~80kB gzipped.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
- **Encapsulated Styles:** Powered by Shadow DOM to prevent style clashing with your website.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
- **Privacy-First:** Automatic hardware cleanup ensures the camera turns off immediately after use.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
- **Framework Agnostic:** Works with React, Vue, Angular, or Vanilla JavaScript.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
globalIgnores(['dist']),
|
|
21
|
-
{
|
|
22
|
-
files: ['**/*.{ts,tsx}'],
|
|
23
|
-
extends: [
|
|
24
|
-
// Other configs...
|
|
16
|
+
### Installation
|
|
17
|
+
```bash
|
|
18
|
+
npm install @smartcomply/web-sdk
|
|
19
|
+
```
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
tseslint.configs.recommendedTypeChecked,
|
|
28
|
-
// Alternatively, use this for stricter rules
|
|
29
|
-
tseslint.configs.strictTypeChecked,
|
|
30
|
-
// Optionally, add this for stylistic rules
|
|
31
|
-
tseslint.configs.stylisticTypeChecked,
|
|
21
|
+
**or**
|
|
32
22
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
languageOptions: {
|
|
36
|
-
parserOptions: {
|
|
37
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
38
|
-
tsconfigRootDir: import.meta.dirname,
|
|
39
|
-
},
|
|
40
|
-
// other options...
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
])
|
|
23
|
+
```bash
|
|
24
|
+
yarn add @smartcomply/web-sdk
|
|
44
25
|
```
|
|
45
26
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
import
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
{
|
|
56
|
-
|
|
57
|
-
extends: [
|
|
58
|
-
// Other configs...
|
|
59
|
-
// Enable lint rules for React
|
|
60
|
-
reactX.configs['recommended-typescript'],
|
|
61
|
-
// Enable lint rules for React DOM
|
|
62
|
-
reactDom.configs.recommended,
|
|
63
|
-
],
|
|
64
|
-
languageOptions: {
|
|
65
|
-
parserOptions: {
|
|
66
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
67
|
-
tsconfigRootDir: import.meta.dirname,
|
|
68
|
-
},
|
|
69
|
-
// other options...
|
|
70
|
-
},
|
|
27
|
+
### Usage
|
|
28
|
+
Integrating the SDK is straightforward. Initialize it with your configuration and launch it.
|
|
29
|
+
|
|
30
|
+
#### Basic Integration
|
|
31
|
+
```JavaScript
|
|
32
|
+
import AdhereSDK from '@smartcomply/web-sdk';
|
|
33
|
+
|
|
34
|
+
const sdk = new AdhereSDK({
|
|
35
|
+
session: 'sessionId',
|
|
36
|
+
onSuccess: (data) => {
|
|
37
|
+
console.log('Verification successful:', data);
|
|
71
38
|
},
|
|
72
|
-
|
|
39
|
+
onExpire: () => {
|
|
40
|
+
console.log('User cancelled verification');
|
|
41
|
+
},
|
|
42
|
+
onError: (error) => {
|
|
43
|
+
console.error('Verification error:', error);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// To open the SDK
|
|
48
|
+
sdk.launch();
|
|
73
49
|
```
|
|
50
|
+
|
|
51
|
+
### Styling & Customization
|
|
52
|
+
The SDK uses a custom prefix (sc:) for its Tailwind-powered UI. Because it resides in a Shadow DOM, your global CSS will not affect the SDK, and the SDK's styles will not leak into your application.
|
|
53
|
+
|
|
54
|
+
### Security & Privacy
|
|
55
|
+
- **Camera Permissions:** The SDK only requests camera access during the liveness detection phase.
|
|
56
|
+
|
|
57
|
+
- **Resource Management:** Hardware streams are automatically released upon session expiry or user exit.
|
|
58
|
+
|
|
59
|
+
- **Data Encryption:** All verification data is encrypted in transit.
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
### License
|
|
63
|
+
Copyright © 2026 Smartcomply. All rights reserved.
|
|
64
|
+
This software and its source code are the proprietary information of Smartcomply.
|
|
65
|
+
Unauthorized copying, modification, distribution, or any other use of this software without the express written consent of Smartcomply is strictly prohibited.
|
|
66
|
+
|
|
67
|
+
The use of this SDK is governed by the Smartcomply Terms of Service provided at https://adhere.smartcomply.com.
|
|
68
|
+
|
|
69
|
+
### Contributors
|
|
70
|
+
|
|
71
|
+
##### This SDK is developed and maintained by the Smartcomply Engineering Team.
|
|
72
|
+
|
|
73
|
+
<a href="https://github.com/titoadeoye">
|
|
74
|
+
<img src="https://avatars.githubusercontent.com/titoadeoye?s=80"
|
|
75
|
+
alt="Tito Adeoye"
|
|
76
|
+
width="100"
|
|
77
|
+
style="border-radius:50%;" />
|
|
78
|
+
</a>
|
|
79
|
+
|
|
80
|
+
---
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,7 @@ return Ut("section",{className:"sc:space-y-6",children:[
|
|
|
32
32
|
/* @__PURE__ */Ut("p",{className:"sc:text-center sc:text-sm sc:font-normal sc:text-gray-400",children:"Accepted file types: JPG, PNG"})]}),
|
|
33
33
|
/* @__PURE__ */Ut("p",{className:"sc:text-sm sc:text-gray-600 sc:font-semibold",children:"Max file size: 200KB"}),o&&/* @__PURE__ */Ut("aside",{className:"sc:mt-3",children:/* @__PURE__ */Ut("ul",{children:/* @__PURE__ */Ut("li",{className:"sc:m-0 sc:mb-1 sc:flex sc:justify-between sc:gap-3 sc:p-2 sc:hover:rounded-3xl sc:hover:border-1.5 sc:hover:border-gray-100 sc:hover:!bg-transparent",children:[
|
|
34
34
|
/* @__PURE__ */Ut("div",{className:"sc:flex sc:flex-1 sc:gap-3",children:/* @__PURE__ */Ut("div",{className:"sc:flex sc:flex-1 sc:flex-col",children:/* @__PURE__ */Ut("p",{className:"sc:break-all sc:text-left sc:text-[14px] sc:font-normal sc:text-gray-600",children:o?.name})})}),
|
|
35
|
-
/* @__PURE__ */Ut("div",{className:"sc:flex shrink-0 sc:gap-2",children:/* @__PURE__ */Ut("button",{onClick:f,className:"sc:text-lg sc:font-semibold",children:/* @__PURE__ */Ut("img",{src:"https://
|
|
35
|
+
/* @__PURE__ */Ut("div",{className:"sc:flex shrink-0 sc:gap-2",children:/* @__PURE__ */Ut("button",{onClick:f,className:"sc:text-lg sc:font-semibold",children:/* @__PURE__ */Ut("img",{src:"https://adhere-prod.s3.amazonaws.com/logo/trash.svg",className:"size-5 sc:mx-auto shrink-0",alt:"delete",loading:"eager"})})})]})})})]}):null]}),
|
|
36
36
|
/* @__PURE__ */Ut("button",{onClick:()=>r(i.identifier,i.identifier_type,i.country),className:Od("sc:text-md sc:h-12 sc:w-full sc:rounded-xl sc:text-center sc:font-semibold sc:disabled:opacity-50"),disabled:!i?.country||!i?.identifier||!i?.identifier_type||!o&&t.verification_type.includes("document_verification"),style:{background:e.primaryColor,color:e.buttonText},children:"Continue"}),
|
|
37
37
|
/* @__PURE__ */Ut("div",{className:"sc:w-full sc:h-12"})]});var p}function qd({selectedTheme:t,onStart:e}){/* @__PURE__ */
|
|
38
38
|
return Ut("section",{className:"sc:mt-8 sc:space-y-6",children:[
|
|
@@ -43,7 +43,7 @@ return Ut("section",{className:"sc:mt-8 sc:space-y-6",children:[
|
|
|
43
43
|
/* @__PURE__ */Ut("li",{children:"Stay in a well lit area with your eyes clearly visible. "}),
|
|
44
44
|
/* @__PURE__ */Ut("li",{children:"Remove anything covering your face like masks, glasses, hats."}),
|
|
45
45
|
/* @__PURE__ */Ut("li",{children:"Follow the onscreen instruction for face capture."})]}),
|
|
46
|
-
/* @__PURE__ */Ut("button",{onClick:e,className:Od("sc:text-md sc:h-12 sc:w-full sc:rounded-xl sc:text-center sc:font-semibold "),style:{background:t.primaryColor,color:t.buttonText},children:"Take a selfie"})]})}const Yd=[362,385,387,263,373,380],Xd=[33,160,158,133,153,144],Jd=t=>{const e=t[1].x,r=t[234].x,n=(e-r)/(t[454].x-r);return n<.35?"LEFT":n>.65?"RIGHT":"CENTER"};class Zd{baseUrl;timeout;session;onError;destroy;constructor(t,e){this.baseUrl="
|
|
46
|
+
/* @__PURE__ */Ut("button",{onClick:e,className:Od("sc:text-md sc:h-12 sc:w-full sc:rounded-xl sc:text-center sc:font-semibold "),style:{background:t.primaryColor,color:t.buttonText},children:"Take a selfie"})]})}const Yd=[362,385,387,263,373,380],Xd=[33,160,158,133,153,144],Jd=t=>{const e=t[1].x,r=t[234].x,n=(e-r)/(t[454].x-r);return n<.35?"LEFT":n>.65?"RIGHT":"CENTER"};class Zd{baseUrl;timeout;session;onError;destroy;constructor(t,e){this.baseUrl="https://dev-adhere.smartcomply.com",this.timeout=t.timeout||45e3,this.session=t.session,this.onError=t.onError,this.destroy=e}async request(t,e,r,n){const o=new AbortController,s=setTimeout(()=>o.abort(),this.timeout);try{const s=r instanceof FormData,a=await fetch(`${this.baseUrl}${e}`,{method:t,headers:{Authorization:`Session ${this.session}`,...n||{},...s?{}:{"Content-Type":"application/json"}},body:r?s?r:JSON.stringify(r):void 0,signal:o.signal});if(!(a.headers.get("content-type")||"").includes("application/json"))throw new Error(`Unexpected response from ${e} (${a.status})`);let c;try{c=await a.json()}catch(i){c=null}if(!a.ok){const t=c?.message||c?.error||`Error: ${a.status}`;throw{status:a.status,message:t,data:c}}return c}catch(a){throw"AbortError"===a.name?this.onError?.({error:a,message:"Request timeout",code:"TIMEOUT_ERROR"}):403==a.status||401==a.status?(this.onError?.({error:a,message:"Session expired. Please restart the process",code:"AUTH_ERROR"}),console.error("Authentication failed. Session is no longer valid."),setTimeout(()=>{"function"==typeof this.destroy&&this.destroy()},2e3)):this.onError?.({error:a||a.data,message:"An error occured",code:"UNKNOWN_ERROR"}),a}finally{clearTimeout(s)}}post(t,e,r){return this.request("POST",t,e,r)}patch(t,e,r){return this.request("PATCH",t,e,r)}get(t){return this.request("GET",t)}}function Qd({onComplete:t,canClose:e}){const[r,n]=et(0);return rt(()=>{let o;return r<99?o=setInterval(()=>{n(t=>{const e=t+(Math.floor(10*Math.random())+1);return e>=99?99:e})},500):99===r&&e&&(n(100),t&&t()),()=>clearInterval(o)},[r,e,t]),/* @__PURE__ */Ut("div",{className:"sc:mt-8 sc:space-y-4",children:[
|
|
47
47
|
/* @__PURE__ */Ut("section",{className:"sc:space-y-1",children:[
|
|
48
48
|
/* @__PURE__ */Ut("h3",{className:"sc:text-center sc:animate-pulse sc:text-2xl sc:font-semibold sc:text-gray-600",children:"Finalizing Verification..."}),
|
|
49
49
|
/* @__PURE__ */Ut("p",{className:"sc:text-center sc:text-sm sc:text-gray-600",children:"Please do not close this page"})]}),
|
|
@@ -54,9 +54,9 @@ return Ut(v,{children:F?/* @__PURE__ */Ut(Qd,{canClose:M,onComplete:()=>{t.onSuc
|
|
|
54
54
|
/* @__PURE__ */Ut("h3",{className:"sc:text-2xl sc:font-bold sc:text-gray-600 sc:animate-pulse",children:O?0===_&&!E&&b?"Synchronizing Session...":th[_]?.label:"Getting ready..."}),O&&E?/* @__PURE__ */Ut("p",{className:"sc:text-sm sc:text-gray-500",children:th[_]?.subtitle}):null]}),
|
|
55
55
|
/* @__PURE__ */Ut("div",{className:Od("sc:relative sc:w-full sc:max-w-md sc:aspect-[3/4] sc:overflow-hidden sc:rounded-3xl",O?"sc:bg-[rgba(0,0,0,0.6)]":"sc:bg-[#262A2F]"),children:[
|
|
56
56
|
/* @__PURE__ */Ut("video",{ref:a,className:"sc:absolute sc:inset-0 sc:w-full sc:h-full sc:object-cover sc:mirror",muted:!0,playsInline:!0}),/* @__PURE__ */Ut("div",O?{className:"sc:absolute sc:inset-0 sc:pointer-events-none sc:flex sc:items-center sc:justify-center",children:/* @__PURE__ */Ut("svg",{viewBox:"0 0 100 100",className:"sc:w-[80%] sc:h-[80%] sc:overflow-visible",children:/* @__PURE__ */Ut("ellipse",{cx:"50",cy:"50",rx:"35",ry:"45",fill:"none",strokeWidth:"3",className:Od("sc:transition-colors sc:duration-500 sc:ease-in-out","neutral"===R&&"sc:stroke-white/50","success"===R&&"sc:stroke-[#62DF98]","error"===R&&"sc:stroke-error-6/60"),style:{filter:"neutral"!==R?`drop-shadow(0 0 8px ${"success"===R?"#22c55e":"#ef4444"})`:"none"}})})}:{className:"sc:absolute sc:w-full sc:h-full sc:gap-1.5 sc:pointer-events-none sc:flex sc:flex-col sc:items-center sc:justify-center",children:[
|
|
57
|
-
/* @__PURE__ */Ut("img",{src:"https://
|
|
57
|
+
/* @__PURE__ */Ut("img",{src:"https://adhere-prod.s3.amazonaws.com/logo/loading.svg",alt:"loading",loading:"eager",className:"size-9 sc:animate-spin"}),
|
|
58
58
|
/* @__PURE__ */Ut("span",{className:"sc:text-white sc:text-sm sc:text-center",children:"Loading camera"})]})]})]})})};function rh({redirect_url:t,destroy:e}){return rt(()=>{const r=setTimeout(()=>{t?window.location.assign(t):e()},3e3);return()=>clearTimeout(r)},[]),/* @__PURE__ */Ut("section",{className:"sc:mt-8 sc:space-y-3",children:[
|
|
59
|
-
/* @__PURE__ */Ut("img",{src:"https://
|
|
59
|
+
/* @__PURE__ */Ut("img",{src:"https://adhere-prod.s3.amazonaws.com/logo/success.svg",className:"size-44 sc:mx-auto shrink-0",alt:"success-icon",loading:"eager"}),
|
|
60
60
|
/* @__PURE__ */Ut("h3",{className:"sc:text-center sc:text-2xl sc:font-semibold sc:text-gray-600",children:"Identity verified"}),
|
|
61
61
|
/* @__PURE__ */Ut("p",{className:"sc:text-center sc:text-sm sc:text-gray-600",children:"We have successfully verified your identity. You can close this page now."})]})}function nh({destroy:t,onExpire:e}){const[r,n]=et(120),[o,s]=et(!1);rt(()=>{const t=setInterval(()=>{n(t=>t>0?t-1:0)},1e3);return()=>clearInterval(t)},[]),rt(()=>{if(r>0&&!o)return;Kd.error("Time limit exceeded"),s(!1);const n=setTimeout(()=>{e?.(),t()},1500);return()=>clearTimeout(n)},[r,o]);const i=Math.floor(r/60),a=r%60;/* @__PURE__ */
|
|
62
62
|
return Ut("p",{className:Od("sc:text-2xl sc:font-bold sc:font-[monospace]",r<60?"sc:text-error-6":"sc:text-gray-600"),children:[i,":",a.toString().padStart(2,"0")]})}function oh(){const[t,e]=et([]);return rt(()=>Kd.subscribe(e),[]),/* @__PURE__ */Ut("div",{className:"sc:fixed sc:top-6 sc:left-1/2 sc:-translate-x-1/2 sc:z-50 sc:flex sc:flex-col sc:gap-3 sc:w-auto",children:t.map(t=>/* @__PURE__ */Ut("div",{className:`\n sc:flex sc:items-center sc:gap-3\n sc:px-4 sc:py-3\n sc:rounded-lg\n sc:shadow-lg\n sc:text-sm\n sc:text-white\n sc:animate-in sc:fade-in sc:slide-in-from-top-2\n ${"success"===t.type?"sc:bg-green-600":"error"===t.type?"sc:bg-red-600":"sc:bg-gray-50 sc:text-gray-500!"}\n `,children:[
|
|
@@ -75,7 +75,7 @@ return Ut("svg","success"===t?{className:"sc:w-4 sc:h-4",viewBox:"0 0 20 20",fil
|
|
|
75
75
|
/* @__PURE__ */Ut("p",{className:"sc:relative sc:pt-2 sc:text-center sc:text-xs sc:font-medium sc:text-gray-400",children:"Powered by Adhere"})]}),
|
|
76
76
|
/* @__PURE__ */Ut("div",{className:"sc:flex sc:flex-1 sc:items-start sc:justify-center sc:px-4 sc:py-24! sc:sm:px-10 sc:md:justify-start sc:h-full",children:/* @__PURE__ */Ut("div",{className:Od("sc:w-full sc:max-w-[500px] sc:max-sm:w-[80vw] sc:max-[450px]:!w-[calc(100vw_-_2rem)]",Dd.includes(e)?"mx-auto":""),children:["loading"===e&&/* @__PURE__ */Ut(zt,{selectedTheme:p}),"welcome"===e&&/* @__PURE__ */Ut(Ud,{config:n,onNext:()=>{r("identity"),h(!0)},selectedTheme:p}),"identity"===e&&/* @__PURE__ */Ut($d,{config:n,onSubmit:async(e,o,i)=>{if(!s&&n?.verification_type?.includes("document_verification"))return void Kd.error("Please upload ID");const a={session_id:f.session,onboarding_type:o,id_number:e,name_to_confirm:"",[o]:e};u({identifier:e,identifier_type:o,country:i});try{const e=t.getHttp(),n=await e.post("/v1/onboarding/verify",a);"verified"===n.status&&(Kd.success(n.message||"Verification successful"),r("liveness-intro"))}catch(c){const t=c?.message||"An error occured. Please try again";Kd.error(t)}},selectedTheme:p,handleIdUpdate:async(t,e)=>{i(t),c(e)},idFile:s}),"liveness-intro"===e&&/* @__PURE__ */Ut(qd,{config:n,onStart:()=>r("liveness-check"),selectedTheme:p}),"liveness-check"===e&&/* @__PURE__ */Ut(eh,{config:n,updateStep:t=>r(t),sdkInstance:f,idFile:s,snapshotFile:a,identityFormData:l,handleDetectionPass:()=>h(!1)}),"success-confirmation"===e&&/* @__PURE__ */Ut(rh,{destroy:t.destroy,redirect_url:n.redirect_url})]})}),"loading"===e||"welcome"===e?/* @__PURE__ */Ut("div",{className:"sc:relative sc:hidden sc:w-[35%] sc:bg-gray-100 sc:h-full sc:md:flex",children:[
|
|
77
77
|
/* @__PURE__ */Ut("section",{className:"sc:mx-auto sc:flex sc:h-[90%] sc:max-w-[90%] sc:flex-col sc:justify-center sc:space-y-4",children:[
|
|
78
|
-
/* @__PURE__ */Ut("img",{src:"https://
|
|
78
|
+
/* @__PURE__ */Ut("img",{src:"https://adhere-prod.s3.amazonaws.com/logo/shield-checkmark.png",className:"size-30 sc:mx-auto shrink-0",alt:"shield-checkmark",loading:"eager"}),
|
|
79
79
|
/* @__PURE__ */Ut("section",{className:"sc:space-y-2",children:[
|
|
80
80
|
/* @__PURE__ */Ut("h3",{className:"sc:text-center sc:text-xl sc:font-semibold sc:text-gray-600",children:["Welcome to"," ",n?.brand_name?n?.brand_name:"Brand Name"]}),
|
|
81
81
|
/* @__PURE__ */Ut("p",{className:"sc:break-all sc:text-center sc:text-sm sc:text-gray-500",children:n?.description?n?.description:"Description"})]})]})," ",
|
package/package.json
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartcomply/web-sdk",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.2",
|
|
5
5
|
"description": "Smartcomply Identity Verification SDK",
|
|
6
6
|
"author": {
|
|
7
|
-
"name": "Tito Adeoye"
|
|
7
|
+
"name": "Tito Adeoye",
|
|
8
|
+
"email": "tito@smartcomply.com"
|
|
8
9
|
},
|
|
10
|
+
"contributors": [
|
|
11
|
+
{
|
|
12
|
+
"name": "Tito Adeoye",
|
|
13
|
+
"url": "https://github.com/titoadeoye",
|
|
14
|
+
"email": "tito@smartcomply.com"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
9
17
|
"type": "module",
|
|
10
18
|
"main": "dist/index.js",
|
|
11
19
|
"module": "dist/index.cjs",
|
|
@@ -57,5 +65,6 @@
|
|
|
57
65
|
"typescript": "~5.9.3",
|
|
58
66
|
"typescript-eslint": "^8.48.0",
|
|
59
67
|
"vite": "^7.3.1"
|
|
60
|
-
}
|
|
68
|
+
},
|
|
69
|
+
"license": "UNLICENSED"
|
|
61
70
|
}
|