@lightspeed/online-payments-sdk 1.7.3 → 1.9.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.
Files changed (47) hide show
  1. package/README.md +37 -0
  2. package/dist/cjs/index.js +4 -1
  3. package/dist/cjs/v1/EventBroadcaster.js +1 -0
  4. package/dist/cjs/v1/adyen/terms.js +16 -0
  5. package/dist/cjs/v1/adyen/widget.js +216 -9
  6. package/dist/cjs/v1/index.js +1 -0
  7. package/dist/cjs/v1/stripe/localizedText.js +32 -0
  8. package/dist/cjs/v1/stripe/session.js +9 -0
  9. package/dist/cjs/v1/stripe/shared.js +55 -14
  10. package/dist/cjs/v1/stripe/terms.js +1 -1
  11. package/dist/cjs/v1/stripe/themes.js +2 -2
  12. package/dist/cjs/v1/stripe/widget.js +64 -25
  13. package/dist/cjs/v1/stripe/widgets/deferredMoto.js +203 -0
  14. package/dist/cjs/v1/widget.js +83 -2
  15. package/dist/cjs/version.js +1 -1
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.js +3 -0
  18. package/dist/v1/EventBroadcaster.d.ts +18 -1
  19. package/dist/v1/EventBroadcaster.js +1 -0
  20. package/dist/v1/adyen/session.d.ts +6 -3
  21. package/dist/v1/adyen/terms.d.ts +5 -0
  22. package/dist/v1/adyen/terms.js +12 -0
  23. package/dist/v1/adyen/widget.d.ts +9 -2
  24. package/dist/v1/adyen/widget.js +216 -9
  25. package/dist/v1/common.d.ts +30 -2
  26. package/dist/v1/index.d.ts +12 -3
  27. package/dist/v1/index.js +2 -1
  28. package/dist/v1/stripe/localizedText.d.ts +3 -0
  29. package/dist/v1/stripe/localizedText.js +28 -0
  30. package/dist/v1/stripe/session.d.ts +29 -6
  31. package/dist/v1/stripe/session.js +7 -1
  32. package/dist/v1/stripe/shared.d.ts +8 -5
  33. package/dist/v1/stripe/shared.js +55 -15
  34. package/dist/v1/stripe/terms.d.ts +1 -1
  35. package/dist/v1/stripe/terms.js +1 -1
  36. package/dist/v1/stripe/themes.js +2 -2
  37. package/dist/v1/stripe/widget.js +62 -23
  38. package/dist/v1/stripe/widgets/deferredMoto.d.ts +5 -0
  39. package/dist/v1/stripe/widgets/deferredMoto.js +200 -0
  40. package/dist/v1/stripe/widgets/moto.d.ts +2 -2
  41. package/dist/v1/stripe/widgets/payment.d.ts +2 -2
  42. package/dist/v1/widget.d.ts +8 -1
  43. package/dist/v1/widget.js +82 -2
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +1 -1
  46. package/package.json +8 -3
  47. package/styles/lightspeed-global-styles.css +81 -1
@@ -38,15 +38,18 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.StripeWidget = void 0;
40
40
  exports.mount = mount;
41
+ var session_1 = require("./session");
42
+ var error_1 = require("../error");
41
43
  var payment_1 = require("./widgets/payment");
42
44
  var moto_1 = require("./widgets/moto");
45
+ var deferredMoto_1 = require("./widgets/deferredMoto");
43
46
  var themes_1 = require("./themes");
44
47
  /**
45
48
  * Main mount function that delegates to appropriate widget based on session type
46
49
  */
