@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
@@ -0,0 +1,13 @@
1
+ import type { Spec } from "../specs/NativeEvervault";
2
+
3
+ export const encryptedValue =
4
+ "ev:W98t:uu98aas09udya863ty9372y7y23h97rg6gfs678987";
5
+
6
+ export const NativeEvervault: Spec = {
7
+ initialize: vi.fn(),
8
+ encryptString: vi.fn(() => Promise.resolve(encryptedValue)),
9
+ encryptNumber: vi.fn(() => Promise.resolve(encryptedValue)),
10
+ encryptBoolean: vi.fn(() => Promise.resolve(encryptedValue)),
11
+ encryptObject: vi.fn(),
12
+ encryptArray: vi.fn(),
13
+ };
@@ -0,0 +1,6 @@
1
+ import { View } from "react-native";
2
+ import type { WebViewProps } from "react-native-webview";
3
+
4
+ export function WebView(props: WebViewProps) {
5
+ return <View testID="webview" {...props} />;
6
+ }
package/src/context.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { createContext } from "react";
2
+ import type { Encrypted } from "./sdk";
3
+
4
+ export type EncryptFn = <T>(data: T) => Promise<Encrypted<T>>;
5
+
6
+ export interface EvervaultContextValue {
7
+ teamId: string;
8
+ appId: string;
9
+ encrypt: EncryptFn;
10
+ }
11
+
12
+ export const EvervaultContext = createContext<EvervaultContextValue | null>(
13
+ null
14
+ );
package/src/index.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { sdk } from "./sdk";
2
+
3
+ export const verifyInstallation = sdk.verify;
4
+
5
+ export type { Encrypted } from "./sdk";
6
+
7
+ export {
8
+ EvervaultProvider,
9
+ type EvervaultProviderProps,
10
+ } from "./EvervaultProvider";
11
+
12
+ export type { EncryptFn } from "./context";
13
+ export { useEvervault } from "./useEvervault";
14
+
15
+ export type {
16
+ EvervaultInput,
17
+ BaseEvervaultInputProps as EvervaultInputProps,
18
+ } from "./Input";
19
+
20
+ export * from "./Card";
21
+ export * from "./ThreeDSecure";
@@ -0,0 +1,122 @@
1
+ import { NativeEvervault } from "./__mocks__/NativeEvervault";
2
+ import { sdk } from "./sdk";
3
+
4
+ describe("sdk", () => {
5
+ describe("verify", () => {
6
+ it("should return true", () => {
7
+ expect(sdk.verify()).toBe(true);
8
+ });
9
+ });
10
+
11
+ describe("initialize", () => {
12
+ it("throws an error if teamId is not provided", () => {
13
+ expect(() => sdk.initialize("", "appId")).toThrow("Team ID is required.");
14
+ });
15
+
16
+ it("throws an error if appId is not provided", () => {
17
+ expect(() => sdk.initialize("teamId", "")).toThrow("App ID is required.");
18
+ });
19
+
20
+ it("initializes the sdk", () => {
21
+ sdk.initialize("teamId", "appId");
22
+ expect(NativeEvervault.initialize).toHaveBeenCalledWith(
23
+ "teamId",
24
+ "appId"
25
+ );
26
+ });
27
+ });
28
+
29
+ describe("encrypt", () => {
30
+ it("encrypts an undefined value", async () => {
31
+ const result = await sdk.encrypt("instanceId", undefined);
32
+ expect(result).toBe(undefined);
33
+ expect(NativeEvervault.encryptString).not.toHaveBeenCalled();
34
+ expect(NativeEvervault.encryptNumber).not.toHaveBeenCalled();
35
+ expect(NativeEvervault.encryptBoolean).not.toHaveBeenCalled();
36
+ expect(NativeEvervault.encryptObject).not.toHaveBeenCalled();
37
+ expect(NativeEvervault.encryptArray).not.toHaveBeenCalled();
38
+ });
39
+
40
+ it("encrypts a null value", async () => {
41
+ const result = await sdk.encrypt("instanceId", null);
42
+ expect(result).toBe(null);
43
+ expect(NativeEvervault.encryptString).not.toHaveBeenCalled();
44
+ expect(NativeEvervault.encryptNumber).not.toHaveBeenCalled();
45
+ expect(NativeEvervault.encryptBoolean).not.toHaveBeenCalled();
46
+ expect(NativeEvervault.encryptObject).not.toHaveBeenCalled();
47
+ expect(NativeEvervault.encryptArray).not.toHaveBeenCalled();
48
+ });
49
+
50
+ it("encrypts a string", async () => {
51
+ await sdk.encrypt("instanceId", "hello");
52
+ expect(NativeEvervault.encryptString).toHaveBeenCalledWith(
53
+ "instanceId",
54
+ "hello"
55
+ );
56
+ assertType<Promise<string>>(sdk.encrypt("instanceId", "hello"));
57
+ });
58
+
59
+ it("encrypts a number", async () => {
60
+ await sdk.encrypt("instanceId", 123);
61
+ expect(NativeEvervault.encryptNumber).toHaveBeenCalledWith(
62
+ "instanceId",
63
+ 123
64
+ );
65
+ assertType<Promise<string>>(sdk.encrypt("instanceId", 123));
66
+ });
67
+
68
+ it("encrypts a boolean", async () => {
69
+ await sdk.encrypt("instanceId", true);
70
+ expect(NativeEvervault.encryptBoolean).toHaveBeenCalledWith(
71
+ "instanceId",
72
+ true
73
+ );
74
+ assertType<Promise<string>>(sdk.encrypt("instanceId", true));
75
+ });
76
+
77
+ it("encrypts an object", async () => {
78
+ await sdk.encrypt("instanceId", { a: 1, b: 2 });
79
+ expect(NativeEvervault.encryptObject).toHaveBeenCalledWith("instanceId", {
80
+ a: 1,
81
+ b: 2,
82
+ });
83
+ assertType<Promise<{ a: string; b: string }>>(
84
+ sdk.encrypt("instanceId", { a: 1, b: 2 })
85
+ );
86
+ });
87
+
88
+ it("encrypts a deep object", async () => {
89
+ await sdk.encrypt("instanceId", { a: 1, b: { c: 2, d: 3 } });
90
+ expect(NativeEvervault.encryptObject).toHaveBeenCalledWith("instanceId", {
91
+ a: 1,
92
+ b: { c: 2, d: 3 },
93
+ });
94
+ assertType<Promise<{ a: string; b: { c: string; d: string } }>>(
95
+ sdk.encrypt("instanceId", { a: 1, b: { c: 2, d: 3 } })
96
+ );
97
+ });
98
+
99
+ it("encrypts an array", async () => {
100
+ await sdk.encrypt("instanceId", [1, 2, 3]);
101
+ expect(NativeEvervault.encryptArray).toHaveBeenCalledWith(
102
+ "instanceId",
103
+ [1, 2, 3]
104
+ );
105
+ assertType<Promise<Array<string>>>(sdk.encrypt("instanceId", [1, 2, 3]));
106
+ });
107
+
108
+ it("throws an error if the data is not supported", async () => {
109
+ const fn = () => {};
110
+ await expect(() => sdk.encrypt("instanceId", fn)).rejects.toThrow(
111
+ "Unsupported data type."
112
+ );
113
+ assertType<() => Promise<never>>(() => sdk.encrypt("instanceId", fn));
114
+
115
+ const symbol = Symbol("test");
116
+ await expect(() => sdk.encrypt("instanceId", symbol)).rejects.toThrow(
117
+ "Unsupported data type."
118
+ );
119
+ assertType<() => Promise<never>>(() => sdk.encrypt("instanceId", symbol));
120
+ });
121
+ });
122
+ });
package/src/sdk.ts ADDED
@@ -0,0 +1,71 @@
1
+ import {
2
+ NativeEvervault,
3
+ Spec as NativeEvervaultSpec,
4
+ } from "./specs/NativeEvervault";
5
+
6
+ export type Encrypted<T> = T extends undefined
7
+ ? undefined
8
+ : T extends null
9
+ ? null
10
+ : T extends string | number | boolean
11
+ ? string
12
+ : T extends Function
13
+ ? never
14
+ : T extends object
15
+ ? {
16
+ [K in keyof T]: Encrypted<T[K]>;
17
+ }
18
+ : T extends Array<infer U>
19
+ ? Array<Encrypted<U>>
20
+ : never;
21
+
22
+ function getModule(): NativeEvervaultSpec {
23
+ if (!NativeEvervault) {
24
+ throw new Error("NativeEvervault is not available.");
25
+ }
26
+
27
+ return NativeEvervault;
28
+ }
29
+
30
+ export const sdk = {
31
+ verify() {
32
+ getModule();
33
+ return true;
34
+ },
35
+
36
+ initialize(teamId: string, appId: string): string {
37
+ const evervault = getModule();
38
+
39
+ if (!teamId) {
40
+ throw new Error("Team ID is required.");
41
+ }
42
+
43
+ if (!appId) {
44
+ throw new Error("App ID is required.");
45
+ }
46
+
47
+ return evervault.initialize(teamId, appId);
48
+ },
49
+
50
+ async encrypt<T>(instanceId: string, data: T): Promise<Encrypted<T>> {
51
+ const evervault = getModule();
52
+
53
+ if (data === undefined) {
54
+ return undefined as any;
55
+ } else if (data === null) {
56
+ return null as any;
57
+ } else if (typeof data === "string") {
58
+ return (await evervault.encryptString(instanceId, data)) as any;
59
+ } else if (typeof data === "number") {
60
+ return (await evervault.encryptNumber(instanceId, data)) as any;
61
+ } else if (typeof data === "boolean") {
62
+ return (await evervault.encryptBoolean(instanceId, data)) as any;
63
+ } else if (Array.isArray(data)) {
64
+ return (await evervault.encryptArray(instanceId, data)) as any;
65
+ } else if (typeof data === "object") {
66
+ return (await evervault.encryptObject(instanceId, data)) as any;
67
+ }
68
+
69
+ throw new Error("Unsupported data type.");
70
+ },
71
+ };
@@ -0,0 +1,67 @@
1
+ import { TurboModule, TurboModuleRegistry } from "react-native";
2
+
3
+ export interface Spec extends TurboModule {
4
+ /**
5
+ * Initialize the Evervault SDK.
6
+ *
7
+ * @param teamId - The team ID.
8
+ * @param appId - The app ID.
9
+ *
10
+ * @returns A unique identifier for the SDK instance.
11
+ */
12
+ initialize(teamId: string, appId: string): string;
13
+
14
+ /**
15
+ * Encrypt a string.
16
+ *
17
+ * @param instanceId - The unique identifier for the SDK instance.
18
+ * @param data - The string to encrypt.
19
+ *
20
+ * @returns The encrypted string.
21
+ */
22
+ encryptString(instanceId: string, data: string): Promise<string>;
23
+
24
+ /**
25
+ * Encrypt a number.
26
+ *
27
+ * @param instanceId - The unique identifier for the SDK instance.
28
+ * @param data - The number to encrypt.
29
+ *
30
+ * @returns The encrypted number.
31
+ */
32
+ encryptNumber(instanceId: string, data: number): Promise<string>;
33
+
34
+ /**
35
+ * Encrypt a boolean.
36
+ *
37
+ * @param instanceId - The unique identifier for the SDK instance.
38
+ * @param data - The boolean to encrypt.
39
+ *
40
+ * @returns The encrypted boolean.
41
+ */
42
+ encryptBoolean(instanceId: string, data: boolean): Promise<string>;
43
+
44
+ /**
45
+ * Encrypt an object.
46
+ *
47
+ * @param instanceId - The unique identifier for the SDK instance.
48
+ * @param data - The object to encrypt.
49
+ *
50
+ * @returns The encrypted object.
51
+ */
52
+ encryptObject(instanceId: string, data: Object): Promise<Object>;
53
+
54
+ /**
55
+ * Encrypt an array.
56
+ *
57
+ * @param instanceId - The unique identifier for the SDK instance.
58
+ * @param data - The array to encrypt.
59
+ *
60
+ * @returns The encrypted array.
61
+ */
62
+ encryptArray(instanceId: string, data: Array<any>): Promise<Array<any>>;
63
+ }
64
+
65
+ export const NativeEvervault = TurboModuleRegistry.get<Spec>(
66
+ "NativeEvervault"
67
+ ) as Spec | null;
@@ -0,0 +1,31 @@
1
+ import { renderHook } from "@testing-library/react-native";
2
+ import { useEvervault } from "./useEvervault";
3
+ import { EvervaultProvider } from "./EvervaultProvider";
4
+ import { PropsWithChildren } from "react";
5
+ import { ErrorBoundary } from "./utils";
6
+
7
+ it("throws an error if used outside of EvervaultProvider", () => {
8
+ const onError = vi.fn();
9
+ const wrapper = ({ children }: PropsWithChildren) => (
10
+ <ErrorBoundary onError={onError}>{children}</ErrorBoundary>
11
+ );
12
+
13
+ renderHook(() => useEvervault(), { wrapper });
14
+ expect(onError).toHaveBeenCalledWith(
15
+ new Error("`useEvervault` must be used within an `EvervaultProvider`.")
16
+ );
17
+ });
18
+
19
+ it("returns the config when used within EvervaultProvider", () => {
20
+ const wrapper = ({ children }: PropsWithChildren) => (
21
+ <EvervaultProvider teamId="team_123" appId="app_123">
22
+ {children}
23
+ </EvervaultProvider>
24
+ );
25
+
26
+ const { result } = renderHook(() => useEvervault(), { wrapper });
27
+
28
+ expect(result.current.appId).toBe("app_123");
29
+ expect(result.current.teamId).toBe("team_123");
30
+ expect(result.current.encrypt).toStrictEqual(expect.any(Function));
31
+ });
@@ -0,0 +1,14 @@
1
+ import { useContext } from "react";
2
+ import { EvervaultContext } from "./context";
3
+
4
+ export function useEvervault() {
5
+ const context = useContext(EvervaultContext);
6
+
7
+ if (!context) {
8
+ throw new Error(
9
+ "`useEvervault` must be used within an `EvervaultProvider`."
10
+ );
11
+ }
12
+
13
+ return context;
14
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,41 @@
1
+ import {
2
+ Component,
3
+ LegacyRef,
4
+ MutableRefObject,
5
+ PropsWithChildren,
6
+ RefCallback,
7
+ } from "react";
8
+
9
+ // Taken from https://github.com/gregberge/react-merge-refs
10
+ export function mergeRefs<T = any>(
11
+ ...refs: Array<MutableRefObject<T> | LegacyRef<T> | undefined | null>
12
+ ): RefCallback<T> {
13
+ return (value) => {
14
+ refs.forEach((ref) => {
15
+ if (typeof ref === "function") {
16
+ ref(value);
17
+ } else if (ref != null) {
18
+ (ref as MutableRefObject<T | null>).current = value;
19
+ }
20
+ });
21
+ };
22
+ }
23
+
24
+ export class ErrorBoundary extends Component<
25
+ PropsWithChildren<{ onError?(error: Error): void }>
26
+ > {
27
+ state = { hasError: false };
28
+
29
+ static getDerivedStateFromError() {
30
+ return { hasError: true };
31
+ }
32
+
33
+ componentDidCatch(error: Error) {
34
+ this.props.onError?.(error);
35
+ }
36
+
37
+ render() {
38
+ if (this.state.hasError) return null;
39
+ return this.props.children;
40
+ }
41
+ }