@payscore/web-widget-sdk 1.1.0 → 1.2.0

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 CHANGED
@@ -12,11 +12,17 @@ declare enum PayscoreWidgetEventType {
12
12
  IncomeVerificationCompleted = "payscore/incomeVerification/completed",
13
13
  WidgetClosed = "payscore/incomeVerification/widgetClosed"
14
14
  }
15
+ declare enum IncomeVerificationMethod {
16
+ Bank = "bank",
17
+ Payroll = "payroll",
18
+ DocumentUpload = "document_upload"
19
+ }
15
20
  type PayscoreEnvironment = 'staging' | 'production';
16
21
  interface PayscoreBaseEvent<T extends PayscoreWidgetEventType = PayscoreWidgetEventType> {
17
22
  type: T;
18
23
  timestamp: string;
19
24
  payscore: true;
25
+ methods: IncomeVerificationMethod[];
20
26
  }
21
27
  interface PayscoreWidgetOptions {
22
28
  hideCloseButton?: boolean;
@@ -43,4 +49,4 @@ declare class IncomeVerificationWidget {
43
49
  private removeListener;
44
50
  }
45
51
 
46
- export { IncomeVerificationWidget, type PayscoreBaseEvent, type PayscoreEnvironment, type PayscoreWidgetConfiguration, PayscoreWidgetEventType, type PayscoreWidgetOptions };
52
+ export { IncomeVerificationMethod, IncomeVerificationWidget, type PayscoreBaseEvent, type PayscoreEnvironment, type PayscoreWidgetConfiguration, PayscoreWidgetEventType, type PayscoreWidgetOptions };
package/dist/index.d.ts CHANGED
@@ -12,11 +12,17 @@ declare enum PayscoreWidgetEventType {
12
12
  IncomeVerificationCompleted = "payscore/incomeVerification/completed",
13
13
  WidgetClosed = "payscore/incomeVerification/widgetClosed"
14
14
  }
15
+ declare enum IncomeVerificationMethod {
16
+ Bank = "bank",
17
+ Payroll = "payroll",
18
+ DocumentUpload = "document_upload"
19
+ }
15
20
  type PayscoreEnvironment = 'staging' | 'production';
16
21
  interface PayscoreBaseEvent<T extends PayscoreWidgetEventType = PayscoreWidgetEventType> {
17
22
  type: T;
18
23
  timestamp: string;
19
24
  payscore: true;
25
+ methods: IncomeVerificationMethod[];
20
26
  }
21
27
  interface PayscoreWidgetOptions {
22
28
  hideCloseButton?: boolean;
@@ -43,4 +49,4 @@ declare class IncomeVerificationWidget {
43
49
  private removeListener;
44
50
  }
45
51
 
46
- export { IncomeVerificationWidget, type PayscoreBaseEvent, type PayscoreEnvironment, type PayscoreWidgetConfiguration, PayscoreWidgetEventType, type PayscoreWidgetOptions };
52
+ export { IncomeVerificationMethod, IncomeVerificationWidget, type PayscoreBaseEvent, type PayscoreEnvironment, type PayscoreWidgetConfiguration, PayscoreWidgetEventType, type PayscoreWidgetOptions };
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // style-loader:src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
+ IncomeVerificationMethod: () => IncomeVerificationMethod,
23
24
  IncomeVerificationWidget: () => IncomeVerificationWidget,
24
25
  PayscoreWidgetEventType: () => PayscoreWidgetEventType
25
26
  });
@@ -33,6 +34,12 @@ var PayscoreWidgetEventType = /* @__PURE__ */ ((PayscoreWidgetEventType2) => {
33
34
  PayscoreWidgetEventType2["WidgetClosed"] = "payscore/incomeVerification/widgetClosed";
34
35
  return PayscoreWidgetEventType2;
35
36
  })(PayscoreWidgetEventType || {});
37
+ var IncomeVerificationMethod = /* @__PURE__ */ ((IncomeVerificationMethod2) => {
38
+ IncomeVerificationMethod2["Bank"] = "bank";
39
+ IncomeVerificationMethod2["Payroll"] = "payroll";
40
+ IncomeVerificationMethod2["DocumentUpload"] = "document_upload";
41
+ return IncomeVerificationMethod2;
42
+ })(IncomeVerificationMethod || {});
36
43
 
37
44
  // src/utils.ts
38
45
  var PAYSCORE_STAGING_URL = "https://app.staging.payscore.com";
