@evervault/react-native 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +0 -2
  2. package/build/cjs/Card/Cvc.js +29 -0
  3. package/build/cjs/Card/Expiry.js +12 -0
  4. package/build/cjs/Card/Holder.js +15 -0
  5. package/build/cjs/Card/Number.js +27 -0
  6. package/build/cjs/Card/Root.js +70 -0
  7. package/build/cjs/Card/index.js +20 -0
  8. package/build/cjs/Card/schema.js +32 -0
  9. package/build/cjs/Card/types.js +21 -0
  10. package/build/cjs/Card/utils.js +87 -0
  11. package/build/cjs/EvervaultProvider.js +17 -0
  12. package/build/cjs/Input.js +107 -0
  13. package/build/cjs/ThreeDSecure/Frame.js +37 -0
  14. package/build/cjs/ThreeDSecure/Root.js +14 -0
  15. package/build/cjs/ThreeDSecure/config.js +7 -0
  16. package/build/cjs/ThreeDSecure/context.js +7 -0
  17. package/build/cjs/ThreeDSecure/event.js +20 -0
  18. package/build/cjs/ThreeDSecure/index.js +12 -0
  19. package/build/cjs/ThreeDSecure/session.js +141 -0
  20. package/build/cjs/ThreeDSecure/types.js +2 -0
  21. package/build/cjs/ThreeDSecure/useThreeDSecure.js +44 -0
  22. package/build/cjs/__mocks__/NativeEvervault.js +14 -0
  23. package/build/cjs/__mocks__/react-native-webview.js +10 -0
  24. package/build/cjs/context.js +7 -0
  25. package/build/cjs/index.js +25 -0
  26. package/build/cjs/node_modules/@hookform/resolvers/dist/resolvers.js +8 -0
  27. package/build/cjs/node_modules/@hookform/resolvers/zod/dist/zod.js +8 -0
  28. package/build/cjs/node_modules/react-hook-form/dist/index.esm.js +2221 -0
  29. package/build/cjs/node_modules/react-native-mask-input/lib/module/MaskInput.js +60 -0
  30. package/build/cjs/node_modules/react-native-mask-input/lib/module/formatWithMask.js +92 -0
  31. package/build/cjs/node_modules/react-native-mask-input/lib/module/index.js +10 -0
  32. package/build/cjs/node_modules/react-native-mask-input/lib/module/useMaskedInputProps.js +93 -0
  33. package/build/{index.cjs.js → cjs/node_modules/zod/lib/index.js} +193 -3490
  34. package/build/cjs/packages/card-validator/dist/evervault-card-validator.main.js +349 -0
  35. package/build/cjs/sdk.js +53 -0
  36. package/build/cjs/specs/NativeEvervault.js +7 -0
  37. package/build/cjs/useEvervault.js +14 -0
  38. package/build/cjs/utils.js +34 -0
  39. package/build/{Card → esm/Card}/Cvc.d.ts +0 -1
  40. package/build/esm/Card/Cvc.js +27 -0
  41. package/build/{Card → esm/Card}/Expiry.d.ts +0 -1
  42. package/build/esm/Card/Expiry.js +10 -0
  43. package/build/{Card → esm/Card}/Holder.d.ts +0 -1
  44. package/build/esm/Card/Holder.js +13 -0
  45. package/build/{Card → esm/Card}/Number.d.ts +0 -1
  46. package/build/esm/Card/Number.js +25 -0
  47. package/build/{Card → esm/Card}/Root.d.ts +0 -1
  48. package/build/esm/Card/Root.js +68 -0
  49. package/build/{Card → esm/Card}/index.d.ts +0 -1
  50. package/build/esm/Card/index.js +14 -0
  51. package/build/{Card → esm/Card}/schema.d.ts +0 -1
  52. package/build/esm/Card/schema.js +30 -0
  53. package/build/{Card → esm/Card}/types.d.ts +0 -1
  54. package/build/esm/Card/types.js +19 -0
  55. package/build/{Card → esm/Card}/utils.d.ts +0 -1
  56. package/build/esm/Card/utils.js +82 -0
  57. package/build/{EvervaultProvider.d.ts → esm/EvervaultProvider.d.ts} +0 -1
  58. package/build/esm/EvervaultProvider.js +15 -0
  59. package/build/{Input.d.ts → esm/Input.d.ts} +0 -1
  60. package/build/esm/Input.js +103 -0
  61. package/build/{ThreeDSecure → esm/ThreeDSecure}/Frame.d.ts +0 -1
  62. package/build/esm/ThreeDSecure/Frame.js +35 -0
  63. package/build/{ThreeDSecure → esm/ThreeDSecure}/Root.d.ts +0 -1
  64. package/build/esm/ThreeDSecure/Root.js +12 -0
  65. package/build/{ThreeDSecure → esm/ThreeDSecure}/config.d.ts +0 -1
  66. package/build/esm/ThreeDSecure/config.js +4 -0
  67. package/build/{ThreeDSecure → esm/ThreeDSecure}/context.d.ts +0 -1
  68. package/build/esm/ThreeDSecure/context.js +5 -0
  69. package/build/{ThreeDSecure → esm/ThreeDSecure}/event.d.ts +0 -1
  70. package/build/esm/ThreeDSecure/event.js +18 -0
  71. package/build/{ThreeDSecure → esm/ThreeDSecure}/index.d.ts +0 -1
  72. package/build/esm/ThreeDSecure/index.js +9 -0
  73. package/build/{ThreeDSecure → esm/ThreeDSecure}/session.d.ts +0 -1
  74. package/build/esm/ThreeDSecure/session.js +136 -0
  75. package/build/{ThreeDSecure → esm/ThreeDSecure}/types.d.ts +0 -1
  76. package/build/esm/ThreeDSecure/types.js +1 -0
  77. package/build/{ThreeDSecure → esm/ThreeDSecure}/useThreeDSecure.d.ts +0 -1
  78. package/build/esm/ThreeDSecure/useThreeDSecure.js +42 -0
  79. package/build/{__mocks__ → esm/__mocks__}/NativeEvervault.d.ts +0 -1
  80. package/build/esm/__mocks__/NativeEvervault.js +11 -0
  81. package/build/{__mocks__ → esm/__mocks__}/react-native-webview.d.ts +0 -1
  82. package/build/esm/__mocks__/react-native-webview.js +8 -0
  83. package/build/{context.d.ts → esm/context.d.ts} +0 -1
  84. package/build/esm/context.js +5 -0
  85. package/build/{index.d.ts → esm/index.d.ts} +0 -1
  86. package/build/esm/index.js +14 -0
  87. package/build/esm/node_modules/@hookform/resolvers/dist/resolvers.js +5 -0
  88. package/build/esm/node_modules/@hookform/resolvers/zod/dist/zod.js +6 -0
  89. package/build/esm/node_modules/react-hook-form/dist/index.esm.js +2211 -0
  90. package/build/esm/node_modules/react-native-mask-input/lib/module/MaskInput.js +37 -0
  91. package/build/esm/node_modules/react-native-mask-input/lib/module/formatWithMask.js +88 -0
  92. package/build/esm/node_modules/react-native-mask-input/lib/module/index.js +6 -0
  93. package/build/esm/node_modules/react-native-mask-input/lib/module/useMaskedInputProps.js +70 -0
  94. package/build/{index.esm.js → esm/node_modules/zod/lib/index.js} +1 -3377
  95. package/build/esm/packages/card-validator/dist/evervault-card-validator.main.js +345 -0
  96. package/build/{sdk.d.ts → esm/sdk.d.ts} +0 -1
  97. package/build/esm/sdk.js +51 -0
  98. package/build/{specs → esm/specs}/NativeEvervault.d.ts +0 -1
  99. package/build/esm/specs/NativeEvervault.js +5 -0
  100. package/build/{useEvervault.d.ts → esm/useEvervault.d.ts} +0 -1
  101. package/build/esm/useEvervault.js +12 -0
  102. package/build/{utils.d.ts → esm/utils.d.ts} +0 -1
  103. package/build/esm/utils.js +31 -0
  104. package/package.json +9 -21
  105. package/build/Card/Cvc.d.ts.map +0 -1
  106. package/build/Card/Cvc.test.d.ts +0 -2
  107. package/build/Card/Cvc.test.d.ts.map +0 -1
  108. package/build/Card/Expiry.d.ts.map +0 -1
  109. package/build/Card/Holder.d.ts.map +0 -1
  110. package/build/Card/Number.d.ts.map +0 -1
  111. package/build/Card/Number.test.d.ts +0 -2
  112. package/build/Card/Number.test.d.ts.map +0 -1
  113. package/build/Card/Root.d.ts.map +0 -1
  114. package/build/Card/Root.test.d.ts +0 -2
  115. package/build/Card/Root.test.d.ts.map +0 -1
  116. package/build/Card/index.d.ts.map +0 -1
  117. package/build/Card/schema.d.ts.map +0 -1
  118. package/build/Card/types.d.ts.map +0 -1
  119. package/build/Card/utils.d.ts.map +0 -1
  120. package/build/Card/utils.test.d.ts +0 -2
  121. package/build/Card/utils.test.d.ts.map +0 -1
  122. package/build/EvervaultProvider.d.ts.map +0 -1
  123. package/build/EvervaultProvider.test.d.ts +0 -2
  124. package/build/EvervaultProvider.test.d.ts.map +0 -1
  125. package/build/Input.d.ts.map +0 -1
  126. package/build/Input.test.d.ts +0 -2
  127. package/build/Input.test.d.ts.map +0 -1
  128. package/build/ThreeDSecure/Frame.d.ts.map +0 -1
  129. package/build/ThreeDSecure/Frame.test.d.ts +0 -2
  130. package/build/ThreeDSecure/Frame.test.d.ts.map +0 -1
  131. package/build/ThreeDSecure/Root.d.ts.map +0 -1
  132. package/build/ThreeDSecure/Root.test.d.ts +0 -2
  133. package/build/ThreeDSecure/Root.test.d.ts.map +0 -1
  134. package/build/ThreeDSecure/config.d.ts.map +0 -1
  135. package/build/ThreeDSecure/context.d.ts.map +0 -1
  136. package/build/ThreeDSecure/event.d.ts.map +0 -1
  137. package/build/ThreeDSecure/index.d.ts.map +0 -1
  138. package/build/ThreeDSecure/session.d.ts.map +0 -1
  139. package/build/ThreeDSecure/session.test.d.ts +0 -2
  140. package/build/ThreeDSecure/session.test.d.ts.map +0 -1
  141. package/build/ThreeDSecure/types.d.ts.map +0 -1
  142. package/build/ThreeDSecure/useThreeDSecure.d.ts.map +0 -1
  143. package/build/ThreeDSecure/useThreeDSecure.test.d.ts +0 -2
  144. package/build/ThreeDSecure/useThreeDSecure.test.d.ts.map +0 -1
  145. package/build/__mocks__/NativeEvervault.d.ts.map +0 -1
  146. package/build/__mocks__/react-native-webview.d.ts.map +0 -1
  147. package/build/context.d.ts.map +0 -1
  148. package/build/index.cjs.js.map +0 -1
  149. package/build/index.d.ts.map +0 -1
  150. package/build/sdk.d.ts.map +0 -1
  151. package/build/sdk.test.d.ts +0 -2
  152. package/build/sdk.test.d.ts.map +0 -1
  153. package/build/specs/NativeEvervault.d.ts.map +0 -1
  154. package/build/useEvervault.d.ts.map +0 -1
  155. package/build/useEvervault.test.d.ts +0 -2
  156. package/build/useEvervault.test.d.ts.map +0 -1
  157. package/build/utils.d.ts.map +0 -1
  158. package/src/Card/Cvc.test.tsx +0 -41
  159. package/src/Card/Cvc.tsx +0 -58
  160. package/src/Card/Expiry.tsx +0 -26
  161. package/src/Card/Holder.tsx +0 -27
  162. package/src/Card/Number.test.tsx +0 -76
  163. package/src/Card/Number.tsx +0 -54
  164. package/src/Card/Root.test.tsx +0 -341
  165. package/src/Card/Root.tsx +0 -150
  166. package/src/Card/index.ts +0 -28
  167. package/src/Card/schema.ts +0 -41
  168. package/src/Card/types.ts +0 -57
  169. package/src/Card/utils.test.ts +0 -271
  170. package/src/Card/utils.ts +0 -129
  171. package/src/EvervaultProvider.test.tsx +0 -24
  172. package/src/EvervaultProvider.tsx +0 -43
  173. package/src/Input.test.tsx +0 -420
  174. package/src/Input.tsx +0 -182
  175. package/src/ThreeDSecure/Frame.test.tsx +0 -87
  176. package/src/ThreeDSecure/Frame.tsx +0 -50
  177. package/src/ThreeDSecure/Root.test.tsx +0 -67
  178. package/src/ThreeDSecure/Root.tsx +0 -23
  179. package/src/ThreeDSecure/config.ts +0 -3
  180. package/src/ThreeDSecure/context.ts +0 -6
  181. package/src/ThreeDSecure/event.ts +0 -19
  182. package/src/ThreeDSecure/index.ts +0 -17
  183. package/src/ThreeDSecure/session.test.ts +0 -524
  184. package/src/ThreeDSecure/session.ts +0 -184
  185. package/src/ThreeDSecure/types.ts +0 -80
  186. package/src/ThreeDSecure/useThreeDSecure.test.tsx +0 -244
  187. package/src/ThreeDSecure/useThreeDSecure.ts +0 -64
  188. package/src/__mocks__/NativeEvervault.ts +0 -13
  189. package/src/__mocks__/react-native-webview.tsx +0 -6
  190. package/src/context.ts +0 -14
  191. package/src/index.ts +0 -21
  192. package/src/sdk.test.ts +0 -122
  193. package/src/sdk.ts +0 -71
  194. package/src/specs/NativeEvervault.ts +0 -67
  195. package/src/useEvervault.test.tsx +0 -31
  196. package/src/useEvervault.ts +0 -14
  197. package/src/utils.ts +0 -41
