tonder-web-sdk 1.15.2 → 1.16.3

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/.husky/pre-commit +4 -0
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +10 -0
  4. package/README.md +189 -35
  5. package/eslint.config.mjs +15 -0
  6. package/package.json +21 -4
  7. package/src/classes/3dsHandler.js +58 -62
  8. package/src/classes/BaseInlineCheckout.js +21 -36
  9. package/src/classes/LiteInlineCheckout.js +8 -8
  10. package/src/classes/checkout.js +75 -71
  11. package/src/classes/globalLoader.js +9 -7
  12. package/src/classes/inlineCheckout.js +528 -250
  13. package/src/data/apmApi.js +8 -14
  14. package/src/data/businessApi.js +5 -8
  15. package/src/data/cardApi.js +5 -14
  16. package/src/data/checkoutApi.js +54 -54
  17. package/src/data/customerApi.js +1 -6
  18. package/src/data/index.js +15 -15
  19. package/src/data/openPayApi.js +7 -7
  20. package/src/data/skyflowApi.js +14 -16
  21. package/src/helpers/skyflow.js +210 -119
  22. package/src/helpers/styles.js +56 -27
  23. package/src/helpers/template-skeleton.js +1 -1
  24. package/src/helpers/template.js +984 -541
  25. package/src/helpers/utils.js +152 -58
  26. package/src/helpers/validations.js +34 -35
  27. package/src/index-dev.js +38 -11
  28. package/src/index.html +20 -12
  29. package/src/index.js +19 -13
  30. package/src/shared/catalog/commonLogosCatalog.js +7 -0
  31. package/src/shared/catalog/paymentMethodsCatalog.js +242 -243
  32. package/src/shared/constants/colors.js +15 -0
  33. package/src/shared/constants/displayMode.js +4 -0
  34. package/src/shared/constants/fieldPathNames.js +4 -0
  35. package/src/shared/constants/htmlTonderIds.js +18 -0
  36. package/src/shared/constants/messages.js +10 -9
  37. package/types/card.d.ts +17 -17
  38. package/types/checkout.d.ts +85 -87
  39. package/types/common.d.ts +4 -1
  40. package/types/customer.d.ts +10 -10
  41. package/types/index.d.ts +9 -11
  42. package/types/inlineCheckout.d.ts +81 -61
  43. package/types/liteInlineCheckout.d.ts +78 -83
  44. package/types/paymentMethod.d.ts +17 -17
  45. package/types/transaction.d.ts +94 -94
  46. package/v1/bundle.min.js +3 -3
@@ -1,3 +1,7 @@
1
+ import { defaultStyles } from "./styles";
2
+ import get from "lodash.get";
3
+ import { HTML_IDS } from "../shared/constants/htmlTonderIds";
4
+
1
5
  export async function addScripts() {
2
6
  try {
3
7
  const skyflowScript = document.createElement("script");
@@ -23,7 +27,6 @@ export async function addScripts() {
23
27
  openPay2Script.onerror = reject;
24
28
  document.head.appendChild(openPay2Script);
25
29
  });
26
-
27
30
  } catch (error) {
28
31
  console.error("Error loading scripts", error);
29
32
  }
@@ -36,88 +39,121 @@ export function toCurrency(value) {
36
39
  var formatter = new Intl.NumberFormat("es-MX", {
37
40
  style: "currency",
38
41
  currency: "MXN",
39
- minimumFractionDigits: 2
42
+ minimumFractionDigits: 2,
40
43
  });
41
44
  return formatter.format(value);
42
45
  }
43
46
 
