@lightspeed/online-payments-sdk 1.4.2 → 1.6.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.
@@ -33,6 +33,9 @@ var EventBroadcaster = /** @class */ (function () {
33
33
  if ('paymentMethodType' in event && event.paymentMethodType) {
34
34
  externalEvent.paymentMethodType = event.paymentMethodType;
35
35
  }
36
+ if ('saveCheckboxChecked' in event && event.saveCheckboxChecked !== undefined) {
37
+ externalEvent.saveCheckboxChecked = event.saveCheckboxChecked;
38
+ }
36
39
  return externalEvent;
37
40
  };
38
41
  EventBroadcaster.prototype.registerMiddleware = function (middleware) {
@@ -5,7 +5,9 @@ exports.isTokenValid = isTokenValid;
5
5
  var error_1 = require("./error");
6
6
  function decodePaymentSessionToContext(paymentSession) {
7
7
  try {
8
- var decoded = atob(paymentSession);
8
+ var binary = atob(paymentSession);
9
+ var bytes = Uint8Array.from(binary, function (c) { return c.charCodeAt(0); });
10
+ var decoded = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
9
11
  var jsonToken = JSON.parse(decoded);
10
12
  if (jsonToken && isTokenValid(jsonToken)) {
11
13
  return jsonToken;
@@ -92,10 +92,11 @@ function initStripe(context, theme) {
92
92
  * @param defaultValues - Default values for the payment element
93
93
  * @param theme - Theme configuration
94
94
  * @param hideNameField - Whether to hide the billing details name field (used when address element is present to avoid duplicates with ACH)
95
+ * @param businessName - Overrides the merchant name Stripe renders in mandate text (passed to `business.name`)
95
96
  */
96
- function createPaymentElementOptions(defaultValues, theme, hideNameField) {
97
+ function createPaymentElementOptions(defaultValues, theme, hideNameField, businessName) {
97
98
  if (hideNameField === void 0) { hideNameField = false; }
98
- var options = __assign(__assign({ wallets: {
99
+ var options = __assign(__assign(__assign({ wallets: {
99
100
  applePay: 'never',
100
101
  googlePay: 'never',
101
102
  link: 'never',
@@ -107,7 +108,7 @@ function createPaymentElementOptions(defaultValues, theme, hideNameField) {
107
108
  },
108
109
  })), { terms: {
109
110
  usBankAccount: 'never', // Hide Stripe's default T&Cs (shown for ACH payments)
110
- } });
111
+ } }), (businessName && { business: { name: businessName } }));
111
112
  if (defaultValues) {
112
113
  options.defaultValues = {
113
114
  billingDetails: {
@@ -221,17 +222,22 @@ function createPaymentElement(elements, options, mountElement, eventBroadcaster)
221
222
  * When addressElement is provided (payment form): emits "Complete" only when BOTH elements are complete,
222
223
  * and "Incomplete" when at least one element becomes incomplete.
223
224
  * When addressElement is not provided (MOTO form): emits based on payment element completion only.
225
+ * Also includes the current save-payment-method checkbox state (when present) on every Change event,
226
+ * and emits a Change event when that checkbox state changes.
224
227
  */
225
228
  function setupChangeEventHandler(paymentElement, eventBroadcaster, addressElement) {
226
229
  var paymentComplete = false;
227
230
  var addressComplete = !addressElement; // If no address element, consider it complete
228
231
  var previousComplete = null;
229
232
  var previousMethodType;
233
+ var previousSaveCheckboxState; // Track save checkbox state
230
234
  var emitChangeEvent = function () {
231
235
  var complete = paymentComplete && addressComplete;
232
236
  previousComplete = complete;
233
- eventBroadcaster.publish(__assign({ status: 'Change', code: complete ? 'Complete' : 'Incomplete' }, (previousMethodType && {
237
+ eventBroadcaster.publish(__assign(__assign({ status: 'Change', code: complete ? 'Complete' : 'Incomplete' }, (previousMethodType && {
234
238
  paymentMethodType: previousMethodType,
239
+ })), (previousSaveCheckboxState !== undefined && {
240
+ saveCheckboxChecked: previousSaveCheckboxState,
235
241
  })));
236
242
  };
237
243
  paymentElement.on('change', function (event) {
@@ -243,7 +249,15 @@ function setupChangeEventHandler(paymentElement, eventBroadcaster, addressElemen
243
249
  if (methodType !== undefined) {
244
250
  previousMethodType = methodType;
245
251
  }
246
- if (completenessChanged || methodTypeChanged) {
252
+ // Check for save checkbox state from Stripe's value object
253
+ // The value object may contain a `savePaymentMethod` property
254
+ var saveCheckboxChanged = false;
255
+ if (event.value && typeof event.value === 'object' && 'savePaymentMethod' in event.value) {
256
+ var saveCheckboxState = event.value.savePaymentMethod;
257
+ saveCheckboxChanged = previousSaveCheckboxState !== saveCheckboxState;
258
+ previousSaveCheckboxState = saveCheckboxState;
259
+ }
260
+ if (completenessChanged || methodTypeChanged || saveCheckboxChanged) {
247
261
  emitChangeEvent();
248
262
  }
249
263
  });
@@ -50,7 +50,7 @@ function mountMotoWidget(mountElement, session, eventBroadcaster, defaultValues,
50
50
  case 0: return [4 /*yield*/, (0, shared_1.initStripe)(session.context, theme)];
51
51
  case 1:
52
52
  _a = _c.sent(), stripe = _a.stripe, elements = _a.elements;
53
- paymentOptions = (0, shared_1.createPaymentElementOptions)(defaultValues, theme);
53
+ paymentOptions = (0, shared_1.createPaymentElementOptions)(defaultValues, theme, false, session.context.businessName);
54
54
  _b = (0, shared_1.createPaymentElement)(elements, paymentOptions, mountElement, eventBroadcaster), paymentElement = _b.element, paymentContainer = _b.container, customTermsContainer = _b.customTermsContainer;
55
55
  // Setup change handler for payment element only (MOTO forms don't have address element)
56
56
  (0, shared_1.setupChangeEventHandler)(paymentElement, eventBroadcaster);
@@ -51,7 +51,7 @@ function mountPaymentWidget(mountElement, session, eventBroadcaster, defaultValu
51
51
  _a = _d.sent(), stripe = _a.stripe, elements = _a.elements;
52
52
  addressOptions = (0, shared_1.createAddressElementOptions)(defaultValues);
53
53
  _b = (0, shared_1.createAddressElement)(elements, addressOptions, mountElement), addressElement = _b.element, addressContainer = _b.container;
54
- paymentOptions = (0, shared_1.createPaymentElementOptions)(defaultValues, theme, true);
54
+ paymentOptions = (0, shared_1.createPaymentElementOptions)(defaultValues, theme, true, session.context.businessName);
55
55
  _c = (0, shared_1.createPaymentElement)(elements, paymentOptions, mountElement, eventBroadcaster), paymentElement = _c.element, paymentContainer = _c.container, customTermsContainer = _c.customTermsContainer;
56
56
  // Setup change handler that emits Complete only when both elements are complete
57
57
  (0, shared_1.setupChangeEventHandler)(paymentElement, eventBroadcaster, addressElement);
@@ -3,4 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SDK_VERSION = void 0;
4
4
  // This file is auto-generated during the build process
5
5
  // DO NOT EDIT MANUALLY - Version is extracted from package.json
6
- exports.SDK_VERSION = '1.4.2';
6
+ exports.SDK_VERSION = '1.6.0';
@@ -23,13 +23,15 @@ export type ChangeEvent = BaseEvent & {
23
23
  status: 'Change';
24
24
  code: 'Complete' | 'Incomplete';
25
25
  paymentMethodType?: string;
26
+ saveCheckboxChecked?: boolean;
26
27
  };
27
28
  export type ErrorResultEvent = BaseEvent & {
28
29
  code: SupportedErrorCodes;
29
30
  status: 'Error';
30
31
  };
31
32
  export type InternalEvent = SucceededResultEvent | PendingResultEvent | DeclinedResultEvent | ErrorResultEvent | ReadyEvent | ChangeEvent;
32
- export type Event = Omit<InternalEvent, 'loggingEnrichment'>;
33
+ type DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;
34
+ export type Event = DistributiveOmit<InternalEvent, 'loggingEnrichment'>;
33
35
  export type EventHandler = (result: Event) => void;
34
36
  export type EventMiddleware = (event: InternalEvent) => InternalEvent | void;
35
37
  export type EventListeners = Partial<Record<`on${Status}`, EventHandler>>;
@@ -42,3 +44,4 @@ export declare class EventBroadcaster {
42
44
  applyMiddlewares(event: InternalEvent): Event;
43
45
  publish(event: InternalEvent): void;
44
46
  }
47
+ export {};
@@ -30,6 +30,9 @@ var EventBroadcaster = /** @class */ (function () {
30
30
  if ('paymentMethodType' in event && event.paymentMethodType) {
31
31
  externalEvent.paymentMethodType = event.paymentMethodType;
32
32
  }
33
+ if ('saveCheckboxChecked' in event && event.saveCheckboxChecked !== undefined) {
34
+ externalEvent.saveCheckboxChecked = event.saveCheckboxChecked;
35
+ }
33
36
  return externalEvent;
34
37
  };
35
38
  EventBroadcaster.prototype.registerMiddleware = function (middleware) {
@@ -1,7 +1,9 @@
1
1
  import { InvalidSessionPayloadError, InvalidSessionError } from './error';
2
2
  export function decodePaymentSessionToContext(paymentSession) {
3
3
  try {
4
- var decoded = atob(paymentSession);
4
+ var binary = atob(paymentSession);
5
+ var bytes = Uint8Array.from(binary, function (c) { return c.charCodeAt(0); });
6
+ var decoded = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
5
7
  var jsonToken = JSON.parse(decoded);
6
8
  if (jsonToken && isTokenValid(jsonToken)) {
7
9
  return jsonToken;
@@ -11,4 +11,5 @@ export type StripeContext = {
11
11
  intent: 'save-card' | 'payment';
12
12
  locale?: StripeElementLocale;
13
13
  redirectUrl?: string;
14
+ businessName?: string;
14
15
  };
@@ -21,8 +21,9 @@ export declare function initStripe(context: StripeContext, theme?: PaymentWidget
21
21
  * @param defaultValues - Default values for the payment element
22
22
  * @param theme - Theme configuration
23
23
  * @param hideNameField - Whether to hide the billing details name field (used when address element is present to avoid duplicates with ACH)
24
+ * @param businessName - Overrides the merchant name Stripe renders in mandate text (passed to `business.name`)
24
25
  */
25
- export declare function createPaymentElementOptions(defaultValues?: DefaultValues, theme?: PaymentWidgetTheme, hideNameField?: boolean): StripePaymentElementOptions;
26
+ export declare function createPaymentElementOptions(defaultValues?: DefaultValues, theme?: PaymentWidgetTheme, hideNameField?: boolean, businessName?: string): StripePaymentElementOptions;
26
27
  /**
27
28
  * Create address element options
28
29
  */
@@ -40,6 +41,8 @@ export declare function createPaymentElement(elements: StripeElements, options:
40
41
  * When addressElement is provided (payment form): emits "Complete" only when BOTH elements are complete,
41
42
  * and "Incomplete" when at least one element becomes incomplete.
42
43
  * When addressElement is not provided (MOTO form): emits based on payment element completion only.
44
+ * Also includes the current save-payment-method checkbox state (when present) on every Change event,
45
+ * and emits a Change event when that checkbox state changes.
43
46
  */
44
47
  export declare function setupChangeEventHandler(paymentElement: StripePaymentElement, eventBroadcaster: EventBroadcaster, addressElement?: StripeAddressElement | null): void;
45
48
  /**
@@ -80,10 +80,11 @@ export function initStripe(context, theme) {
80
80
  * @param defaultValues - Default values for the payment element
81
81
  * @param theme - Theme configuration
82
82
  * @param hideNameField - Whether to hide the billing details name field (used when address element is present to avoid duplicates with ACH)
83
+ * @param businessName - Overrides the merchant name Stripe renders in mandate text (passed to `business.name`)
83
84
  */
84
- export function createPaymentElementOptions(defaultValues, theme, hideNameField) {
85
+ export function createPaymentElementOptions(defaultValues, theme, hideNameField, businessName) {
85
86
  if (hideNameField === void 0) { hideNameField = false; }
86
- var options = __assign(__assign({ wallets: {
87
+ var options = __assign(__assign(__assign({ wallets: {
87
88
  applePay: 'never',
88
89
  googlePay: 'never',
89
90
  link: 'never',
@@ -95,7 +96,7 @@ export function createPaymentElementOptions(defaultValues, theme, hideNameField)
95
96
  },
96
97
  })), { terms: {
97
98
  usBankAccount: 'never', // Hide Stripe's default T&Cs (shown for ACH payments)
98
- } });
99
+ } }), (businessName && { business: { name: businessName } }));
99
100
  if (defaultValues) {
100
101
  options.defaultValues = {
101
102
  billingDetails: {
@@ -209,17 +210,22 @@ export function createPaymentElement(elements, options, mountElement, eventBroad
209
210
  * When addressElement is provided (payment form): emits "Complete" only when BOTH elements are complete,
210
211
  * and "Incomplete" when at least one element becomes incomplete.
211
212
  * When addressElement is not provided (MOTO form): emits based on payment element completion only.
213
+ * Also includes the current save-payment-method checkbox state (when present) on every Change event,
214
+ * and emits a Change event when that checkbox state changes.
212
215
  */
213
216
  export function setupChangeEventHandler(paymentElement, eventBroadcaster, addressElement) {
214
217
  var paymentComplete = false;
215
218
  var addressComplete = !addressElement; // If no address element, consider it complete
216
219
  var previousComplete = null;
217
220
  var previousMethodType;
221
+ var previousSaveCheckboxState; // Track save checkbox state
218
222
  var emitChangeEvent = function () {
219
223
  var complete = paymentComplete && addressComplete;
220
224
  previousComplete = complete;
221
- eventBroadcaster.publish(__assign({ status: 'Change', code: complete ? 'Complete' : 'Incomplete' }, (previousMethodType && {
225
+ eventBroadcaster.publish(__assign(__assign({ status: 'Change', code: complete ? 'Complete' : 'Incomplete' }, (previousMethodType && {
222
226
  paymentMethodType: previousMethodType,
227
+ })), (previousSaveCheckboxState !== undefined && {
228
+ saveCheckboxChecked: previousSaveCheckboxState,
223
229
  })));
224
230
  };
225
231
  paymentElement.on('change', function (event) {
@@ -231,7 +237,15 @@ export function setupChangeEventHandler(paymentElement, eventBroadcaster, addres
231
237
  if (methodType !== undefined) {
232
238
  previousMethodType = methodType;
233
239
  }
234
- if (completenessChanged || methodTypeChanged) {
240
+ // Check for save checkbox state from Stripe's value object
241
+ // The value object may contain a `savePaymentMethod` property
242
+ var saveCheckboxChanged = false;
243
+ if (event.value && typeof event.value === 'object' && 'savePaymentMethod' in event.value) {
244
+ var saveCheckboxState = event.value.savePaymentMethod;
245
+ saveCheckboxChanged = previousSaveCheckboxState !== saveCheckboxState;
246
+ previousSaveCheckboxState = saveCheckboxState;
247
+ }
248
+ if (completenessChanged || methodTypeChanged || saveCheckboxChanged) {
235
249
  emitChangeEvent();
236
250
  }
237
251
  });
@@ -47,7 +47,7 @@ export function mountMotoWidget(mountElement, session, eventBroadcaster, default
47
47
  case 0: return [4 /*yield*/, initStripe(session.context, theme)];
48
48
  case 1:
49
49
  _a = _c.sent(), stripe = _a.stripe, elements = _a.elements;
50
- paymentOptions = createPaymentElementOptions(defaultValues, theme);
50
+ paymentOptions = createPaymentElementOptions(defaultValues, theme, false, session.context.businessName);
51
51
  _b = createPaymentElement(elements, paymentOptions, mountElement, eventBroadcaster), paymentElement = _b.element, paymentContainer = _b.container, customTermsContainer = _b.customTermsContainer;
52
52
  // Setup change handler for payment element only (MOTO forms don't have address element)
53
53
  setupChangeEventHandler(paymentElement, eventBroadcaster);
@@ -48,7 +48,7 @@ export function mountPaymentWidget(mountElement, session, eventBroadcaster, defa
48
48
  _a = _d.sent(), stripe = _a.stripe, elements = _a.elements;
49
49
  addressOptions = createAddressElementOptions(defaultValues);
50
50
  _b = createAddressElement(elements, addressOptions, mountElement), addressElement = _b.element, addressContainer = _b.container;
51
- paymentOptions = createPaymentElementOptions(defaultValues, theme, true);
51
+ paymentOptions = createPaymentElementOptions(defaultValues, theme, true, session.context.businessName);
52
52
  _c = createPaymentElement(elements, paymentOptions, mountElement, eventBroadcaster), paymentElement = _c.element, paymentContainer = _c.container, customTermsContainer = _c.customTermsContainer;
53
53
  // Setup change handler that emits Complete only when both elements are complete
54
54
  setupChangeEventHandler(paymentElement, eventBroadcaster, addressElement);
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "1.4.2";
1
+ export declare const SDK_VERSION = "1.6.0";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // This file is auto-generated during the build process
2
2
  // DO NOT EDIT MANUALLY - Version is extracted from package.json
3
- export var SDK_VERSION = '1.4.2';
3
+ export var SDK_VERSION = '1.6.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lightspeed/online-payments-sdk",
3
- "version": "1.4.2",
3
+ "version": "1.6.0",
4
4
  "description": "Process online-payments with Lightspeed Payments",
5
5
  "author": "Lightspeed Commerce Inc.",
6
6
  "license": "SEE LICENSE IN LICENSE.md",