@@ -0,0 +1,30 @@
1
+ import z from '../node_modules/zod/lib';
2
+ import { validateCVC as R, validateExpiry as b, validateNumber as C } from '../packages/card-validator/dist/evervault-card-validator.main.js';
3
+ import { isAcceptedBrand } from './utils.js';
4
+
5
+ function getCardFormSchema(acceptedBrands) {
6
+ return z.object({
7
+ name: z.string().min(1, "Missing name"),
8
+ number: z
9
+ .string()
10
+ .min(1, "Required")
11
+ .refine((value) => C(value).isValid, {
12
+ message: "Invalid card number",
13
+ })
14
+ .refine((value) => isAcceptedBrand(acceptedBrands, C(value)), { message: "Brand not accepted" }),
15
+ expiry: z
16
+ .string()
17
+ .min(1, "Required")
18
+ .refine((value) => b(value).isValid, {
19
+ message: "Invalid expiry",
20
+ }),
21
+ cvc: z
22
+ .string()
23
+ .min(1, "Required")
24
+ .refine((value) => R(value).isValid, {
25
+ message: "Invalid CVC",
26
+ }),
27
+ });
28
+ }
29
+
30
+ export { getCardFormSchema };
@@ -34,4 +34,3 @@ export interface CardPayload {
34
34
  cvc?: string;
35
35
  };