@@ -159,6 +166,7 @@ var IncomeVerificationWidget = class {
159
166
  typeof document === "object" && document.head.appendChild(document.createElement("style")).appendChild(document.createTextNode(":root {\n --payscore-container-z-index: 999999;\n}\n\n#payscore-widget-container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: var(--payscore-container-z-index);\n background-color: rgba(0, 0, 0, 0.5);\n animation: fade-in 0.5s forwards;\n}\n\n#payscore-widget {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 90%;\n height: 90%;\n border-radius: 10px;\n transform: translate(-50%, -50%) scale(0);\n background-color: #fff;\n\n @media only screen and (max-width: 1200px) {\n width: 99.5%;\n height: 99.5%;\n min-width: 99.5%;\n min-height: 99.5%;\n }\n}\n\n#payscore-widget.loaded {\n animation: zoom-in 0.5s forwards;\n}\n\n#payscore-loading-spinner {\n position: absolute;\n top: calc(40% - 104px);\n left: calc(50% - 104px);\n width: 200px;\n height: 200px;\n padding: 8px;\n aspect-ratio: 1;\n border-radius: 50%;\n mask: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;\n -webkit-mask-composite: source-out;\n mask-composite: subtract;\n animation: loading-spin 1s infinite linear;\n\n background-color: #014ffa;\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes zoom-in {\n from {\n transform: translate(-50%, -50%) scale(0);\n }\n to {\n transform: translate(-50%, -50%) scale(1);\n }\n}\n\n@keyframes loading-spin {\n to {\n transform: rotate(1turn);\n }\n}\n"));
160
167
  // Annotate the CommonJS export names for ESM import in node:
161
168
  0 && (module.exports = {
169
+ IncomeVerificationMethod,
162
170
  IncomeVerificationWidget,
163
171
  PayscoreWidgetEventType
164
172
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["style-loader:src/index.ts","../src/types/index.ts","../src/utils.ts","../src/widgets.ts"],"sourcesContent":["typeof document === 'object' &&document.head.appendChild(document.createElement('style')).appendChild(document.createTextNode(\":root {\\n --payscore-container-z-index: 999999;\\n}\\n\\n#payscore-widget-container {\\n position: fixed;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n z-index: var(--payscore-container-z-index);\\n background-color: rgba(0, 0, 0, 0.5);\\n animation: fade-in 0.5s forwards;\\n}\\n\\n#payscore-widget {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 90%;\\n height: 90%;\\n border-radius: 10px;\\n transform: translate(-50%, -50%) scale(0);\\n background-color: #fff;\\n\\n @media only screen and (max-width: 1200px) {\\n width: 99.5%;\\n height: 99.5%;\\n min-width: 99.5%;\\n min-height: 99.5%;\\n }\\n}\\n\\n#payscore-widget.loaded {\\n animation: zoom-in 0.5s forwards;\\n}\\n\\n#payscore-loading-spinner {\\n position: absolute;\\n top: calc(40% - 104px);\\n left: calc(50% - 104px);\\n width: 200px;\\n height: 200px;\\n padding: 8px;\\n aspect-ratio: 1;\\n border-radius: 50%;\\n mask: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;\\n -webkit-mask-composite: source-out;\\n mask-composite: subtract;\\n animation: loading-spin 1s infinite linear;\\n\\n background-color: #014ffa;\\n}\\n\\n@keyframes fade-in {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n\\n@keyframes zoom-in {\\n from {\\n transform: translate(-50%, -50%) scale(0);\\n }\\n to {\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n\\n@keyframes loading-spin {\\n to {\\n transform: rotate(1turn);\\n }\\n}\\n\"))\nexport * from './types/index';\nexport { IncomeVerificationWidget } from './widgets';\n","export interface PayscoreWidgetConfiguration {\n environment: PayscoreEnvironment;\n applicantId: string;\n testUrl?: string;\n widgetToken: string;\n options?: PayscoreWidgetOptions;\n onEvent?(event: PayscoreBaseEvent): void;\n}\n\nexport enum PayscoreWidgetEventType {\n IncomeVerificationLoaded = 'payscore/incomeVerification/loaded',\n IncomeVerificationStarted = 'payscore/incomeVerification/started',\n IncomeVerificationCompleted = 'payscore/incomeVerification/completed',\n WidgetClosed = 'payscore/incomeVerification/widgetClosed',\n}\n\nexport type PayscoreEnvironment = 'staging' | 'production';\n\nexport interface PayscoreBaseEvent<T extends PayscoreWidgetEventType = PayscoreWidgetEventType> {\n type: T;\n timestamp: string;\n payscore: true;\n}\n\nexport interface PayscoreWidgetOptions {\n hideCloseButton?: boolean;\n}\n","import { PayscoreEnvironment } from './types';\nimport { Permutations } from './types/utils';\n\nexport const PAYSCORE_STAGING_URL = 'https://app.staging.payscore.com';\nexport const PAYSCORE_PRODUCTION_URL = 'https://app.payscore.com';\n\nexport const AVAILABLE_ENVIRONMENTS: Permutations<PayscoreEnvironment> = [\n 'production',\n 'staging',\n];\n","import {\n PayscoreBaseEvent,\n PayscoreEnvironment,\n PayscoreWidgetConfiguration,\n PayscoreWidgetEventType,\n PayscoreWidgetOptions,\n} from './types';\nimport { AVAILABLE_ENVIRONMENTS, PAYSCORE_PRODUCTION_URL, PAYSCORE_STAGING_URL } from './utils';\n\nconst PAYSCORE_WIDGET_ID = 'payscore-widget';\nconst PAYSCORE_WIDGET_CONTAINER_ID = 'payscore-widget-container';\nconst PAYSCORE_LOADING_SPINNER_ID = 'payscore-loading-spinner';\n\nexport class IncomeVerificationWidget {\n private environment: PayscoreEnvironment;\n private isUnmounting: boolean;\n private applicantId: string;\n private widgetToken: string;\n private testUrl?: string;\n private options?: PayscoreWidgetOptions;\n private onEvent?: (event: PayscoreBaseEvent, widget: IncomeVerificationWidget) => void;\n private windowMessageCallback: (event: MessageEvent) => void;\n\n constructor(configuration: PayscoreWidgetConfiguration) {\n const { environment, applicantId, testUrl, widgetToken, options, onEvent } = configuration;\n\n if (!environment || !AVAILABLE_ENVIRONMENTS.includes(environment)) {\n throw new Error(\n 'Invalid environment configuration for the Payscore Widget, please use either \"staging\" or \"production\" as the environment configuration.'\n );\n }\n\n if (!applicantId) {\n throw new Error(\n 'applicantId is missing from the Payscore Widget configuration. Please provide a valid applicant ID.'\n );\n }\n\n if (!widgetToken) {\n throw new Error(\n 'widgetToken is missing from the Payscore Widget configuration. Please provide a valid widget token.'\n );\n }\n\n this.environment = environment;\n this.applicantId = applicantId;\n this.testUrl = testUrl;\n this.widgetToken = widgetToken;\n this.options = options;\n this.onEvent = onEvent;\n\n this.isUnmounting = false;\n\n this.windowMessageCallback = (event: MessageEvent) => {\n this.handlePayscoreMessage(event);\n };\n }\n\n private get baseUrl(): string {\n if (!!this.testUrl) {\n return this.testUrl;\n }\n\n switch (this.environment) {\n case 'staging':\n return PAYSCORE_STAGING_URL;\n case 'production':\n return PAYSCORE_PRODUCTION_URL;\n }\n }\n\n private get widgetUrl() {\n const options = this.options ? encodeURIComponent(JSON.stringify(this.options)) : '';\n return `${this.baseUrl}/applicants/${this.applicantId}?token=${this.widgetToken}${\n options ? `&options=${options}` : ''\n }`;\n }\n\n load(): void {\n const existingWidgetContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n\n if (!!existingWidgetContainer || this.isUnmounting) {\n return;\n }\n\n this.mountIFrame();\n }\n\n unmount(): void {\n if (this.isUnmounting) {\n console.log('Widget is already unmounting');\n return;\n }\n\n this.unmountIFrame();\n }\n\n private mountIFrame(): void {\n this.setupListener();\n\n const iframe = document.createElement('iframe');\n\n iframe.setAttribute('id', PAYSCORE_WIDGET_ID);\n iframe.setAttribute('title', 'Payscore Widget');\n iframe.setAttribute('src', this.widgetUrl);\n\n iframe.addEventListener('load', () => {\n iframe.classList.add('loaded');\n const iframeContainer = iframe.parentElement;\n if (!!iframeContainer) {\n const spinner = document.getElementById(PAYSCORE_LOADING_SPINNER_ID);\n if (!!spinner) {\n iframeContainer.removeChild(spinner);\n }\n }\n });\n\n const iframeContainer = document.createElement('div');\n iframeContainer.setAttribute('id', PAYSCORE_WIDGET_CONTAINER_ID);\n\n const iframeLoadingSpinner = document.createElement('div');\n iframeLoadingSpinner.setAttribute('id', PAYSCORE_LOADING_SPINNER_ID);\n\n iframeContainer.appendChild(iframeLoadingSpinner);\n iframeContainer.appendChild(iframe);\n\n document.body.appendChild(iframeContainer);\n }\n\n private unmountIFrame(): void {\n this.isUnmounting = true;\n\n this.removeListener();\n\n const iframeContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n if (!!iframeContainer) {\n document.body.removeChild(iframeContainer);\n }\n\n this.isUnmounting = false;\n }\n\n private handlePayscoreMessage(event: MessageEvent<PayscoreBaseEvent>): void {\n if (!event.data.payscore) {\n return;\n }\n\n this.onEvent?.(event.data, this);\n\n if (event.data.type === PayscoreWidgetEventType.WidgetClosed) {\n this.unmount();\n }\n }\n\n private setupListener(): void {\n window.addEventListener('message', this.windowMessageCallback);\n }\n\n private removeListener(): void {\n window.removeEventListener('message', this.windowMessageCallback);\n }\n}\n"],"mappings":"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","names":["PayscoreWidgetEventType","iframeContainer"]}
1
+ {"version":3,"sources":["style-loader:src/index.ts","../src/types/index.ts","../src/utils.ts","../src/widgets.ts"],"sourcesContent":["typeof document === 'object' &&document.head.appendChild(document.createElement('style')).appendChild(document.createTextNode(\":root {\\n --payscore-container-z-index: 999999;\\n}\\n\\n#payscore-widget-container {\\n position: fixed;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n z-index: var(--payscore-container-z-index);\\n background-color: rgba(0, 0, 0, 0.5);\\n animation: fade-in 0.5s forwards;\\n}\\n\\n#payscore-widget {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 90%;\\n height: 90%;\\n border-radius: 10px;\\n transform: translate(-50%, -50%) scale(0);\\n background-color: #fff;\\n\\n @media only screen and (max-width: 1200px) {\\n width: 99.5%;\\n height: 99.5%;\\n min-width: 99.5%;\\n min-height: 99.5%;\\n }\\n}\\n\\n#payscore-widget.loaded {\\n animation: zoom-in 0.5s forwards;\\n}\\n\\n#payscore-loading-spinner {\\n position: absolute;\\n top: calc(40% - 104px);\\n left: calc(50% - 104px);\\n width: 200px;\\n height: 200px;\\n padding: 8px;\\n aspect-ratio: 1;\\n border-radius: 50%;\\n mask: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;\\n -webkit-mask-composite: source-out;\\n mask-composite: subtract;\\n animation: loading-spin 1s infinite linear;\\n\\n background-color: #014ffa;\\n}\\n\\n@keyframes fade-in {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n\\n@keyframes zoom-in {\\n from {\\n transform: translate(-50%, -50%) scale(0);\\n }\\n to {\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n\\n@keyframes loading-spin {\\n to {\\n transform: rotate(1turn);\\n }\\n}\\n\"))\nexport * from './types/index';\nexport { IncomeVerificationWidget } from './widgets';\n","export interface PayscoreWidgetConfiguration {\n environment: PayscoreEnvironment;\n applicantId: string;\n testUrl?: string;\n widgetToken: string;\n options?: PayscoreWidgetOptions;\n onEvent?(event: PayscoreBaseEvent): void;\n}\n\nexport enum PayscoreWidgetEventType {\n IncomeVerificationLoaded = 'payscore/incomeVerification/loaded',\n IncomeVerificationStarted = 'payscore/incomeVerification/started',\n IncomeVerificationCompleted = 'payscore/incomeVerification/completed',\n WidgetClosed = 'payscore/incomeVerification/widgetClosed',\n}\n\nexport enum IncomeVerificationMethod {\n Bank = 'bank',\n Payroll = 'payroll',\n DocumentUpload = 'document_upload',\n}\n\nexport type PayscoreEnvironment = 'staging' | 'production';\n\nexport interface PayscoreBaseEvent<T extends PayscoreWidgetEventType = PayscoreWidgetEventType> {\n type: T;\n timestamp: string;\n payscore: true;\n methods: IncomeVerificationMethod[];\n}\n\nexport interface PayscoreWidgetOptions {\n hideCloseButton?: boolean;\n}\n","import { PayscoreEnvironment } from './types';\nimport { Permutations } from './types/utils';\n\nexport const PAYSCORE_STAGING_URL = 'https://app.staging.payscore.com';\nexport const PAYSCORE_PRODUCTION_URL = 'https://app.payscore.com';\n\nexport const AVAILABLE_ENVIRONMENTS: Permutations<PayscoreEnvironment> = [\n 'production',\n 'staging',\n];\n","import {\n PayscoreBaseEvent,\n PayscoreEnvironment,\n PayscoreWidgetConfiguration,\n PayscoreWidgetEventType,\n PayscoreWidgetOptions,\n} from './types';\nimport { AVAILABLE_ENVIRONMENTS, PAYSCORE_PRODUCTION_URL, PAYSCORE_STAGING_URL } from './utils';\n\nconst PAYSCORE_WIDGET_ID = 'payscore-widget';\nconst PAYSCORE_WIDGET_CONTAINER_ID = 'payscore-widget-container';\nconst PAYSCORE_LOADING_SPINNER_ID = 'payscore-loading-spinner';\n\nexport class IncomeVerificationWidget {\n private environment: PayscoreEnvironment;\n private isUnmounting: boolean;\n private applicantId: string;\n private widgetToken: string;\n private testUrl?: string;\n private options?: PayscoreWidgetOptions;\n private onEvent?: (event: PayscoreBaseEvent, widget: IncomeVerificationWidget) => void;\n private windowMessageCallback: (event: MessageEvent) => void;\n\n constructor(configuration: PayscoreWidgetConfiguration) {\n const { environment, applicantId, testUrl, widgetToken, options, onEvent } = configuration;\n\n if (!environment || !AVAILABLE_ENVIRONMENTS.includes(environment)) {\n throw new Error(\n 'Invalid environment configuration for the Payscore Widget, please use either \"staging\" or \"production\" as the environment configuration.'\n );\n }\n\n if (!applicantId) {\n throw new Error(\n 'applicantId is missing from the Payscore Widget configuration. Please provide a valid applicant ID.'\n );\n }\n\n if (!widgetToken) {\n throw new Error(\n 'widgetToken is missing from the Payscore Widget configuration. Please provide a valid widget token.'\n );\n }\n\n this.environment = environment;\n this.applicantId = applicantId;\n this.testUrl = testUrl;\n this.widgetToken = widgetToken;\n this.options = options;\n this.onEvent = onEvent;\n\n this.isUnmounting = false;\n\n this.windowMessageCallback = (event: MessageEvent) => {\n this.handlePayscoreMessage(event);\n };\n }\n\n private get baseUrl(): string {\n if (!!this.testUrl) {\n return this.testUrl;\n }\n\n switch (this.environment) {\n case 'staging':\n return PAYSCORE_STAGING_URL;\n case 'production':\n return PAYSCORE_PRODUCTION_URL;\n }\n }\n\n private get widgetUrl() {\n const options = this.options ? encodeURIComponent(JSON.stringify(this.options)) : '';\n return `${this.baseUrl}/applicants/${this.applicantId}?token=${this.widgetToken}${\n options ? `&options=${options}` : ''\n }`;\n }\n\n load(): void {\n const existingWidgetContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n\n if (!!existingWidgetContainer || this.isUnmounting) {\n return;\n }\n\n this.mountIFrame();\n }\n\n unmount(): void {\n if (this.isUnmounting) {\n console.log('Widget is already unmounting');\n return;\n }\n\n this.unmountIFrame();\n }\n\n private mountIFrame(): void {\n this.setupListener();\n\n const iframe = document.createElement('iframe');\n\n iframe.setAttribute('id', PAYSCORE_WIDGET_ID);\n iframe.setAttribute('title', 'Payscore Widget');\n iframe.setAttribute('src', this.widgetUrl);\n\n iframe.addEventListener('load', () => {\n iframe.classList.add('loaded');\n const iframeContainer = iframe.parentElement;\n if (!!iframeContainer) {\n const spinner = document.getElementById(PAYSCORE_LOADING_SPINNER_ID);\n if (!!spinner) {\n iframeContainer.removeChild(spinner);\n }\n }\n });\n\n const iframeContainer = document.createElement('div');\n iframeContainer.setAttribute('id', PAYSCORE_WIDGET_CONTAINER_ID);\n\n const iframeLoadingSpinner = document.createElement('div');\n iframeLoadingSpinner.setAttribute('id', PAYSCORE_LOADING_SPINNER_ID);\n\n iframeContainer.appendChild(iframeLoadingSpinner);\n iframeContainer.appendChild(iframe);\n\n document.body.appendChild(iframeContainer);\n }\n\n private unmountIFrame(): void {\n this.isUnmounting = true;\n\n this.removeListener();\n\n const iframeContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n if (!!iframeContainer) {\n document.body.removeChild(iframeContainer);\n }\n\n this.isUnmounting = false;\n }\n\n private handlePayscoreMessage(event: MessageEvent<PayscoreBaseEvent>): void {\n if (!event.data.payscore) {\n return;\n }\n\n this.onEvent?.(event.data, this);\n\n if (event.data.type === PayscoreWidgetEventType.WidgetClosed) {\n this.unmount();\n }\n }\n\n private setupListener(): void {\n window.addEventListener('message', this.windowMessageCallback);\n }\n\n private removeListener(): void {\n window.removeEventListener('message', this.windowMessageCallback);\n }\n}\n"],"mappings":"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","names":["PayscoreWidgetEventType","IncomeVerificationMethod","iframeContainer"]}
package/dist/index.mjs CHANGED
@@ -6,6 +6,12 @@ var PayscoreWidgetEventType = /* @__PURE__ */ ((PayscoreWidgetEventType2) => {
6
6
  PayscoreWidgetEventType2["WidgetClosed"] = "payscore/incomeVerification/widgetClosed";
7
7
  return PayscoreWidgetEventType2;
8
8
  })(PayscoreWidgetEventType || {});
9
+ var IncomeVerificationMethod = /* @__PURE__ */ ((IncomeVerificationMethod2) => {
10
+ IncomeVerificationMethod2["Bank"] = "bank";
11
+ IncomeVerificationMethod2["Payroll"] = "payroll";
12
+ IncomeVerificationMethod2["DocumentUpload"] = "document_upload";
13
+ return IncomeVerificationMethod2;
14
+ })(IncomeVerificationMethod || {});
9
15
 
10
16
  // src/utils.ts
11
17
  var PAYSCORE_STAGING_URL = "https://app.staging.payscore.com";
@@ -131,6 +137,7 @@ var IncomeVerificationWidget = class {
131
137
  // style-loader:src/index.ts
132
138
  typeof document === "object" && document.head.appendChild(document.createElement("style")).appendChild(document.createTextNode(":root {\n --payscore-container-z-index: 999999;\n}\n\n#payscore-widget-container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: var(--payscore-container-z-index);\n background-color: rgba(0, 0, 0, 0.5);\n animation: fade-in 0.5s forwards;\n}\n\n#payscore-widget {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 90%;\n height: 90%;\n border-radius: 10px;\n transform: translate(-50%, -50%) scale(0);\n background-color: #fff;\n\n @media only screen and (max-width: 1200px) {\n width: 99.5%;\n height: 99.5%;\n min-width: 99.5%;\n min-height: 99.5%;\n }\n}\n\n#payscore-widget.loaded {\n animation: zoom-in 0.5s forwards;\n}\n\n#payscore-loading-spinner {\n position: absolute;\n top: calc(40% - 104px);\n left: calc(50% - 104px);\n width: 200px;\n height: 200px;\n padding: 8px;\n aspect-ratio: 1;\n border-radius: 50%;\n mask: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;\n -webkit-mask-composite: source-out;\n mask-composite: subtract;\n animation: loading-spin 1s infinite linear;\n\n background-color: #014ffa;\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes zoom-in {\n from {\n transform: translate(-50%, -50%) scale(0);\n }\n to {\n transform: translate(-50%, -50%) scale(1);\n }\n}\n\n@keyframes loading-spin {\n to {\n transform: rotate(1turn);\n }\n}\n"));
133
139
  export {
140
+ IncomeVerificationMethod,
134
141
  IncomeVerificationWidget,
135
142
  PayscoreWidgetEventType
136
143
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/utils.ts","../src/widgets.ts","style-loader:src/index.ts"],"sourcesContent":["export interface PayscoreWidgetConfiguration {\n environment: PayscoreEnvironment;\n applicantId: string;\n testUrl?: string;\n widgetToken: string;\n options?: PayscoreWidgetOptions;\n onEvent?(event: PayscoreBaseEvent): void;\n}\n\nexport enum PayscoreWidgetEventType {\n IncomeVerificationLoaded = 'payscore/incomeVerification/loaded',\n IncomeVerificationStarted = 'payscore/incomeVerification/started',\n IncomeVerificationCompleted = 'payscore/incomeVerification/completed',\n WidgetClosed = 'payscore/incomeVerification/widgetClosed',\n}\n\nexport type PayscoreEnvironment = 'staging' | 'production';\n\nexport interface PayscoreBaseEvent<T extends PayscoreWidgetEventType = PayscoreWidgetEventType> {\n type: T;\n timestamp: string;\n payscore: true;\n}\n\nexport interface PayscoreWidgetOptions {\n hideCloseButton?: boolean;\n}\n","import { PayscoreEnvironment } from './types';\nimport { Permutations } from './types/utils';\n\nexport const PAYSCORE_STAGING_URL = 'https://app.staging.payscore.com';\nexport const PAYSCORE_PRODUCTION_URL = 'https://app.payscore.com';\n\nexport const AVAILABLE_ENVIRONMENTS: Permutations<PayscoreEnvironment> = [\n 'production',\n 'staging',\n];\n","import {\n PayscoreBaseEvent,\n PayscoreEnvironment,\n PayscoreWidgetConfiguration,\n PayscoreWidgetEventType,\n PayscoreWidgetOptions,\n} from './types';\nimport { AVAILABLE_ENVIRONMENTS, PAYSCORE_PRODUCTION_URL, PAYSCORE_STAGING_URL } from './utils';\n\nconst PAYSCORE_WIDGET_ID = 'payscore-widget';\nconst PAYSCORE_WIDGET_CONTAINER_ID = 'payscore-widget-container';\nconst PAYSCORE_LOADING_SPINNER_ID = 'payscore-loading-spinner';\n\nexport class IncomeVerificationWidget {\n private environment: PayscoreEnvironment;\n private isUnmounting: boolean;\n private applicantId: string;\n private widgetToken: string;\n private testUrl?: string;\n private options?: PayscoreWidgetOptions;\n private onEvent?: (event: PayscoreBaseEvent, widget: IncomeVerificationWidget) => void;\n private windowMessageCallback: (event: MessageEvent) => void;\n\n constructor(configuration: PayscoreWidgetConfiguration) {\n const { environment, applicantId, testUrl, widgetToken, options, onEvent } = configuration;\n\n if (!environment || !AVAILABLE_ENVIRONMENTS.includes(environment)) {\n throw new Error(\n 'Invalid environment configuration for the Payscore Widget, please use either \"staging\" or \"production\" as the environment configuration.'\n );\n }\n\n if (!applicantId) {\n throw new Error(\n 'applicantId is missing from the Payscore Widget configuration. Please provide a valid applicant ID.'\n );\n }\n\n if (!widgetToken) {\n throw new Error(\n 'widgetToken is missing from the Payscore Widget configuration. Please provide a valid widget token.'\n );\n }\n\n this.environment = environment;\n this.applicantId = applicantId;\n this.testUrl = testUrl;\n this.widgetToken = widgetToken;\n this.options = options;\n this.onEvent = onEvent;\n\n this.isUnmounting = false;\n\n this.windowMessageCallback = (event: MessageEvent) => {\n this.handlePayscoreMessage(event);\n };\n }\n\n private get baseUrl(): string {\n if (!!this.testUrl) {\n return this.testUrl;\n }\n\n switch (this.environment) {\n case 'staging':\n return PAYSCORE_STAGING_URL;\n case 'production':\n return PAYSCORE_PRODUCTION_URL;\n }\n }\n\n private get widgetUrl() {\n const options = this.options ? encodeURIComponent(JSON.stringify(this.options)) : '';\n return `${this.baseUrl}/applicants/${this.applicantId}?token=${this.widgetToken}${\n options ? `&options=${options}` : ''\n }`;\n }\n\n load(): void {\n const existingWidgetContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n\n if (!!existingWidgetContainer || this.isUnmounting) {\n return;\n }\n\n this.mountIFrame();\n }\n\n unmount(): void {\n if (this.isUnmounting) {\n console.log('Widget is already unmounting');\n return;\n }\n\n this.unmountIFrame();\n }\n\n private mountIFrame(): void {\n this.setupListener();\n\n const iframe = document.createElement('iframe');\n\n iframe.setAttribute('id', PAYSCORE_WIDGET_ID);\n iframe.setAttribute('title', 'Payscore Widget');\n iframe.setAttribute('src', this.widgetUrl);\n\n iframe.addEventListener('load', () => {\n iframe.classList.add('loaded');\n const iframeContainer = iframe.parentElement;\n if (!!iframeContainer) {\n const spinner = document.getElementById(PAYSCORE_LOADING_SPINNER_ID);\n if (!!spinner) {\n iframeContainer.removeChild(spinner);\n }\n }\n });\n\n const iframeContainer = document.createElement('div');\n iframeContainer.setAttribute('id', PAYSCORE_WIDGET_CONTAINER_ID);\n\n const iframeLoadingSpinner = document.createElement('div');\n iframeLoadingSpinner.setAttribute('id', PAYSCORE_LOADING_SPINNER_ID);\n\n iframeContainer.appendChild(iframeLoadingSpinner);\n iframeContainer.appendChild(iframe);\n\n document.body.appendChild(iframeContainer);\n }\n\n private unmountIFrame(): void {\n this.isUnmounting = true;\n\n this.removeListener();\n\n const iframeContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n if (!!iframeContainer) {\n document.body.removeChild(iframeContainer);\n }\n\n this.isUnmounting = false;\n }\n\n private handlePayscoreMessage(event: MessageEvent<PayscoreBaseEvent>): void {\n if (!event.data.payscore) {\n return;\n }\n\n this.onEvent?.(event.data, this);\n\n if (event.data.type === PayscoreWidgetEventType.WidgetClosed) {\n this.unmount();\n }\n }\n\n private setupListener(): void {\n window.addEventListener('message', this.windowMessageCallback);\n }\n\n private removeListener(): void {\n window.removeEventListener('message', this.windowMessageCallback);\n }\n}\n","typeof document === 'object' &&document.head.appendChild(document.createElement('style')).appendChild(document.createTextNode(\":root {\\n --payscore-container-z-index: 999999;\\n}\\n\\n#payscore-widget-container {\\n position: fixed;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n z-index: var(--payscore-container-z-index);\\n background-color: rgba(0, 0, 0, 0.5);\\n animation: fade-in 0.5s forwards;\\n}\\n\\n#payscore-widget {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 90%;\\n height: 90%;\\n border-radius: 10px;\\n transform: translate(-50%, -50%) scale(0);\\n background-color: #fff;\\n\\n @media only screen and (max-width: 1200px) {\\n width: 99.5%;\\n height: 99.5%;\\n min-width: 99.5%;\\n min-height: 99.5%;\\n }\\n}\\n\\n#payscore-widget.loaded {\\n animation: zoom-in 0.5s forwards;\\n}\\n\\n#payscore-loading-spinner {\\n position: absolute;\\n top: calc(40% - 104px);\\n left: calc(50% - 104px);\\n width: 200px;\\n height: 200px;\\n padding: 8px;\\n aspect-ratio: 1;\\n border-radius: 50%;\\n mask: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;\\n -webkit-mask-composite: source-out;\\n mask-composite: subtract;\\n animation: loading-spin 1s infinite linear;\\n\\n background-color: #014ffa;\\n}\\n\\n@keyframes fade-in {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n\\n@keyframes zoom-in {\\n from {\\n transform: translate(-50%, -50%) scale(0);\\n }\\n to {\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n\\n@keyframes loading-spin {\\n to {\\n transform: rotate(1turn);\\n }\\n}\\n\"))\nexport * from './types/index';\nexport { IncomeVerificationWidget } from './widgets';\n"],"mappings":"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","names":["PayscoreWidgetEventType","iframeContainer"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/utils.ts","../src/widgets.ts","style-loader:src/index.ts"],"sourcesContent":["export interface PayscoreWidgetConfiguration {\n environment: PayscoreEnvironment;\n applicantId: string;\n testUrl?: string;\n widgetToken: string;\n options?: PayscoreWidgetOptions;\n onEvent?(event: PayscoreBaseEvent): void;\n}\n\nexport enum PayscoreWidgetEventType {\n IncomeVerificationLoaded = 'payscore/incomeVerification/loaded',\n IncomeVerificationStarted = 'payscore/incomeVerification/started',\n IncomeVerificationCompleted = 'payscore/incomeVerification/completed',\n WidgetClosed = 'payscore/incomeVerification/widgetClosed',\n}\n\nexport enum IncomeVerificationMethod {\n Bank = 'bank',\n Payroll = 'payroll',\n DocumentUpload = 'document_upload',\n}\n\nexport type PayscoreEnvironment = 'staging' | 'production';\n\nexport interface PayscoreBaseEvent<T extends PayscoreWidgetEventType = PayscoreWidgetEventType> {\n type: T;\n timestamp: string;\n payscore: true;\n methods: IncomeVerificationMethod[];\n}\n\nexport interface PayscoreWidgetOptions {\n hideCloseButton?: boolean;\n}\n","import { PayscoreEnvironment } from './types';\nimport { Permutations } from './types/utils';\n\nexport const PAYSCORE_STAGING_URL = 'https://app.staging.payscore.com';\nexport const PAYSCORE_PRODUCTION_URL = 'https://app.payscore.com';\n\nexport const AVAILABLE_ENVIRONMENTS: Permutations<PayscoreEnvironment> = [\n 'production',\n 'staging',\n];\n","import {\n PayscoreBaseEvent,\n PayscoreEnvironment,\n PayscoreWidgetConfiguration,\n PayscoreWidgetEventType,\n PayscoreWidgetOptions,\n} from './types';\nimport { AVAILABLE_ENVIRONMENTS, PAYSCORE_PRODUCTION_URL, PAYSCORE_STAGING_URL } from './utils';\n\nconst PAYSCORE_WIDGET_ID = 'payscore-widget';\nconst PAYSCORE_WIDGET_CONTAINER_ID = 'payscore-widget-container';\nconst PAYSCORE_LOADING_SPINNER_ID = 'payscore-loading-spinner';\n\nexport class IncomeVerificationWidget {\n private environment: PayscoreEnvironment;\n private isUnmounting: boolean;\n private applicantId: string;\n private widgetToken: string;\n private testUrl?: string;\n private options?: PayscoreWidgetOptions;\n private onEvent?: (event: PayscoreBaseEvent, widget: IncomeVerificationWidget) => void;\n private windowMessageCallback: (event: MessageEvent) => void;\n\n constructor(configuration: PayscoreWidgetConfiguration) {\n const { environment, applicantId, testUrl, widgetToken, options, onEvent } = configuration;\n\n if (!environment || !AVAILABLE_ENVIRONMENTS.includes(environment)) {\n throw new Error(\n 'Invalid environment configuration for the Payscore Widget, please use either \"staging\" or \"production\" as the environment configuration.'\n );\n }\n\n if (!applicantId) {\n throw new Error(\n 'applicantId is missing from the Payscore Widget configuration. Please provide a valid applicant ID.'\n );\n }\n\n if (!widgetToken) {\n throw new Error(\n 'widgetToken is missing from the Payscore Widget configuration. Please provide a valid widget token.'\n );\n }\n\n this.environment = environment;\n this.applicantId = applicantId;\n this.testUrl = testUrl;\n this.widgetToken = widgetToken;\n this.options = options;\n this.onEvent = onEvent;\n\n this.isUnmounting = false;\n\n this.windowMessageCallback = (event: MessageEvent) => {\n this.handlePayscoreMessage(event);\n };\n }\n\n private get baseUrl(): string {\n if (!!this.testUrl) {\n return this.testUrl;\n }\n\n switch (this.environment) {\n case 'staging':\n return PAYSCORE_STAGING_URL;\n case 'production':\n return PAYSCORE_PRODUCTION_URL;\n }\n }\n\n private get widgetUrl() {\n const options = this.options ? encodeURIComponent(JSON.stringify(this.options)) : '';\n return `${this.baseUrl}/applicants/${this.applicantId}?token=${this.widgetToken}${\n options ? `&options=${options}` : ''\n }`;\n }\n\n load(): void {\n const existingWidgetContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n\n if (!!existingWidgetContainer || this.isUnmounting) {\n return;\n }\n\n this.mountIFrame();\n }\n\n unmount(): void {\n if (this.isUnmounting) {\n console.log('Widget is already unmounting');\n return;\n }\n\n this.unmountIFrame();\n }\n\n private mountIFrame(): void {\n this.setupListener();\n\n const iframe = document.createElement('iframe');\n\n iframe.setAttribute('id', PAYSCORE_WIDGET_ID);\n iframe.setAttribute('title', 'Payscore Widget');\n iframe.setAttribute('src', this.widgetUrl);\n\n iframe.addEventListener('load', () => {\n iframe.classList.add('loaded');\n const iframeContainer = iframe.parentElement;\n if (!!iframeContainer) {\n const spinner = document.getElementById(PAYSCORE_LOADING_SPINNER_ID);\n if (!!spinner) {\n iframeContainer.removeChild(spinner);\n }\n }\n });\n\n const iframeContainer = document.createElement('div');\n iframeContainer.setAttribute('id', PAYSCORE_WIDGET_CONTAINER_ID);\n\n const iframeLoadingSpinner = document.createElement('div');\n iframeLoadingSpinner.setAttribute('id', PAYSCORE_LOADING_SPINNER_ID);\n\n iframeContainer.appendChild(iframeLoadingSpinner);\n iframeContainer.appendChild(iframe);\n\n document.body.appendChild(iframeContainer);\n }\n\n private unmountIFrame(): void {\n this.isUnmounting = true;\n\n this.removeListener();\n\n const iframeContainer = document.getElementById(PAYSCORE_WIDGET_CONTAINER_ID);\n if (!!iframeContainer) {\n document.body.removeChild(iframeContainer);\n }\n\n this.isUnmounting = false;\n }\n\n private handlePayscoreMessage(event: MessageEvent<PayscoreBaseEvent>): void {\n if (!event.data.payscore) {\n return;\n }\n\n this.onEvent?.(event.data, this);\n\n if (event.data.type === PayscoreWidgetEventType.WidgetClosed) {\n this.unmount();\n }\n }\n\n private setupListener(): void {\n window.addEventListener('message', this.windowMessageCallback);\n }\n\n private removeListener(): void {\n window.removeEventListener('message', this.windowMessageCallback);\n }\n}\n","typeof document === 'object' &&document.head.appendChild(document.createElement('style')).appendChild(document.createTextNode(\":root {\\n --payscore-container-z-index: 999999;\\n}\\n\\n#payscore-widget-container {\\n position: fixed;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n z-index: var(--payscore-container-z-index);\\n background-color: rgba(0, 0, 0, 0.5);\\n animation: fade-in 0.5s forwards;\\n}\\n\\n#payscore-widget {\\n position: absolute;\\n top: 50%;\\n left: 50%;\\n width: 90%;\\n height: 90%;\\n border-radius: 10px;\\n transform: translate(-50%, -50%) scale(0);\\n background-color: #fff;\\n\\n @media only screen and (max-width: 1200px) {\\n width: 99.5%;\\n height: 99.5%;\\n min-width: 99.5%;\\n min-height: 99.5%;\\n }\\n}\\n\\n#payscore-widget.loaded {\\n animation: zoom-in 0.5s forwards;\\n}\\n\\n#payscore-loading-spinner {\\n position: absolute;\\n top: calc(40% - 104px);\\n left: calc(50% - 104px);\\n width: 200px;\\n height: 200px;\\n padding: 8px;\\n aspect-ratio: 1;\\n border-radius: 50%;\\n mask: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;\\n -webkit-mask-composite: source-out;\\n mask-composite: subtract;\\n animation: loading-spin 1s infinite linear;\\n\\n background-color: #014ffa;\\n}\\n\\n@keyframes fade-in {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n\\n@keyframes zoom-in {\\n from {\\n transform: translate(-50%, -50%) scale(0);\\n }\\n to {\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n\\n@keyframes loading-spin {\\n to {\\n transform: rotate(1turn);\\n }\\n}\\n\"))\nexport * from './types/index';\nexport { IncomeVerificationWidget } from './widgets';\n"],"mappings":"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","names":["PayscoreWidgetEventType","IncomeVerificationMethod","iframeContainer"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payscore/web-widget-sdk",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Payscore Web Widget SDK",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",