@qore-id/web-sdk 1.0.0 → 1.0.1

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 CHANGED
@@ -8,42 +8,6 @@ A clean, event-driven JavaScript SDK wrapper for integrating QoreID identity ver
8
8
  npm install @qore-id/web-sdk
9
9
  ```
10
10
 
11
- ## Quick Start
12
-
13
- ```javascript
14
- import QoreID from '@qore-id/web-sdk';
15
-
16
-
17
- // Listen for events
18
- QoreID.on('success', (data) => {
19
- console.log('Verification successful:', data);
20
- });
21
-
22
- QoreID.on('error', (error) => {
23
- console.error('Verification error:', error);
24
- });
25
-
26
- QoreID.on('close', (data) => {
27
- console.error('Verification modal closed:', data);
28
- });
29
-
30
- QoreID.on('loading', (isLoading) => {
31
- console.log('Loading:', isLoading);
32
- });
33
-
34
- // Start verification flow
35
- await QoreID.start({
36
- clientId: 'your-client-id',
37
- product: 'your-product',
38
- customerReference: 'unique-reference',
39
- applicantData: {
40
- firstname: 'John',
41
- lastname: 'Doe',
42
- email: 'john@example.com',
43
- },
44
- });
45
- ```
46
-
47
11
  ## Full Documentation
48
12
 
49
13
  For complete documentation, examples, and API reference, visit:
package/dist/index.d.ts CHANGED
@@ -9,7 +9,6 @@ type QoreidEventPayloads = {
9
9
  type Handler<T extends QoreidEvent> = (payload: QoreidEventPayloads[T]) => void;
10
10
  interface InitConfig {
11
11
  containerId?: string;
12
- environment?: "sandbox" | "production";
13
12
  scriptUrl?: string;
14
13
  }
15
14
  interface ApplicantData {
@@ -33,12 +32,13 @@ interface AddressData {
33
32
  }
34
33
  interface StartConfig {
35
34
  clientId: string;
36
- product: string;
35
+ productCode?: string;
37
36
  customerReference: string;
38
37
  flowId?: number;
39
38
  applicantData: ApplicantData;
40
39
  identityData?: IdentityData;
41
40
  addressData?: AddressData;
41
+ ocrAcceptedDocuments?: string;
42
42
  }
43
43
  declare class QoreidSDK {
44
44
  private listeners;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAAK,WAAA;AAAA,KAEA,mBAAA;EACH,OAAA,EAAS,MAAA;EACT,KAAA;EACA,KAAA,EAAO,MAAA;EACP,OAAA;AAAA;AAAA,KAIG,OAAA,WAAkB,WAAA,KACrB,OAAA,EAAS,mBAAA,CAAoB,CAAA;AAAA,UAGrB,UAAA;EACR,WAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,UAGQ,aAAA;EACR,SAAA;EACA,UAAA;EACA,QAAA;EACA,MAAA;EAdG;EAgBH,GAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,UAGQ,YAAA;EACR,MAAA;EACA,QAAA;AAAA;AAAA,UAGQ,WAAA;EACR,OAAA;EACA,IAAA;EACA,OAAA;AAAA;AAAA,UAGQ,WAAA;EACR,QAAA;EACA,OAAA;EACA,iBAAA;EACA,MAAA;EACA,aAAA,EAAe,aAAA;EACf,YAAA,GAAe,YAAA;EACf,WAAA,GAAc,WAAA;AAAA;AAAA,cAGV,SAAA;EAAA,QACI,SAAA;EAAA,QACA,SAAA;EAAA,QACA,WAAA;EAAA,QACA,cAAA;;EAUR,IAAA,CAAK,MAAA,GAAS,UAAA,GAAU,OAAA;EA0CxB,EAAA,WAAa,WAAA,CAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA;EAIrD,GAAA,WAAc,WAAA,CAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA;EAItD,IAAA,WAAe,WAAA,CAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA;EAQvD,kBAAA,CAAmB,KAAA,GAAQ,WAAA;EAAA,QAQnB,IAAA;EAUF,KAAA,CAAM,MAAA,EAAQ,WAAA,GAAW,OAAA;AAAA;AAAA,cAwE3B,MAAA,EAAM,SAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAAK,WAAA;AAAA,KAEA,mBAAA;EACH,OAAA,EAAS,MAAA;EACT,KAAA;EACA,KAAA,EAAO,MAAA;EACP,OAAA;AAAA;AAAA,KAIG,OAAA,WAAkB,WAAA,KAAgB,OAAA,EAAS,mBAAA,CAAoB,CAAA;AAAA,UAE1D,UAAA;EACR,WAAA;EACA,SAAA;AAAA;AAAA,UAGQ,aAAA;EACR,SAAA;EACA,UAAA;EACA,QAAA;EACA,MAAA;EAfO;EAiBP,GAAA;EACA,KAAA;EACA,KAAA;AAAA;AAAA,UAGQ,YAAA;EACR,MAAA;EACA,QAAA;AAAA;AAAA,UAGQ,WAAA;EACR,OAAA;EACA,IAAA;EACA,OAAA;AAAA;AAAA,UAGQ,WAAA;EACR,QAAA;EACA,WAAA;EACA,iBAAA;EACA,MAAA;EACA,aAAA,EAAe,aAAA;EACf,YAAA,GAAe,YAAA;EACf,WAAA,GAAc,WAAA;EACd,oBAAA;AAAA;AAAA,cAGI,SAAA;EAAA,QACI,SAAA;EAAA,QACA,SAAA;EAAA,QACA,WAAA;EAAA,QACA,cAAA;;EAUR,IAAA,CAAK,MAAA,GAAS,UAAA,GAAU,OAAA;EA0CxB,EAAA,WAAa,WAAA,CAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA;EAIrD,GAAA,WAAc,WAAA,CAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA;EAItD,IAAA,WAAe,WAAA,CAAA,CAAa,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,CAAA;EAQvD,kBAAA,CAAmB,KAAA,GAAQ,WAAA;EAAA,QAQnB,IAAA;EAUF,KAAA,CAAM,MAAA,EAAQ,WAAA,GAAW,OAAA;AAAA;AAAA,cAoF3B,MAAA,EAAM,SAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=new class{constructor(){this.listeners=new Map,this.loadPromise=null,this.currentElement=null,[`success`,`error`,`close`,`loading`].forEach(e=>{this.listeners.set(e,new Set)})}init(e){if(this.loadPromise)return this.loadPromise;let t=e?.scriptUrl||`https://dashboard.qoreid.com/qoreid-sdk/qoreid.js`;return this.loadPromise=new Promise((n,r)=>{if(e?.containerId){let t=document.getElementById(e.containerId);if(!t)throw Error(`Container not found`);this.container=t}else this.container=document.createElement(`div`),this.container.id=`qoreid-sdk-root`,document.body.appendChild(this.container);if(window.QoreIDWebSdk){n();return}let i=document.createElement(`script`);i.src=t,i.async=!0,i.onload=()=>{n()},i.onerror=r,document.body.appendChild(i)}),this.loadPromise}on(e,t){this.listeners.get(e)?.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}once(e,t){let n=r=>{t(r),this.off(e,n)};this.on(e,n)}removeAllListeners(e){e?this.listeners.get(e)?.clear():this.listeners.forEach(e=>e.clear())}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t))}async start(e){this.emit(`loading`,!0),await this.init(),this.currentElement&&=(this.currentElement.remove(),null);let t=document.createElement(`qoreid-button`);t.id=`QoreIDButton`,t.setAttribute(`clientId`,e.clientId),t.setAttribute(`productCode`,e.product),t.setAttribute(`customerReference`,e.customerReference),t.setAttribute(`hideButton`,`yes`),Object.entries(e).forEach(([e,n])=>{if(![`clientId`,`product`,`customerReference`].includes(e)&&n!==void 0){let r=[`string`,`number`].includes(typeof n)?String(n):JSON.stringify(n);t.setAttribute(e,r)}}),t.addEventListener(`qoreid:verificationSubmitted`,e=>{this.emit(`success`,e.detail)}),t.addEventListener(`qoreid:verificationError`,e=>{this.emit(`error`,e.detail)}),t.addEventListener(`qoreid:verificationClosed`,e=>{this.emit(`close`,e.detail)}),this.container.appendChild(t),this.currentElement=t;try{window.QoreIdRegenerateSDK?.(),window.QoreIDWebSdk?.start();let e=()=>{document.querySelector(`.sdkPopup`)?this.emit(`loading`,!1):setTimeout(e,1e3)};setTimeout(e,1e3)}catch(e){this.emit(`error`,e)}}};export{e as default};