36
36
  }
37
- //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,19 @@
1
+ const CARD_BRAND_NAMES = [
2
+ "american-express",
3
+ "visa",
4
+ "mastercard",
5
+ "discover",
6
+ "jcb",
7
+ "diners-club",
8
+ "unionpay",
9
+ "maestro",
10
+ "mir",
11
+ "elo",
12
+ "hipercard",
13
+ "hiper",
14
+ "szep",
15
+ "uatp",
16
+ "rupay",
17
+ ];
18
+
19
+ export { CARD_BRAND_NAMES };
@@ -14,4 +14,3 @@ export declare function formatExpiry(expiry: string): {
14
14
  month: string;
15
15
  year: string;
16
16
  } | null;
17
- //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1,82 @@
1
+ import { validateNumber as C, validateCVC as R, validateExpiry as b } from '../packages/card-validator/dist/evervault-card-validator.main.js';
2
+
3
+ async function formatPayload(values, context) {
4
+ const number = values.number?.replace(/\s/g, "") || "";
5
+ const { brand, localBrands, bin, lastFour, isValid: isNumberValid, } = C(number);
6
+ if (number.length > 0 &&
7
+ brand !== "american-express" &&
8
+ values.cvc?.length === 4) {
9
+ context.form.setValue("cvc", values.cvc?.slice(0, 3));
10
+ }
11
+ const { cvc, isValid: isCvcValid } = R(values.cvc ?? "", number);
12
+ const formErrors = context.form.formState.errors;
13
+ const isValid = !Object.keys(formErrors).length;
14
+ const isComplete = areValuesComplete(values);
15
+ const errors = {};
16
+ if (formErrors.name?.message) {
17
+ errors.name = formErrors.name.message;
18
+ }
19
+ if (formErrors.number?.message) {
20
+ errors.number = formErrors.number.message;
21
+ }
22
+ if (formErrors.expiry?.message) {
23
+ errors.expiry = formErrors.expiry.message;
24
+ }
25
+ if (formErrors.cvc?.message) {
26
+ errors.cvc = formErrors.cvc.message;
27
+ }
28
+ return {
29
+ card: {
30
+ name: values.name ?? null,
31
+ brand,
32
+ localBrands,
33
+ bin,
34
+ lastFour,
35
+ expiry: formatExpiry(values.expiry ?? ""),
36
+ number: isNumberValid ? await context.encrypt(number) : null,
37
+ cvc: isCvcValid ? await context.encrypt(cvc ?? "") : null,
38
+ },
39
+ isComplete,
40
+ isValid: isValid && isComplete,
41
+ errors,
42
+ };
43
+ }
44
+ function areValuesComplete(values) {
45
+ if ("name" in values && !values.name?.length) {
46
+ return false;
47
+ }
48
+ if ("number" in values && !C(values.number ?? "").isValid) {
49
+ return false;
50
+ }
51
+ if ("expiry" in values && !b(values.expiry ?? "").isValid) {
52
+ return false;
53
+ }
54
+ if ("cvc" in values &&
55
+ !R(values.cvc ?? "", values.number).isValid) {
56
+ return false;
57
+ }
58
+ return true;
59
+ }
60
+ function isAcceptedBrand(acceptedBrands, cardNumberValidationResult) {
61
+ if (!acceptedBrands?.length)
62
+ return true;
63
+ if (!cardNumberValidationResult.isValid)
64
+ return false;
65
+ const { brand, localBrands } = cardNumberValidationResult;
66
+ const acceptedBrandsSet = new Set(acceptedBrands);
67
+ const isBrandAccepted = brand !== null && acceptedBrandsSet.has(brand);
68
+ const isLocalBrandAccepted = localBrands.some((localBrand) => acceptedBrandsSet.has(localBrand));
69
+ return isBrandAccepted || isLocalBrandAccepted;
70
+ }
71
+ function formatExpiry(expiry) {
72
+ const parsedExpiry = b(expiry);
73
+ if (!parsedExpiry.isValid) {
74
+ return null;
75
+ }
76
+ return {
77
+ month: parsedExpiry.month,
78
+ year: parsedExpiry.year,
79
+ };
80
+ }
81
+
82
+ export { areValuesComplete, formatExpiry, formatPayload, isAcceptedBrand };
@@ -4,4 +4,3 @@ export interface EvervaultProviderProps extends PropsWithChildren {
4
4
  appId: string;
5
5
  }
