@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.
- package/README.md +63 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeEvervaultSpec.java +60 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNCWebViewModuleSpec.java +42 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerDelegate.java +294 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCWebViewManagerInterface.java +104 -0
- package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
- package/android/app/build/generated/source/codegen/jni/NativeEvervaultSpec-generated.cpp +62 -0
- package/android/app/build/generated/source/codegen/jni/NativeEvervaultSpec.h +31 -0
- package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec-generated.cpp +38 -0
- package/android/app/build/generated/source/codegen/jni/RNCWebViewSpec.h +31 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/NativeEvervaultSpec/NativeEvervaultSpecJSI-generated.cpp +68 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/NativeEvervaultSpec/NativeEvervaultSpecJSI.h +112 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.cpp +241 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/EventEmitters.h +263 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.cpp +99 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/Props.h +488 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI-generated.cpp +35 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/RNCWebViewSpecJSI.h +76 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/ShadowNodes.h +32 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNCWebViewSpec/States.h +29 -0
- package/android/build.gradle +32 -0
- package/android/src/main/java/com/nativeevervault/EvervaultModule.kt +114 -0
- package/android/src/main/java/com/nativeevervault/EvervaultPackage.kt +29 -0
- package/build/Card/Cvc.d.ts +5 -0
- package/build/Card/Cvc.d.ts.map +1 -0
- package/build/Card/Cvc.test.d.ts +2 -0
- package/build/Card/Cvc.test.d.ts.map +1 -0
- package/build/Card/Expiry.d.ts +5 -0
- package/build/Card/Expiry.d.ts.map +1 -0
- package/build/Card/Holder.d.ts +5 -0
- package/build/Card/Holder.d.ts.map +1 -0
- package/build/Card/Number.d.ts +5 -0
- package/build/Card/Number.d.ts.map +1 -0
- package/build/Card/Number.test.d.ts +2 -0
- package/build/Card/Number.test.d.ts.map +1 -0
- package/build/Card/Root.d.ts +36 -0
- package/build/Card/Root.d.ts.map +1 -0
- package/build/Card/Root.test.d.ts +2 -0
- package/build/Card/Root.test.d.ts.map +1 -0
- package/build/Card/index.d.ts +23 -0
- package/build/Card/index.d.ts.map +1 -0
- package/build/Card/schema.d.ts +30 -0
- package/build/Card/schema.d.ts.map +1 -0
- package/build/Card/types.d.ts +31 -0
- package/build/Card/types.d.ts.map +1 -0
- package/build/Card/utils.d.ts +17 -0
- package/build/Card/utils.d.ts.map +1 -0
- package/build/Card/utils.test.d.ts +2 -0
- package/build/Card/utils.test.d.ts.map +1 -0
- package/build/EvervaultProvider.d.ts +7 -0
- package/build/EvervaultProvider.d.ts.map +1 -0
- package/build/EvervaultProvider.test.d.ts +2 -0
- package/build/EvervaultProvider.test.d.ts.map +1 -0
- package/build/Input.d.ts +14 -0
- package/build/Input.d.ts.map +1 -0
- package/build/Input.test.d.ts +2 -0
- package/build/Input.test.d.ts.map +1 -0
- package/build/ThreeDSecure/Frame.d.ts +6 -0
- package/build/ThreeDSecure/Frame.d.ts.map +1 -0
- package/build/ThreeDSecure/Frame.test.d.ts +2 -0
- package/build/ThreeDSecure/Frame.test.d.ts.map +1 -0
- package/build/ThreeDSecure/Root.d.ts +10 -0
- package/build/ThreeDSecure/Root.d.ts.map +1 -0
- package/build/ThreeDSecure/Root.test.d.ts +2 -0
- package/build/ThreeDSecure/Root.test.d.ts.map +1 -0
- package/build/ThreeDSecure/config.d.ts +3 -0
- package/build/ThreeDSecure/config.d.ts.map +1 -0
- package/build/ThreeDSecure/context.d.ts +3 -0
- package/build/ThreeDSecure/context.d.ts.map +1 -0
- package/build/ThreeDSecure/index.d.ts +10 -0
- package/build/ThreeDSecure/index.d.ts.map +1 -0
- package/build/ThreeDSecure/session.d.ts +6 -0
- package/build/ThreeDSecure/session.d.ts.map +1 -0
- package/build/ThreeDSecure/session.test.d.ts +2 -0
- package/build/ThreeDSecure/session.test.d.ts.map +1 -0
- package/build/ThreeDSecure/types.d.ts +57 -0
- package/build/ThreeDSecure/types.d.ts.map +1 -0
- package/build/ThreeDSecure/useThreeDSecure.d.ts +3 -0
- package/build/ThreeDSecure/useThreeDSecure.d.ts.map +1 -0
- package/build/ThreeDSecure/useThreeDSecure.test.d.ts +2 -0
- package/build/ThreeDSecure/useThreeDSecure.test.d.ts.map +1 -0
- package/build/__mocks__/NativeEvervault.d.ts +4 -0
- package/build/__mocks__/NativeEvervault.d.ts.map +1 -0
- package/build/__mocks__/react-native-webview.d.ts +3 -0
- package/build/__mocks__/react-native-webview.d.ts.map +1 -0
- package/build/context.d.ts +9 -0
- package/build/context.d.ts.map +1 -0
- package/build/generated/ios/FBReactNativeSpec/FBReactNativeSpec-generated.mm +2321 -0
- package/build/generated/ios/FBReactNativeSpec/FBReactNativeSpec.h +2761 -0
- package/build/generated/ios/FBReactNativeSpecJSI-generated.cpp +2923 -0
- package/build/generated/ios/FBReactNativeSpecJSI.h +7718 -0
- package/build/generated/ios/NativeEvervaultSpec/NativeEvervaultSpec-generated.mm +74 -0
- package/build/generated/ios/NativeEvervaultSpec/NativeEvervaultSpec.h +80 -0
- package/build/generated/ios/NativeEvervaultSpecJSI-generated.cpp +68 -0
- package/build/generated/ios/NativeEvervaultSpecJSI.h +112 -0
- package/build/generated/ios/RCTModulesConformingToProtocolsProvider.h +18 -0
- package/build/generated/ios/RCTModulesConformingToProtocolsProvider.mm +33 -0
- package/build/generated/ios/RNCWebViewSpec/RNCWebViewSpec-generated.mm +46 -0
- package/build/generated/ios/RNCWebViewSpec/RNCWebViewSpec.h +62 -0
- package/build/generated/ios/RNCWebViewSpecJSI-generated.cpp +35 -0
- package/build/generated/ios/RNCWebViewSpecJSI.h +76 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.cpp +22 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ComponentDescriptors.h +24 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/EventEmitters.cpp +241 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/EventEmitters.h +263 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/Props.cpp +99 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/Props.h +488 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/RCTComponentViewHelpers.h +218 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ShadowNodes.cpp +17 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/ShadowNodes.h +32 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/States.cpp +16 -0
- package/build/generated/ios/react/renderer/components/RNCWebViewSpec/States.h +29 -0
- package/build/index.cjs.js +7732 -0
- package/build/index.cjs.js.map +1 -0
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.esm.js +7702 -0
- package/build/sdk.d.ts +9 -0
- package/build/sdk.d.ts.map +1 -0
- package/build/sdk.test.d.ts +2 -0
- package/build/sdk.test.d.ts.map +1 -0
- package/build/specs/NativeEvervault.d.ts +59 -0
- package/build/specs/NativeEvervault.d.ts.map +1 -0
- package/build/useEvervault.d.ts +2 -0
- package/build/useEvervault.d.ts.map +1 -0
- package/build/useEvervault.test.d.ts +2 -0
- package/build/useEvervault.test.d.ts.map +1 -0
- package/build/utils.d.ts +15 -0
- package/build/utils.d.ts.map +1 -0
- package/ios/NativeEvervault-Bridging-Header.h +2 -0
- package/ios/NativeEvervault.mm +38 -0
- package/ios/NativeEvervault.swift +62 -0
- package/native-evervault.podspec +20 -0
- package/package.json +85 -0
- package/src/Card/Cvc.test.tsx +41 -0
- package/src/Card/Cvc.tsx +51 -0
- package/src/Card/Expiry.tsx +26 -0
- package/src/Card/Holder.tsx +27 -0
- package/src/Card/Number.test.tsx +55 -0
- package/src/Card/Number.tsx +47 -0
- package/src/Card/Root.test.tsx +260 -0
- package/src/Card/Root.tsx +118 -0
- package/src/Card/index.ts +28 -0
- package/src/Card/schema.ts +51 -0
- package/src/Card/types.ts +50 -0
- package/src/Card/utils.test.ts +271 -0
- package/src/Card/utils.ts +127 -0
- package/src/EvervaultProvider.test.tsx +24 -0
- package/src/EvervaultProvider.tsx +43 -0
- package/src/Input.test.tsx +138 -0
- package/src/Input.tsx +136 -0
- package/src/ThreeDSecure/Frame.test.tsx +87 -0
- package/src/ThreeDSecure/Frame.tsx +50 -0
- package/src/ThreeDSecure/Root.test.tsx +67 -0
- package/src/ThreeDSecure/Root.tsx +23 -0
- package/src/ThreeDSecure/config.ts +3 -0
- package/src/ThreeDSecure/context.ts +6 -0
- package/src/ThreeDSecure/index.ts +17 -0
- package/src/ThreeDSecure/session.test.ts +329 -0
- package/src/ThreeDSecure/session.ts +132 -0
- package/src/ThreeDSecure/types.ts +67 -0
- package/src/ThreeDSecure/useThreeDSecure.test.tsx +133 -0
- package/src/ThreeDSecure/useThreeDSecure.ts +47 -0
- package/src/__mocks__/NativeEvervault.ts +13 -0
- package/src/__mocks__/react-native-webview.tsx +6 -0
- package/src/context.ts +14 -0
- package/src/index.ts +21 -0
- package/src/sdk.test.ts +122 -0
- package/src/sdk.ts +71 -0
- package/src/specs/NativeEvervault.ts +67 -0
- package/src/useEvervault.test.tsx +31 -0
- package/src/useEvervault.ts +14 -0
- 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
|
+
};
|
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";
|
package/src/sdk.test.ts
ADDED
|
@@ -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
|
+
}
|