1
+ const e=new class{constructor(){this.listeners=new Map,this.loadPromise=null,this.currentElement=null,[`success`,`error`,`close`,`loading`].forEach(e=>{this.listeners.set(e,new Set)})}init(e){if(this.loadPromise)return this.loadPromise;let t=e?.scriptUrl||`https://dashboard.qoreid.com/qoreid-sdk/qoreid.js`;return this.loadPromise=new Promise((n,r)=>{if(e?.containerId){let t=document.getElementById(e.containerId);if(!t)throw Error(`Container not found`);this.container=t}else this.container=document.createElement(`div`),this.container.id=`qoreid-sdk-root`,document.body.appendChild(this.container);if(window.QoreIDWebSdk){n();return}let i=document.createElement(`script`);i.src=t,i.async=!0,i.onload=()=>{n()},i.onerror=r,document.body.appendChild(i)}),this.loadPromise}on(e,t){this.listeners.get(e)?.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}once(e,t){let n=r=>{t(r),this.off(e,n)};this.on(e,n)}removeAllListeners(e){e?this.listeners.get(e)?.clear():this.listeners.forEach(e=>e.clear())}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t))}async start(e){if(this.emit(`loading`,!0),await this.init(),this.currentElement&&=(this.currentElement.remove(),null),!e.clientId)throw Error(`clientId is required`);if(!e.customerReference)throw Error(`customerReference is required`);if(!e.productCode&&!e.flowId)throw Error(`productCode or flowId is required to determine product or flow`);let t=document.createElement(`qoreid-button`);t.id=`QoreIDButton`,t.setAttribute(`clientId`,e.clientId),t.setAttribute(`customerReference`,e.customerReference),t.setAttribute(`hideButton`,`yes`),Object.entries(e).forEach(([e,n])=>{if(![`clientId`,`customerReference`].includes(e)&&n!==void 0){let r=[`string`,`number`].includes(typeof n)?String(n):JSON.stringify(n);t.setAttribute(e,r)}}),t.addEventListener(`qoreid:verificationSubmitted`,e=>{this.emit(`success`,e.detail)}),t.addEventListener(`qoreid:verificationError`,e=>{this.emit(`error`,e.detail)}),t.addEventListener(`qoreid:verificationClosed`,e=>{this.emit(`close`,e.detail)}),this.container.appendChild(t),this.currentElement=t;try{window.QoreIdRegenerateSDK?.(),window.QoreIDWebSdk?.start();let e=()=>{document.querySelector(`.sdkPopup`)?this.emit(`loading`,!1):setTimeout(e,1e3)};setTimeout(e,1e3)}catch(e){this.emit(`error`,e)}}};export{e as default};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["type QoreidEvent = \"success\" | \"error\" | \"close\" | \"loading\";\n\ntype QoreidEventPayloads = {\n success: Record<string, any>;\n error: any;\n close: Record<string, any>;\n loading: boolean;\n};\n\n// if the event is loading payload is boolean, otherwise it's the detail object\ntype Handler<T extends QoreidEvent> = (\n payload: QoreidEventPayloads[T],\n) => void;\n\ninterface InitConfig {\n containerId?: string;\n environment?: \"sandbox\" | \"production\";\n scriptUrl?: string;\n}\n\ninterface ApplicantData {\n firstname: string;\n middlename?: string;\n lastname: string;\n gender?: string;\n /**YYYY-MM-DD */\n dob?: string;\n phone?: string;\n email?: string;\n}\n\ninterface IdentityData {\n idType: string;\n idNumber: string;\n}\n\ninterface AddressData {\n address: string;\n city: string;\n lgaName: string;\n}\n\ninterface StartConfig {\n clientId: string;\n product: string;\n customerReference: string;\n flowId?: number;\n applicantData: ApplicantData;\n identityData?: IdentityData;\n addressData?: AddressData;\n}\n\nclass QoreidSDK {\n private listeners = new Map<QoreidEvent, Set<Handler<QoreidEvent>>>();\n private container!: HTMLElement;\n private loadPromise: Promise<void> | null = null;\n private currentElement: HTMLElement | null = null;\n constructor() {\n [\"success\", \"error\", \"close\", \"loading\"].forEach((event) => {\n this.listeners.set(event as QoreidEvent, new Set());\n });\n }\n\n // -------------------\n // Init\n // -------------------\n init(config?: InitConfig) {\n if (this.loadPromise) return this.loadPromise;\n const scriptUrl =\n config?.scriptUrl || \"https://dashboard.qoreid.com/qoreid-sdk/qoreid.js\";\n\n this.loadPromise = new Promise((resolve, reject) => {\n // 1. Setup container\n if (config?.containerId) {\n const el = document.getElementById(config.containerId);\n if (!el) throw new Error(\"Container not found\");\n this.container = el;\n } else {\n this.container = document.createElement(\"div\");\n this.container.id = \"qoreid-sdk-root\";\n document.body.appendChild(this.container);\n }\n\n // 2. Load script once\n if ((window as any).QoreIDWebSdk) {\n resolve();\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = scriptUrl;\n script.async = true;\n\n script.onload = () => {\n resolve();\n };\n\n script.onerror = reject;\n\n document.body.appendChild(script);\n });\n\n return this.loadPromise;\n }\n\n // -------------------\n // Events\n // -------------------\n on<T extends QoreidEvent>(event: T, handler: Handler<T>) {\n this.listeners.get(event)?.add(handler as Handler<QoreidEvent>);\n }\n\n off<T extends QoreidEvent>(event: T, handler: Handler<T>) {\n this.listeners.get(event)?.delete(handler as Handler<QoreidEvent>);\n }\n\n once<T extends QoreidEvent>(event: T, handler: Handler<T>) {\n const onceHandler: Handler<T> = (payload) => {\n handler(payload);\n this.off(event, onceHandler);\n };\n this.on(event, onceHandler);\n }\n\n removeAllListeners(event?: QoreidEvent) {\n if (event) {\n this.listeners.get(event)?.clear();\n } else {\n this.listeners.forEach((set) => set.clear());\n }\n }\n\n private emit<T extends QoreidEvent>(\n event: T,\n payload?: QoreidEventPayloads[T],\n ) {\n this.listeners.get(event)?.forEach((h) => h(payload));\n }\n\n // -------------------\n // Start\n // -------------------\n async start(config: StartConfig) {\n this.emit(\"loading\", true);\n await this.init();\n\n // Cleanup previous instance (important)\n if (this.currentElement) {\n this.currentElement.remove();\n this.currentElement = null;\n }\n\n // 1. Create web component\n const el = document.createElement(\"qoreid-button\");\n\n // 2. Map config → attributes\n el.id = \"QoreIDButton\";\n el.setAttribute(\"clientId\", config.clientId);\n el.setAttribute(\"productCode\", config.product);\n el.setAttribute(\"customerReference\", config.customerReference);\n el.setAttribute(\"hideButton\", \"yes\");\n\n // Optional passthrough config\n Object.entries(config).forEach(([key, value]) => {\n if (\n ![\"clientId\", \"product\", \"customerReference\"].includes(key) &&\n value !== undefined\n ) {\n const transformedValue = [\"string\", \"number\"].includes(typeof value)\n ? String(value)\n : JSON.stringify(value);\n el.setAttribute(key, transformedValue);\n }\n });\n\n // 3. Bind DOM events → SDK events\n el.addEventListener(\"qoreid:verificationSubmitted\", (e: any) => {\n this.emit(\"success\", e.detail);\n });\n\n el.addEventListener(\"qoreid:verificationError\", (e: any) => {\n this.emit(\"error\", e.detail);\n });\n\n el.addEventListener(\"qoreid:verificationClosed\", (e: any) => {\n this.emit(\"close\", e.detail);\n });\n\n // 4. Mount element\n this.container.appendChild(el);\n this.currentElement = el;\n\n // 5. Trigger SDK\n try {\n (window as any).QoreIdRegenerateSDK?.();\n (window as any).QoreIDWebSdk?.start();\n\n // check for element with class sdkPopup in embedded iframe\n const checkPopup = () => {\n const popup = document.querySelector(\".sdkPopup\") as HTMLElement | null;\n if (popup) {\n this.emit(\"loading\", false);\n } else {\n setTimeout(checkPopup, 1000);\n }\n };\n setTimeout(checkPopup, 1000);\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n}\n\n// Singleton export\nconst QoreID = new QoreidSDK();\nexport default QoreID;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["type QoreidEvent = \"success\" | \"error\" | \"close\" | \"loading\";\n\ntype QoreidEventPayloads = {\n success: Record<string, any>;\n error: any;\n close: Record<string, any>;\n loading: boolean;\n};\n\n// if the event is loading payload is boolean, otherwise it's the detail object\ntype Handler<T extends QoreidEvent> = (payload: QoreidEventPayloads[T]) => void;\n\ninterface InitConfig {\n containerId?: string;\n scriptUrl?: string;\n}\n\ninterface ApplicantData {\n firstname: string;\n middlename?: string;\n lastname: string;\n gender?: string;\n /**YYYY-MM-DD */\n dob?: string;\n phone?: string;\n email?: string;\n}\n\ninterface IdentityData {\n idType: string;\n idNumber: string;\n}\n\ninterface AddressData {\n address: string;\n city: string;\n lgaName: string;\n}\n\ninterface StartConfig {\n clientId: string;\n productCode?: string;\n customerReference: string;\n flowId?: number;\n applicantData: ApplicantData;\n identityData?: IdentityData;\n addressData?: AddressData;\n ocrAcceptedDocuments?: string;\n}\n\nclass QoreidSDK {\n private listeners = new Map<QoreidEvent, Set<Handler<QoreidEvent>>>();\n private container!: HTMLElement;\n private loadPromise: Promise<void> | null = null;\n private currentElement: HTMLElement | null = null;\n constructor() {\n [\"success\", \"error\", \"close\", \"loading\"].forEach((event) => {\n this.listeners.set(event as QoreidEvent, new Set());\n });\n }\n\n // -------------------\n // Init\n // -------------------\n init(config?: InitConfig) {\n if (this.loadPromise) return this.loadPromise;\n const scriptUrl =\n config?.scriptUrl || \"https://dashboard.qoreid.com/qoreid-sdk/qoreid.js\";\n\n this.loadPromise = new Promise((resolve, reject) => {\n // 1. Setup container\n if (config?.containerId) {\n const el = document.getElementById(config.containerId);\n if (!el) throw new Error(\"Container not found\");\n this.container = el;\n } else {\n this.container = document.createElement(\"div\");\n this.container.id = \"qoreid-sdk-root\";\n document.body.appendChild(this.container);\n }\n\n // 2. Load script once\n if ((window as any).QoreIDWebSdk) {\n resolve();\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = scriptUrl;\n script.async = true;\n\n script.onload = () => {\n resolve();\n };\n\n script.onerror = reject;\n\n document.body.appendChild(script);\n });\n\n return this.loadPromise;\n }\n\n // -------------------\n // Events\n // -------------------\n on<T extends QoreidEvent>(event: T, handler: Handler<T>) {\n this.listeners.get(event)?.add(handler as Handler<QoreidEvent>);\n }\n\n off<T extends QoreidEvent>(event: T, handler: Handler<T>) {\n this.listeners.get(event)?.delete(handler as Handler<QoreidEvent>);\n }\n\n once<T extends QoreidEvent>(event: T, handler: Handler<T>) {\n const onceHandler: Handler<T> = (payload) => {\n handler(payload);\n this.off(event, onceHandler);\n };\n this.on(event, onceHandler);\n }\n\n removeAllListeners(event?: QoreidEvent) {\n if (event) {\n this.listeners.get(event)?.clear();\n } else {\n this.listeners.forEach((set) => set.clear());\n }\n }\n\n private emit<T extends QoreidEvent>(\n event: T,\n payload?: QoreidEventPayloads[T],\n ) {\n this.listeners.get(event)?.forEach((h) => h(payload));\n }\n\n // -------------------\n // Start\n // -------------------\n async start(config: StartConfig) {\n this.emit(\"loading\", true);\n await this.init();\n\n // Cleanup previous instance (important)\n if (this.currentElement) {\n this.currentElement.remove();\n this.currentElement = null;\n }\n\n // check for required fields\n if (!config.clientId) {\n throw new Error(\"clientId is required\");\n }\n\n if (!config.customerReference) {\n throw new Error(\"customerReference is required\");\n }\n\n if (!config.productCode && !config.flowId) {\n throw new Error(\"productCode or flowId is required to determine product or flow\");\n }\n\n // 1. Create web component\n const el = document.createElement(\"qoreid-button\");\n\n // 2. Map config → attributes\n el.id = \"QoreIDButton\";\n el.setAttribute(\"clientId\", config.clientId);\n el.setAttribute(\"customerReference\", config.customerReference);\n el.setAttribute(\"hideButton\", \"yes\");\n\n // Optional passthrough config\n Object.entries(config).forEach(([key, value]) => {\n if (\n ![\"clientId\", \"customerReference\"].includes(key) &&\n value !== undefined\n ) {\n const transformedValue = [\"string\", \"number\"].includes(typeof value)\n ? String(value)\n : JSON.stringify(value);\n el.setAttribute(key, transformedValue);\n }\n });\n\n // 3. Bind DOM events → SDK events\n el.addEventListener(\"qoreid:verificationSubmitted\", (e: any) => {\n this.emit(\"success\", e.detail);\n });\n\n el.addEventListener(\"qoreid:verificationError\", (e: any) => {\n this.emit(\"error\", e.detail);\n });\n\n el.addEventListener(\"qoreid:verificationClosed\", (e: any) => {\n this.emit(\"close\", e.detail);\n });\n\n // 4. Mount element\n this.container.appendChild(el);\n this.currentElement = el;\n\n // 5. Trigger SDK\n try {\n (window as any).QoreIdRegenerateSDK?.();\n (window as any).QoreIDWebSdk?.start();\n\n // check for element with class sdkPopup in embedded iframe\n const checkPopup = () => {\n const popup = document.querySelector(\".sdkPopup\") as HTMLElement | null;\n if (popup) {\n this.emit(\"loading\", false);\n } else {\n setTimeout(checkPopup, 1000);\n }\n };\n setTimeout(checkPopup, 1000);\n } catch (err) {\n this.emit(\"error\", err);\n }\n }\n}\n\n// Singleton export\nconst QoreID = new QoreidSDK();\nexport default QoreID;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qore-id/web-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "QoreID Web SDK wrapper with clean event-driven API",
5
5
  "homepage": "https://docs.qoreid.com/docs/qoreid-web-sdk",
6
6
  "license": "MIT",