47
50
  function mount(mountElement, session, eventBroadcaster, defaultValues, theme) {
48
51
  return __awaiter(this, void 0, void 0, function () {
49
- var sessionType, widgetController, _a, originalUnmount_1, error_1;
52
+ var sessionType, widgetController_1, widgetController, _a, error_2;
50
53
  return __generator(this, function (_b) {
51
54
  switch (_b.label) {
52
55
  case 0:
@@ -57,43 +60,79 @@ function mount(mountElement, session, eventBroadcaster, defaultValues, theme) {
57
60
  sessionType = session.metadata.sessionType;
58
61
  _b.label = 1;
59
62
  case 1:
60
- _b.trys.push([1, 8, , 9]);
63
+ _b.trys.push([1, 10, , 11]);
64
+ if (!(0, session_1.isDeferredStripeSession)(session)) return [3 /*break*/, 3];
65
+ validateDeferredSession(session, sessionType);
66
+ return [4 /*yield*/, (0, deferredMoto_1.mountDeferredMotoWidget)(mountElement, session, eventBroadcaster, defaultValues, theme)];
67
+ case 2:
68
+ widgetController_1 = _b.sent();
69
+ return [2 /*return*/, withThemeCleanup(widgetController_1, mountElement, theme)];
70
+ case 3:
71
+ if (!(0, session_1.isIntentBoundStripeSession)(session)) {
72
+ throw new error_1.InvalidSessionPayloadError('Invalid Stripe session context');
73
+ }
61
74
  widgetController = void 0;
62
75
  _a = sessionType;
63
76
  switch (_a) {
64
- case 'payment': return [3 /*break*/, 2];
65
- case 'payment-with-save': return [3 /*break*/, 2];
66
- case 'moto': return [3 /*break*/, 4];
67
- case 'moto-with-save': return [3 /*break*/, 4];
68
- case 'save': return [3 /*break*/, 4];
77
+ case 'payment': return [3 /*break*/, 4];
78
+ case 'payment-with-save': return [3 /*break*/, 4];
79
+ case 'moto': return [3 /*break*/, 6];
80
+ case 'moto-with-save': return [3 /*break*/, 6];
81
+ case 'save': return [3 /*break*/, 6];
69
82
  }
70
- return [3 /*break*/, 6];
71
- case 2: return [4 /*yield*/, (0, payment_1.mountPaymentWidget)(mountElement, session, eventBroadcaster, defaultValues, theme)];
72
- case 3:
73
- widgetController = _b.sent();
74
- return [3 /*break*/, 7];
75
- case 4: return [4 /*yield*/, (0, moto_1.mountMotoWidget)(mountElement, session, eventBroadcaster, defaultValues, theme)];
83
+ return [3 /*break*/, 8];
84
+ case 4: return [4 /*yield*/, (0, payment_1.mountPaymentWidget)(mountElement, session, eventBroadcaster, defaultValues, theme)];
76
85
  case 5:
77
86
  widgetController = _b.sent();
78
- return [3 /*break*/, 7];
79
- case 6: throw new Error("Unsupported session type: ".concat(sessionType));
87
+ return [3 /*break*/, 9];
88
+ case 6: return [4 /*yield*/, (0, moto_1.mountMotoWidget)(mountElement, session, eventBroadcaster, defaultValues, theme)];
80
89
  case 7:
81
- originalUnmount_1 = widgetController.unmount;
82
- widgetController.unmount = function () {
83
- (0, themes_1.removeThemeClass)(mountElement, theme);
84
- originalUnmount_1();
85
- };
86
- return [2 /*return*/, widgetController];
87
- case 8:
88
- error_1 = _b.sent();
90
+ widgetController = _b.sent();
91
+ return [3 /*break*/, 9];
92
+ case 8: throw new Error("Unsupported session type: ".concat(sessionType));
93
+ case 9:
94
+ // Wrap unmount to include theme cleanup
95
+ return [2 /*return*/, withThemeCleanup(widgetController, mountElement, theme)];
96
+ case 10:
97
+ error_2 = _b.sent();
89
98
  // Clean up theme class if mounting fails
90
99
  (0, themes_1.removeThemeClass)(mountElement, theme);
91
- throw error_1;
92
- case 9: return [2 /*return*/];
100
+ throw error_2;
101
+ case 11: return [2 /*return*/];
93
102
  }
94
103
  });
95
104
  });
96
105
  }
106
+ function validateDeferredSession(session, sessionType) {
107
+ var context = session.context;
108
+ if (!['moto', 'moto-with-save'].includes(sessionType || '') ||
109
+ context.intentMode !== 'deferred' ||
110
+ context.intent !== 'payment' ||
111
+ !Number.isSafeInteger(context.amount) ||
112
+ context.amount <= 0 ||
113
+ typeof context.currency !== 'string' ||
114
+ !/^[a-z]{3}$/i.test(context.currency) ||
115
+ typeof context.publishableKey !== 'string' ||
116
+ context.publishableKey.length === 0 ||
117
+ typeof context.onBehalfOf !== 'string' ||
118
+ context.onBehalfOf.length === 0 ||
119
+ context.onBehalfOf.trim() !== context.onBehalfOf ||
120
+ !Array.isArray(context.paymentMethodTypes) ||
121
+ context.paymentMethodTypes.length !== 1 ||
122
+ context.paymentMethodTypes[0] !== 'card' ||
123
+ 'clientSecret' in context ||
124
+ 'customerSessionClientSecret' in context) {
125
+ throw new error_1.InvalidSessionPayloadError('Invalid deferred Stripe MOTO session context');
126
+ }
127
+ }
128
+ function withThemeCleanup(controller, mountElement, theme) {
129
+ var originalUnmount = controller.unmount;
130
+ controller.unmount = function () {
131
+ (0, themes_1.removeThemeClass)(mountElement, theme);
132
+ originalUnmount();
133
+ };
134
+ return controller;
135
+ }
97
136
  exports.StripeWidget = {
98
137
  mount: mount,
99
138
  };
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.mountDeferredMotoWidget = mountDeferredMotoWidget;
40
+ var error_1 = require("../../error");
41
+ var ResultBuilder_1 = require("../ResultBuilder");
42
+ var localizedText_1 = require("../localizedText");
43
+ var shared_1 = require("../shared");
44
+ function publishStripeError(error, eventBroadcaster) {
45
+ return eventBroadcaster.publish(ResultBuilder_1.EventBuilder.fromStripeError(error));
46
+ }
47
+ function mountDeferredMotoWidget(mountElement, session, eventBroadcaster, defaultValues, theme) {
48
+ return __awaiter(this, void 0, void 0, function () {
49
+ var _a, stripe, elements, paymentOptions, _b, paymentElement, paymentContainer, customTermsContainer, finalizationError, savePaymentMethod, revision, unmounted, completedSubmission, clearFinalizationError, invalidateSubmission, hasSaveOption, updateSaveCheckboxState, savePaymentMethodContainer, submission, failSubmission, submit;
50
+ var _this = this;
51
+ return __generator(this, function (_c) {
52
+ switch (_c.label) {
53
+ case 0: return [4 /*yield*/, (0, shared_1.initStripe)(session.context, theme)];
54
+ case 1:
55
+ _a = _c.sent(), stripe = _a.stripe, elements = _a.elements;
56
+ paymentOptions = (0, shared_1.createPaymentElementOptions)(defaultValues, theme, false, session.context.businessName);
57
+ _b = (0, shared_1.createPaymentElement)(elements, paymentOptions, mountElement, eventBroadcaster), paymentElement = _b.element, paymentContainer = _b.container, customTermsContainer = _b.customTermsContainer;
58
+ finalizationError = document.createElement('p');
59
+ finalizationError.className = 'stripe-finalization-error';
60
+ finalizationError.setAttribute('role', 'alert');
61
+ finalizationError.hidden = true;
62
+ paymentContainer.insertAdjacentElement('afterend', finalizationError);
63
+ savePaymentMethod = false;
64
+ revision = 0;
65
+ unmounted = false;
66
+ clearFinalizationError = function () {
67
+ finalizationError.hidden = true;
68
+ finalizationError.textContent = '';
69
+ };
70
+ invalidateSubmission = function () {
71
+ revision += 1;
72
+ completedSubmission = undefined;
73
+ clearFinalizationError();
74
+ };
75
+ hasSaveOption = session.metadata.sessionType === 'moto-with-save';
76
+ updateSaveCheckboxState = (0, shared_1.setupChangeEventHandler)(paymentElement, eventBroadcaster, null, invalidateSubmission, hasSaveOption ? false : undefined);
77
+ if (hasSaveOption) {
78
+ savePaymentMethodContainer = (0, shared_1.createSavePaymentMethodElement)(mountElement, function (checked) {
79
+ savePaymentMethod = checked;
80
+ invalidateSubmission();
81
+ updateSaveCheckboxState(savePaymentMethod);
82
+ }, session.context.locale);
83
+ }
84
+ failSubmission = function (message) {
85
+ eventBroadcaster.publish({ status: 'Error', code: 'Processing' });
86
+ throw new error_1.ProcessingError(message);
87
+ };
88
+ submit = function () {
89
+ if (unmounted) {
90
+ eventBroadcaster.publish({ status: 'Error', code: 'Processing' });
91
+ return Promise.reject(new error_1.ProcessingError('The payment widget has been unmounted'));
92
+ }
93
+ if ((completedSubmission === null || completedSubmission === void 0 ? void 0 : completedSubmission.revision) === revision) {
94
+ return Promise.resolve(completedSubmission.result);
95
+ }
96
+ if (submission) {
97
+ if (submission.revision === revision) {
98
+ return submission.promise;
99
+ }
100
+ return submission.promise.then(submit, submit);
101
+ }
102
+ var submissionRevision = revision;
103
+ var submissionSavePaymentMethod = savePaymentMethod;
104
+ clearFinalizationError();
105
+ var assertSubmissionIsCurrent = function () {
106
+ if (unmounted) {
107
+ return failSubmission('The payment widget was unmounted during submission');
108
+ }
109
+ if (revision !== submissionRevision) {
110
+ return failSubmission('Payment details or save consent changed during submission');
111
+ }
112
+ };
113
+ var promise = (function () { return __awaiter(_this, void 0, void 0, function () {
114
+ var submitResult, paymentMethodResult, result;
115
+ var _a;
116
+ return __generator(this, function (_b) {
117
+ switch (_b.label) {
118
+ case 0: return [4 /*yield*/, elements.submit()];
119
+ case 1:
120
+ submitResult = _b.sent();
121
+ assertSubmissionIsCurrent();
122
+ if (submitResult.error) {
123
+ return [2 /*return*/, publishStripeError(submitResult.error, eventBroadcaster)];
124
+ }
125
+ return [4 /*yield*/, stripe.createPaymentMethod({ elements: elements })];
126
+ case 2:
127
+ paymentMethodResult = _b.sent();
128
+ assertSubmissionIsCurrent();
129
+ if (paymentMethodResult.error) {
130
+ return [2 /*return*/, publishStripeError(paymentMethodResult.error, eventBroadcaster)];
131
+ }
132
+ if (!((_a = paymentMethodResult.paymentMethod) === null || _a === void 0 ? void 0 : _a.id)) {
133
+ eventBroadcaster.publish({ status: 'Error', code: 'Unexpected' });
134
+ throw new error_1.ProcessingError('Stripe did not return a PaymentMethod ID');
135
+ }
136
+ result = {
137
+ status: 'RequiresFinalization',
138
+ code: 'RequiresFinalization',
139
+ finalizationRequest: {
140
+ paymentData: {
141
+ type: 'payment-method',
142
+ id: paymentMethodResult.paymentMethod.id,
143
+ },
144
+ options: {
145
+ savePaymentMethod: submissionSavePaymentMethod,
146
+ },
147
+ },
148
+ };
149
+ completedSubmission = { revision: submissionRevision, result: result };
150
+ return [2 /*return*/, result];
151
+ }
152
+ });
153
+ }); })();
154
+ var currentSubmission = { revision: submissionRevision, promise: promise };
155
+ submission = currentSubmission;
156
+ var clearSubmission = function () {
157
+ if (submission === currentSubmission) {
158
+ submission = undefined;
159
+ }
160
+ };
161
+ promise.then(clearSubmission, clearSubmission);
162
+ return promise;
163
+ };
164
+ return [2 /*return*/, {
165
+ unmount: function () {
166
+ if (unmounted) {
167
+ return;
168
+ }
169
+ unmounted = true;
170
+ revision += 1;
171
+ completedSubmission = undefined;
172
+ (0, shared_1.cleanupElements)(paymentElement, null, paymentContainer, null, customTermsContainer);
173
+ finalizationError.remove();
174
+ savePaymentMethodContainer === null || savePaymentMethodContainer === void 0 ? void 0 : savePaymentMethodContainer.remove();
175
+ },
176
+ submit: submit,
177
+ reportFinalizationDecline: function (result, message) {
178
+ if (unmounted ||
179
+ (completedSubmission === null || completedSubmission === void 0 ? void 0 : completedSubmission.revision) !== revision ||
180
+ completedSubmission.result.finalizationRequest.paymentData.type !==
181
+ result.finalizationRequest.paymentData.type ||
182
+ completedSubmission.result.finalizationRequest.paymentData.id !==
183
+ result.finalizationRequest.paymentData.id ||
184
+ completedSubmission.result.finalizationRequest.options
185
+ .savePaymentMethod !==
186
+ result.finalizationRequest.options.savePaymentMethod) {
187
+ return;
188
+ }
189
+ invalidateSubmission();
190
+ var trimmedMessage = message.trim();
191
+ finalizationError.textContent =
192
+ trimmedMessage === 'Payment declined.' || !trimmedMessage
193
+ ? (0, localizedText_1.getCardDeclinedText)(session.context.locale)
194
+ : trimmedMessage;
195
+ finalizationError.hidden = false;
196
+ paymentElement.focus();
197
+ eventBroadcaster.publish({ status: 'Declined', code: 'Generic' });
198
+ },
199
+ }];
200
+ }
201
+ });
202
+ });
203
+ }
@@ -37,6 +37,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.mountPaymentWidget = mountPaymentWidget;
40
+ exports.mountMultiStepWidget = mountMultiStepWidget;
40
41
  var widget_1 = require("./adyen/widget");
41
42
  var widget_2 = require("./stripe/widget");
42
43
  var session_1 = require("./session");
@@ -44,9 +45,19 @@ var error_1 = require("./error");
44
45
  var logger_1 = require("./logging/logger");
45
46
  var common_1 = require("./logging/common");
46
47
  var EventBroadcaster_1 = require("./EventBroadcaster");
48
+ var version_1 = require("../version");
49
+ // Exposes the running SDK version on the mount point so it can be inspected
50
+ // in browser devtools (e.g. `document.querySelector('[data-lightspeed-payments-sdk-version]')`).
51
+ var SDK_VERSION_ATTRIBUTE = 'data-lightspeed-payments-sdk-version';
52
+ function markMountPointWithSdkVersion(mountPoint) {
53
+ mountPoint.setAttribute(SDK_VERSION_ATTRIBUTE, version_1.SDK_VERSION);
54
+ }
55
+ function unmarkMountPointWithSdkVersion(mountPoint) {
56
+ mountPoint.removeAttribute(SDK_VERSION_ATTRIBUTE);
57
+ }
47
58
  function mountPaymentWidget(session, config) {
48
59
  return __awaiter(this, void 0, void 0, function () {
49
- var eventBroadcaster, decodedSession, logger_2, configSummary, widgetController, _a, error_2;
60
+ var eventBroadcaster, decodedSession, logger_2, configSummary, widgetController, _a, unmount_1, error_2;
50
61
  return __generator(this, function (_b) {
51
62
  switch (_b.label) {
52
63
  case 0:
@@ -85,8 +96,17 @@ function mountPaymentWidget(session, config) {
85
96
  return [3 /*break*/, 7];
86
97
  case 6: throw new error_1.UnsupportedLocationError();
87
98
  case 7:
99
+ markMountPointWithSdkVersion(config.mountPoint);
88
100
  widgetController.submit = (0, common_1.withLogging)(logger_2, 'Submit', widgetController.submit);
89
- widgetController.unmount = (0, common_1.withLogging)(logger_2, 'Unmount', widgetController.unmount);
101
+ unmount_1 = widgetController.unmount;
102
+ widgetController.unmount = (0, common_1.withLogging)(logger_2, 'Unmount', function () {
103
+ try {
104
+ unmount_1();
105
+ }
106
+ finally {
107
+ unmarkMountPointWithSdkVersion(config.mountPoint);
108
+ }
109
+ });
90
110
  return [2 /*return*/, widgetController];
91
111
  case 8:
92
112
  error_2 = _b.sent();
@@ -100,3 +120,64 @@ function mountPaymentWidget(session, config) {
100
120
  });
101
121
  });
102
122
  }
123
+ // Internal impl of v1.mountMultiStepWidget (additive; event-based flows unchanged).
124
+ function mountMultiStepWidget(session, config) {
125
+ return __awaiter(this, void 0, void 0, function () {
126
+ var eventBroadcaster, decodedSession, logger_3, controller, _a, unmount_2, error_3;
127
+ return __generator(this, function (_b) {
128
+ switch (_b.label) {
129
+ case 0:
130
+ eventBroadcaster = new EventBroadcaster_1.EventBroadcaster(config.listeners);
131
+ _b.label = 1;
132
+ case 1:
133
+ _b.trys.push([1, 6, , 7]);
134
+ decodedSession = (0, session_1.decodePaymentSessionToContext)(session);
135
+ logger_3 = (0, logger_1.getLogger)(decodedSession.logging);
136
+ logger_3.setSessionMetadata(decodedSession.metadata);
137
+ eventBroadcaster.registerMiddleware(function (event) {
138
+ logger_3.log('info', event.status, { event: event });
139
+ return event;
140
+ });
141
+ logger_3.log('info', 'Mount', {
142
+ configuration: {
143
+ theme: config.theme || 'none',
144
+ listeners: config.listeners ? Object.keys(config.listeners) : [],
145
+ },
146
+ });
147
+ controller = void 0;
148
+ _a = decodedSession.psp;
149
+ switch (_a) {
150
+ case 'ADYEN': return [3 /*break*/, 2];
151
+ }
152
+ return [3 /*break*/, 4];
153
+ case 2: return [4 /*yield*/, widget_1.AdyenWidget.mountMultiStep(config.mountPoint, decodedSession, eventBroadcaster, config.onRequiresFinalization)];
154
+ case 3:
155
+ controller = _b.sent();
156
+ return [3 /*break*/, 5];
157
+ case 4: throw new error_1.UnsupportedLocationError();
158
+ case 5:
159
+ markMountPointWithSdkVersion(config.mountPoint);
160
+ controller.submit = (0, common_1.withLogging)(logger_3, 'Submit', controller.submit);
161
+ controller.handleNextAction = (0, common_1.withLogging)(logger_3, 'HandleNextAction', controller.handleNextAction);
162
+ unmount_2 = controller.unmount;
163
+ controller.unmount = (0, common_1.withLogging)(logger_3, 'Unmount', function () {
164
+ try {
165
+ unmount_2();
166
+ }
167
+ finally {
168
+ unmarkMountPointWithSdkVersion(config.mountPoint);
169
+ }
170
+ });
171
+ return [2 /*return*/, controller];
172
+ case 6:
173
+ error_3 = _b.sent();
174
+ eventBroadcaster.publish({
175
+ code: 'Unexpected',
176
+ status: 'Error',
177
+ });
178
+ throw error_3;
179
+ case 7: return [2 /*return*/];
180
+ }
181
+ });
182
+ });
183
+ }
@@ -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.7.3';
6
+ exports.SDK_VERSION = '1.9.0';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
+ import { SDK_VERSION } from './version';
1
2
  export type * from './v1';
2
3
  export { THEME_COLORS } from './v1';
4
+ export { SDK_VERSION };
3
5
  export declare const LightspeedPayments: {
4
6
  v1: import("./v1").LightspeedPaymentsV1;
7
+ version: string;
5
8
  };
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  import { v1 } from './v1';
2
+ import { SDK_VERSION } from './version';
2
3
  export { THEME_COLORS } from './v1';
4
+ export { SDK_VERSION };
3
5
  export var LightspeedPayments = {
4
6
  v1: v1,
7
+ version: SDK_VERSION,
5
8
  };
@@ -25,6 +25,23 @@ export type ChangeEvent = BaseEvent & {
25
25
  paymentMethodType?: string;
26
26
  saveCheckboxChecked?: boolean;
27
27
  };
28
+ export type RequiresFinalizationResult = {
29
+ status: 'RequiresFinalization';
30
+ code: 'RequiresFinalization';
31
+ /**
32
+ * Provider-neutral backend command. Integrations should forward this object
33
+ * unchanged to their Processing Service finalization endpoint.
34
+ */
35
+ finalizationRequest: {
36
+ paymentData: {
37
+ type: 'payment-method';
38
+ id: string;
39
+ };
40
+ options: {
41
+ savePaymentMethod: boolean;
42
+ };
43
+ };
44
+ };
28
45
  export type ErrorResultEvent = BaseEvent & {
29
46
  code: SupportedErrorCodes;
30
47
  status: 'Error';
@@ -42,6 +59,6 @@ export declare class EventBroadcaster {
42
59
  private convertInternalEventToExternal;
43
60
  registerMiddleware(middleware: EventMiddleware): void;
44
61
  applyMiddlewares(event: InternalEvent): Event;
45
- publish(event: InternalEvent): void;
62
+ publish(event: InternalEvent): Event;
46
63
  }
47
64
  export {};
@@ -63,6 +63,7 @@ var EventBroadcaster = /** @class */ (function () {
63
63
  var processedEvent = this.applyMiddlewares(event);
64
64
  var eventListener = this.listenersRegistry[event.status];
65
65
  eventListener(processedEvent);
66
+ return processedEvent;
66
67
  };
67
68
  return EventBroadcaster;
68
69
  }());
@@ -6,12 +6,15 @@ export type AdyenSession = BaseSession & {
6
6
  };
7
7
  export type AdyenContext = {
8
8
  clientKey: string;
9
- sessionId: string;
10
- sessionData: string;
9
+ sessionId?: string;
10
+ sessionData?: string;
11
11
  locale: string;
12
12
  countryCode: string;
13
- amount: number;
13
+ amount?: number;
14
14
  currency: string;
15
15
  env: 'test' | 'live';
16
16
  paymentMethods: PaymentMethodsResponse;
17
+ intent?: 'payment' | 'save-card';
18
+ businessName?: string;
19
+ saveSessionId?: string;
17
20
  };
@@ -0,0 +1,5 @@
1
+ export declare const NO_SHOW_CONSENT_TEXT: {
2
+ readonly MANDATORY_TEMPLATE: "By providing your card information, you authorize {business} to charge your card for {reason} in accordance with their terms.";
3
+ };
4
+ export declare const NO_SHOW_CONSENT_REASON = "a no-show fee if you do not honor your reservation";
5
+ export declare function buildNoShowConsentText(businessName: string): string;
@@ -0,0 +1,12 @@
1
+ // SDK-owned consent copy for the card-save (no-show) flow — the SDK owns the
2
+ // wording rather than taking free-form text from the backend (mirrors
3
+ // `PARTNER_CARD_CONSENT_TEXT` in `stripe/terms.ts`). Plain constants, so they can
4
+ // be extracted for Transifex later. `{business}`/`{reason}` interpolated at render.
5
+ export var NO_SHOW_CONSENT_TEXT = {
6
+ MANDATORY_TEMPLATE: 'By providing your card information, you authorize {business} to charge your card for {reason} in accordance with their terms.',
7
+ };
8
+ // Hardcoded for now; may become a per-session input from the backend later.
9
+ export var NO_SHOW_CONSENT_REASON = 'a no-show fee if you do not honor your reservation';
10
+ export function buildNoShowConsentText(businessName) {
11
+ return NO_SHOW_CONSENT_TEXT.MANDATORY_TEMPLATE.replace(/\{business\}/g, function () { return businessName; }).replace(/\{reason\}/g, function () { return NO_SHOW_CONSENT_REASON; });
12
+ }
@@ -1,3 +1,10 @@
1
1
  import { AdyenSession } from './session';
2
- import { WidgetInterface } from '../common';
3
- export declare const AdyenWidget: WidgetInterface<AdyenSession>;
2
+ import { WidgetController, MultiStepController, MultiStepResult } from '../common';
3
+ import { EventBroadcaster } from '../EventBroadcaster';
4
+ declare function mount(mountElement: HTMLElement, session: AdyenSession, eventBroadcaster: EventBroadcaster): Promise<WidgetController>;
5
+ declare function mountMultiStep(mountElement: HTMLElement, session: AdyenSession, eventBroadcaster: EventBroadcaster, onRequiresFinalization?: (result: MultiStepResult) => void): Promise<MultiStepController>;
6
+ export declare const AdyenWidget: {
7
+ mount: typeof mount;
8
+ mountMultiStep: typeof mountMultiStep;
9
+ };
10
+ export {};