@dintero/checkout-web-sdk 0.0.14 → 0.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.
Files changed (46) hide show
  1. package/.babelrc +3 -0
  2. package/.github/dependabot.yml +10 -0
  3. package/.github/workflows/build.yml +25 -0
  4. package/.github/workflows/release.yml +34 -0
  5. package/.releaserc.json +11 -0
  6. package/CHANGELOG.md +22 -4
  7. package/LISENCE +20 -0
  8. package/README.md +78 -22
  9. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/base.css +224 -0
  10. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/block-navigation.js +79 -0
  11. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/checkout.ts.html +377 -0
  12. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/createIframeAsync.ts.html +254 -0
  13. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/favicon.png +0 -0
  14. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/index.html +171 -0
  15. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/index.ts.html +1103 -0
  16. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/prettify.css +1 -0
  17. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/prettify.js +2 -0
  18. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/sort-arrow-sprite.png +0 -0
  19. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/sorter.js +170 -0
  20. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/subscribe.ts.html +443 -0
  21. package/coverage/Chrome Headless 80.0.3987.0 (Linux x86_64)/html/url.ts.html +185 -0
  22. package/dist/declarations/package.d.ts +52 -0
  23. package/dist/{src → declarations}/src/checkout.d.ts +18 -2
  24. package/dist/{src → declarations}/src/createIframeAsync.d.ts +0 -0
  25. package/dist/{src/src/dintero-checkout-web-sdk.d.ts → declarations/src/index.d.ts} +7 -1
  26. package/dist/declarations/src/session.d.ts +953 -0
  27. package/dist/declarations/src/subscribe.d.ts +41 -0
  28. package/dist/{src → declarations}/src/url.d.ts +1 -0
  29. package/dist/dintero-checkout-web-sdk.cjs.d.ts +1 -0
  30. package/dist/dintero-checkout-web-sdk.cjs.dev.js +469 -0
  31. package/dist/dintero-checkout-web-sdk.cjs.js +7 -0
  32. package/dist/dintero-checkout-web-sdk.cjs.prod.js +469 -0
  33. package/dist/dintero-checkout-web-sdk.esm.js +464 -0
  34. package/dist/dintero-checkout-web-sdk.umd.min.js +7 -0
  35. package/dist/dintero-checkout-web-sdk.umd.min.js.map +1 -0
  36. package/karma.conf.js +33 -0
  37. package/package.json +49 -43
  38. package/dist/checkout-web-sdk.js +0 -2
  39. package/dist/checkout-web-sdk.js.map +0 -1
  40. package/dist/checkout-web-sdk.js.mjs +0 -2
  41. package/dist/checkout-web-sdk.js.mjs.map +0 -1
  42. package/dist/checkout-web-sdk.modern.js +0 -2
  43. package/dist/checkout-web-sdk.modern.js.map +0 -1
  44. package/dist/checkout-web-sdk.umd.js +0 -2
  45. package/dist/checkout-web-sdk.umd.js.map +0 -1
  46. package/dist/src/src/subscribe.d.ts +0 -25