44
- export function showError(message) {
45
- var msgErrorDiv = document.getElementById("msgError");
46
- msgErrorDiv.classList.add("error-container");
47
- msgErrorDiv.innerHTML = message;
48
- setTimeout(function () {
49
- try {
50
- document.querySelector("#tonderPayButton").disabled = false;
51
- } catch (error) {}
52
- msgErrorDiv.classList.remove("error-container");
53
- msgErrorDiv.innerHTML = "";
54
- }, 3000);
55
- }
47
+ export function showError(
48
+ message,
49
+ selectedId = null,
50
+ containerId = HTML_IDS.msgError,
51
+ containerTextId = HTML_IDS.msgErrorText,
52
+ ) {
53
+ try {
54
+ const existSelectedId = selectedId && selectedId !== "new";
55
+ let msgErrorDiv = document.getElementById(`${containerId}${existSelectedId ? selectedId : ""}`);
56
+ let msgErrorText = document.getElementById(
57
+ `${containerTextId}${existSelectedId ? selectedId : ""}`,
58
+ );
59
+ msgErrorText.innerHTML = "";
60
+ msgErrorText.innerHTML = message;
61
+ msgErrorDiv.style.display = "flex";
56
62
 
57
- export function showMessage(message, containerId) {
58
- const msgDiv = document.getElementById(`${containerId}`);
59
- if(msgDiv) {
60
- msgDiv.classList.add("message-container");
61
- msgDiv.innerHTML = message;
62
63
  setTimeout(function () {
63
- msgDiv.classList.remove("message-container");
64
- msgDiv.innerHTML = "";
64
+ msgErrorDiv.style.display = "none";
65
+ msgErrorText.innerHTML = "";
65
66
  }, 3000);
67
+ } catch (error) {
68
+ console.warn("Error showing message error", error);
69
+ }
70
+ }
71
+
72
+ export function showMessage(
73
+ message,
74
+ selectedId = null,
75
+ containerId = HTML_IDS.msgNotification,
76
+ containerTextId = HTML_IDS.msgNotificationText,
77
+ ) {
78
+ try {
79
+ const existSelectedId = selectedId && selectedId !== "new";
80
+ const msgDiv = document.getElementById(`${containerId}${existSelectedId ? selectedId : ""}`);
81
+ if (msgDiv) {
82
+ let msgText = document.getElementById(
83
+ `${containerTextId}${existSelectedId ? selectedId : ""}`,
84
+ );
85
+ msgDiv.style.display = "flex";
86
+ msgText.innerHTML = "";
87
+ msgText.innerHTML = message;
88
+ setTimeout(function () {
89
+ msgDiv.style.display = "none";
90
+ msgText.innerHTML = "";
91
+ }, 3000);
92
+ }
93
+ } catch (error) {
94
+ console.error("Error showing message", error);
66
95
  }
67
96
  }
68
97
  export function getBrowserInfo() {
69
98
  const browserInfo = {
70
- javascript_enabled: true, // Assumed since JavaScript is running
99
+ javascript_enabled: true, // Assumed since JavaScript is running
71
100
  time_zone: new Date().getTimezoneOffset(),
72
- language: navigator.language || 'en-US', // Fallback to 'en-US'
101
+ language: navigator.language || "en-US", // Fallback to 'en-US'
73
102
  color_depth: window.screen ? window.screen.colorDepth : null,
74
- screen_width: window.screen ? window.screen.width * window.devicePixelRatio || window.screen.width : null,
75
- screen_height: window.screen ? window.screen.height * window.devicePixelRatio || window.screen.height : null,
103
+ screen_width: window.screen
104
+ ? window.screen.width * window.devicePixelRatio || window.screen.width
105
+ : null,
106
+ screen_height: window.screen
107
+ ? window.screen.height * window.devicePixelRatio || window.screen.height
108
+ : null,
76
109
  user_agent: navigator.userAgent,
77
110
  };
78
111
  return browserInfo;
79
112
  }
80
113
 
81
- export const mapCards = (card) => {
114
+ export const mapCards = card => {
82
115
  const newCard = { ...card.fields };
83
116
  const carArr = newCard.card_number.split("-");
84
117
  const last = carArr[carArr.length - 1];
85
118
  newCard.card_number = `••••${last}`;
86
119
  return newCard;
87
- }
120
+ };
88
121
 
89
- export const getCardType = (scheme) => {
90
- if(scheme === "Visa") { // Check if visa
91
- return "https://d35a75syrgujp0.cloudfront.net/cards/visa.png"
92
- } else if(scheme === "Mastercard") { // Check if master
93
- return "https://d35a75syrgujp0.cloudfront.net/cards/mastercard.png"
94
- } else if (scheme === "American Express") { // Check if amex
95
- return "https://d35a75syrgujp0.cloudfront.net/cards/american_express.png"
122
+ export const getCardType = (scheme, isDark = false) => {
123
+ if (scheme === "Visa") {
124
+ // Check if visa
125
+ return "https://d35a75syrgujp0.cloudfront.net/cards/visa.png";
126
+ } else if (scheme === "Mastercard") {
127
+ // Check if master
128
+ return "https://d35a75syrgujp0.cloudfront.net/cards/mastercard.png";
129
+ } else if (scheme === "American Express") {
130
+ // Check if amex
131
+ return "https://d35a75syrgujp0.cloudfront.net/cards/american_express.png";
96
132
  } else {
97
- return "https://d35a75syrgujp0.cloudfront.net/cards/default_card.png"
133
+ return `https://d35a75syrgujp0.cloudfront.net/cards/default_card_tonder${isDark ? "_purple" : ""}.png`;
98
134
  }
99
- }
100
- export const clearSpace = (text) => {
101
- return text.trim().replace(/\s+/g, '');
102
- }
103
-
135
+ };
136
+ export const clearSpace = text => {
137
+ return text.trim().replace(/\s+/g, "");
138
+ };
104
139
 
105
140
  export function formatPublicErrorResponse(data, error) {
106
- let code = 200
141
+ let code = 200;
107
142
  try {
108
- code = Number(error?.code || 200)
109
- }catch{}
143
+ code = Number(error?.code || 200);
144
+ } catch {}
110
145
 
111
146
  const default_res = {
112
147
  status: "error",
113
148
  code,
114
149
  message: "",
115
- detail: error?.body?.detail || error?.body?.error || error.body || "Ocurrio un error inesperado."
116
- }
150
+ detail:
151
+ error?.body?.detail || error?.body?.error || error.body || "Ocurrio un error inesperado.",
152
+ };
117
153
 
118
154
  return {
119
155
  ...default_res,
120
- ...data
156
+ ...data,
121
157
  };
122
158
  }
123
159
 
@@ -138,7 +174,7 @@ export function buildErrorResponseFromCatch(e) {
138
174
  return {
139
175
  code: e?.status ? e.status : e.code,
140
176
  body: e?.body,
141
- name: e ? typeof e == "string" ? "catch" : e.name : "Error",
177
+ name: e ? (typeof e == "string" ? "catch" : e.name) : "Error",
142
178
  message: e ? (typeof e == "string" ? e : e.message) : "Error",
143
179
  stack: typeof e == "string" ? undefined : e.stack,
144
180
  };
@@ -146,18 +182,76 @@ export function buildErrorResponseFromCatch(e) {
146
182
 
147
183
  export function injectMercadoPagoSecurity() {
148
184
  try {
149
- const script = document.createElement('script');
150
- script.src = "https://www.mercadopago.com/v2/security.js";
151
- script.setAttribute('view', '');
152
- script.onload = () => {
153
- console.log("Mercado Pago script loaded successfully.");
154
- };
155
- script.onerror = (error) => {
156
- console.error("Error loading Mercado Pago script:", error);
157
- };
158
- document.head.appendChild(script);
185
+ const script = document.createElement("script");
186
+ script.src = "https://www.mercadopago.com/v2/security.js";
187
+ script.setAttribute("view", "");
188
+ script.onload = () => {
189
+ console.log("Mercado Pago script loaded successfully.");
190
+ };
191
+ script.onerror = error => {
192
+ console.error("Error loading Mercado Pago script:", error);
193
+ };
194
+ document.head.appendChild(script);
159
195
  } catch (error) {
160
- console.error("Error attempting to inject Mercado Pago script:", error);
196
+ console.error("Error attempting to inject Mercado Pago script:", error);
161
197
  }
162
198
  }
163
199
 
200
+ export function getCardFormLabels(customStyles) {
201
+ return {
202
+ labels: {
203
+ nameLabel: get(customStyles, "labels.nameLabel", defaultStyles.labels.nameLabel),
204
+ cardLabel: get(customStyles, "labels.cardLabel", defaultStyles.labels.cardLabel),
205
+ cvvLabel: get(customStyles, "labels.cvvLabel", defaultStyles.labels.cvvLabel),
206
+ expiryDateLabel: get(
207
+ customStyles,
208
+ "labels.expiryDateLabel",
209
+ defaultStyles.labels.expiryDateLabel,
210
+ ),
211
+ },
212
+ placeholders: {
213
+ namePlaceholder: get(
214
+ customStyles,
215
+ "placeholders.namePlaceholder",
216
+ defaultStyles.placeholders.namePlaceholder,
217
+ ),
218
+ cardPlaceholder: get(
219
+ customStyles,
220
+ "placeholders.cardPlaceholder",
221
+ defaultStyles.placeholders.cardPlaceholder,
222
+ ),
223
+ cvvPlaceholder: get(
224
+ customStyles,
225
+ "placeholders.cvvPlaceholder",
226
+ defaultStyles.placeholders.cvvPlaceholder,
227
+ ),
228
+ expiryMonthPlaceholder: get(
229
+ customStyles,
230
+ "placeholders.expiryMonthPlaceholder",
231
+ defaultStyles.placeholders.expiryMonthPlaceholder,
232
+ ),
233
+ expiryYearPlaceholder: get(
234
+ customStyles,
235
+ "placeholders.expiryYearPlaceholder",
236
+ defaultStyles.placeholders.expiryYearPlaceholder,
237
+ ),
238
+ },
239
+ };
240
+ }
241
+
242
+ export const executeCallback = async ({ callbacks, callback, data = null, throwError = false }) => {
243
+ try {
244
+ if (callbacks && callback in callbacks) {
245
+ if (data) {
246
+ await callbacks[callback](data);
247
+ } else {
248
+ await callbacks[callback]();
249
+ }
250
+ }
251
+ } catch (e) {
252
+ console.error(e);
253
+ if (throwError) {
254
+ throw e;
255
+ }
256
+ }
257
+ };
@@ -1,54 +1,53 @@
1
1
  export function validateCardNumber(cardNumber) {
2
- const regex = /^\d{12,19}$/;
3
- return regex.test(cardNumber) && luhnCheck(cardNumber);
2
+ const regex = /^\d{12,19}$/;
3
+ return regex.test(cardNumber) && luhnCheck(cardNumber);
4
4
  }
5
5
 
6
6
  export function validateCardholderName(name) {
7
- const regex = /^([a-zA-Z\\ \\,\\.\\-\\']{2,})$/;
8
- return regex.test(name);
7
+ const regex = /^([a-zA-Z\\ \\,\\.\\-\\']{2,})$/;
8
+ return regex.test(name);
9
9
  }
10
10
 
11
11
  export function validateCVV(cvv) {
12
- const regex = /^\d{3,4}$/;
13
- return regex.test(cvv);
12
+ const regex = /^\d{3,4}$/;
13
+ return regex.test(cvv);
14
14
  }
15
15
 
16
16
  export function validateExpirationDate(expirationDate) {
17
- const regex = /^(0[1-9]|1[0-2])\/\d{2}$/;
18
- if (!regex.test(expirationDate)) {
19
- return false;
20
- }
21
- const [month, year] = expirationDate.split('/');
22
- const currentDate = new Date();
23
- const expiration = new Date(`20${year}`, month - 1);
24
- return expiration >= currentDate;
17
+ const regex = /^(0[1-9]|1[0-2])\/\d{2}$/;
18
+ if (!regex.test(expirationDate)) {
19
+ return false;
20
+ }
21
+ const [month, year] = expirationDate.split("/");
22
+ const currentDate = new Date();
23
+ const expiration = new Date(`20${year}`, month - 1);
24
+ return expiration >= currentDate;
25
25
  }
26
26
 
27
27
  export function validateExpirationMonth(month) {
28
- const regex = /^(0[1-9]|1[0-2])$/;
29
- return regex.test(month);
28
+ const regex = /^(0[1-9]|1[0-2])$/;
29
+ return regex.test(month);
30
30
  }
31
31
 
32
32
  export function validateExpirationYear(year) {
33
- const regex = /^\d{2}$/;
34
- if (!regex.test(year)) {
35
- return false;
36
- }
37
- const currentYear = new Date().getFullYear() % 100;
38
- return parseInt(year, 10) >= currentYear;
33
+ const regex = /^\d{2}$/;
34
+ if (!regex.test(year)) {
35
+ return false;
36
+ }
37
+ const currentYear = new Date().getFullYear() % 100;
38
+ return parseInt(year, 10) >= currentYear;
39
39
  }
40
40
 
41
41
  const luhnCheck = num => {
42
- const arr = `${num}`
43
- .split('')
44
- .reverse()
45
- .map(x => Number.parseInt(x));
46
- const lastDigit = arr.shift();
47
- let sum = arr.reduce(
48
- (acc, val, i) =>
49
- i % 2 !== 0 ? acc + val : acc + ((val *= 2) > 9 ? val - 9 : val),
50
- 0
51
- );
52
- sum += lastDigit;
53
- return sum % 10 === 0;
54
- };
42
+ const arr = `${num}`
43
+ .split("")
44
+ .reverse()
45
+ .map(x => Number.parseInt(x));
46
+ const lastDigit = arr.shift();
47
+ let sum = arr.reduce(
48
+ (acc, val, i) => (i % 2 !== 0 ? acc + val : acc + ((val *= 2) > 9 ? val - 9 : val)),
49
+ 0,
50
+ );
51
+ sum += lastDigit;
52
+ return sum % 10 === 0;
53
+ };
package/src/index-dev.js CHANGED
@@ -99,7 +99,7 @@ const checkoutData = {
99
99
  // order_id: 123456
100
100
  // }
101
101
  // Reference from the merchant
102
- order_reference: "ORD-123456"
102
+ order_reference: "ORD-123456",
103
103
  };
104
104
 
105
105
  // localhost
@@ -127,20 +127,42 @@ function setupInlineCheckout() {
127
127
  inlineCheckout = new InlineCheckout({
128
128
  ...commonConfig,
129
129
  customization: {
130
+ displayMode: "light", // usar para cambiar el aspecto ligth/dark
130
131
  saveCards: {
131
132
  showSaveCardOption: true, // Usar para mostrar/ocultar el checkbox de guardar tarjeta para futuros pagos
132
- autoSave: false, // Usar para guardar automáticamente la tarjeta (sin necesidad de mostrar el checkbox)
133
- showSaved: true // Usar para mostrar/ocultar el listado de tarjetas guardadas
133
+ autoSave: false, // Usar para guardar automáticamente la tarjeta (sin necesidad de mostrar el checkbox)
134
+ showSaved: true, // Usar para mostrar/ocultar el listado de tarjetas guardadas
135
+ },
136
+ paymentButton: {
137
+ show: false, // Usar para mostrar/ocultar el boton de pago
138
+ showAmount: true, // Usar para concatener el monto junto al texto del botón de pago
139
+ text: "Pagar", // Usar para cambiar el texto del botón de pago
140
+ },
141
+ cancelButton: {
142
+ show: false, // Usar para mostrar/ocultar el boton de cancelar
143
+ text: "Cancelar", // Usar para concatener el monto junto al texto del botón de cancelar
144
+ },
145
+ paymentMethods: {
146
+ show: true, // Usar para mostrar/ocultar el listado de métodos de pago
147
+ },
148
+ cardForm: {
149
+ show: true, // Usar para mostrar/ocultar el formulario de tarjeta
150
+ },
151
+ },
152
+ callbacks: {
153
+ // Usar para definir la acción a ejecutar cuando el usuario de click en el botón Cancelar
154
+ onCancel: () => {
155
+ console.log("onCancel");
134
156
  },
135
157
  },
136
158
  });
137
159
  inlineCheckout.configureCheckout({
138
- customer: checkoutData.customer,
139
- secureToken: "eyJhbGc..."
160
+ secureToken: "eyJhbGc...",
161
+ ...checkoutData,
140
162
  });
141
163
  inlineCheckout.injectCheckout();
142
164
  // ['Declined', 'Cancelled', 'Failed', 'Success', 'Pending', 'Authorized']
143
- inlineCheckout.verify3dsTransaction().then((response) => {
165
+ inlineCheckout.verify3dsTransaction().then(response => {
144
166
  console.log("Verify 3ds response", response);
145
167
  });
146
168
 
@@ -165,10 +187,15 @@ function setupLiteInlineCheckout() {
165
187
  liteInlineCheckout = new LiteInlineCheckout(commonConfig);
166
188
  liteInlineCheckout.configureCheckout({
167
189
  customer: checkoutData.customer,
168
- secureToken: "eyJhbGc..."
190
+ secureToken: "eyJhbGc...",
169
191
  });
170
- liteInlineCheckout.injectCheckout().then(() => {});
171
- liteInlineCheckout.verify3dsTransaction().then((response) => {
192
+ liteInlineCheckout.injectCheckout().then(() => {
193
+ liteInlineCheckout.getCustomerCards().then(r => {
194
+ console.log("customer cards", r);
195
+ });
196
+ });
197
+
198
+ liteInlineCheckout.verify3dsTransaction().then(response => {
172
199
  console.log("Verify 3ds response", response);
173
200
  });
174
201
 
@@ -205,7 +232,7 @@ function setupLiteInlineCheckout() {
205
232
 
206
233
  function setupCheckout() {
207
234
  const mode = getCheckoutMode();
208
- document.querySelectorAll(".tab-content").forEach((content) => {
235
+ document.querySelectorAll(".tab-content").forEach(content => {
209
236
  content.style.display = "none";
210
237
  });
211
238
 
@@ -284,7 +311,7 @@ function loadMaskitoMask() {
284
311
  }
285
312
  function updateActiveTab() {
286
313
  const mode = getCheckoutMode();
287
- document.querySelectorAll(".tab").forEach((tab) => {
314
+ document.querySelectorAll(".tab").forEach(tab => {
288
315
  tab.classList.remove("active");
289
316
  });
290
317
  document.querySelector(`[data-mode="${mode}"]`).classList.add("active");
package/src/index.html CHANGED
@@ -1,9 +1,9 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
- <meta charset="UTF-8">
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
4
+ <meta charset="UTF-8" />
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
7
7
  <style>
8
8
  #checkout-container {
9
9
  display: flex;
@@ -109,7 +109,7 @@
109
109
  .input-md {
110
110
  max-width: 100%;
111
111
  }
112
- .invalid{
112
+ .invalid {
113
113
  border: 2px solid red !important;
114
114
  }
115
115
  </style>
@@ -118,8 +118,16 @@
118
118
  <body>
119
119
  <div class="checkout-container">
120
120
  <div class="tab-container">
121
- <a href="?mode=inline" class="tab" data-mode="inline" onclick="switchTab('inline'); return false;">Inline Checkout</a>
122
- <a href="?mode=lite" class="tab" data-mode="lite" onclick="switchTab('lite'); return false;">Lite Inline Checkout</a>
121
+ <a
122
+ href="?mode=inline"
123
+ class="tab"
124
+ data-mode="inline"
125
+ onclick="switchTab('inline'); return false;"
126
+ >Inline Checkout</a
127
+ >
128
+ <a href="?mode=lite" class="tab" data-mode="lite" onclick="switchTab('lite'); return false;"
129
+ >Lite Inline Checkout</a
130
+ >
123
131
  </div>
124
132
 
125
133
  <div id="lite-content" class="tab-content">
@@ -130,23 +138,23 @@
130
138
  <form id="lite-payment-form" class="card-form">
131
139
  <div class="form-group">
132
140
  <label for="card-number">Número de Tarjeta</label>
133
- <input type="text" id="card-number" placeholder="1234 5678 9012 3456" required>
141
+ <input type="text" id="card-number" placeholder="1234 5678 9012 3456" required />
134
142
  </div>
135
143
  <div class="form-group">
136
144
  <label for="card-name">Nombre en la Tarjeta</label>
137
- <input type="text" id="card-name" placeholder="John Doe" required>
145
+ <input type="text" id="card-name" placeholder="John Doe" required />
138
146
  </div>
139
147
  <div class="form-row">
140
148
  <div class="form-group">
141
149
  <label for="month">Fecha de Expiración</label>
142
150
  <div class="form-row">
143
- <input class="input-md" type="text" id="month" placeholder="MM" required>
144
- <input class="input-md" type="text" id="year" placeholder="AA" required>
151
+ <input class="input-md" type="text" id="month" placeholder="MM" required />
152
+ <input class="input-md" type="text" id="year" placeholder="AA" required />
145
153
  </div>
146
154
  </div>
147
155
  <div class="form-group">
148
156
  <label for="cvv">CVV</label>
149
- <input class="input-md" type="text" id="cvv" placeholder="123" required>
157
+ <input class="input-md" type="text" id="cvv" placeholder="123" required />
150
158
  </div>
151
159
  </div>
152
160
  <button type="submit" class="btn" id="pay-button-lite">Pagar Ahora</button>
package/src/index.js CHANGED
@@ -1,15 +1,21 @@
1
- import { Checkout } from './classes/checkout'
2
- import { InlineCheckout } from './classes/inlineCheckout'
3
- import { LiteInlineCheckout } from './classes/LiteInlineCheckout'
4
- import { validateCVV, validateCardNumber, validateCardholderName, validateExpirationMonth, validateExpirationYear } from "./helpers/validations";
1
+ import { Checkout } from "./classes/checkout";
2
+ import { InlineCheckout } from "./classes/inlineCheckout";
3
+ import { LiteInlineCheckout } from "./classes/LiteInlineCheckout";
4
+ import {
5
+ validateCVV,
6
+ validateCardNumber,
7
+ validateCardholderName,
8
+ validateExpirationMonth,
9
+ validateExpirationYear,
10
+ } from "./helpers/validations";
5
11
 
6
12
  export {
7
- Checkout,
8
- InlineCheckout,
9
- LiteInlineCheckout,
10
- validateCVV,
11
- validateCardNumber,
12
- validateCardholderName,
13
- validateExpirationMonth,
14
- validateExpirationYear
15
- }
13
+ Checkout,
14
+ InlineCheckout,
15
+ LiteInlineCheckout,
16
+ validateCVV,
17
+ validateCardNumber,
18
+ validateCardholderName,
19
+ validateExpirationMonth,
20
+ validateExpirationYear,
21
+ };
@@ -0,0 +1,7 @@
1
+ const COMMON_LOGOS = Object.freeze({
2
+ pci: "https://d35a75syrgujp0.cloudfront.net/tonder/logo-pci-500.png",
3
+ tonderBlue: "https://d35a75syrgujp0.cloudfront.net/tonder/logo-tonder-blue.png",
4
+ tonderWhite: "https://d35a75syrgujp0.cloudfront.net/tonder/logo-tonder-white.png",
5
+ });
6
+
7
+ export { COMMON_LOGOS };