6
6
  export declare function EvervaultProvider({ teamId, appId, children, }: EvervaultProviderProps): import("react/jsx-runtime").JSX.Element;
7
- //# sourceMappingURL=EvervaultProvider.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useMemo, useCallback } from 'react';
3
+ import { EvervaultContext } from './context.js';
4
+ import { sdk } from './sdk.js';
5
+
6
+ function EvervaultProvider({ teamId, appId, children, }) {
7
+ const instanceId = useMemo(() => sdk.initialize(teamId, appId), [teamId, appId]);
8
+ const encrypt = useCallback(function (data) {
9
+ return sdk.encrypt(instanceId, data);
10
+ }, [instanceId]);
11
+ const context = useMemo(() => ({ teamId, appId, encrypt }), [teamId, appId, encrypt]);
12
+ return (jsx(EvervaultContext.Provider, { value: context, children: children }));
13
+ }
14
+
15
+ export { EvervaultProvider };
@@ -16,4 +16,3 @@ export interface EvervaultInputProps<Values extends Record<string, unknown>> ext
16
16
  export declare const EvervaultInput: <Values extends Record<string, unknown>>(props: EvervaultInputProps<Values> & {
17
17
  ref?: Ref<EvervaultInput>;
18
18
  }) => ReactNode;
19
- //# sourceMappingURL=Input.d.ts.map
@@ -0,0 +1,103 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, forwardRef, useContext, useMemo, useRef, useImperativeHandle, useCallback } from 'react';
3
+ import { mergeRefs } from './utils.js';
4
+ import { useFormContext, useController } from './node_modules/react-hook-form/dist/index.esm.js';
5
+ import MaskInput from './node_modules/react-native-mask-input/lib/module/MaskInput.js';
6
+
7
+ const EvervaultInputContext = createContext({
8
+ validationMode: "all",
9
+ });
10
+ function useForwardedInputRef(ref) {
11
+ const inputRef = useRef(null);
12
+ useImperativeHandle(ref, useCallback(() => ({
13
+ isFocused() {
14
+ return inputRef.current?.isFocused() ?? false;
15
+ },
16
+ focus() {
17
+ inputRef.current?.focus();
18
+ },
19
+ blur() {
20
+ inputRef.current?.blur();
21
+ },
22
+ clear() {
23
+ inputRef.current?.clear();
24
+ },
25
+ measure(callback) {
26
+ inputRef.current?.measure(callback);
27
+ },
28
+ measureInWindow(callback) {
29
+ inputRef.current?.measureInWindow(callback);
30
+ },
31
+ measureLayout(relativeToNativeComponentRef, onSuccess, onFail) {
32
+ inputRef.current?.measureLayout(relativeToNativeComponentRef, onSuccess, onFail);
33
+ },
34
+ }), [inputRef]));
35
+ return inputRef;
36
+ }
37
+ function mask(format) {
38
+ const maskArray = [];
39
+ let isObfuscated = false;
40
+ format.split("").forEach((char) => {
41
+ if (char === "[") {
42
+ isObfuscated = true;
43
+ return;
44
+ }
45
+ else if (char === "]") {
46
+ isObfuscated = false;
47
+ return;
48
+ }
49
+ let value = char;
50
+ if (char === "9") {
51
+ value = isObfuscated ? [/\d/] : /\d/;
52
+ }
53
+ maskArray.push(value);
54
+ });
55
+ return maskArray;
56
+ }
57
+ const EvervaultInput = forwardRef(function EvervaultInput({ name, mask, obfuscateValue, ...props }, ref) {
58
+ const { validationMode } = useContext(EvervaultInputContext);
59
+ const inputRef = useForwardedInputRef(ref);
60
+ const methods = useFormContext();
61
+ const { field, fieldState } = useController({
62
+ control: methods.control,
63
+ name,
64
+ shouldUnregister: true,
65
+ });
66
+ const obfuscationCharacter = useMemo(() => {
67
+ if (typeof obfuscateValue === "string") {
68
+ return obfuscateValue;
69
+ }
70
+ else {
71
+ return "•";
72
+ }
73
+ }, [obfuscateValue]);
74
+ return (jsx(MaskInput
75
+ // Overridable props
76
+ , {
77
+ // Overridable props
78
+ id: field.name, ...props,
79
+ // Strict props
80
+ ref: mergeRefs(inputRef, field.ref), editable: !field.disabled && (props.editable ?? true), onBlur: (evt) => {
81
+ const shouldValidate = validationMode === "onBlur" ||
82
+ validationMode === "onTouched" ||
83
+ validationMode === "all";
84
+ methods.setValue(field.name, field.value, {
85
+ shouldDirty: true,
86
+ shouldTouch: true,
87
+ shouldValidate,
88
+ });
89
+ props.onBlur?.(evt);
90
+ }, mask: mask, maskAutoComplete: !!mask, obfuscationCharacter: obfuscationCharacter, showObfuscatedValue: !!obfuscateValue, value: field.value, onChangeText: (masked, unmasked) => {
91
+ const shouldValidate = (validationMode === "onTouched" && fieldState.isTouched) ||
92
+ ((validationMode === "onChange" || validationMode === "all") &&
93
+ (!!fieldState.error || fieldState.isTouched));
94
+ methods.setValue(field.name, unmasked, {
95
+ shouldDirty: true,
96
+ shouldValidate,
97
+ });
98
+ },
99
+ // Remove unwanted props
100
+ defaultValue: undefined, onChange: undefined }));
101
+ });
102
+
103
+ export { EvervaultInput, EvervaultInputContext, mask };
@@ -3,4 +3,3 @@ export interface ThreeDSecureFrameProps {
3
3
  style?: StyleProp<ViewStyle>;
4
4
  }
