diff --git a/package.json b/package.json index eded733..c95cfcd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@paddle/paddle-js", - "version": "1.0.1", + "version": "1.0.2", "description": "Wrapper to load Paddle.js as a module and use TypeScript definitions when working with methods.", "main": "dist/index.js", "module": "dist/index.esm.js", diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 4a793f5..f878654 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -25,33 +25,50 @@ const mockedPaddleInstance: Paddle = { hide: jest.fn(), show: jest.fn(), }, + Initialized: false, + Initialize: jest.fn(), + Update: jest.fn(), }; describe('initializePaddle', () => { + afterEach(() => { + jest.clearAllMocks(); + }); test('Should initialize Paddle with Seller ID', async () => { jest.spyOn(shared, 'loadFromCDN').mockResolvedValue(Promise.resolve(mockedPaddleInstance)); const paddle = await initializePaddle({ seller: 1 }); expect(paddle?.Status.libraryVersion).toBe('2.0'); - expect(paddle?.Setup).toBeCalledWith({ seller: 1 }); + expect(paddle?.Initialize).toBeCalledWith({ seller: 1 }); }); test('Should initialize Paddle with Token', async () => { jest.spyOn(shared, 'loadFromCDN').mockResolvedValue(Promise.resolve(mockedPaddleInstance)); const paddle = await initializePaddle({ token: 'TOKEN' }); expect(paddle?.Status.libraryVersion).toBe('2.0'); - expect(paddle?.Setup).toBeCalledWith({ token: 'TOKEN' }); + expect(paddle?.Initialize).toBeCalledWith({ token: 'TOKEN' }); }); test('Should initialize Paddle with Sandbox Environment', async () => { jest.spyOn(shared, 'loadFromCDN').mockResolvedValue(Promise.resolve(mockedPaddleInstance)); const paddle = await initializePaddle({ seller: 1, environment: 'sandbox' }); expect(paddle?.Environment.set).toBeCalledWith('sandbox'); - expect(paddle?.Setup).toBeCalledWith({ seller: 1 }); + expect(paddle?.Initialize).toBeCalledWith({ seller: 1 }); + }); + + test('Should call update if Paddle is already initialized', async () => { + const updatedMockedPaddleInstance = { ...mockedPaddleInstance, Initialized: true }; + jest.spyOn(shared, 'loadFromCDN').mockResolvedValue(Promise.resolve(updatedMockedPaddleInstance)); + const paddle = await initializePaddle({ seller: 1, environment: 'sandbox' }); + expect(paddle?.Environment.set).toBeCalledWith('sandbox'); + expect(paddle?.Initialize).not.toBeCalled(); + expect(paddle?.Update).toBeCalledWith({ seller: 1 }); }); test('Should return error when initialization fails', async () => { const consoleWarn = jest.spyOn(console, 'warn'); - // @ts-expect-error - undefined is not a valid value - jest.spyOn(shared, 'loadFromCDN').mockResolvedValue(Promise.resolve({ ...mockedPaddleInstance, Setup: undefined })); + jest + .spyOn(shared, 'loadFromCDN') + // @ts-expect-error - undefined is not a valid value for Initialize + .mockResolvedValue(Promise.resolve({ ...mockedPaddleInstance, Initialize: undefined })); await initializePaddle({ seller: 1, environment: 'sandbox' }); expect(consoleWarn).toBeCalledTimes(1); }); diff --git a/src/__tests__/shared.test.ts b/src/__tests__/shared.test.ts index 74017ad..ea908a4 100644 --- a/src/__tests__/shared.test.ts +++ b/src/__tests__/shared.test.ts @@ -26,6 +26,9 @@ const mockedPaddleInstance: Paddle = { hide: jest.fn(), show: jest.fn(), }, + Initialized: false, + Initialize: jest.fn(), + Update: jest.fn(), }; interface SharedModule { diff --git a/src/index.ts b/src/index.ts index 07ff3f6..e9655b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,9 +18,11 @@ export async function initializePaddle(options?: InitializePaddleOptions): Promi if (environment) { paddle.Environment.set(environment); } - paddle.Setup({ - ...rest, - }); + if (paddle.Initialized) { + paddle.Update({ ...rest }); + } else { + paddle.Initialize({ ...rest }); + } } catch (e) { console.warn('Paddle Initialization failed. Please check the inputs', e); } diff --git a/types/checkout/checkout.d.ts b/types/checkout/checkout.d.ts index ecb4f0f..89388bd 100644 --- a/types/checkout/checkout.d.ts +++ b/types/checkout/checkout.d.ts @@ -22,12 +22,14 @@ export interface CheckoutSettings { allowedPaymentMethods?: AvailablePaymentMethod[]; } +export interface PaddleSetupPwCustomer { + id?: string; + email?: string; +} + interface PaddleSetupBaseOptions { pwAuth?: string; - pwCustomer?: { - id?: string; - email?: string; - }; + pwCustomer?: PaddleSetupPwCustomer; debug?: boolean; eventCallback?: (event: PaddleEventData) => void; checkout?: { diff --git a/types/index.d.ts b/types/index.d.ts index 75c0c17..c24ff10 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -5,6 +5,7 @@ import { PaddleSetupOptions, CheckoutSettings, PaddleEventData, + PaddleSetupPwCustomer, } from './checkout/checkout'; import { CheckoutCustomer, CheckoutCustomerAddress, CheckoutCustomerBusiness } from './checkout/customer'; import { PricePreviewItem, PricePreviewParams, PricePreviewResponse } from './price-preview/price-preview'; @@ -47,6 +48,7 @@ export type Environments = 'production' | 'sandbox'; export type Theme = 'light' | 'dark'; export { + PaddleSetupPwCustomer, AvailablePaymentMethod, CheckoutOpenOptions, PaddleSetupOptions, @@ -84,6 +86,9 @@ export interface Paddle { }; PricePreview: (params: PricePreviewParams) => Promise; TransactionPreview: (params: TransactionPreviewParams) => Promise; + /** + @deprecated. Use `Paddle.Initialize` instead. + */ Setup(options: PaddleSetupOptions): void; Spinner: { show(): void; @@ -92,12 +97,15 @@ export interface Paddle { Status: { libraryVersion: string; }; + Initialized: boolean; + Initialize(options: PaddleSetupOptions): void; + Update(options: Partial): void; } declare global { interface Window { // Paddle.JS will be downloaded directly from our CDN and added to global variable - Paddle?: Paddle; + Paddle?: Paddle | undefined; } }