@evervault/react-native 2.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 (177) hide show
  1. package/README.md +63 -0
  2. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeEvervaultSpec.java +60 -0
  3. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNCWebViewModuleSpec.java +42 -0
  4. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerDelegate.java +294 -0
  5. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerInterface.java +104 -0
  6. package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
  7. package/android/app/build/generated/source/codegen/jni/NativeEvervaultSpec-generated.cpp +62 -0
  8. package/android/app/build/generated/source/codegen/jni/NativeEvervaultSpec.h +31 -0
  9. package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec-generated.cpp +38 -0
  10. package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec.h +31 -0
  11. package/android/app/build/generated/source/codegen/jni/react/renderer/components/NativeEvervaultSpec/NativeEvervaultSpecJSI-generated.cpp +68 -0
  12. package/android/app/build/generated/source/codegen/jni/react/renderer/components/NativeEvervaultSpec/NativeEvervaultSpecJSI.h +112 -0
  13. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.cpp +22 -0
  14. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.h +24 -0
  15. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.cpp +241 -0
  16. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.h +263 -0
  17. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.cpp +99 -0
  18. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.h +488 -0
  19. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI-generated.cpp +35 -0
  20. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI.h +76 -0
  21. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.cpp +17 -0
  22. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.h +32 -0
  23. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.cpp +16 -0
  24. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.h +29 -0
  25. package/android/build.gradle +32 -0
  26. package/android/src/main/java/com/nativeevervault/EvervaultModule.kt +114 -0
  27. package/android/src/main/java/com/nativeevervault/EvervaultPackage.kt +29 -0
  28. package/build/Card/Cvc.d.ts +5 -0
  29. package/build/Card/Cvc.d.ts.map +1 -0
  30. package/build/Card/Cvc.test.d.ts +2 -0
  31. package/build/Card/Cvc.test.d.ts.map +1 -0
  32. package/build/Card/Expiry.d.ts +5 -0
  33. package/build/Card/Expiry.d.ts.map +1 -0
  34. package/build/Card/Holder.d.ts +5 -0
  35. package/build/Card/Holder.d.ts.map +1 -0
  36. package/build/Card/Number.d.ts +5 -0
  37. package/build/Card/Number.d.ts.map +1 -0
  38. package/build/Card/Number.test.d.ts +2 -0
  39. package/build/Card/Number.test.d.ts.map +1 -0
  40. package/build/Card/Root.d.ts +36 -0
  41. package/build/Card/Root.d.ts.map +1 -0
  42. package/build/Card/Root.test.d.ts +2 -0
  43. package/build/Card/Root.test.d.ts.map +1 -0
  44. package/build/Card/index.d.ts +23 -0
  45. package/build/Card/index.d.ts.map +1 -0
  46. package/build/Card/schema.d.ts +30 -0
  47. package/build/Card/schema.d.ts.map +1 -0
  48. package/build/Card/types.d.ts +31 -0
  49. package/build/Card/types.d.ts.map +1 -0
  50. package/build/Card/utils.d.ts +17 -0
  51. package/build/Card/utils.d.ts.map +1 -0
  52. package/build/Card/utils.test.d.ts +2 -0
  53. package/build/Card/utils.test.d.ts.map +1 -0
  54. package/build/EvervaultProvider.d.ts +7 -0
  55. package/build/EvervaultProvider.d.ts.map +1 -0
  56. package/build/EvervaultProvider.test.d.ts +2 -0
  57. package/build/EvervaultProvider.test.d.ts.map +1 -0
  58. package/build/Input.d.ts +14 -0
  59. package/build/Input.d.ts.map +1 -0
  60. package/build/Input.test.d.ts +2 -0
  61. package/build/Input.test.d.ts.map +1 -0
  62. package/build/ThreeDSecure/Frame.d.ts +6 -0
  63. package/build/ThreeDSecure/Frame.d.ts.map +1 -0
  64. package/build/ThreeDSecure/Frame.test.d.ts +2 -0
  65. package/build/ThreeDSecure/Frame.test.d.ts.map +1 -0
  66. package/build/ThreeDSecure/Root.d.ts +10 -0
  67. package/build/ThreeDSecure/Root.d.ts.map +1 -0
  68. package/build/ThreeDSecure/Root.test.d.ts +2 -0
  69. package/build/ThreeDSecure/Root.test.d.ts.map +1 -0
  70. package/build/ThreeDSecure/config.d.ts +3 -0
  71. package/build/ThreeDSecure/config.d.ts.map +1 -0
  72. package/build/ThreeDSecure/context.d.ts +3 -0
  73. package/build/ThreeDSecure/context.d.ts.map +1 -0
  74. package/build/ThreeDSecure/index.d.ts +10 -0
  75. package/build/ThreeDSecure/index.d.ts.map +1 -0
  76. package/build/ThreeDSecure/session.d.ts +6 -0
  77. package/build/ThreeDSecure/session.d.ts.map +1 -0
  78. package/build/ThreeDSecure/session.test.d.ts +2 -0
  79. package/build/ThreeDSecure/session.test.d.ts.map +1 -0
  80. package/build/ThreeDSecure/types.d.ts +57 -0
  81. package/build/ThreeDSecure/types.d.ts.map +1 -0
  82. package/build/ThreeDSecure/useThreeDSecure.d.ts +3 -0
  83. package/build/ThreeDSecure/useThreeDSecure.d.ts.map +1 -0
  84. package/build/ThreeDSecure/useThreeDSecure.test.d.ts +2 -0
  85. package/build/ThreeDSecure/useThreeDSecure.test.d.ts.map +1 -0
  86. package/build/__mocks__/NativeEvervault.d.ts +4 -0
  87. package/build/__mocks__/NativeEvervault.d.ts.map +1 -0
  88. package/build/__mocks__/react-native-webview.d.ts +3 -0
  89. package/build/__mocks__/react-native-webview.d.ts.map +1 -0
  90. package/build/context.d.ts +9 -0
  91. package/build/context.d.ts.map +1 -0
  92. package/build/generated/ios/FBReactNativeSpec/FBReactNativeSpec-generated.mm +2321 -0
  93. package/build/generated/ios/FBReactNativeSpec/FBReactNativeSpec.h +2761 -0
  94. package/build/generated/ios/FBReactNativeSpecJSI-generated.cpp +2923 -0
  95. package/build/generated/ios/FBReactNativeSpecJSI.h +7718 -0
  96. package/build/generated/ios/NativeEvervaultSpec/NativeEvervaultSpec-generated.mm +74 -0
  97. package/build/generated/ios/NativeEvervaultSpec/NativeEvervaultSpec.h +80 -0
  98. package/build/generated/ios/NativeEvervaultSpecJSI-generated.cpp +68 -0
  99. package/build/generated/ios/NativeEvervaultSpecJSI.h +112 -0
  100. package/build/generated/ios/RCTModulesConformingToProtocolsProvider.h +18 -0
  101. package/build/generated/ios/RCTModulesConformingToProtocolsProvider.mm +33 -0
  102. package/build/generated/ios/RNCWebViewSpec/RNCWebViewSpec-generated.mm +46 -0
  103. package/build/generated/ios/RNCWebViewSpec/RNCWebViewSpec.h +62 -0
  104. package/build/generated/ios/RNCWebViewSpecJSI-generated.cpp +35 -0
  105. package/build/generated/ios/RNCWebViewSpecJSI.h +76 -0
  106. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.cpp +22 -0
  107. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.h +24 -0
  108. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/EventEmitters.cpp +241 -0
  109. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/EventEmitters.h +263 -0
  110. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/Props.cpp +99 -0
  111. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/Props.h +488 -0
  112. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/RCTComponentViewHelpers.h +218 -0
  113. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ShadowNodes.cpp +17 -0
  114. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ShadowNodes.h +32 -0
  115. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/States.cpp +16 -0
  116. package/build/generated/ios/react/renderer/components/RNCWebViewSpec/States.h +29 -0
  117. package/build/index.cjs.js +7732 -0
  118. package/build/index.cjs.js.map +1 -0
  119. package/build/index.d.ts +9 -0
  120. package/build/index.d.ts.map +1 -0
  121. package/build/index.esm.js +7702 -0
  122. package/build/sdk.d.ts +9 -0
  123. package/build/sdk.d.ts.map +1 -0
  124. package/build/sdk.test.d.ts +2 -0
  125. package/build/sdk.test.d.ts.map +1 -0
  126. package/build/specs/NativeEvervault.d.ts +59 -0
  127. package/build/specs/NativeEvervault.d.ts.map +1 -0
  128. package/build/useEvervault.d.ts +2 -0
  129. package/build/useEvervault.d.ts.map +1 -0
  130. package/build/useEvervault.test.d.ts +2 -0
  131. package/build/useEvervault.test.d.ts.map +1 -0
  132. package/build/utils.d.ts +15 -0
  133. package/build/utils.d.ts.map +1 -0
  134. package/ios/NativeEvervault-Bridging-Header.h +2 -0
  135. package/ios/NativeEvervault.mm +38 -0
  136. package/ios/NativeEvervault.swift +62 -0
  137. package/native-evervault.podspec +20 -0
  138. package/package.json +85 -0
  139. package/src/Card/Cvc.test.tsx +41 -0
  140. package/src/Card/Cvc.tsx +51 -0
  141. package/src/Card/Expiry.tsx +26 -0
  142. package/src/Card/Holder.tsx +27 -0
  143. package/src/Card/Number.test.tsx +55 -0
  144. package/src/Card/Number.tsx +47 -0
  145. package/src/Card/Root.test.tsx +260 -0
  146. package/src/Card/Root.tsx +118 -0
  147. package/src/Card/index.ts +28 -0
  148. package/src/Card/schema.ts +51 -0
  149. package/src/Card/types.ts +50 -0
  150. package/src/Card/utils.test.ts +271 -0
  151. package/src/Card/utils.ts +127 -0
  152. package/src/EvervaultProvider.test.tsx +24 -0
  153. package/src/EvervaultProvider.tsx +43 -0
  154. package/src/Input.test.tsx +138 -0
  155. package/src/Input.tsx +136 -0
  156. package/src/ThreeDSecure/Frame.test.tsx +87 -0
  157. package/src/ThreeDSecure/Frame.tsx +50 -0
  158. package/src/ThreeDSecure/Root.test.tsx +67 -0
  159. package/src/ThreeDSecure/Root.tsx +23 -0
  160. package/src/ThreeDSecure/config.ts +3 -0
  161. package/src/ThreeDSecure/context.ts +6 -0
  162. package/src/ThreeDSecure/index.ts +17 -0
  163. package/src/ThreeDSecure/session.test.ts +329 -0
  164. package/src/ThreeDSecure/session.ts +132 -0
  165. package/src/ThreeDSecure/types.ts +67 -0
  166. package/src/ThreeDSecure/useThreeDSecure.test.tsx +133 -0
  167. package/src/ThreeDSecure/useThreeDSecure.ts +47 -0
  168. package/src/__mocks__/NativeEvervault.ts +13 -0
  169. package/src/__mocks__/react-native-webview.tsx +6 -0
  170. package/src/context.ts +14 -0
  171. package/src/index.ts +21 -0
  172. package/src/sdk.test.ts +122 -0
  173. package/src/sdk.ts +71 -0
  174. package/src/specs/NativeEvervault.ts +67 -0
  175. package/src/useEvervault.test.tsx +31 -0
  176. package/src/useEvervault.ts +14 -0
  177. package/src/utils.ts +41 -0