5
5
  export declare function ThreeDSecureFrame({ style }: ThreeDSecureFrameProps): import("react/jsx-runtime").JSX.Element | null;
6
- //# sourceMappingURL=Frame.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useContext, useMemo } from 'react';
3
+ import { StyleSheet } from 'react-native';
4
+ import { useEvervault } from '../useEvervault.js';
5
+ import { WebView } from 'react-native-webview';
6
+ import { CHALLENGE_DOMAIN_3DS } from './config.js';
7
+ import { ThreeDSecureContext } from './context.js';
8
+
9
+ function ThreeDSecureFrame({ style }) {
10
+ const evervault = useEvervault();
11
+ const context = useContext(ThreeDSecureContext);
12
+ if (!context) {
13
+ throw new Error("`ThreeDSecure.Frame` must be used within a `ThreeDSecure` component.");
14
+ }
15
+ const uri = useMemo(() => {
16
+ if (!context.session)
17
+ return null;
18
+ const params = new URLSearchParams();
19
+ params.set("session", context.session.sessionId);
20
+ params.set("app", evervault.appId);
21
+ params.set("team", evervault.teamId);
22
+ return `https://${CHALLENGE_DOMAIN_3DS}/?${params.toString()}`;
23
+ }, [context.session, evervault.appId, evervault.teamId]);
24
+ if (!uri)
25
+ return null;
26
+ return (jsx(WebView, { containerStyle: [defaultStyles.webView, style], source: { uri }, hideKeyboardAccessoryView: true, overScrollMode: "content" }));
27
+ }
28
+ const defaultStyles = StyleSheet.create({
29
+ webView: {
30
+ flex: 1,
31
+ width: "100%",
32
+ },
33
+ });
34
+
35
+ export { ThreeDSecureFrame };
@@ -7,4 +7,3 @@ export interface ThreeDSecureProps extends PropsWithChildren {
7
7
  state: ThreeDSecureState;
8
8
  }
