@fat-zebra/sdk 1.0.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 (89) hide show
  1. package/.jest/setup-env-vars.js +2 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/react/VerifyCard.d.ts +10 -0
  6. package/dist/react/VerifyCard.js +22 -0
  7. package/dist/react/VerifyCard.js.map +1 -0
  8. package/dist/react/index.d.ts +2 -0
  9. package/dist/react/index.js +9 -0
  10. package/dist/react/index.js.map +1 -0
  11. package/dist/react/url.d.ts +26 -0
  12. package/dist/react/url.js +63 -0
  13. package/dist/react/url.js.map +1 -0
  14. package/dist/react/useFatZebra.d.ts +12 -0
  15. package/dist/react/useFatZebra.js +148 -0
  16. package/dist/react/useFatZebra.js.map +1 -0
  17. package/dist/sca/cardinal.d.ts +28 -0
  18. package/dist/sca/cardinal.js +110 -0
  19. package/dist/sca/cardinal.js.map +1 -0
  20. package/dist/sca/eci-mappings.d.ts +6 -0
  21. package/dist/sca/eci-mappings.js +63 -0
  22. package/dist/sca/eci-mappings.js.map +1 -0
  23. package/dist/sca/index.d.ts +38 -0
  24. package/dist/sca/index.js +395 -0
  25. package/dist/sca/index.js.map +1 -0
  26. package/dist/sca/scenarios/enrollment.d.ts +15 -0
  27. package/dist/sca/scenarios/enrollment.js +150 -0
  28. package/dist/sca/scenarios/enrollment.js.map +1 -0
  29. package/dist/sca/scenarios/index.d.ts +2 -0
  30. package/dist/sca/scenarios/index.js +8 -0
  31. package/dist/sca/scenarios/index.js.map +1 -0
  32. package/dist/sca/scenarios/validation.d.ts +15 -0
  33. package/dist/sca/scenarios/validation.js +128 -0
  34. package/dist/sca/scenarios/validation.js.map +1 -0
  35. package/dist/sca/types.d.ts +158 -0
  36. package/dist/sca/types.js +57 -0
  37. package/dist/sca/types.js.map +1 -0
  38. package/dist/shared/api-gateway-client.d.ts +17 -0
  39. package/dist/shared/api-gateway-client.js +106 -0
  40. package/dist/shared/api-gateway-client.js.map +1 -0
  41. package/dist/shared/bridge-client.d.ts +2 -0
  42. package/dist/shared/bridge-client.js +24 -0
  43. package/dist/shared/bridge-client.js.map +1 -0
  44. package/dist/shared/constants.d.ts +6 -0
  45. package/dist/shared/constants.js +19 -0
  46. package/dist/shared/constants.js.map +1 -0
  47. package/dist/shared/event-manager.d.ts +28 -0
  48. package/dist/shared/event-manager.js +15 -0
  49. package/dist/shared/event-manager.js.map +1 -0
  50. package/dist/shared/post-message-client.d.ts +47 -0
  51. package/dist/shared/post-message-client.js +107 -0
  52. package/dist/shared/post-message-client.js.map +1 -0
  53. package/dist/shared/types.d.ts +142 -0
  54. package/dist/shared/types.js +41 -0
  55. package/dist/shared/types.js.map +1 -0
  56. package/dist/shared/util.d.ts +6 -0
  57. package/dist/shared/util.js +96 -0
  58. package/dist/shared/util.js.map +1 -0
  59. package/fatzebra-sdk-1.0.0.tgz +0 -0
  60. package/index.js +0 -0
  61. package/jest.config.js +16 -0
  62. package/package.json +33 -0
  63. package/src/index.ts +9 -0
  64. package/src/react/VerifyCard.tsx +36 -0
  65. package/src/react/index.ts +3 -0
  66. package/src/react/url.ts +97 -0
  67. package/src/react/useFatZebra.ts +154 -0
  68. package/src/sca/__tests__/eci-mappings.test.ts +35 -0
  69. package/src/sca/__tests__/index.test.ts +514 -0
  70. package/src/sca/cardinal.ts +136 -0
  71. package/src/sca/eci-mappings.ts +63 -0
  72. package/src/sca/index.ts +329 -0
  73. package/src/sca/scenarios/enrollment.ts +164 -0
  74. package/src/sca/scenarios/index.ts +2 -0
  75. package/src/sca/scenarios/validation.ts +142 -0
  76. package/src/sca/types.ts +206 -0
  77. package/src/shared/api-gateway-client.ts +71 -0
  78. package/src/shared/bridge-client.ts +26 -0
  79. package/src/shared/constants.ts +19 -0
  80. package/src/shared/event-manager.ts +44 -0
  81. package/src/shared/post-message-client.test.ts +73 -0
  82. package/src/shared/post-message-client.ts +125 -0
  83. package/src/shared/types.test.ts +65 -0
  84. package/src/shared/types.ts +182 -0
  85. package/src/shared/util.test.ts +164 -0
  86. package/src/shared/util.ts +98 -0
  87. package/tests/helpers/api-gateway-mock.ts +46 -0
  88. package/tsconfig.json +22 -0
  89. package/yarn-error.log +2374 -0