@@ -0,0 +1,464 @@
1
+ import 'native-promise-only';
2
+
3
+ var pkg = {
4
+ name: "@dintero/checkout-web-sdk",
5
+ version: "0.0.0-development",
6
+ description: "Dintero Checkout SDK for web frontends",
7
+ main: "dist/dintero-checkout-web-sdk.cjs.js",
8
+ module: "dist/dintero-checkout-web-sdk.esm.js",
9
+ "umd:main": "dist/dintero-checkout-web-sdk.umd.min.js",
10
+ unpkg: "dist/dintero-checkout-web-sdk.umd.min.js",
11
+ types: "dist/dintero-checkout-web-sdk.cjs.d.ts",
12
+ preconstruct: {
13
+ umdName: "dintero"
14
+ },
15
+ scripts: {
16
+ build: "preconstruct build",
17
+ test: "karma start",
18
+ "semantic-release": "semantic-release"
19
+ },
20
+ "private": false,
21
+ repository: {
22
+ type: "git",
23
+ url: "https://github.com/Dintero/Dintero.Checkout.Web.SDK.git"
24
+ },
25
+ homepage: "https://github.com/Dintero/Dintero.Checkout.Web.SDK#readme",
26
+ author: "Sven Nicolai Viig <sven@dintero.com> (http://dintero.com)",
27
+ license: "MIT",
28
+ bugs: {
29
+ url: "https://github.com/Dintero/Dintero.Checkout.Web.SDK/issues"
30
+ },
31
+ devDependencies: {
32
+ "@babel/preset-env": "^7.14.1",
33
+ "@babel/preset-typescript": "^7.13.0",
34
+ "@preconstruct/cli": "^2.1.0",
35
+ "@semantic-release/git": "^10.0.1",
36
+ chai: "^4.2.0",
37
+ karma: "^6.3.14",
38
+ "karma-chai": "^0.1.0",
39
+ "karma-chrome-launcher": "^3.1.0",
40
+ "karma-mocha": "^2.0.1",
41
+ "karma-typescript": "^5.0.3",
42
+ mocha: "^8.1.1",
43
+ prettier: "^1.19.1",
44
+ puppeteer: "^2.1.0",
45
+ rollup: "^1.30.1",
46
+ "semantic-release": "^19.0.2",
47
+ sinon: "^8.1.1",
48
+ typescript: "^4.2.4"
49
+ },
50
+ dependencies: {
51
+ "native-promise-only": "^0.8.1"
52
+ }
53
+ };
54
+
55
+ let CheckoutEvents;
56
+
57
+ (function (CheckoutEvents) {
58
+ CheckoutEvents["SessionNotFound"] = "SessionNotFound";
59
+ CheckoutEvents["SessionLoaded"] = "SessionLoaded";
60
+ CheckoutEvents["SessionUpdated"] = "SessionUpdated";
61
+ CheckoutEvents["SessionCancel"] = "SessionCancel";
62
+ CheckoutEvents["SessionPaymentOnHold"] = "SessionPaymentOnHold";
63
+ CheckoutEvents["SessionPaymentAuthorized"] = "SessionPaymentAuthorized";
64
+ CheckoutEvents["SessionPaymentError"] = "SessionPaymentError";
65
+ CheckoutEvents["SessionLocked"] = "SessionLocked";
66
+ CheckoutEvents["SessionLockFailed"] = "SessionLockFailed";
67
+ CheckoutEvents["ActivePaymentProductType"] = "ActivePaymentProductType";
68
+ CheckoutEvents["ValidateSession"] = "ValidateSession";
69
+ })(CheckoutEvents || (CheckoutEvents = {}));
70
+
71
+ let InternalCheckoutEvents;
72
+
73
+ (function (InternalCheckoutEvents) {
74
+ InternalCheckoutEvents["HeightChanged"] = "HeightChanged";
75
+ InternalCheckoutEvents["LanguageChanged"] = "LanguageChanged";
76
+ })(InternalCheckoutEvents || (InternalCheckoutEvents = {}));
77
+
78
+ /**
79
+ * Wraps window.location.assign()
80
+ */
81
+
82
+ const windowLocationAssign = url => {
83
+ window.location.assign(url);
84
+ };
85
+ /**
86
+ * Get the url for the session./yarn-error.log
87
+ .DS_Store
88
+ */
89
+
90
+ const getSessionUrl = options => {
91
+ const {
92
+ sid,
93
+ endpoint,
94
+ language,
95
+ ui,
96
+ shouldCallValidateSession
97
+ } = options;
98
+
99
+ if (!endpoint) {
100
+ throw new Error("Invalid endpoint");
101
+ } // Compose url for view session endpoint with optional language parameter.
102
+
103
+
104
+ let languageParam = language ? `language=${language}` : "";
105
+ let uiParam = ui ? `ui=${ui}` : "";
106
+ let sdk = `sdk=${pkg.version}`;
107
+ let validate = shouldCallValidateSession ? `client_side_validation=true` : undefined;
108
+ const params = [languageParam, uiParam, sdk, validate].filter(x => x).join("&");
109
+ return `${endpoint}/v1/view/${sid}${params ? "?" + params : ""}`;
110
+ };
111
+
112
+ /**
113
+ * Creates an iframe and adds it to the container.
114
+ *
115
+ * Returns a promise that resolves to the iframe when the iframe has loaded.
116
+ * Rejects the promise if there is a problem loading the iframe.
117
+ */
118
+ const createIframeAsync = (container, endpoint, url) => {
119
+ if (!container || !container.appendChild) {
120
+ throw new Error("Invalid container");
121
+ }
122
+
123
+ const iframe = document.createElement("iframe"); // No border, transparent and stretch to 100% of the container width.
124
+
125
+ iframe.setAttribute("frameborder", "0");
126
+ iframe.setAttribute("allowTransparency", "true");
127
+ iframe.setAttribute("style", "width:100%; height:0;"); // TODO: Get this to work as expected, might be tricky with current
128
+ // tests since they will require the csp to be "unsafe-inline".
129
+ // The server needs to add the same property in the Content Security
130
+ // Policy headers in the response for this to work. A CSP header set by
131
+ // a meta tag in the iframe target will not be detected as a valid
132
+ // CSP from the iframe host.
133
+ // Content Security Policy, should be limited to "endpoint".
134
+ // iframe.setAttribute("csp", `default-src ${endpoint}`);
135
+ // Apply extra restrictions to the content in the iframe.
136
+ // allow popups is needed to open terms in new window
137
+
138
+ iframe.setAttribute("sandbox", "allow-scripts allow-forms allow-same-origin allow-popups"); // The download priority of the resource in the <iframe>'s src attribute.
139
+
140
+ iframe.setAttribute("importance", "high"); // Set the iframe source to the url.
141
+
142
+ iframe.setAttribute("src", url); // Resolve or reject promise when iframe loads.
143
+ // // Add iframe to the container.
144
+ // container.appendChild(iframe);
145
+
146
+ return {
147
+ iframe,
148
+ initiate: async () => {
149
+ return new Promise((resolve, reject) => {
150
+ iframe.onload = () => resolve();
151
+
152
+ iframe.onerror = () => reject();
153
+
154
+ container.appendChild(iframe);
155
+ });
156
+ }
157
+ };
158
+ };
159
+
160
+ /**
161
+ * Unsubscribe handler from event(s).
162
+ */
163
+
164
+ /**
165
+ * Post a message acknowledgement to the checkout iframe.
166
+ */
167
+ const postAck = (iframe, event) => {
168
+ if (event.data.mid && iframe.contentWindow) {
169
+ iframe.contentWindow.postMessage({
170
+ ack: event.data.mid
171
+ }, event.origin || "*");
172
+ }
173
+ };
174
+ /**
175
+ * Post a SessionLock-event to the checkout iframe.
176
+ */
177
+
178
+
179
+ const postSessionLock = (iframe, sid) => {
180
+ if (iframe.contentWindow) {
181
+ iframe.contentWindow.postMessage({
182
+ type: "LockSession",
183
+ sid
184
+ }, "*");
185
+ }
186
+ };
187
+ /**
188
+ * Post the validation result to the checkout iframe
189
+ */
190
+
191
+ const postValidationResult = (iframe, sid, result) => {
192
+ if (iframe.contentWindow) {
193
+ iframe.contentWindow.postMessage({
194
+ type: "ValidationResult",
195
+ sid,
196
+ ...result
197
+ }, "*");
198
+ }
199
+ };
200
+ /**
201
+ * Post RefreshSession-event to the checkout iframe.
202
+ */
203
+
204
+ const postSessionRefresh = (iframe, sid) => {
205
+ if (iframe.contentWindow) {
206
+ iframe.contentWindow.postMessage({
207
+ type: "RefreshSession",
208
+ sid
209
+ }, "*");
210
+ }
211
+ };
212
+ /**
213
+ * Post setActivePaymentProductType-event to the checkout iframe.
214
+ */
215
+
216
+ const postActivePaymentProductType = (iframe, sid, paymentProductType) => {
217
+ if (iframe.contentWindow) {
218
+ iframe.contentWindow.postMessage({
219
+ type: "SetActivePaymentProductType",
220
+ sid,
221
+ payment_product_type: paymentProductType
222
+ }, "*");
223
+ }
224
+ };
225
+ /**
226
+ * Subscribe to events from an iframe given a handler and a set
227
+ * of event types.
228
+ */
229
+
230
+ const subscribe = options => {
231
+ const {
232
+ sid,
233
+ endpoint,
234
+ handler,
235
+ eventTypes,
236
+ checkout
237
+ } = options; // Wrap event handler in a function that checks for correct origin and
238
+ // filters on event type(s) in the event data.
239
+
240
+ const wrappedHandler = event => {
241
+ const correctOrigin = event.origin === endpoint;
242
+ const correctWindow = event.source === checkout.iframe.contentWindow;
243
+ const correctSid = event.data && event.data.sid === sid;
244
+ const correctMessageType = eventTypes.indexOf(event.data && event.data.type) !== -1;
245
+
246
+ if (correctOrigin && correctWindow && correctSid && correctMessageType) {
247
+ postAck(checkout.iframe, event);
248
+ handler(event.data, checkout);
249
+ }
250
+ }; // Add event listener to the iframe.
251
+
252
+
253
+ window.addEventListener("message", wrappedHandler, false); // Function to remove the event listener from the iframe.
254
+
255
+ const unsubscribe = () => {
256
+ window.removeEventListener("message", wrappedHandler, false);
257
+ }; // Return object with unsubscribe function.
258
+
259
+
260
+ return {
261
+ unsubscribe
262
+ };
263
+ };
264
+
265
+ /**
266
+ * An event handler that navigates to the href in the event.
267
+ */
268
+ const followHref = event => {
269
+ if (event.href) {
270
+ windowLocationAssign(event.href);
271
+ }
272
+ };
273
+ /**
274
+ * An event handler that sets height of the iframe.
275
+ */
276
+
277
+
278
+ const setIframeHeight = (event, checkout) => {
279
+ if (event.height || event.height === 0) {
280
+ checkout.iframe.setAttribute("style", `width:100%; height:${event.height}px;`);
281
+ }
282
+ };
283
+
284
+ const setLanguage = (event, checkout) => {
285
+ if (event.language) {
286
+ checkout.language = event.language;
287
+ }
288
+ };
289
+
290
+ const handleWithResult = (sid, endpoint, handler) => {
291
+ return (event, checkout) => {
292
+ const eventKeys = ["sid", "merchant_reference", "transaction_id", "error"];
293
+ const pairs = eventKeys.map(key => [key, event[key]]);
294
+
295
+ if (event.type === CheckoutEvents.SessionCancel && !event.error) {
296
+ pairs.push(["error", "cancelled"]);
297
+ }
298
+
299
+ pairs.push(["language", checkout.language]);
300
+ pairs.push(["sdk", pkg.version]);
301
+ const urlQuery = pairs.filter(([key, value]) => value).map(([key, value]) => `${key}=${value}`).join("&");
302
+ checkout.iframe.setAttribute("src", `${endpoint}/embedResult/?${urlQuery}`);
303
+ handler(event, checkout);
304
+ };
305
+ };
306
+ /**
307
+ * Show a dintero payment session in an embedded iframe.
308
+ */
309
+
310
+
311
+ const embed = async options => {
312
+ const {
313
+ container,
314
+ sid,
315
+ language,
316
+ endpoint = "https://checkout.dintero.com",
317
+ onSession,
318
+ onSessionCancel,
319
+ onPayment,
320
+ onPaymentAuthorized,
321
+ onPaymentError,
322
+ onSessionNotFound,
323
+ onSessionLocked,
324
+ onSessionLockFailed,
325
+ onActivePaymentType,
326
+ onValidateSession
327
+ } = options;
328
+ const subscriptions = []; // Create iframe
329
+
330
+ const {
331
+ iframe,
332
+ initiate
333
+ } = createIframeAsync(container, endpoint, getSessionUrl({
334
+ sid,
335
+ endpoint,
336
+ language,
337
+ ui: "inline",
338
+ shouldCallValidateSession: onValidateSession !== undefined
339
+ }));
340
+ /**
341
+ * Function that removes the iframe and all event listeners.
342
+ */
343
+
344
+ const destroy = () => {
345
+ if (iframe) {
346
+ subscriptions.forEach(sub => sub.unsubscribe());
347
+
348
+ if (iframe.parentElement) {
349
+ container.removeChild(iframe);
350
+ }
351
+ }
352
+ };
353
+
354
+ const lockSession = () => {
355
+ postSessionLock(iframe, sid);
356
+ };
357
+
358
+ const refreshSession = () => {
359
+ postSessionRefresh(iframe, sid);
360
+ };
361
+
362
+ const setActivePaymentProductType = paymentProductType => {
363
+ postActivePaymentProductType(iframe, sid, paymentProductType);
364
+ };
365
+
366
+ const submitValidationResult = result => {
367
+ postValidationResult(iframe, sid, result);
368
+ };
369
+
370
+ const wrappedOnValidateSession = (event, checkout) => {
371
+ if (onValidateSession) {
372
+ onValidateSession(event, checkout, submitValidationResult);
373
+ }
374
+ }; // Create checkout object that wraps the destroy function.
375
+
376
+
377
+ const checkout = {
378
+ destroy,
379
+ iframe,
380
+ language,
381
+ lockSession,
382
+ refreshSession,
383
+ setActivePaymentProductType,
384
+ submitValidationResult
385
+ }; // Add event handlers (or in some cases add a fallback href handler).
386
+
387
+ [{
388
+ handler: setLanguage,
389
+ eventTypes: [InternalCheckoutEvents.LanguageChanged]
390
+ }, {
391
+ handler: setIframeHeight,
392
+ eventTypes: [InternalCheckoutEvents.HeightChanged]
393
+ }, {
394
+ handler: onSession,
395
+ eventTypes: [CheckoutEvents.SessionLoaded, CheckoutEvents.SessionUpdated]
396
+ }, {
397
+ eventTypes: [CheckoutEvents.SessionPaymentOnHold],
398
+ handler: onPayment ? handleWithResult(sid, endpoint, onPayment) : followHref
399
+ }, {
400
+ eventTypes: [CheckoutEvents.SessionPaymentAuthorized],
401
+ handler: onPaymentAuthorized || onPayment ? handleWithResult(sid, endpoint, onPaymentAuthorized || onPayment) : followHref
402
+ }, {
403
+ handler: onSessionCancel ? handleWithResult(sid, endpoint, onSessionCancel) : followHref,
404
+ eventTypes: [CheckoutEvents.SessionCancel]
405
+ }, {
406
+ handler: onPaymentError ? handleWithResult(sid, endpoint, onPaymentError) : followHref,
407
+ eventTypes: [CheckoutEvents.SessionPaymentError]
408
+ }, {
409
+ handler: onSessionNotFound,
410
+ eventTypes: [CheckoutEvents.SessionNotFound]
411
+ }, {
412
+ handler: onSessionLocked,
413
+ eventTypes: [CheckoutEvents.SessionLocked]
414
+ }, {
415
+ handler: onSessionLockFailed,
416
+ eventTypes: [CheckoutEvents.SessionLockFailed]
417
+ }, {
418
+ handler: onActivePaymentType,
419
+ eventTypes: [CheckoutEvents.ActivePaymentProductType]
420
+ }, {
421
+ handler: onActivePaymentType,
422
+ eventTypes: [CheckoutEvents.ActivePaymentProductType]
423
+ }, {
424
+ handler: wrappedOnValidateSession,
425
+ eventTypes: [CheckoutEvents.ValidateSession]
426
+ }].forEach(({
427
+ handler,
428
+ eventTypes
429
+ }) => {
430
+ if (handler) {
431
+ subscriptions.push(subscribe({
432
+ sid,
433
+ endpoint,
434
+ handler,
435
+ eventTypes,
436
+ checkout
437
+ }));
438
+ }
439
+ }); // Add iframe to DOM
440
+
441
+ await initiate(); // Return object with function to destroy the checkout.
442
+
443
+ return checkout;
444
+ };
445
+ /**
446
+ * Redirect the customer to a payment session in the Dintero Checkout.
447
+ */
448
+
449
+ const redirect = options => {
450
+ const {
451
+ sid,
452
+ language,
453
+ endpoint = "https://checkout.dintero.com"
454
+ } = options; // Redirect the current browser window to the checkout session url.
455
+
456
+ windowLocationAssign(getSessionUrl({
457
+ sid,
458
+ endpoint,
459
+ language,
460
+ shouldCallValidateSession: false
461
+ }));
462
+ };
463
+
464
+ export { embed, redirect };
@@ -0,0 +1,7 @@
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).dintero={})}(this,(function(e){"use strict";var n="undefined"!=typeof globalThis?globalThis:"undefined"!="object"?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};!function(e,n,t){e(t={path:n,exports:{},require:function(e,n){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==n&&t.path)}},t.exports),t.exports}((function(e){
2
+ /*! Native Promise Only
3
+ v0.8.1 (c) Kyle Simpson
4
+ MIT License: http://getify.mit-license.org
5
+ */
6
+ var t,o,i;i=function(){var e,n,t,o=Object.prototype.toString,i="undefined"!=typeof setImmediate?function(e){return setImmediate(e)}:setTimeout;try{Object.defineProperty({},"x",{}),e=function(e,n,t,o){return Object.defineProperty(e,n,{value:t,writable:!0,configurable:!1!==o})}}catch(n){e=function(e,n,t){return e[n]=t,e}}function r(e,o){t.add(e,o),n||(n=i(t.drain))}function s(e){var n,t=typeof e;return null==e||"object"!=t&&"function"!=t||(n=e.then),"function"==typeof n&&n}function a(){for(var e=0;e<this.chain.length;e++)c(this,1===this.state?this.chain[e].success:this.chain[e].failure,this.chain[e]);this.chain.length=0}function c(e,n,t){var o,i;try{!1===n?t.reject(e.msg):(o=!0===n?e.msg:n.call(void 0,e.msg))===t.promise?t.reject(TypeError("Promise-chain cycle")):(i=s(o))?i.call(o,t.resolve,t.reject):t.resolve(o)}catch(e){t.reject(e)}}function d(e){var n,t=this;if(!t.triggered){t.triggered=!0,t.def&&(t=t.def);try{(n=s(e))?r((function(){var o=new f(t);try{n.call(e,(function(){d.apply(o,arguments)}),(function(){u.apply(o,arguments)}))}catch(e){u.call(o,e)}})):(t.msg=e,t.state=1,t.chain.length>0&&r(a,t))}catch(e){u.call(new f(t),e)}}}function u(e){var n=this;n.triggered||(n.triggered=!0,n.def&&(n=n.def),n.msg=e,n.state=2,n.chain.length>0&&r(a,n))}function l(e,n,t,o){for(var i=0;i<n.length;i++)!function(i){e.resolve(n[i]).then((function(e){t(i,e)}),o)}(i)}function f(e){this.def=e,this.triggered=!1}function h(e){this.promise=e,this.state=0,this.triggered=!1,this.chain=[],this.msg=void 0}function p(e){if("function"!=typeof e)throw TypeError("Not a function");if(0!==this.__NPO__)throw TypeError("Not a promise");this.__NPO__=1;var n=new h(this);this.then=function(e,t){var o={success:"function"!=typeof e||e,failure:"function"==typeof t&&t};return o.promise=new this.constructor((function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");o.resolve=e,o.reject=n})),n.chain.push(o),0!==n.state&&r(a,n),o.promise},this.catch=function(e){return this.then(void 0,e)};try{e.call(void 0,(function(e){d.call(n,e)}),(function(e){u.call(n,e)}))}catch(e){u.call(n,e)}}t=function(){var e,t,o;function i(e,n){this.fn=e,this.self=n,this.next=void 0}return{add:function(n,r){o=new i(n,r),t?t.next=o:e=o,t=o,o=void 0},drain:function(){var o=e;for(e=t=n=void 0;o;)o.fn.call(o.self),o=o.next}}}();var y=e({},"constructor",p,!1);return p.prototype=y,e(y,"__NPO__",0,!1),e(p,"resolve",(function(e){return e&&"object"==typeof e&&1===e.__NPO__?e:new this((function(n,t){if("function"!=typeof n||"function"!=typeof t)throw TypeError("Not a function");n(e)}))})),e(p,"reject",(function(e){return new this((function(n,t){if("function"!=typeof n||"function"!=typeof t)throw TypeError("Not a function");t(e)}))})),e(p,"all",(function(e){var n=this;return"[object Array]"!=o.call(e)?n.reject(TypeError("Not an array")):0===e.length?n.resolve([]):new n((function(t,o){if("function"!=typeof t||"function"!=typeof o)throw TypeError("Not a function");var i=e.length,r=Array(i),s=0;l(n,e,(function(e,n){r[e]=n,++s===i&&t(r)}),o)}))})),e(p,"race",(function(e){var n=this;return"[object Array]"!=o.call(e)?n.reject(TypeError("Not an array")):new n((function(t,o){if("function"!=typeof t||"function"!=typeof o)throw TypeError("Not a function");l(n,e,(function(e,n){t(n)}),o)}))})),p},(o=n)[t="Promise"]=o[t]||i(),e.exports&&(e.exports=o[t])}));var t="0.0.0-development";let o,i;!function(e){e.SessionNotFound="SessionNotFound",e.SessionLoaded="SessionLoaded",e.SessionUpdated="SessionUpdated",e.SessionCancel="SessionCancel",e.SessionPaymentOnHold="SessionPaymentOnHold",e.SessionPaymentAuthorized="SessionPaymentAuthorized",e.SessionPaymentError="SessionPaymentError",e.SessionLocked="SessionLocked",e.SessionLockFailed="SessionLockFailed",e.ActivePaymentProductType="ActivePaymentProductType",e.ValidateSession="ValidateSession"}(o||(o={})),function(e){e.HeightChanged="HeightChanged",e.LanguageChanged="LanguageChanged"}(i||(i={}));const r=e=>{window.location.assign(e)},s=e=>{const{sid:n,endpoint:o,language:i,ui:r,shouldCallValidateSession:s}=e;if(!o)throw new Error("Invalid endpoint");const a=[i?`language=${i}`:"",r?`ui=${r}`:"",`sdk=${t}`,s?"client_side_validation=true":void 0].filter((e=>e)).join("&");return`${o}/v1/view/${n}${a?"?"+a:""}`},a=e=>{e.href&&r(e.href)},c=(e,n)=>{(e.height||0===e.height)&&n.iframe.setAttribute("style",`width:100%; height:${e.height}px;`)},d=(e,n)=>{e.language&&(n.language=e.language)},u=(e,n,i)=>(e,r)=>{const s=["sid","merchant_reference","transaction_id","error"].map((n=>[n,e[n]]));e.type!==o.SessionCancel||e.error||s.push(["error","cancelled"]),s.push(["language",r.language]),s.push(["sdk",t]);const a=s.filter((([e,n])=>n)).map((([e,n])=>`${e}=${n}`)).join("&");r.iframe.setAttribute("src",`${n}/embedResult/?${a}`),i(e,r)};e.embed=async e=>{const{container:n,sid:t,language:r,endpoint:l="https://checkout.dintero.com",onSession:f,onSessionCancel:h,onPayment:p,onPaymentAuthorized:y,onPaymentError:g,onSessionNotFound:m,onSessionLocked:v,onSessionLockFailed:w,onActivePaymentType:S,onValidateSession:T}=e,b=[],{iframe:P,initiate:_}=((e,n,t)=>{if(!e||!e.appendChild)throw new Error("Invalid container");const o=document.createElement("iframe");return o.setAttribute("frameborder","0"),o.setAttribute("allowTransparency","true"),o.setAttribute("style","width:100%; height:0;"),o.setAttribute("sandbox","allow-scripts allow-forms allow-same-origin allow-popups"),o.setAttribute("importance","high"),o.setAttribute("src",t),{iframe:o,initiate:async()=>new Promise(((n,t)=>{o.onload=()=>n(),o.onerror=()=>t(),e.appendChild(o)}))}})(n,0,s({sid:t,endpoint:l,language:r,ui:"inline",shouldCallValidateSession:void 0!==T})),E=e=>{((e,n,t)=>{e.contentWindow&&e.contentWindow.postMessage({type:"ValidationResult",sid:n,...t},"*")})(P,t,e)},A={destroy:()=>{P&&(b.forEach((e=>e.unsubscribe())),P.parentElement&&n.removeChild(P))},iframe:P,language:r,lockSession:()=>{((e,n)=>{e.contentWindow&&e.contentWindow.postMessage({type:"LockSession",sid:n},"*")})(P,t)},refreshSession:()=>{((e,n)=>{e.contentWindow&&e.contentWindow.postMessage({type:"RefreshSession",sid:n},"*")})(P,t)},setActivePaymentProductType:e=>{((e,n,t)=>{e.contentWindow&&e.contentWindow.postMessage({type:"SetActivePaymentProductType",sid:n,payment_product_type:t},"*")})(P,t,e)},submitValidationResult:E};return[{handler:d,eventTypes:[i.LanguageChanged]},{handler:c,eventTypes:[i.HeightChanged]},{handler:f,eventTypes:[o.SessionLoaded,o.SessionUpdated]},{eventTypes:[o.SessionPaymentOnHold],handler:p?u(0,l,p):a},{eventTypes:[o.SessionPaymentAuthorized],handler:y||p?u(0,l,y||p):a},{handler:h?u(0,l,h):a,eventTypes:[o.SessionCancel]},{handler:g?u(0,l,g):a,eventTypes:[o.SessionPaymentError]},{handler:m,eventTypes:[o.SessionNotFound]},{handler:v,eventTypes:[o.SessionLocked]},{handler:w,eventTypes:[o.SessionLockFailed]},{handler:S,eventTypes:[o.ActivePaymentProductType]},{handler:S,eventTypes:[o.ActivePaymentProductType]},{handler:(e,n)=>{T&&T(e,n,E)},eventTypes:[o.ValidateSession]}].forEach((({handler:e,eventTypes:n})=>{e&&b.push((e=>{const{sid:n,endpoint:t,handler:o,eventTypes:i,checkout:r}=e,s=e=>{const s=e.origin===t,a=e.source===r.iframe.contentWindow,c=e.data&&e.data.sid===n,d=-1!==i.indexOf(e.data&&e.data.type);s&&a&&c&&d&&(((e,n)=>{n.data.mid&&e.contentWindow&&e.contentWindow.postMessage({ack:n.data.mid},n.origin||"*")})(r.iframe,e),o(e.data,r))};return window.addEventListener("message",s,!1),{unsubscribe:()=>{window.removeEventListener("message",s,!1)}}})({sid:t,endpoint:l,handler:e,eventTypes:n,checkout:A}))})),await _(),A},e.redirect=e=>{const{sid:n,language:t,endpoint:o="https://checkout.dintero.com"}=e;r(s({sid:n,endpoint:o,language:t,shouldCallValidateSession:!1}))},Object.defineProperty(e,"__esModule",{value:!0})}));
7
+ //# sourceMappingURL=dintero-checkout-web-sdk.umd.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dintero-checkout-web-sdk.umd.min.js","sources":["../node_modules/native-promise-only/lib/npo.src.js","../src/checkout.ts","../src/url.ts","../src/index.ts","../src/createIframeAsync.ts","../src/subscribe.ts"],"sourcesContent":["/*! Native Promise Only\n v0.8.1 (c) Kyle Simpson\n MIT License: http://getify.mit-license.org\n*/\n\n(function UMD(name,context,definition){\n\t// special form of UMD for polyfilling across evironments\n\tcontext[name] = context[name] || definition();\n\tif (typeof module != \"undefined\" && module.exports) { module.exports = context[name]; }\n\telse if (typeof define == \"function\" && define.amd) { define(function $AMD$(){ return context[name]; }); }\n})(\"Promise\",typeof global != \"undefined\" ? global : this,function DEF(){\n\t/*jshint validthis:true */\n\t\"use strict\";\n\n\tvar builtInProp, cycle, scheduling_queue,\n\t\tToString = Object.prototype.toString,\n\t\ttimer = (typeof setImmediate != \"undefined\") ?\n\t\t\tfunction timer(fn) { return setImmediate(fn); } :\n\t\t\tsetTimeout\n\t;\n\n\t// dammit, IE8.\n\ttry {\n\t\tObject.defineProperty({},\"x\",{});\n\t\tbuiltInProp = function builtInProp(obj,name,val,config) {\n\t\t\treturn Object.defineProperty(obj,name,{\n\t\t\t\tvalue: val,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: config !== false\n\t\t\t});\n\t\t};\n\t}\n\tcatch (err) {\n\t\tbuiltInProp = function builtInProp(obj,name,val) {\n\t\t\tobj[name] = val;\n\t\t\treturn obj;\n\t\t};\n\t}\n\n\t// Note: using a queue instead of array for efficiency\n\tscheduling_queue = (function Queue() {\n\t\tvar first, last, item;\n\n\t\tfunction Item(fn,self) {\n\t\t\tthis.fn = fn;\n\t\t\tthis.self = self;\n\t\t\tthis.next = void 0;\n\t\t}\n\n\t\treturn {\n\t\t\tadd: function add(fn,self) {\n\t\t\t\titem = new Item(fn,self);\n\t\t\t\tif (last) {\n\t\t\t\t\tlast.next = item;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfirst = item;\n\t\t\t\t}\n\t\t\t\tlast = item;\n\t\t\t\titem = void 0;\n\t\t\t},\n\t\t\tdrain: function drain() {\n\t\t\t\tvar f = first;\n\t\t\t\tfirst = last = cycle = void 0;\n\n\t\t\t\twhile (f) {\n\t\t\t\t\tf.fn.call(f.self);\n\t\t\t\t\tf = f.next;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t})();\n\n\tfunction schedule(fn,self) {\n\t\tscheduling_queue.add(fn,self);\n\t\tif (!cycle) {\n\t\t\tcycle = timer(scheduling_queue.drain);\n\t\t}\n\t}\n\n\t// promise duck typing\n\tfunction isThenable(o) {\n\t\tvar _then, o_type = typeof o;\n\n\t\tif (o != null &&\n\t\t\t(\n\t\t\t\to_type == \"object\" || o_type == \"function\"\n\t\t\t)\n\t\t) {\n\t\t\t_then = o.then;\n\t\t}\n\t\treturn typeof _then == \"function\" ? _then : false;\n\t}\n\n\tfunction notify() {\n\t\tfor (var i=0; i<this.chain.length; i++) {\n\t\t\tnotifyIsolated(\n\t\t\t\tthis,\n\t\t\t\t(this.state === 1) ? this.chain[i].success : this.chain[i].failure,\n\t\t\t\tthis.chain[i]\n\t\t\t);\n\t\t}\n\t\tthis.chain.length = 0;\n\t}\n\n\t// NOTE: This is a separate function to isolate\n\t// the `try..catch` so that other code can be\n\t// optimized better\n\tfunction notifyIsolated(self,cb,chain) {\n\t\tvar ret, _then;\n\t\ttry {\n\t\t\tif (cb === false) {\n\t\t\t\tchain.reject(self.msg);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (cb === true) {\n\t\t\t\t\tret = self.msg;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tret = cb.call(void 0,self.msg);\n\t\t\t\t}\n\n\t\t\t\tif (ret === chain.promise) {\n\t\t\t\t\tchain.reject(TypeError(\"Promise-chain cycle\"));\n\t\t\t\t}\n\t\t\t\telse if (_then = isThenable(ret)) {\n\t\t\t\t\t_then.call(ret,chain.resolve,chain.reject);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tchain.resolve(ret);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tchain.reject(err);\n\t\t}\n\t}\n\n\tfunction resolve(msg) {\n\t\tvar _then, self = this;\n\n\t\t// already triggered?\n\t\tif (self.triggered) { return; }\n\n\t\tself.triggered = true;\n\n\t\t// unwrap\n\t\tif (self.def) {\n\t\t\tself = self.def;\n\t\t}\n\n\t\ttry {\n\t\t\tif (_then = isThenable(msg)) {\n\t\t\t\tschedule(function(){\n\t\t\t\t\tvar def_wrapper = new MakeDefWrapper(self);\n\t\t\t\t\ttry {\n\t\t\t\t\t\t_then.call(msg,\n\t\t\t\t\t\t\tfunction $resolve$(){ resolve.apply(def_wrapper,arguments); },\n\t\t\t\t\t\t\tfunction $reject$(){ reject.apply(def_wrapper,arguments); }\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\treject.call(def_wrapper,err);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself.msg = msg;\n\t\t\t\tself.state = 1;\n\t\t\t\tif (self.chain.length > 0) {\n\t\t\t\t\tschedule(notify,self);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\treject.call(new MakeDefWrapper(self),err);\n\t\t}\n\t}\n\n\tfunction reject(msg) {\n\t\tvar self = this;\n\n\t\t// already triggered?\n\t\tif (self.triggered) { return; }\n\n\t\tself.triggered = true;\n\n\t\t// unwrap\n\t\tif (self.def) {\n\t\t\tself = self.def;\n\t\t}\n\n\t\tself.msg = msg;\n\t\tself.state = 2;\n\t\tif (self.chain.length > 0) {\n\t\t\tschedule(notify,self);\n\t\t}\n\t}\n\n\tfunction iteratePromises(Constructor,arr,resolver,rejecter) {\n\t\tfor (var idx=0; idx<arr.length; idx++) {\n\t\t\t(function IIFE(idx){\n\t\t\t\tConstructor.resolve(arr[idx])\n\t\t\t\t.then(\n\t\t\t\t\tfunction $resolver$(msg){\n\t\t\t\t\t\tresolver(idx,msg);\n\t\t\t\t\t},\n\t\t\t\t\trejecter\n\t\t\t\t);\n\t\t\t})(idx);\n\t\t}\n\t}\n\n\tfunction MakeDefWrapper(self) {\n\t\tthis.def = self;\n\t\tthis.triggered = false;\n\t}\n\n\tfunction MakeDef(self) {\n\t\tthis.promise = self;\n\t\tthis.state = 0;\n\t\tthis.triggered = false;\n\t\tthis.chain = [];\n\t\tthis.msg = void 0;\n\t}\n\n\tfunction Promise(executor) {\n\t\tif (typeof executor != \"function\") {\n\t\t\tthrow TypeError(\"Not a function\");\n\t\t}\n\n\t\tif (this.__NPO__ !== 0) {\n\t\t\tthrow TypeError(\"Not a promise\");\n\t\t}\n\n\t\t// instance shadowing the inherited \"brand\"\n\t\t// to signal an already \"initialized\" promise\n\t\tthis.__NPO__ = 1;\n\n\t\tvar def = new MakeDef(this);\n\n\t\tthis[\"then\"] = function then(success,failure) {\n\t\t\tvar o = {\n\t\t\t\tsuccess: typeof success == \"function\" ? success : true,\n\t\t\t\tfailure: typeof failure == \"function\" ? failure : false\n\t\t\t};\n\t\t\t// Note: `then(..)` itself can be borrowed to be used against\n\t\t\t// a different promise constructor for making the chained promise,\n\t\t\t// by substituting a different `this` binding.\n\t\t\to.promise = new this.constructor(function extractChain(resolve,reject) {\n\t\t\t\tif (typeof resolve != \"function\" || typeof reject != \"function\") {\n\t\t\t\t\tthrow TypeError(\"Not a function\");\n\t\t\t\t}\n\n\t\t\t\to.resolve = resolve;\n\t\t\t\to.reject = reject;\n\t\t\t});\n\t\t\tdef.chain.push(o);\n\n\t\t\tif (def.state !== 0) {\n\t\t\t\tschedule(notify,def);\n\t\t\t}\n\n\t\t\treturn o.promise;\n\t\t};\n\t\tthis[\"catch\"] = function $catch$(failure) {\n\t\t\treturn this.then(void 0,failure);\n\t\t};\n\n\t\ttry {\n\t\t\texecutor.call(\n\t\t\t\tvoid 0,\n\t\t\t\tfunction publicResolve(msg){\n\t\t\t\t\tresolve.call(def,msg);\n\t\t\t\t},\n\t\t\t\tfunction publicReject(msg) {\n\t\t\t\t\treject.call(def,msg);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\tcatch (err) {\n\t\t\treject.call(def,err);\n\t\t}\n\t}\n\n\tvar PromisePrototype = builtInProp({},\"constructor\",Promise,\n\t\t/*configurable=*/false\n\t);\n\n\t// Note: Android 4 cannot use `Object.defineProperty(..)` here\n\tPromise.prototype = PromisePrototype;\n\n\t// built-in \"brand\" to signal an \"uninitialized\" promise\n\tbuiltInProp(PromisePrototype,\"__NPO__\",0,\n\t\t/*configurable=*/false\n\t);\n\n\tbuiltInProp(Promise,\"resolve\",function Promise$resolve(msg) {\n\t\tvar Constructor = this;\n\n\t\t// spec mandated checks\n\t\t// note: best \"isPromise\" check that's practical for now\n\t\tif (msg && typeof msg == \"object\" && msg.__NPO__ === 1) {\n\t\t\treturn msg;\n\t\t}\n\n\t\treturn new Constructor(function executor(resolve,reject){\n\t\t\tif (typeof resolve != \"function\" || typeof reject != \"function\") {\n\t\t\t\tthrow TypeError(\"Not a function\");\n\t\t\t}\n\n\t\t\tresolve(msg);\n\t\t});\n\t});\n\n\tbuiltInProp(Promise,\"reject\",function Promise$reject(msg) {\n\t\treturn new this(function executor(resolve,reject){\n\t\t\tif (typeof resolve != \"function\" || typeof reject != \"function\") {\n\t\t\t\tthrow TypeError(\"Not a function\");\n\t\t\t}\n\n\t\t\treject(msg);\n\t\t});\n\t});\n\n\tbuiltInProp(Promise,\"all\",function Promise$all(arr) {\n\t\tvar Constructor = this;\n\n\t\t// spec mandated checks\n\t\tif (ToString.call(arr) != \"[object Array]\") {\n\t\t\treturn Constructor.reject(TypeError(\"Not an array\"));\n\t\t}\n\t\tif (arr.length === 0) {\n\t\t\treturn Constructor.resolve([]);\n\t\t}\n\n\t\treturn new Constructor(function executor(resolve,reject){\n\t\t\tif (typeof resolve != \"function\" || typeof reject != \"function\") {\n\t\t\t\tthrow TypeError(\"Not a function\");\n\t\t\t}\n\n\t\t\tvar len = arr.length, msgs = Array(len), count = 0;\n\n\t\t\titeratePromises(Constructor,arr,function resolver(idx,msg) {\n\t\t\t\tmsgs[idx] = msg;\n\t\t\t\tif (++count === len) {\n\t\t\t\t\tresolve(msgs);\n\t\t\t\t}\n\t\t\t},reject);\n\t\t});\n\t});\n\n\tbuiltInProp(Promise,\"race\",function Promise$race(arr) {\n\t\tvar Constructor = this;\n\n\t\t// spec mandated checks\n\t\tif (ToString.call(arr) != \"[object Array]\") {\n\t\t\treturn Constructor.reject(TypeError(\"Not an array\"));\n\t\t}\n\n\t\treturn new Constructor(function executor(resolve,reject){\n\t\t\tif (typeof resolve != \"function\" || typeof reject != \"function\") {\n\t\t\t\tthrow TypeError(\"Not a function\");\n\t\t\t}\n\n\t\t\titeratePromises(Constructor,arr,function resolver(idx,msg){\n\t\t\t\tresolve(msg);\n\t\t\t},reject);\n\t\t});\n\t});\n\n\treturn Promise;\n});\n","import { Session } from \"./session\";\n\nexport enum CheckoutEvents {\n SessionNotFound = \"SessionNotFound\",\n SessionLoaded = \"SessionLoaded\",\n SessionUpdated = \"SessionUpdated\",\n SessionCancel = \"SessionCancel\",\n SessionPaymentOnHold = \"SessionPaymentOnHold\",\n SessionPaymentAuthorized = \"SessionPaymentAuthorized\",\n SessionPaymentError = \"SessionPaymentError\",\n SessionLocked = \"SessionLocked\",\n SessionLockFailed = \"SessionLockFailed\",\n ActivePaymentProductType = \"ActivePaymentProductType\",\n ValidateSession = \"ValidateSession\",\n}\nexport enum InternalCheckoutEvents {\n HeightChanged = \"HeightChanged\",\n LanguageChanged = \"LanguageChanged\",\n}\n\nexport type SessionNotFound = {\n type: CheckoutEvents.SessionNotFound;\n};\n\nexport type SessionLoaded = {\n type: CheckoutEvents.SessionLoaded;\n session: Session;\n};\n\nexport type SessionUpdated = {\n type: CheckoutEvents.SessionUpdated;\n session: Session;\n};\n\nexport type SessionCancel = {\n type: CheckoutEvents.SessionCancel;\n href: string;\n};\n\nexport type SessionPaymentOnHold = {\n type: CheckoutEvents.SessionPaymentOnHold;\n transaction_id: string;\n merchant_reference: string;\n href: string;\n};\n\nexport type SessionPaymentAuthorized = {\n type: CheckoutEvents.SessionPaymentAuthorized;\n transaction_id: string;\n merchant_reference: string;\n href: string;\n};\n\nexport type SessionLocked = {\n type: CheckoutEvents.SessionLocked;\n pay_lock_id: string;\n};\n\nexport type SessionLockFailed = {\n type: CheckoutEvents.SessionLockFailed;\n};\nexport type ActivePaymentProductType = {\n type: CheckoutEvents.ActivePaymentProductType;\n payment_product_type: string | undefined;\n};\n\nexport type ValidateSession = {\n type: CheckoutEvents.ValidateSession;\n session: Session;\n callback: (result: SessionValidationCallback) => void;\n};\n\nexport interface SessionValidationCallback {\n success: boolean;\n clientValidationError?: string;\n}\n\nexport type WrappedValidateSession = Pick<ValidateSession, \"type\" | \"session\">;\n\nexport type SessionPayment = SessionPaymentAuthorized | SessionPaymentOnHold;\n\nexport type SessionPaymentError = {\n type: CheckoutEvents.SessionPaymentError;\n error: string;\n href: string;\n};\n\nexport type SessionEvent =\n | SessionNotFound\n | SessionLoaded\n | SessionUpdated\n | SessionCancel\n | SessionPaymentOnHold\n | SessionPaymentAuthorized\n | SessionPaymentError\n | SessionLocked\n | SessionLockFailed\n | ActivePaymentProductType\n | WrappedValidateSession;\n","import pkg from \"../package.json\";\n\n/**\n * Wraps window.location.assign()\n */\nexport const windowLocationAssign = (url: string) => {\n window.location.assign(url);\n};\n\n/**\n * Get the url for the session./yarn-error.log\n.DS_Store\n */\nexport interface SessionUrlOptions {\n sid: string;\n endpoint: string;\n language: string | undefined;\n ui?: \"fullscreen\" | \"inline\";\n shouldCallValidateSession: boolean;\n}\n\nexport const getSessionUrl = (options: SessionUrlOptions): string => {\n const { sid, endpoint, language, ui, shouldCallValidateSession } = options;\n if (!endpoint) {\n throw new Error(\"Invalid endpoint\");\n }\n\n // Compose url for view session endpoint with optional language parameter.\n let languageParam = language ? `language=${language}` : \"\";\n let uiParam = ui ? `ui=${ui}` : \"\";\n let sdk = `sdk=${pkg.version}`;\n let validate = shouldCallValidateSession ? `client_side_validation=true` : undefined;\n const params = [languageParam, uiParam, sdk, validate].filter(x => x).join(\"&\");\n return `${endpoint}/v1/view/${sid}${params ? \"?\" + params : \"\"}`;\n};\n","import \"native-promise-only\";\n\nimport pkg from \"../package.json\";\nimport {\n CheckoutEvents,\n InternalCheckoutEvents,\n SessionNotFound,\n SessionLoaded,\n SessionUpdated,\n SessionCancel,\n SessionPaymentOnHold,\n SessionPaymentAuthorized,\n SessionPaymentError,\n SessionLocked,\n SessionLockFailed,\n ActivePaymentProductType,\n ValidateSession,\n SessionValidationCallback,\n} from \"./checkout\";\nimport { getSessionUrl, windowLocationAssign } from \"./url\";\nimport { createIframeAsync } from \"./createIframeAsync\";\nimport {\n subscribe,\n SubscriptionHandler,\n Subscription,\n postSessionLock,\n postSessionRefresh,\n postActivePaymentProductType,\n postValidationResult,\n} from \"./subscribe\";\n\nexport interface DinteroCheckoutInstance {\n /**\n * Remove iframe and all event listeners.\n */\n destroy: () => void;\n iframe: HTMLIFrameElement;\n language: string;\n lockSession: () => void;\n refreshSession: () => void;\n setActivePaymentProductType: (paymentProductType: string) => void;\n submitValidationResult: (result: SessionValidationCallback) => void;\n}\n\nexport interface DinteroCheckoutOptions {\n sid: string;\n endpoint?: string;\n language?: string;\n}\n\nexport interface DinteroEmbedCheckoutOptions extends DinteroCheckoutOptions {\n container: HTMLDivElement;\n onPayment?: (\n event: SessionPaymentAuthorized | SessionPaymentOnHold,\n checkout: DinteroCheckoutInstance\n ) => void;\n /**\n * @deprecated Since version 0.0.1. Will be deleted in version 1.0.0. Use onPayment instead.\n */\n onPaymentAuthorized?: (\n event: SessionPaymentAuthorized,\n checkout: DinteroCheckoutInstance\n ) => void;\n onSession?: (\n event: SessionLoaded | SessionUpdated,\n checkout: DinteroCheckoutInstance\n ) => void;\n onPaymentError?: (\n event: SessionPaymentError,\n checkout: DinteroCheckoutInstance\n ) => void;\n onSessionCancel?: (\n event: SessionCancel,\n checkout: DinteroCheckoutInstance\n ) => void;\n onSessionNotFound?: (\n event: SessionNotFound,\n checkout: DinteroCheckoutInstance\n ) => void;\n onSessionLocked?: (\n event: SessionLocked,\n checkout: DinteroCheckoutInstance\n ) => void;\n onSessionLockFailed?: (\n event: SessionLockFailed,\n checkout: DinteroCheckoutInstance\n ) => void;\n onActivePaymentType?: (\n event: ActivePaymentProductType,\n checkout: DinteroCheckoutInstance\n ) => void;\n onValidateSession?: (\n event: ValidateSession,\n checkout: DinteroCheckoutInstance,\n callback: (result: SessionValidationCallback) => void,\n ) => void;\n}\n\n/**\n * An event handler that navigates to the href in the event.\n */\nconst followHref: SubscriptionHandler = (event: any): void => {\n if (event.href) {\n windowLocationAssign(event.href);\n }\n};\n\n/**\n * An event handler that sets height of the iframe.\n */\nconst setIframeHeight: SubscriptionHandler = (event: any, checkout): void => {\n if (event.height || event.height === 0) {\n checkout.iframe.setAttribute(\n \"style\",\n `width:100%; height:${event.height}px;`\n );\n }\n};\nconst setLanguage: SubscriptionHandler = (event: any, checkout): void => {\n if (event.language) {\n checkout.language = event.language;\n }\n};\n\nconst handleWithResult = (\n sid: string,\n endpoint: string,\n handler: SubscriptionHandler\n): SubscriptionHandler => {\n return (event: any, checkout: DinteroCheckoutInstance) => {\n const eventKeys = [\n \"sid\",\n \"merchant_reference\",\n \"transaction_id\",\n \"error\",\n ];\n const pairs = eventKeys.map((key) => [key, event[key]]);\n if (event.type === CheckoutEvents.SessionCancel && !event.error) {\n pairs.push([\"error\", \"cancelled\"]);\n }\n pairs.push([\"language\", checkout.language]);\n pairs.push([\"sdk\", pkg.version]);\n const urlQuery = pairs\n .filter(([key, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"&\");\n checkout.iframe.setAttribute(\n \"src\",\n `${endpoint}/embedResult/?${urlQuery}`\n );\n handler(event, checkout);\n };\n};\n\n/**\n * Show a dintero payment session in an embedded iframe.\n */\nexport const embed = async (\n options: DinteroEmbedCheckoutOptions\n): Promise<DinteroCheckoutInstance> => {\n const {\n container,\n sid,\n language,\n endpoint = \"https://checkout.dintero.com\",\n onSession,\n onSessionCancel,\n onPayment,\n onPaymentAuthorized,\n onPaymentError,\n onSessionNotFound,\n onSessionLocked,\n onSessionLockFailed,\n onActivePaymentType,\n onValidateSession,\n } = options;\n const subscriptions: Subscription[] = [];\n\n // Create iframe\n const { iframe, initiate } = createIframeAsync(\n container,\n endpoint,\n getSessionUrl({\n sid,\n endpoint,\n language,\n ui: \"inline\",\n shouldCallValidateSession: onValidateSession !== undefined\n }),\n );\n\n /**\n * Function that removes the iframe and all event listeners.\n */\n const destroy = () => {\n if (iframe) {\n subscriptions.forEach((sub) => sub.unsubscribe());\n if (iframe.parentElement) {\n container.removeChild(iframe);\n }\n }\n };\n\n const lockSession = () => {\n postSessionLock(iframe, sid);\n };\n\n const refreshSession = () => {\n postSessionRefresh(iframe, sid);\n };\n\n const setActivePaymentProductType = (paymentProductType?:string) => {\n postActivePaymentProductType(iframe, sid, paymentProductType);\n };\n\n const submitValidationResult = (result: SessionValidationCallback) => {\n postValidationResult(iframe, sid, result);\n }\n\n const wrappedOnValidateSession = (\n event: ValidateSession,\n checkout: DinteroCheckoutInstance,\n ) => {\n if (onValidateSession) {\n onValidateSession(event, checkout, submitValidationResult);\n }\n }\n\n // Create checkout object that wraps the destroy function.\n const checkout: DinteroCheckoutInstance = {\n destroy,\n iframe,\n language,\n lockSession,\n refreshSession,\n setActivePaymentProductType,\n submitValidationResult,\n };\n\n // Add event handlers (or in some cases add a fallback href handler).\n [\n {\n handler: setLanguage,\n eventTypes: [InternalCheckoutEvents.LanguageChanged],\n },\n {\n handler: setIframeHeight,\n eventTypes: [InternalCheckoutEvents.HeightChanged],\n },\n {\n handler: onSession as SubscriptionHandler | undefined,\n eventTypes: [\n CheckoutEvents.SessionLoaded,\n CheckoutEvents.SessionUpdated,\n ],\n },\n {\n eventTypes: [CheckoutEvents.SessionPaymentOnHold],\n handler: onPayment\n ? handleWithResult(sid, endpoint, onPayment)\n : followHref,\n },\n {\n eventTypes: [CheckoutEvents.SessionPaymentAuthorized],\n handler:\n onPaymentAuthorized || onPayment\n ? handleWithResult(\n sid,\n endpoint,\n onPaymentAuthorized || onPayment\n )\n : followHref,\n },\n {\n handler: onSessionCancel\n ? handleWithResult(sid, endpoint, onSessionCancel)\n : followHref,\n eventTypes: [CheckoutEvents.SessionCancel],\n },\n {\n handler: onPaymentError\n ? handleWithResult(sid, endpoint, onPaymentError)\n : followHref,\n eventTypes: [CheckoutEvents.SessionPaymentError],\n },\n {\n handler: onSessionNotFound as SubscriptionHandler | undefined,\n eventTypes: [CheckoutEvents.SessionNotFound],\n },\n {\n handler: onSessionLocked as SubscriptionHandler | undefined,\n eventTypes: [CheckoutEvents.SessionLocked],\n },\n {\n handler: onSessionLockFailed as SubscriptionHandler | undefined,\n eventTypes: [CheckoutEvents.SessionLockFailed],\n },\n {\n handler: onActivePaymentType as SubscriptionHandler | undefined,\n eventTypes: [CheckoutEvents.ActivePaymentProductType],\n },\n {\n handler: onActivePaymentType as SubscriptionHandler | undefined,\n eventTypes: [CheckoutEvents.ActivePaymentProductType],\n },\n {\n handler: wrappedOnValidateSession as SubscriptionHandler | undefined,\n eventTypes: [CheckoutEvents.ValidateSession],\n },\n ].forEach(({ handler, eventTypes }) => {\n if (handler) {\n subscriptions.push(\n subscribe({\n sid,\n endpoint,\n handler,\n eventTypes,\n checkout,\n })\n );\n }\n });\n\n // Add iframe to DOM\n await initiate();\n // Return object with function to destroy the checkout.\n return checkout;\n};\n\n/**\n * Redirect the customer to a payment session in the Dintero Checkout.\n */\nexport const redirect = (options: DinteroCheckoutOptions) => {\n const {\n sid,\n language,\n endpoint = \"https://checkout.dintero.com\",\n } = options;\n // Redirect the current browser window to the checkout session url.\n windowLocationAssign(getSessionUrl({ sid, endpoint, language, shouldCallValidateSession: false }));\n};\n","/**\n * Creates an iframe and adds it to the container.\n *\n * Returns a promise that resolves to the iframe when the iframe has loaded.\n * Rejects the promise if there is a problem loading the iframe.\n */\nexport const createIframeAsync = (\n container: HTMLDivElement,\n endpoint: string,\n url: string\n): { iframe: HTMLIFrameElement; initiate: () => void } => {\n if (!container || !container.appendChild) {\n throw new Error(\"Invalid container\");\n }\n const iframe = document.createElement(\"iframe\");\n\n // No border, transparent and stretch to 100% of the container width.\n iframe.setAttribute(\"frameborder\", \"0\");\n iframe.setAttribute(\"allowTransparency\", \"true\");\n iframe.setAttribute(\"style\", \"width:100%; height:0;\");\n\n // TODO: Get this to work as expected, might be tricky with current\n // tests since they will require the csp to be \"unsafe-inline\".\n // The server needs to add the same property in the Content Security\n // Policy headers in the response for this to work. A CSP header set by\n // a meta tag in the iframe target will not be detected as a valid\n // CSP from the iframe host.\n // Content Security Policy, should be limited to \"endpoint\".\n // iframe.setAttribute(\"csp\", `default-src ${endpoint}`);\n\n // Apply extra restrictions to the content in the iframe.\n // allow popups is needed to open terms in new window\n iframe.setAttribute(\n \"sandbox\",\n \"allow-scripts allow-forms allow-same-origin allow-popups\"\n );\n\n // The download priority of the resource in the <iframe>'s src attribute.\n iframe.setAttribute(\"importance\", \"high\");\n\n // Set the iframe source to the url.\n iframe.setAttribute(\"src\", url);\n\n // Resolve or reject promise when iframe loads.\n\n // // Add iframe to the container.\n // container.appendChild(iframe);\n return {\n iframe,\n initiate: async () => {\n return new Promise<void>((resolve, reject) => {\n iframe.onload = () => resolve();\n iframe.onerror = () => reject();\n container.appendChild(iframe);\n });\n },\n };\n};\n","import {\n CheckoutEvents,\n InternalCheckoutEvents,\n SessionEvent,\n SessionValidationCallback,\n} from \"./checkout\";\nimport { DinteroCheckoutInstance } from \".\";\n\n/**\n * Unsubscribe handler from event(s).\n */\nexport type SubscriptionHandler = (\n sessionEvent: SessionEvent,\n checkout: DinteroCheckoutInstance\n) => void;\n\ninterface SubscriptionOptions {\n sid: string;\n endpoint: string;\n handler: SubscriptionHandler;\n eventTypes: (CheckoutEvents | InternalCheckoutEvents)[];\n checkout: DinteroCheckoutInstance;\n}\n\nexport type Subscription = {\n /**\n * Unsubscribe handler from event(s).\n */\n unsubscribe: () => void;\n};\n\n/**\n * Post a message acknowledgement to the checkout iframe.\n */\nconst postAck = (iframe: HTMLIFrameElement, event: MessageEvent) => {\n if (event.data.mid && iframe.contentWindow) {\n iframe.contentWindow.postMessage(\n { ack: event.data.mid },\n event.origin || \"*\"\n );\n }\n};\n\n/**\n * Post a SessionLock-event to the checkout iframe.\n */\nexport const postSessionLock = (iframe: HTMLIFrameElement, sid: string) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type: \"LockSession\", sid }, \"*\");\n }\n};\n\n/**\n * Post the validation result to the checkout iframe\n */\nexport const postValidationResult = (iframe: HTMLIFrameElement, sid: string, result: SessionValidationCallback) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type: \"ValidationResult\", sid, ...result }, \"*\");\n }\n};\n\n/**\n * Post RefreshSession-event to the checkout iframe.\n */\nexport const postSessionRefresh = (iframe: HTMLIFrameElement, sid: string) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type: \"RefreshSession\", sid }, \"*\");\n }\n};\n\n/**\n * Post setActivePaymentProductType-event to the checkout iframe.\n */\nexport const postActivePaymentProductType = (iframe: HTMLIFrameElement, sid: string, paymentProductType?: string) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage(\n { type: \"SetActivePaymentProductType\", sid, payment_product_type:paymentProductType },\n \"*\"\n );\n }\n};\n\n/**\n * Subscribe to events from an iframe given a handler and a set\n * of event types.\n */\nexport const subscribe = (options: SubscriptionOptions): Subscription => {\n const { sid, endpoint, handler, eventTypes, checkout } = options;\n\n // Wrap event handler in a function that checks for correct origin and\n // filters on event type(s) in the event data.\n const wrappedHandler = (event: MessageEvent) => {\n const correctOrigin = event.origin === endpoint;\n const correctWindow = event.source === checkout.iframe.contentWindow;\n const correctSid = event.data && event.data.sid === sid;\n const correctMessageType =\n eventTypes.indexOf(event.data && event.data.type) !== -1;\n if (\n correctOrigin &&\n correctWindow &&\n correctSid &&\n correctMessageType\n ) {\n postAck(checkout.iframe, event);\n handler(event.data, checkout);\n }\n };\n\n // Add event listener to the iframe.\n window.addEventListener(\"message\", wrappedHandler as any, false);\n\n // Function to remove the event listener from the iframe.\n const unsubscribe = () => {\n window.removeEventListener(\"message\", wrappedHandler as any, false);\n };\n\n // Return object with unsubscribe function.\n return {\n unsubscribe,\n };\n};\n"],"names":["name","context","definition","builtInProp","cycle","scheduling_queue","ToString","Object","prototype","toString","timer","setImmediate","fn","setTimeout","defineProperty","obj","val","config","value","writable","configurable","err","schedule","self","add","drain","isThenable","o","_then","o_type","then","notify","i","this","chain","length","notifyIsolated","state","success","failure","cb","ret","reject","msg","call","promise","TypeError","resolve","triggered","def","def_wrapper","MakeDefWrapper","apply","arguments","iteratePromises","Constructor","arr","resolver","rejecter","idx","MakeDef","Promise","executor","__NPO__","constructor","push","first","last","item","Item","next","f","PromisePrototype","len","msgs","Array","count","global","module","exports","CheckoutEvents","InternalCheckoutEvents","windowLocationAssign","url","window","location","assign","getSessionUrl","options","sid","endpoint","language","ui","shouldCallValidateSession","Error","params","pkg","undefined","filter","x","join","followHref","event","href","setIframeHeight","checkout","height","iframe","setAttribute","setLanguage","handleWithResult","handler","pairs","map","key","type","SessionCancel","error","urlQuery","async","container","onSession","onSessionCancel","onPayment","onPaymentAuthorized","onPaymentError","onSessionNotFound","onSessionLocked","onSessionLockFailed","onActivePaymentType","onValidateSession","subscriptions","initiate","appendChild","document","createElement","onload","onerror","createIframeAsync","submitValidationResult","result","contentWindow","postMessage","postValidationResult","destroy","forEach","sub","unsubscribe","parentElement","removeChild","lockSession","postSessionLock","refreshSession","postSessionRefresh","setActivePaymentProductType","paymentProductType","payment_product_type","postActivePaymentProductType","eventTypes","LanguageChanged","HeightChanged","SessionLoaded","SessionUpdated","SessionPaymentOnHold","SessionPaymentAuthorized","SessionPaymentError","SessionNotFound","SessionLocked","SessionLockFailed","ActivePaymentProductType","ValidateSession","wrappedHandler","correctOrigin","origin","correctWindow","source","correctSid","data","correctMessageType","indexOf","mid","ack","postAck","addEventListener","removeEventListener","subscribe"],"mappings":"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"}
package/karma.conf.js ADDED
@@ -0,0 +1,33 @@
1
+ const puppeteer = require("puppeteer");
2
+
3
+ process.env.CHROME_BIN = puppeteer.executablePath();
4
+
5
+ module.exports = function(config) {
6
+ config.set({
7
+ frameworks: ["mocha", "chai", "karma-typescript"],
8
+ browsers: ["ChromeHeadless"],
9
+ preprocessors: {
10
+ "**/*.ts": "karma-typescript",
11
+ },
12
+ reporters: ["progress", "karma-typescript"],
13
+ basePath: process.cwd(),
14
+ colors: true,
15
+ files: ["test/**/*.ts", "src/**/*.ts"],
16
+ port: 9999,
17
+ singleRun: true,
18
+ concurrency: Infinity,
19
+ // logLevel: config.LOG_DEBUG,
20
+ karmaTypescriptConfig: {
21
+ tsconfig: "./tsconfig.json",
22
+ compilerOptions: {
23
+ emitDecoratorMetadata: true,
24
+ experimentalDecorators: true,
25
+ jsx: "react",
26
+ module: "commonjs",
27
+ sourceMap: true,
28
+ target: "ES5",
29
+ },
30
+ exclude: ["node_modules"],
31
+ },
32
+ });
33
+ };