9
9
  export declare function ThreeDSecure({ state, children }: ThreeDSecureProps): import("react/jsx-runtime").JSX.Element | null;
10
- //# sourceMappingURL=Root.d.ts.map
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useEvervault } from '../useEvervault.js';
3
+ import { ThreeDSecureContext } from './context.js';
4
+
5
+ function ThreeDSecure({ state, children }) {
6
+ useEvervault();
7
+ if (!state.session)
8
+ return null;
9
+ return (jsx(ThreeDSecureContext.Provider, { value: state, children: state.isVisible && children }));
10
+ }
11
+
12
+ export { ThreeDSecure };
@@ -1,3 +1,2 @@
1
1
  export declare const EV_API_DOMAIN: string;
2
2
  export declare const CHALLENGE_DOMAIN_3DS: string;
3
- //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1,4 @@
1
+ const EV_API_DOMAIN = process.env.EV_API_DOMAIN || "api.evervault.com";
2
+ const CHALLENGE_DOMAIN_3DS = process.env.CHALLENGE_DOMAIN_3DS || "3ds.evervault.com";
3
+
4
+ export { CHALLENGE_DOMAIN_3DS, EV_API_DOMAIN };
@@ -1,3 +1,2 @@
1
1
  import { ThreeDSecureState } from "./types";
2
2
  export declare const ThreeDSecureContext: import("react").Context<ThreeDSecureState | null>;
3
- //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react';
2
+
3
+ const ThreeDSecureContext = createContext(null);
4
+
5
+ export { ThreeDSecureContext };
@@ -8,4 +8,3 @@ export declare class ThreeDSecureEvent {
8
8
  preventDefault(): void;
9
9
  get defaultPrevented(): boolean;
10
10
  }
11
- //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1,18 @@
1
+ class ThreeDSecureEvent {
2
+ type;
3
+ session;
4
+ _defaultPrevented;
5
+ constructor(type, session, _defaultPrevented = false) {
6
+ this.type = type;
7
+ this.session = session;
8
+ this._defaultPrevented = _defaultPrevented;
9
+ }
10
+ preventDefault() {
11
+ this._defaultPrevented = true;
12
+ }
13
+ get defaultPrevented() {
14
+ return this._defaultPrevented;
15
+ }
16
+ }
17
+
18
+ export { ThreeDSecureEvent };
@@ -7,4 +7,3 @@ export type { ThreeDSecureProps } from "./Root";
7
7
  export type { ThreeDSecureFrameProps } from "./Frame";
8
8
  export type { ThreeDSecureState, ThreeDSecureSession, ThreeDSecureCallbacks, } from "./types";
9
9
  export { useThreeDSecure } from "./useThreeDSecure";