@@ -0,0 +1,107 @@
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;
13
+ return g = { next: verb(0), "throw": verb(1), "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.PostMessageClient = void 0;
40
+ var types_1 = require("../shared/types");
41
+ var domain = process.env.PAYNOW_BASE_URL;
42
+ // NODE_ENV is introduced to PostMessageClient purely for the purpose of bypassing security
43
+ // check on the postMessage event between parent and child frames. Unforunately there is
44
+ // no workaround to override event origin due to lack of support in existing test framework.
45
+ var PostMessageClient = /** @class */ (function () {
46
+ function PostMessageClient(config) {
47
+ this.channel = config.channel;
48
+ this.fzEnv = process.env.NODE_ENV;
49
+ this.target = config.target;
50
+ }
51
+ // Handle event messages that conform to PostMessage format.
52
+ PostMessageClient.prototype.setEventListeners = function (handlers) {
53
+ var _this = this;
54
+ window.addEventListener("message", function (event) { return __awaiter(_this, void 0, void 0, function () {
55
+ var validationEnabled, isChannelValid, isOriginValid, message, subject, handler;
56
+ return __generator(this, function (_a) {
57
+ validationEnabled = ![types_1.NODE_ENV.TEST, types_1.NODE_ENV.LOCALDEV].includes(this.fzEnv);
58
+ isChannelValid = event.data.channel === this.channel;
59
+ isOriginValid = event.origin === domain;
60
+ if (validationEnabled && (!isOriginValid || !isChannelValid)) {
61
+ console.log('[WARNING] unmatched event origin or incorrect message channel');
62
+ return [2 /*return*/];
63
+ }
64
+ message = event.data;
65
+ subject = message.subject;
66
+ handler = handlers[subject];
67
+ if (handler) {
68
+ handler(message.data);
69
+ }
70
+ else {
71
+ // Do not throw error here as it is possible that the parent frame chooses
72
+ // not to handle certain messages posted from child frame.
73
+ console.log("[WARNING] No handler registered for subject ".concat(subject, ", message ").concat(JSON.stringify(message)));
74
+ }
75
+ return [2 /*return*/];
76
+ });
77
+ }); });
78
+ };
79
+ // Handle event messages that do not conform to PostMessage format.
80
+ PostMessageClient.prototype.setEventListenersLegacy = function (handlers) {
81
+ var _this = this;
82
+ window.addEventListener("message", function (event) {
83
+ var validationEnabled = ![types_1.NODE_ENV.TEST, types_1.NODE_ENV.LOCALDEV].includes(_this.fzEnv);
84
+ var isOriginValid = event.origin === domain;
85
+ if (validationEnabled && !isOriginValid) {
86
+ console.log('[WARNING] unmatched event origin or incorrect message channel');
87
+ return;
88
+ }
89
+ var message = event.data;
90
+ var handler = handlers[message.message];
91
+ if (handler) {
92
+ handler(message.data);
93
+ }
94
+ else {
95
+ // Do not throw error here as it is possible that the parent frame chooses
96
+ // not to handle certain messages posted from child frame.
97
+ console.log("[WARNING] no handler registered for message ".concat(message.message));
98
+ }
99
+ });
100
+ };
101
+ PostMessageClient.prototype.send = function (message) {
102
+ this.target.contentWindow.postMessage(message, domain);
103
+ };
104
+ return PostMessageClient;
105
+ }());
106
+ exports.PostMessageClient = PostMessageClient;
107
+ //# sourceMappingURL=post-message-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-message-client.js","sourceRoot":"","sources":["../../src/shared/post-message-client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA0C;AA2C1C,IAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;AAE1C,2FAA2F;AAC3F,wFAAwF;AACxF,4FAA4F;AAE5F;IAKE,2BAAY,MAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;QAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAoB,CAAA;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC7B,CAAC;IAED,4DAA4D;IAC5D,6CAAiB,GAAjB,UAAkB,QAAuB;QAAzC,iBAwBC;QAvBC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAM,KAAK;;;gBAEtC,iBAAiB,GAAG,CAAC,CAAC,gBAAQ,CAAC,IAAI,EAAE,gBAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5E,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAA;gBACpD,aAAa,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAA;gBAE7C,IAAI,iBAAiB,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,cAAc,CAAC,EAAE;oBAC5D,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAA;oBAC5E,sBAAM;iBACP;gBAEK,OAAO,GAAG,KAAK,CAAC,IAAmB,CAAA;gBACnC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;gBACzB,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;gBAEjC,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;iBACtB;qBAAM;oBACL,0EAA0E;oBAC1E,0DAA0D;oBAC1D,OAAO,CAAC,GAAG,CAAC,sDAA+C,OAAO,uBAAa,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAE,CAAC,CAAA;iBAC1G;;;aACF,CAAC,CAAA;IACJ,CAAC;IAED,mEAAmE;IACnE,mDAAuB,GAAvB,UAAwB,QAAuB;QAA/C,iBAsBC;QArBC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAC,KAAK;YAEvC,IAAM,iBAAiB,GAAG,CAAC,CAAC,gBAAQ,CAAC,IAAI,EAAE,gBAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAI,CAAC,KAAK,CAAC,CAAA;YAClF,IAAM,aAAa,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAA;YAE7C,IAAI,iBAAiB,IAAI,CAAC,aAAa,EAAE;gBACvC,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAA;gBAC5E,OAAM;aACP;YAED,IAAM,OAAO,GAAG,KAAK,CAAC,IAAyB,CAAA;YAC/C,IAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAEzC,IAAI,OAAO,EAAE;gBACX,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;aACtB;iBAAM;gBACL,0EAA0E;gBAC1E,0DAA0D;gBAC1D,OAAO,CAAC,GAAG,CAAC,sDAA+C,OAAO,CAAC,OAAO,CAAE,CAAC,CAAA;aAC9E;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,gCAAI,GAAJ,UAAK,OAAwC;QAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACxD,CAAC;IACH,wBAAC;AAAD,CAAC,AAlED,IAkEC;AAOC,8CAAiB"}
@@ -0,0 +1,142 @@
1
+ declare enum NODE_ENV {
2
+ LOCALDEV = "localdev",
3
+ PRODUCTION = "production",
4
+ SANDBOX = "sandbox",
5
+ STAGING = "staging",
6
+ TEST = "test"
7
+ }
8
+ declare enum PublicEvent {
9
+ FORM_VALIDATION_ERROR = "fz.form_validation.error",
10
+ FORM_VALIDATION_SUCCESS = "fz.form_validation.success",
11
+ VALIDATION_ERROR = "fz.validation.error",
12
+ SCA_SUCCESS = "fz.sca.success",
13
+ SCA_ERROR = "fz.sca.error",
14
+ TOKENIZATION_SUCCESS = "fz.tokenization.success",
15
+ TOKENIZATION_ERROR = "fz.tokenization.error",
16
+ PAYMENT_SUCCESS = "fz.payment.success",
17
+ PAYMENT_ERROR = "fz.payment.error",
18
+ BIN_LOOKUP = "fz.bin.lookup"
19
+ }
20
+ declare enum BridgeEvent {
21
+ TOKENIZE_CARD_REQUEST = "fzi.tc_req",
22
+ TOKENIZE_CARD_RESPONSE = "fzi.tc_res",
23
+ CREATE_PAYMENT_REQUEST = "fzi.cp_req",
24
+ CREATE_PAYMENT_RESPONSE = "fzi.cp_res",
25
+ TRIGGER_PAYNOW_BUTTON = "fzi.pn_btn",
26
+ FORM_VALIDATION_ERROR = "fzi.form_validation_error",
27
+ FORM_VALIDATION_SUCCESS = "fzi.form_validation_success",
28
+ BIN_LOOKUP = "fzi.bin_lookup"
29
+ }
30
+ declare enum PaymentMethodType {
31
+ CARD = "card",
32
+ CARD_ON_FILE = "card_on_file"
33
+ }
34
+ interface Card {
35
+ number: string;
36
+ holder: string;
37
+ expiryMonth: string;
38
+ expiryYear: string;
39
+ cvv: string;
40
+ }
41
+ interface CardOnFile {
42
+ token: string;
43
+ }
44
+ interface Customer {
45
+ firstName?: string;
46
+ lastName?: string;
47
+ email?: string;
48
+ address?: string;
49
+ city?: string;
50
+ postcode?: string;
51
+ state?: string;
52
+ country?: string;
53
+ }
54
+ interface CustomerSnakeCase {
55
+ first_name?: string;
56
+ last_name?: string;
57
+ email?: string;
58
+ address?: string;
59
+ city?: string;
60
+ state?: string;
61
+ postcode?: string;
62
+ country?: string;
63
+ }
64
+ interface Payment {
65
+ amount: number;
66
+ currency: string;
67
+ reference: string;
68
+ hide_card_holder?: boolean;
69
+ }
70
+ interface PaymentIntent {
71
+ payment: Payment;
72
+ verification: string;
73
+ }
74
+ interface PaymentMethod {
75
+ type?: PaymentMethodType;
76
+ data: Card | CardOnFile;
77
+ }
78
+ interface ValidationResult {
79
+ valid: boolean;
80
+ errors: string[];
81
+ }
82
+ type TokenizeCardResponse = {
83
+ bin: string;
84
+ token: string;
85
+ errors?: Array<string>;
86
+ };
87
+ type Callback = (event: any) => void;
88
+ type Handlers = Partial<Record<PublicEvent, Callback>>;
89
+ export type VerificationConfig = {
90
+ accessToken: string;
91
+ paymentIntent: PaymentIntent;
92
+ verification: string;
93
+ options?: Options;
94
+ };
95
+ export type PaymentConfig = {
96
+ accessToken: string;
97
+ payment: PaymentIntent;
98
+ options: Options;
99
+ };
100
+ type Options = Partial<{
101
+ css: string;
102
+ cssSignature: string;
103
+ enableSca: boolean;
104
+ tokenizeOnly: boolean;
105
+ }>;
106
+ export type TransactionPayload = {
107
+ transactionId: string;
108
+ responseCode: string;
109
+ message: string;
110
+ amount: number;
111
+ currency: string;
112
+ reference: string;
113
+ cardNumber: string;
114
+ cardHolder: string;
115
+ cardExpiry: string;
116
+ cardType: string;
117
+ verification: string;
118
+ };
119
+ export type CreatePaymentResponse = {
120
+ transaction_id: TransactionPayload["transactionId"];
121
+ response_code: TransactionPayload["responseCode"];
122
+ message: TransactionPayload["message"];
123
+ amount: TransactionPayload["amount"];
124
+ currency: TransactionPayload["currency"];
125
+ reference: TransactionPayload["reference"];
126
+ card_number: TransactionPayload["cardNumber"];
127
+ card_holder: TransactionPayload["cardHolder"];
128
+ card_expiry: TransactionPayload["cardExpiry"];
129
+ card_type: TransactionPayload["cardType"];
130
+ v: TransactionPayload["verification"];
131
+ errors?: Array<string>;
132
+ };
133
+ declare global {
134
+ interface Window {
135
+ ApplePaySession: any;
136
+ Cardinal: any;
137
+ FatZebra: any;
138
+ HPP: any;
139
+ MerchantUsername: string;
140
+ }
141
+ }
142
+ export { BridgeEvent, PublicEvent, NODE_ENV, Card, CardOnFile, Customer, CustomerSnakeCase, Handlers, Payment, PaymentIntent, PaymentMethod, PaymentMethodType, TokenizeCardResponse, ValidationResult };
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PaymentMethodType = exports.NODE_ENV = exports.PublicEvent = exports.BridgeEvent = void 0;
4
+ var NODE_ENV;
5
+ (function (NODE_ENV) {
6
+ NODE_ENV["LOCALDEV"] = "localdev";
7
+ NODE_ENV["PRODUCTION"] = "production";
8
+ NODE_ENV["SANDBOX"] = "sandbox";
9
+ NODE_ENV["STAGING"] = "staging";
10
+ NODE_ENV["TEST"] = "test";
11
+ })(NODE_ENV || (exports.NODE_ENV = NODE_ENV = {}));
12
+ var PublicEvent;
13
+ (function (PublicEvent) {
14
+ PublicEvent["FORM_VALIDATION_ERROR"] = "fz.form_validation.error";
15
+ PublicEvent["FORM_VALIDATION_SUCCESS"] = "fz.form_validation.success";
16
+ PublicEvent["VALIDATION_ERROR"] = "fz.validation.error";
17
+ PublicEvent["SCA_SUCCESS"] = "fz.sca.success";
18
+ PublicEvent["SCA_ERROR"] = "fz.sca.error";
19
+ PublicEvent["TOKENIZATION_SUCCESS"] = "fz.tokenization.success";
20
+ PublicEvent["TOKENIZATION_ERROR"] = "fz.tokenization.error";
21
+ PublicEvent["PAYMENT_SUCCESS"] = "fz.payment.success";
22
+ PublicEvent["PAYMENT_ERROR"] = "fz.payment.error";
23
+ PublicEvent["BIN_LOOKUP"] = "fz.bin.lookup";
24
+ })(PublicEvent || (exports.PublicEvent = PublicEvent = {}));
25
+ var BridgeEvent;
26
+ (function (BridgeEvent) {
27
+ BridgeEvent["TOKENIZE_CARD_REQUEST"] = "fzi.tc_req";
28
+ BridgeEvent["TOKENIZE_CARD_RESPONSE"] = "fzi.tc_res";
29
+ BridgeEvent["CREATE_PAYMENT_REQUEST"] = "fzi.cp_req";
30
+ BridgeEvent["CREATE_PAYMENT_RESPONSE"] = "fzi.cp_res";
31
+ BridgeEvent["TRIGGER_PAYNOW_BUTTON"] = "fzi.pn_btn";
32
+ BridgeEvent["FORM_VALIDATION_ERROR"] = "fzi.form_validation_error";
33
+ BridgeEvent["FORM_VALIDATION_SUCCESS"] = "fzi.form_validation_success";
34
+ BridgeEvent["BIN_LOOKUP"] = "fzi.bin_lookup";
35
+ })(BridgeEvent || (exports.BridgeEvent = BridgeEvent = {}));
36
+ var PaymentMethodType;
37
+ (function (PaymentMethodType) {
38
+ PaymentMethodType["CARD"] = "card";
39
+ PaymentMethodType["CARD_ON_FILE"] = "card_on_file";
40
+ })(PaymentMethodType || (exports.PaymentMethodType = PaymentMethodType = {}));
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":";;;AACA,IAAK,QAMJ;AAND,WAAK,QAAQ;IACX,iCAAqB,CAAA;IACrB,qCAAyB,CAAA;IACzB,+BAAmB,CAAA;IACnB,+BAAmB,CAAA;IACnB,yBAAa,CAAA;AACf,CAAC,EANI,QAAQ,wBAAR,QAAQ,QAMZ;AAED,IAAK,WAWJ;AAXD,WAAK,WAAW;IACd,iEAAkD,CAAA;IAClD,qEAAsD,CAAA;IACtD,uDAAwC,CAAA;IACxC,6CAA8B,CAAA;IAC9B,yCAA0B,CAAA;IAC1B,+DAAgD,CAAA;IAChD,2DAA4C,CAAA;IAC5C,qDAAsC,CAAA;IACtC,iDAAkC,CAAA;IAClC,2CAA4B,CAAA;AAC9B,CAAC,EAXI,WAAW,2BAAX,WAAW,QAWf;AAED,IAAK,WASJ;AATD,WAAK,WAAW;IACd,mDAAoC,CAAA;IACpC,oDAAqC,CAAA;IACrC,oDAAqC,CAAA;IACrC,qDAAsC,CAAA;IACtC,mDAAoC,CAAA;IACpC,kEAAmD,CAAA;IACnD,sEAAuD,CAAA;IACvD,4CAA6B,CAAA;AAC/B,CAAC,EATI,WAAW,2BAAX,WAAW,QASf;AAED,IAAK,iBAGJ;AAHD,WAAK,iBAAiB;IACpB,kCAAa,CAAA;IACb,kDAA6B,CAAA;AAC/B,CAAC,EAHI,iBAAiB,iCAAjB,iBAAiB,QAGrB"}
@@ -0,0 +1,6 @@
1
+ declare const toCamelCase: (s: string) => string;
2
+ declare const toSnakeCase: (s: string) => string;
3
+ declare const toObjectWithSnakeCaseKeys: (o: any) => any;
4
+ declare const toObjectWithCamelCaseKeys: (o: any) => any;
5
+ declare const getSdkVersionNumber: () => any;
6
+ export { toCamelCase, toSnakeCase, toObjectWithCamelCaseKeys, toObjectWithSnakeCaseKeys, getSdkVersionNumber, };
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSdkVersionNumber = exports.toObjectWithSnakeCaseKeys = exports.toObjectWithCamelCaseKeys = exports.toSnakeCase = exports.toCamelCase = void 0;
4
+ var _package = require('../../package.json');
5
+ var toCamelCase = function (s) {
6
+ return s.replace(/_([a-z])/g, function (g) { return g[1].toUpperCase(); });
7
+ };
8
+ exports.toCamelCase = toCamelCase;
9
+ var toSnakeCase = function (s) {
10
+ return s.replace(/[A-Z]/g, function (char) { return "_".concat(char.toLowerCase()); });
11
+ };
12
+ exports.toSnakeCase = toSnakeCase;
13
+ var primitiveTypes = ['string', 'number', 'boolean', 'undefined', 'symbol', 'bigint'];
14
+ var toObjectWithSnakeCaseKeys = function (o) {
15
+ var objectType = typeof o;
16
+ if (primitiveTypes.includes(objectType) || o == null) {
17
+ return o;
18
+ }
19
+ var converted = {};
20
+ var _loop_1 = function (key) {
21
+ switch (typeof o[key]) {
22
+ case 'object':
23
+ if (Array.isArray(o[key])) {
24
+ converted[toSnakeCase(key)] = [];
25
+ Object.keys(o[key]).forEach(function (k) {
26
+ var c = toObjectWithSnakeCaseKeys(o[key][k]);
27
+ converted[toSnakeCase(key)].push(c);
28
+ });
29
+ }
30
+ else {
31
+ if (o[key] == null) {
32
+ converted[toSnakeCase(key)] = o[key];
33
+ }
34
+ else {
35
+ converted[toSnakeCase(key)] = toObjectWithSnakeCaseKeys(o[key]);
36
+ }
37
+ }
38
+ break;
39
+ case 'string':
40
+ case 'number':
41
+ case 'boolean':
42
+ case 'undefined':
43
+ converted[toSnakeCase(key)] = o[key];
44
+ break;
45
+ }
46
+ };
47
+ for (var key in o) {
48
+ _loop_1(key);
49
+ }
50
+ return converted;
51
+ };
52
+ exports.toObjectWithSnakeCaseKeys = toObjectWithSnakeCaseKeys;
53
+ var toObjectWithCamelCaseKeys = function (o) {
54
+ var objectType = typeof o;
55
+ if (primitiveTypes.includes(objectType) || o == null) {
56
+ return o;
57
+ }
58
+ var converted = {};
59
+ var _loop_2 = function (key) {
60
+ switch (typeof o[key]) {
61
+ case 'object':
62
+ if (Array.isArray(o[key])) {
63
+ converted[toCamelCase(key)] = [];
64
+ Object.keys(o[key]).forEach(function (k) {
65
+ var c = toObjectWithCamelCaseKeys(o[key][k]);
66
+ converted[toCamelCase(key)].push(c);
67
+ });
68
+ }
69
+ else {
70
+ if (o[key] == null) {
71
+ converted[toCamelCase(key)] = o[key];
72
+ }
73
+ else {
74
+ converted[toCamelCase(key)] = toObjectWithCamelCaseKeys(o[key]);
75
+ }
76
+ }
77
+ break;
78
+ case 'string':
79
+ case 'number':
80
+ case 'boolean':
81
+ case 'undefined':
82
+ converted[toCamelCase(key)] = o[key];
83
+ break;
84
+ }
85
+ };
86
+ for (var key in o) {
87
+ _loop_2(key);
88
+ }
89
+ return converted;
90
+ };
91
+ exports.toObjectWithCamelCaseKeys = toObjectWithCamelCaseKeys;
92
+ var getSdkVersionNumber = function () {
93
+ return _package.version;
94
+ };
95
+ exports.getSdkVersionNumber = getSdkVersionNumber;
96
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/shared/util.ts"],"names":[],"mappings":"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"}
Binary file
package/index.js ADDED
File without changes
package/jest.config.js ADDED
@@ -0,0 +1,16 @@
1
+ module.exports = {
2
+ roots: [
3
+ "<rootDir>/src",
4
+ ],
5
+ setupFiles: [
6
+ "<rootDir>/.jest/setup-env-vars.js",
7
+ "jest-localstorage-mock"
8
+ ],
9
+ testMatch: [
10
+ "**/__tests__/**/*.+(ts|tsx|js)",
11
+ "**/?(*.)+(spec|test).+(ts|tsx|js)"
12
+ ],
13
+ transform: {
14
+ "^.+\\.(ts|tsx)$": "ts-jest"
15
+ }
16
+ }
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@fat-zebra/sdk",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "private": false,
8
+
9
+ "scripts": {
10
+ "test": "jest --clearCache && jest --passWithNoTests --verbose"
11
+ },
12
+ "author": "",
13
+ "license": "ISC",
14
+ "devDependencies": {
15
+ "@types/jest": "^29.5.3",
16
+ "@types/react": "^18.2.15",
17
+ "@types/react-dom": "^18.2.7",
18
+ "jest": "^29.6.1",
19
+ "jest-environment-jsdom": "^29.6.1",
20
+ "jest-localstorage-mock": "^2.4.26",
21
+ "nock": "^13.3.2",
22
+ "ts-jest": "^29.1.1",
23
+ "typescript": "^5.1.6"
24
+ },
25
+ "dependencies": {
26
+ "axios": "^1.4.0",
27
+ "url-template": "^3.1.0"
28
+ },
29
+ "optionalDependencies": {
30
+ "react": "^18.2.0",
31
+ "react-dom": "^18.2.0"
32
+ }
33
+ }
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { Payment, PaymentIntent, VerificationConfig, Handlers, PublicEvent } from "../src/shared/types"
2
+
3
+ export {
4
+ Payment,
5
+ PaymentIntent,
6
+ VerificationConfig,
7
+ Handlers,
8
+ PublicEvent,
9
+ }
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import useFatZebra from "./useFatZebra";
3
+ import * as FatZebra from "../shared/types";
4
+
5
+ type FrameProps = {
6
+ handlers: FatZebra.Handlers;
7
+ username: string;
8
+ accessToken: string;
9
+ config: FatZebra.VerificationConfig;
10
+ };
11
+
12
+ const Frame = ({ username, handlers, config }: FrameProps) => {
13
+ const bridgeRef = React.useRef<HTMLIFrameElement>(null);
14
+
15
+ const { url } = useFatZebra({
16
+ username: username,
17
+ config,
18
+ handlers: handlers,
19
+ bridge: bridgeRef,
20
+ });
21
+
22
+ return (
23
+ <div>
24
+ <iframe src={url} width="100%" height="700px" title="verification-form" />
25
+ <iframe
26
+ title="bridge-form"
27
+ src="http://paynow.test:3004/sdk/bridge"
28
+ width="100%"
29
+ height="700px"
30
+ ref={bridgeRef}
31
+ />
32
+ </div>
33
+ );
34
+ };
35
+
36
+ export default Frame;
@@ -0,0 +1,3 @@
1
+ import VerifyCard from "./VerifyCard";
2
+
3
+ export { VerifyCard }
@@ -0,0 +1,97 @@
1
+ import { parseTemplate } from 'url-template';
2
+ type RequiredURLValues = {
3
+ merchant: string;
4
+ hash: string;
5
+ reference: string;
6
+ amount: number;
7
+ currency: string;
8
+ }
9
+
10
+ type VerificationURLValues = OptionalURLValues & {
11
+ merchant: string;
12
+ timestamp: string;
13
+ verification: string;
14
+ };
15
+
16
+ type OptionalURLValues = Partial<{
17
+ hide_card_holder: string;
18
+ return_path: string
19
+ card_types: Array<string>;
20
+ surcharge_enabled: string;
21
+ sca_enabled: boolean;
22
+ css: string;
23
+ css_signature: string;
24
+ tokenize_only: boolean;
25
+ }>
26
+
27
+ type UrlValues = RequiredURLValues & OptionalURLValues
28
+
29
+ const generatePaymentURL = (values: UrlValues) => {
30
+ const queryParts = [
31
+ "tokenize_only",
32
+ "css",
33
+ "css_signature",
34
+ "iframe",
35
+ "postmessage",
36
+ "hide_card_holder",
37
+ "return_path",
38
+ "card_types",
39
+ "surcharge_enabled",
40
+ "sca_enabled",
41
+ ]
42
+
43
+ const urlTemplate = parseTemplate(
44
+ `http://paynow.test:3004/sdk/v3/{merchant}/{reference}/{currency}/{amount}/{verification}{?${queryParts.join(",")}}`
45
+ );
46
+
47
+ const url = urlTemplate.expand({
48
+ merchant: values.merchant,
49
+ reference: values.reference,
50
+ currency: values.currency,
51
+ amount: values.amount,
52
+ verification: values.hash,
53
+ sca_enabled: values.sca_enabled,
54
+ css: values.css,
55
+ css_signature: values.css_signature,
56
+ iframe: true,
57
+ postmessage: true,
58
+ tokenize_only: values.tokenize_only,
59
+ });
60
+
61
+ return url;
62
+ };
63
+
64
+ const generateVerificationURL = (values: VerificationURLValues) => {
65
+ const queryParts = [
66
+ "tokenize_only",
67
+ "css",
68
+ "css_signature",
69
+ "iframe",
70
+ "postmessage",
71
+ "hide_card_holder",
72
+ "return_path",
73
+ "card_types",
74
+ "surcharge_enabled",
75
+ "sca_enabled",
76
+ ]
77
+
78
+ const urlTemplate = parseTemplate(
79
+ `http://paynow.test:3004/sdk/v3/{merchant}/verification/{timestamp}/{verification}{?${queryParts.join(",")}}`
80
+ );
81
+
82
+ const url = urlTemplate.expand({
83
+ merchant: values.merchant,
84
+ timestamp: values.timestamp,
85
+ verification: values.verification,
86
+ sca_enabled: values.sca_enabled,
87
+ css: values.css,
88
+ css_signature: values.css_signature,
89
+ iframe: true,
90
+ postmessage: true,
91
+ tokenize_only: values.tokenize_only,
92
+ });
93
+
94
+ return url;
95
+ };
96
+
97
+ export { generatePaymentURL, generateVerificationURL };