package/build/sdk.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export type Encrypted<T> = T extends undefined ? undefined : T extends null ? null : T extends string | number | boolean ? string : T extends Function ? never : T extends object ? {
2
+ [K in keyof T]: Encrypted<T[K]>;
3
+ } : T extends Array<infer U> ? Array<Encrypted<U>> : never;
4
+ export declare const sdk: {
5
+ verify(): boolean;
6
+ initialize(teamId: string, appId: string): string;
7
+ encrypt<T>(instanceId: string, data: T): Promise<Encrypted<T>>;
8
+ };
9
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAC1C,SAAS,GACT,CAAC,SAAS,IAAI,GACd,IAAI,GACJ,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GACnC,MAAM,GACN,CAAC,SAAS,QAAQ,GAClB,KAAK,GACL,CAAC,SAAS,MAAM,GAChB;KACG,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC,GACD,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACxB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GACnB,KAAK,CAAC;AAUV,eAAO,MAAM,GAAG;;uBAMK,MAAM,SAAS,MAAM,GAAG,MAAM;YAcnC,CAAC,cAAc,MAAM,QAAQ,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAqBrE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sdk.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.test.d.ts","sourceRoot":"","sources":["../src/sdk.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { TurboModule } from "react-native";
2
+ export interface Spec extends TurboModule {
3
+ /**
4
+ * Initialize the Evervault SDK.
5
+ *
6
+ * @param teamId - The team ID.
7
+ * @param appId - The app ID.
8
+ *
9
+ * @returns A unique identifier for the SDK instance.
10
+ */
11
+ initialize(teamId: string, appId: string): string;
12
+ /**
13
+ * Encrypt a string.
14
+ *
15
+ * @param instanceId - The unique identifier for the SDK instance.
16
+ * @param data - The string to encrypt.
17
+ *
18
+ * @returns The encrypted string.
19
+ */
20
+ encryptString(instanceId: string, data: string): Promise<string>;
21
+ /**
22
+ * Encrypt a number.
23
+ *
24
+ * @param instanceId - The unique identifier for the SDK instance.
25
+ * @param data - The number to encrypt.
26
+ *
27
+ * @returns The encrypted number.
28
+ */
29
+ encryptNumber(instanceId: string, data: number): Promise<string>;
30
+ /**
31
+ * Encrypt a boolean.
32
+ *
33
+ * @param instanceId - The unique identifier for the SDK instance.
34
+ * @param data - The boolean to encrypt.
35
+ *
36
+ * @returns The encrypted boolean.
37
+ */
38
+ encryptBoolean(instanceId: string, data: boolean): Promise<string>;
39
+ /**
40
+ * Encrypt an object.
41
+ *
42
+ * @param instanceId - The unique identifier for the SDK instance.
43
+ * @param data - The object to encrypt.
44
+ *
45
+ * @returns The encrypted object.
46
+ */
47
+ encryptObject(instanceId: string, data: Object): Promise<Object>;
48
+ /**
49
+ * Encrypt an array.
50
+ *
51
+ * @param instanceId - The unique identifier for the SDK instance.
52
+ * @param data - The array to encrypt.
53
+ *
54
+ * @returns The encrypted array.
55
+ */
56
+ encryptArray(instanceId: string, data: Array<any>): Promise<Array<any>>;
57
+ }
58
+ export declare const NativeEvervault: Spec | null;
59
+ //# sourceMappingURL=NativeEvervault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeEvervault.d.ts","sourceRoot":"","sources":["../../src/specs/NativeEvervault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAuB,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC;;;;;;;OAOG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAElD;;;;;;;OAOG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjE;;;;;;;OAOG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjE;;;;;;;OAOG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnE;;;;;;;OAOG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjE;;;;;;;OAOG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;CACzE;AAED,eAAO,MAAM,eAAe,EAEvB,IAAI,GAAG,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useEvervault(): import("./context").EvervaultContextValue;
2
+ //# sourceMappingURL=useEvervault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEvervault.d.ts","sourceRoot":"","sources":["../src/useEvervault.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,8CAU3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useEvervault.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEvervault.test.d.ts","sourceRoot":"","sources":["../src/useEvervault.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { Component, LegacyRef, MutableRefObject, PropsWithChildren, RefCallback } from "react";
2
+ export declare function mergeRefs<T = any>(...refs: Array<MutableRefObject<T> | LegacyRef<T> | undefined | null>): RefCallback<T>;
3
+ export declare class ErrorBoundary extends Component<PropsWithChildren<{
4
+ onError?(error: Error): void;
5
+ }>> {
6
+ state: {
7
+ hasError: boolean;
8
+ };
9
+ static getDerivedStateFromError(): {
10
+ hasError: boolean;
11
+ };
12
+ componentDidCatch(error: Error): void;
13
+ render(): import("react").ReactNode;
14
+ }
15
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACZ,MAAM,OAAO,CAAC;AAGf,wBAAgB,SAAS,CAAC,CAAC,GAAG,GAAG,EAC/B,GAAG,IAAI,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,GACpE,WAAW,CAAC,CAAC,CAAC,CAUhB;AAED,qBAAa,aAAc,SAAQ,SAAS,CAC1C,iBAAiB,CAAC;IAAE,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CAAC,CACpD;IACC,KAAK;;MAAuB;IAE5B,MAAM,CAAC,wBAAwB;;;IAI/B,iBAAiB,CAAC,KAAK,EAAE,KAAK;IAI9B,MAAM;CAIP"}
@@ -0,0 +1,2 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
@@ -0,0 +1,38 @@
1
+ #import <React/RCTBridgeModule.h>
2
+
3
+ @interface RCT_EXTERN_MODULE(NativeEvervault, NSObject)
4
+
5
+ RCT_EXTERN_METHOD(initialize:(NSString *)teamId
6
+ withAppId:(NSString *)appId)
7
+
8
+ RCT_EXTERN_METHOD(encryptString:(NSString *)instanceId
9
+ withValue:(NSString *)value
10
+ withResolver:(RCTPromiseResolveBlock)resolve
11
+ withRejecter:(RCTPromiseRejectBlock)reject)
12
+
13
+ RCT_EXTERN_METHOD(encryptNumber:(NSString *)instanceId
14
+ withValue:(double)value
15
+ withResolver:(RCTPromiseResolveBlock)resolve
16
+ withRejecter:(RCTPromiseRejectBlock)reject)
17
+
18
+ RCT_EXTERN_METHOD(encryptBoolean:(NSString *)instanceId
19
+ withValue:(BOOL)value
20
+ withResolver:(RCTPromiseResolveBlock)resolve
21
+ withRejecter:(RCTPromiseRejectBlock)reject)
22
+
23
+ RCT_EXTERN_METHOD(encryptObject:(NSString *)instanceId
24
+ withValue:(NSDictionary *)value
25
+ withResolver:(RCTPromiseResolveBlock)resolve
26
+ withRejecter:(RCTPromiseRejectBlock)reject)
27
+
28
+ RCT_EXTERN_METHOD(encryptArray:(NSString *)instanceId
29
+ withValue:(NSArray *)value
30
+ withResolver:(RCTPromiseResolveBlock)resolve
31
+ withRejecter:(RCTPromiseRejectBlock)reject)
32
+
33
+ + (BOOL)requiresMainQueueSetup
34
+ {
35
+ return NO;
36
+ }
37
+
38
+ @end
@@ -0,0 +1,62 @@
1
+ import Evervault
2
+
3
+ @objc(NativeEvervault)
4
+ class NativeEvervault: NSObject {
5
+ var instances: [String: Evervault] = [:]
6
+
7
+ func getInstanceId(_ teamId: String, _ appId: String) -> String {
8
+ return "\(teamId):\(appId)"
9
+ }
10
+
11
+ func getInstance(_ instanceId: String) -> Evervault? {
12
+ return self.instances[instanceId]
13
+ }
14
+
15
+ @objc(initialize:withAppId:)
16
+ func initialize(teamId: String, appId: String) -> String {
17
+ let evervault = Evervault(teamId: teamId, appId: appId)
18
+ let instanceId = getInstanceId(teamId, appId)
19
+ self.instances[instanceId] = evervault
20
+ return instanceId
21
+ }
22
+
23
+ func encrypt(instanceId: String, _ value: Any, _ resolve: @escaping RCTPromiseResolveBlock, _ reject: @escaping RCTPromiseRejectBlock) {
24
+ Task {
25
+ do {
26
+ guard let instance = getInstance(instanceId) else {
27
+ reject("Error", "Instance not found", nil)
28
+ return
29
+ }
30
+ let enc = try await instance.encrypt(value)
31
+ resolve(enc)
32
+ } catch {
33
+ reject("Error", "Failed to encrypt: \(error.localizedDescription)", error)
34
+ }
35
+ }
36
+ }
37
+
38
+ @objc(encryptString:withValue:withResolver:withRejecter:)
39
+ func encryptString(instanceId: String, value: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
40
+ return self.encrypt(instanceId: instanceId, value, resolve, reject)
41
+ }
42
+
43
+ @objc(encryptNumber:withValue:withResolver:withRejecter:)
44
+ func encryptNumber(instanceId: String, value: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
45
+ return self.encrypt(instanceId: instanceId, value, resolve, reject)
46
+ }
47
+
48
+ @objc(encryptBoolean:withValue:withResolver:withRejecter:)
49
+ func encryptBoolean(instanceId: String, value: Bool, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
50
+ return self.encrypt(instanceId: instanceId, value, resolve, reject)
51
+ }
52
+
53
+ @objc(encryptObject:withValue:withResolver:withRejecter:)
54
+ func encryptObject(instanceId: String, value: [String: Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
55
+ return self.encrypt(instanceId: instanceId, value, resolve, reject)
56
+ }
57
+
58
+ @objc(encryptArray:withValue:withResolver:withRejecter:)
59
+ func encryptArray(instanceId: String, value: [Any], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
60
+ return self.encrypt(instanceId: instanceId, value, resolve, reject)
61
+ }
62
+ }
@@ -0,0 +1,20 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "native-evervault"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.description = package["description"]
10
+ s.homepage = package["homepage"]
11
+ s.license = package["license"]
12
+ s.platforms = { :ios => "11.0" }
13
+ s.author = package["author"]
14
+ s.source = { :git => package["repository"]["url"], :tag => "#{s.version}" }
15
+
16
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
17
+
18
+ install_modules_dependencies(s)
19
+ s.dependency "Evervault", '~> 0.3.2'
20
+ end
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@evervault/react-native",
3
+ "description": "Evervault SDK for React Native",
4
+ "version": "2.0.0",
5
+ "source": "./src/index.ts",
6
+ "main": "./build/index.cjs.js",
7
+ "module": "./build/index.esm.js",
8
+ "types": "./build/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./build/index.d.ts",
13
+ "default": "./build/index.esm.js"
14
+ },
15
+ "require": {
16
+ "types": "./build/index.d.ts",
17
+ "default": "./build/index.cjs.js"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "src",
23
+ "build",
24
+ "ios",
25
+ "android",
26
+ "native-evervault.podspec"
27
+ ],
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/evervault/evervault-js.git"
31
+ },
32
+ "author": "Engineering <engineering@evervault.com> (https://evervault.com)",
33
+ "license": "MIT",
34
+ "bugs": {
35
+ "url": "https://github.com/evervault/evervault-js/issues"
36
+ },
37
+ "homepage": "https://docs.evervault.com/sdks/react-native",
38
+ "publishConfig": {
39
+ "registry": "https://registry.npmjs.org/",
40
+ "access": "public"
41
+ },
42
+ "peerDependencies": {
43
+ "react": "*",
44
+ "react-native": "*",
45
+ "react-native-webview": "*"
46
+ },
47
+ "devDependencies": {
48
+ "@react-native-community/cli": "*",
49
+ "@rollup/plugin-node-resolve": "^16.0.0",
50
+ "@rollup/plugin-typescript": "^12.1.2",
51
+ "@testing-library/react-native": "^13.2.0",
52
+ "@types/react": "^18.2.37",
53
+ "react": "^18.2.0",
54
+ "react-native": "0.76.7",
55
+ "react-native-webview": "^13.12.5",
56
+ "react-test-renderer": "18.2.0",
57
+ "rimraf": "^6.0.1",
58
+ "rollup": "^4.34.9",
59
+ "vitest": "^2.1.8",
60
+ "vitest-react-native": "^0.1.5",
61
+ "tsconfig": "0.1.0"
62
+ },
63
+ "codegenConfig": {
64
+ "name": "NativeEvervaultSpec",
65
+ "type": "modules",
66
+ "jsSrcsDir": "src",
67
+ "android": {
68
+ "javaPackageName": "com.nativeevervault"
69
+ }
70
+ },
71
+ "dependencies": {
72
+ "@hookform/resolvers": "^4.1.3",
73
+ "react-hook-form": "^7.54.2",
74
+ "react-native-mask-input": "^1.2.3",
75
+ "zod": "^3.24.2",
76
+ "@evervault/card-validator": "1.3.0"
77
+ },
78
+ "scripts": {
79
+ "build": "rollup -c",
80
+ "watch": "rollup -c --watch",
81
+ "codegen": "rimraf build android/app && react-native codegen",
82
+ "test": "vitest run",
83
+ "test:watch": "vitest --watch"
84
+ }
85
+ }
@@ -0,0 +1,41 @@
1
+ import { render, userEvent } from "@testing-library/react-native";
2
+ import { PropsWithChildren } from "react";
3
+ import { Card } from "./Root";
4
+ import { EvervaultProvider } from "../EvervaultProvider";
5
+ import { CardCvc } from "./Cvc";
6
+
7
+ function wrapper({ children }: PropsWithChildren) {
8
+ return (
9
+ <EvervaultProvider teamId="team_123" appId="app_123">
10
+ {children}
11
+ </EvervaultProvider>
12
+ );
13
+ }
14
+
15
+ it("uses 3 digits for mask by default", async () => {
16
+ const { getByTestId } = render(
17
+ <Card>
18
+ <CardCvc testID="cvc" />
19
+ </Card>,
20
+ { wrapper }
21
+ );
22
+ const cvc = getByTestId("cvc");
23
+
24
+ const user = userEvent.setup();
25
+ await user.type(cvc, "12345");
26
+ expect(cvc).toHaveProp("value", "123");
27
+ });
28
+
29
+ it("uses 4 digits for mask for american express", async () => {
30
+ const { getByTestId } = render(
31
+ <Card defaultValues={{ number: "378282246310005" }}>
32
+ <CardCvc testID="cvc" />
33
+ </Card>,
34
+ { wrapper }
35
+ );
36
+ const cvc = getByTestId("cvc");
37
+
38
+ const user = userEvent.setup();
39
+ await user.type(cvc, "12345");
40
+ expect(cvc).toHaveProp("value", "1234");
41
+ });
@@ -0,0 +1,51 @@
1
+ import { forwardRef, useMemo } from "react";
2
+ import { BaseEvervaultInputProps, EvervaultInput, mask } from "../Input";
3
+ import { CardFormValues } from "./schema";
4
+ import { Mask } from "react-native-mask-input";
5
+ import { validateNumber } from "@evervault/card-validator";
6
+ import { useFormContext } from "react-hook-form";
7
+ import { CardBrandName } from "./types";
8
+
9
+ const DEFAULT_CARD_CVC_MASK = mask("999");
10
+
11
+ const CARD_CVC_MASKS: Partial<Record<CardBrandName, Mask>> = {
12
+ "american-express": mask("9999"),
13
+ };
14
+
15
+ export type CardCvcProps = BaseEvervaultInputProps;
16
+
17
+ export type CardCvc = EvervaultInput;
18
+
19
+ export const CardCvc = forwardRef<CardCvc, CardCvcProps>(function CardCvc(
20
+ props,
21
+ ref
22
+ ) {
23
+ const methods = useFormContext<CardFormValues>();
24
+
25
+ const number = methods.watch("number");
26
+ const mask = useMemo<Mask>(() => {
27
+ if (!number) {
28
+ return DEFAULT_CARD_CVC_MASK;
29
+ }
30
+
31
+ const brand = validateNumber(number).brand;
32
+ if (brand && CARD_CVC_MASKS[brand]) {
33
+ return CARD_CVC_MASKS[brand];
34
+ }
35
+
36
+ return DEFAULT_CARD_CVC_MASK;
37
+ }, [number]);
38
+
39
+ return (
40
+ <EvervaultInput<CardFormValues>
41
+ placeholder="CVC"
42
+ {...props}
43
+ ref={ref}
44
+ name="cvc"
45
+ mask={mask}
46
+ inputMode="numeric"
47
+ autoComplete="cc-csc"
48
+ keyboardType="number-pad"
49
+ />
50
+ );
51
+ });
@@ -0,0 +1,26 @@
1
+ import { forwardRef } from "react";
2
+ import { BaseEvervaultInputProps, EvervaultInput, mask } from "../Input";
3
+ import { CardFormValues } from "./schema";
4
+
5
+ const CARD_EXPIRY_MASK = mask("99 / 99");
6
+
7
+ export type CardExpiryProps = BaseEvervaultInputProps;
8
+
9
+ export type CardExpiry = EvervaultInput;
10
+
11
+ export const CardExpiry = forwardRef<CardExpiry, CardExpiryProps>(
12
+ function CardExpiry(props, ref) {
13
+ return (
14
+ <EvervaultInput<CardFormValues>
15
+ placeholder="MM / YY"
16
+ {...props}
17
+ ref={ref}
18
+ name="expiry"
19
+ mask={CARD_EXPIRY_MASK}
20
+ inputMode="numeric"
21
+ autoComplete="cc-exp"
22
+ keyboardType="number-pad"
23
+ />
24
+ );
25
+ }
26
+ );
@@ -0,0 +1,27 @@
1
+ import { Platform } from "react-native";
2
+ import { forwardRef } from "react";
3
+ import { BaseEvervaultInputProps, EvervaultInput } from "../Input";
4
+ import { CardFormValues } from "./schema";
5
+
6
+ export type CardHolderProps = BaseEvervaultInputProps;
7
+
8
+ export type CardHolder = EvervaultInput;
9
+
10
+ export const CardHolder = forwardRef<CardHolder, CardHolderProps>(
11
+ function CardHolder(props, ref) {
12
+ return (
13
+ <EvervaultInput<CardFormValues>
14
+ placeholder="Johnny Appleseed"
15
+ {...props}
16
+ ref={ref}
17
+ name="name"
18
+ inputMode="text"
19
+ autoComplete={Platform.select({
20
+ ios: "cc-name",
21
+ default: "name",
22
+ })}
23
+ keyboardType="default"
24
+ />
25
+ );
26
+ }
27
+ );
@@ -0,0 +1,55 @@
1
+ import { render, userEvent } from "@testing-library/react-native";
2
+ import { PropsWithChildren } from "react";
3
+ import { Card } from "./Root";
4
+ import { EvervaultProvider } from "../EvervaultProvider";
5
+ import { CardNumber } from "./Number";
6
+
7
+ function wrapper({ children }: PropsWithChildren) {
8
+ return (
9
+ <EvervaultProvider teamId="team_123" appId="app_123">
10
+ {children}
11
+ </EvervaultProvider>
12
+ );
13
+ }
14
+
15
+ it("uses 16 digits for mask by default", async () => {
16
+ const { getByTestId } = render(
17
+ <Card>
18
+ <CardNumber testID="number" />
19
+ </Card>,
20
+ { wrapper }
21
+ );
22
+ const number = getByTestId("number");
23
+
24
+ const user = userEvent.setup();
25
+ await user.type(number, "4242424242424242");
26
+ expect(number).toHaveProp("value", "4242 4242 4242 4242");
27
+ });
28
+
29
+ it("uses 19 digits for mask for unionpay", async () => {
30
+ const { getByTestId } = render(
31
+ <Card>
32
+ <CardNumber testID="number" />
33
+ </Card>,
34
+ { wrapper }
35
+ );
36
+ const number = getByTestId("number");
37
+
38
+ const user = userEvent.setup();
39
+ await user.type(number, "6205500000000000004");
40
+ expect(number).toHaveProp("value", "6205 5000 0000 0000 004");
41
+ });
42
+
43
+ it("uses 15 digits for mask for american express", async () => {
44
+ const { getByTestId } = render(
45
+ <Card>
46
+ <CardNumber testID="number" />
47
+ </Card>,
48
+ { wrapper }
49
+ );
50
+ const number = getByTestId("number");
51
+
52
+ const user = userEvent.setup();
53
+ await user.type(number, "371449635398431");
54
+ expect(number).toHaveProp("value", "3714 496353 98431");
55
+ });
@@ -0,0 +1,47 @@
1
+ import { forwardRef, useCallback } from "react";
2
+ import { BaseEvervaultInputProps, EvervaultInput, mask } from "../Input";
3
+ import { CardFormValues } from "./schema";
4
+ import { MaskArray } from "react-native-mask-input";
5
+ import { validateNumber } from "@evervault/card-validator";
6
+ import { CardBrandName } from "./types";
7
+
8
+ const DEFAULT_CARD_NUMBER_MASK = mask("9999 9999 9999 9999");
9
+
10
+ const CARD_NUMBER_MASKS: Partial<Record<CardBrandName, MaskArray>> = {
11
+ unionpay: mask("9999 9999 9999 9999 999"),
12
+ "american-express": mask("9999 999999 99999"),
13
+ };
14
+
15
+ export type CardNumberProps = BaseEvervaultInputProps;
16
+
17
+ export type CardNumber = EvervaultInput;
18
+
19
+ export const CardNumber = forwardRef<CardNumber, CardNumberProps>(
20
+ function CardNumber(props, ref) {
21
+ const mask = useCallback((text?: string): MaskArray => {
22
+ if (!text) {
23
+ return DEFAULT_CARD_NUMBER_MASK;
24
+ }
25
+
26
+ const brand = validateNumber(text).brand;
27
+ if (brand && CARD_NUMBER_MASKS[brand]) {
28
+ return CARD_NUMBER_MASKS[brand];
29
+ }
30
+
31
+ return DEFAULT_CARD_NUMBER_MASK;
32
+ }, []);
33
+
34
+ return (
35
+ <EvervaultInput<CardFormValues>
36
+ placeholder="1234 1234 1234 1234"
37
+ {...props}
38
+ ref={ref}
39
+ name="number"
40
+ mask={mask}
41
+ inputMode="numeric"
42
+ autoComplete="cc-number"
43
+ keyboardType="number-pad"
44
+ />
45
+ );
46
+ }
47
+ );