10
- //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { ThreeDSecure as ThreeDSecure$1 } from './Root.js';
2
+ import { ThreeDSecureFrame } from './Frame.js';
3
+ export { useThreeDSecure } from './useThreeDSecure.js';
4
+
5
+ const ThreeDSecure = Object.assign(ThreeDSecure$1, {
6
+ Frame: ThreeDSecureFrame,
7
+ });
8
+
9
+ export { ThreeDSecure };
@@ -3,4 +3,3 @@ export declare function stopPolling(intervalRef: React.MutableRefObject<NodeJS.T
3
3
  export declare function startSession(session: ThreeDSecureSession, options: ThreeDSecureOptions | undefined, intervalRef: React.MutableRefObject<NodeJS.Timeout | null>, setIsVisible: (show: boolean) => void): Promise<void>;
4
4
  export declare function pollSession(session: ThreeDSecureSession, options: ThreeDSecureOptions | undefined, intervalRef: React.MutableRefObject<NodeJS.Timeout | null>, setIsVisible: (show: boolean) => void, interval?: number): void;
5
5
  export declare function threeDSecureSession({ sessionId, appId, options, intervalRef, setIsVisible, }: ThreeDSecureSessionsParams): ThreeDSecureSession;
6
- //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1,136 @@
1
+ import { EV_API_DOMAIN } from './config.js';
2
+ import { ThreeDSecureEvent } from './event.js';
3
+
4
+ function stopPolling(intervalRef, setIsVisible) {
5
+ setIsVisible(false);
6
+ if (intervalRef.current) {
7
+ clearInterval(intervalRef.current);
8
+ intervalRef.current = null;
9
+ }
10
+ }
11
+ async function startSession(session, options, intervalRef, setIsVisible) {
12
+ try {
13
+ const sessionState = await session.get();
14
+ function fail() {
15
+ stopPolling(intervalRef, setIsVisible);
16
+ options?.onFailure?.(new Error("3DS session failed"));
17
+ }
18
+ switch (sessionState.status) {
19
+ case "success": {
20
+ stopPolling(intervalRef, setIsVisible);
21
+ options?.onSuccess?.();
22
+ break;
23
+ }
24
+ case "failure": {
25
+ fail();
26
+ break;
27
+ }
28
+ case "action-required": {
29
+ const failOnChallenge = typeof options?.failOnChallenge === "function"
30
+ ? await options.failOnChallenge()
31
+ : options?.failOnChallenge ?? false;
32
+ if (failOnChallenge) {
33
+ fail();
34
+ break;
35
+ }
36
+ const event = new ThreeDSecureEvent("requestChallenge", session);
37
+ options?.onRequestChallenge?.(event);
38
+ if (event.defaultPrevented) {
39
+ fail();
40
+ break;
41
+ }
42
+ setIsVisible(true);
43
+ pollSession(session, options, intervalRef, setIsVisible);
44
+ }
45
+ }
46
+ }
47
+ catch (error) {
48
+ console.error("Error checking session state", error);
49
+ options?.onError?.(new Error("Failed to check 3DS session state"));
50
+ }
51
+ }
52
+ function pollSession(session, options, intervalRef, setIsVisible, interval = 3000) {
53
+ function fail() {
54
+ stopPolling(intervalRef, setIsVisible);
55
+ options?.onFailure?.(new Error("3DS session failed"));
56
+ }
57
+ intervalRef.current = setInterval(async () => {
58
+ try {
59
+ const pollResponse = await session.get();
60
+ switch (pollResponse.status) {
61
+ case "success": {
62
+ stopPolling(intervalRef, setIsVisible);
63
+ options?.onSuccess?.();
64
+ break;
65
+ }
66
+ case "failure": {
67
+ fail();
68
+ break;
69
+ }
70
+ case "action-required": {
71
+ const failOnChallenge = typeof options?.failOnChallenge === "function"
72
+ ? await options.failOnChallenge()
73
+ : options?.failOnChallenge ?? false;
74
+ if (failOnChallenge) {
75
+ fail();
76
+ break;
77
+ }
78
+ const event = new ThreeDSecureEvent("requestChallenge", session);
79
+ options?.onRequestChallenge?.(event);
80
+ if (event.defaultPrevented) {
81
+ fail();
82
+ break;
83
+ }
84
+ setIsVisible(true);
85
+ }
86
+ }
87
+ }
88
+ catch (error) {
89
+ stopPolling(intervalRef, setIsVisible);
90
+ console.error("Error polling session", error);
91
+ options?.onError?.(new Error("Error polling 3DS session"));
92
+ }
93
+ }, interval);
94
+ }
95
+ function threeDSecureSession({ sessionId, appId, options, intervalRef, setIsVisible, }) {
96
+ async function get() {
97
+ try {
98
+ const response = await fetch(`https://${EV_API_DOMAIN}/frontend/3ds/browser-sessions/${sessionId}`, {
99
+ headers: {
100
+ "x-evervault-app-id": appId,
101
+ },
102
+ });
103
+ const result = (await response.json());
104
+ return result;
105
+ }
106
+ catch (error) {
107
+ console.error("Error fetching 3DS session status", error);
108
+ throw error;
109
+ }
110
+ }
111
+ async function cancel() {
112
+ try {
113
+ await fetch(`https://${EV_API_DOMAIN}/frontend/3ds/browser-sessions/${sessionId}`, {
114
+ method: "PATCH",
115
+ headers: {
116
+ "Content-Type": "application/json",
117
+ "x-evervault-app-id": appId,
118
+ },
119
+ body: JSON.stringify({ outcome: "cancelled" }),
120
+ });
121
+ options?.onFailure?.(new Error("3DS session cancelled by user"));
122
+ stopPolling(intervalRef, setIsVisible);
123
+ }
124
+ catch (error) {
125
+ console.error("Error cancelling 3DS session", error);
126
+ throw error;
127
+ }
128
+ }
129
+ return {
130
+ sessionId,
131
+ get,
132
+ cancel,
133
+ };
134
+ }
135
+
136
+ export { pollSession, startSession, stopPolling, threeDSecureSession };
@@ -66,4 +66,3 @@ export interface ThreeDSecureState extends ThreeDSecureInitialState {
66
66
  */
67
67
  start(sessionId: string, options?: ThreeDSecureOptions): void;
68
68
  }
69
- //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+
@@ -3,4 +3,3 @@ export interface UseThreeDSecureOptions {
3
3
  failOnChallenge?: boolean | (() => Promise<boolean>);
4
4
  }
5
5
  export declare function useThreeDSecure(options?: UseThreeDSecureOptions): ThreeDSecureState;
6
- //# sourceMappingURL=useThreeDSecure.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { useRef, useState, useCallback, useMemo } from 'react';
2
+ import { threeDSecureSession, startSession } from './session.js';
3
+ import { useEvervault } from '../useEvervault.js';
4
+
5
+ function useThreeDSecure(options) {
6
+ const { appId } = useEvervault();
7
+ const intervalRef = useRef(null);
8
+ const [session, setSession] = useState(null);
9
+ const [isVisible, setIsVisible] = useState(false);
10
+ const failOnChallenge = options?.failOnChallenge ?? false;
11
+ const start = useCallback((sessionId, options) => {
12
+ const startOptions = {
13
+ ...options,
14
+ failOnChallenge: options?.failOnChallenge ?? failOnChallenge,
15
+ };
16
+ const session = threeDSecureSession({
17
+ sessionId,
18
+ appId,
19
+ options: startOptions,
20
+ intervalRef,
21
+ setIsVisible,
22
+ });
23
+ setSession(session);
24
+ startSession(session, startOptions, intervalRef, setIsVisible);
25
+ }, [appId, failOnChallenge]);
26
+ const cancel = useCallback(async () => {
27
+ if (session) {
28
+ await session.cancel();
29
+ }
30
+ else {
31
+ console.warn("No 3DS session to cancel");
32
+ }
33
+ }, [session]);
34
+ return useMemo(() => ({
35
+ start,
36
+ cancel,
37
+ session,
38
+ isVisible,
39
+ }), [start, cancel, session, isVisible]);
40
+ }
41
+
42
+ export { useThreeDSecure };
@@ -1,4 +1,3 @@
1
1
  import type { Spec } from "../specs/NativeEvervault";
2
2
  export declare const encryptedValue = "ev:W98t:uu98aas09udya863ty9372y7y23h97rg6gfs678987";
3
3
  export declare const NativeEvervault: Spec;
4
- //# sourceMappingURL=NativeEvervault.d.ts.map
@@ -0,0 +1,11 @@
1
+ const encryptedValue = "ev:W98t:uu98aas09udya863ty9372y7y23h97rg6gfs678987";
2
+ const NativeEvervault = {
3
+ initialize: vi.fn(),
4
+ encryptString: vi.fn(() => Promise.resolve(encryptedValue)),
5
+ encryptNumber: vi.fn(() => Promise.resolve(encryptedValue)),
6
+ encryptBoolean: vi.fn(() => Promise.resolve(encryptedValue)),
7
+ encryptObject: vi.fn(),
8
+ encryptArray: vi.fn(),
9
+ };
10
+
11
+ export { NativeEvervault, encryptedValue };
@@ -1,3 +1,2 @@
1
1
  import type { WebViewProps } from "react-native-webview";
2
2
  export declare function WebView(props: WebViewProps): import("react/jsx-runtime").JSX.Element;
3
- //# sourceMappingURL=react-native-webview.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { View } from 'react-native';
3
+
4
+ function WebView(props) {
5
+ return jsx(View, { testID: "webview", ...props });
6
+ }
7
+
8
+ export { WebView };
@@ -6,4 +6,3 @@ export interface EvervaultContextValue {
6
6
  encrypt: EncryptFn;
7
7
  }
8
8
  export declare const EvervaultContext: import("react").Context<EvervaultContextValue | null>;
9
- //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react';
2
+
3
+ const EvervaultContext = createContext(null);
4
+
5
+ export { EvervaultContext };
@@ -6,4 +6,3 @@ export { useEvervault } from "./useEvervault";
6
6
  export type { EvervaultInput, BaseEvervaultInputProps as EvervaultInputProps, } from "./Input";
7
7
  export * from "./Card";
8
8
  export * from "./ThreeDSecure";
9
- //# sourceMappingURL=index.d.ts.map