@evervault/react-native 2.5.1 → 2.6.1
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 +0 -2
- package/build/cjs/Card/Cvc.js +29 -0
- package/build/cjs/Card/Expiry.js +12 -0
- package/build/cjs/Card/Holder.js +15 -0
- package/build/cjs/Card/Number.js +27 -0
- package/build/cjs/Card/Root.js +70 -0
- package/build/cjs/Card/index.js +20 -0
- package/build/cjs/Card/schema.js +32 -0
- package/build/cjs/Card/types.js +21 -0
- package/build/cjs/Card/utils.js +87 -0
- package/build/cjs/EvervaultProvider.js +17 -0
- package/build/cjs/Input.js +107 -0
- package/build/cjs/ThreeDSecure/Frame.js +37 -0
- package/build/cjs/ThreeDSecure/Root.js +14 -0
- package/build/cjs/ThreeDSecure/config.js +7 -0
- package/build/cjs/ThreeDSecure/context.js +7 -0
- package/build/cjs/ThreeDSecure/event.js +20 -0
- package/build/cjs/ThreeDSecure/index.js +12 -0
- package/build/cjs/ThreeDSecure/session.js +141 -0
- package/build/cjs/ThreeDSecure/types.js +2 -0
- package/build/cjs/ThreeDSecure/useThreeDSecure.js +44 -0
- package/build/cjs/__mocks__/NativeEvervault.js +14 -0
- package/build/cjs/__mocks__/react-native-webview.js +10 -0
- package/build/cjs/context.js +7 -0
- package/build/cjs/index.js +25 -0
- package/build/cjs/node_modules/@hookform/resolvers/dist/resolvers.js +8 -0
- package/build/cjs/node_modules/@hookform/resolvers/zod/dist/zod.js +8 -0
- package/build/cjs/node_modules/react-hook-form/dist/index.esm.js +2221 -0
- package/build/cjs/node_modules/react-native-mask-input/lib/module/MaskInput.js +60 -0
- package/build/cjs/node_modules/react-native-mask-input/lib/module/formatWithMask.js +92 -0
- package/build/cjs/node_modules/react-native-mask-input/lib/module/index.js +10 -0
- package/build/cjs/node_modules/react-native-mask-input/lib/module/useMaskedInputProps.js +93 -0
- package/build/{index.cjs.js → cjs/node_modules/zod/lib/index.js} +193 -3490
- package/build/cjs/packages/card-validator/dist/evervault-card-validator.main.js +349 -0
- package/build/cjs/sdk.js +53 -0
- package/build/cjs/specs/NativeEvervault.js +7 -0
- package/build/cjs/useEvervault.js +14 -0
- package/build/cjs/utils.js +34 -0
- package/build/{Card → esm/Card}/Cvc.d.ts +0 -1
- package/build/esm/Card/Cvc.js +27 -0
- package/build/{Card → esm/Card}/Expiry.d.ts +0 -1
- package/build/esm/Card/Expiry.js +10 -0
- package/build/{Card → esm/Card}/Holder.d.ts +0 -1
- package/build/esm/Card/Holder.js +13 -0
- package/build/{Card → esm/Card}/Number.d.ts +0 -1
- package/build/esm/Card/Number.js +25 -0
- package/build/{Card → esm/Card}/Root.d.ts +0 -1
- package/build/esm/Card/Root.js +68 -0
- package/build/{Card → esm/Card}/index.d.ts +0 -1
- package/build/esm/Card/index.js +14 -0
- package/build/{Card → esm/Card}/schema.d.ts +0 -1
- package/build/esm/Card/schema.js +30 -0
- package/build/{Card → esm/Card}/types.d.ts +0 -1
- package/build/esm/Card/types.js +19 -0
- package/build/{Card → esm/Card}/utils.d.ts +0 -1
- package/build/esm/Card/utils.js +82 -0
- package/build/{EvervaultProvider.d.ts → esm/EvervaultProvider.d.ts} +0 -1
- package/build/esm/EvervaultProvider.js +15 -0
- package/build/{Input.d.ts → esm/Input.d.ts} +0 -1
- package/build/esm/Input.js +103 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/Frame.d.ts +0 -1
- package/build/esm/ThreeDSecure/Frame.js +35 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/Root.d.ts +0 -1
- package/build/esm/ThreeDSecure/Root.js +12 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/config.d.ts +0 -1
- package/build/esm/ThreeDSecure/config.js +4 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/context.d.ts +0 -1
- package/build/esm/ThreeDSecure/context.js +5 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/event.d.ts +0 -1
- package/build/esm/ThreeDSecure/event.js +18 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/index.d.ts +0 -1
- package/build/esm/ThreeDSecure/index.js +9 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/session.d.ts +0 -1
- package/build/esm/ThreeDSecure/session.js +136 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/types.d.ts +0 -1
- package/build/esm/ThreeDSecure/types.js +1 -0
- package/build/{ThreeDSecure → esm/ThreeDSecure}/useThreeDSecure.d.ts +0 -1
- package/build/esm/ThreeDSecure/useThreeDSecure.js +42 -0
- package/build/{__mocks__ → esm/__mocks__}/NativeEvervault.d.ts +0 -1
- package/build/esm/__mocks__/NativeEvervault.js +11 -0
- package/build/{__mocks__ → esm/__mocks__}/react-native-webview.d.ts +0 -1
- package/build/esm/__mocks__/react-native-webview.js +8 -0
- package/build/{context.d.ts → esm/context.d.ts} +0 -1
- package/build/esm/context.js +5 -0
- package/build/{index.d.ts → esm/index.d.ts} +0 -1
- package/build/esm/index.js +14 -0
- package/build/esm/node_modules/@hookform/resolvers/dist/resolvers.js +5 -0
- package/build/esm/node_modules/@hookform/resolvers/zod/dist/zod.js +6 -0
- package/build/esm/node_modules/react-hook-form/dist/index.esm.js +2211 -0
- package/build/esm/node_modules/react-native-mask-input/lib/module/MaskInput.js +37 -0
- package/build/esm/node_modules/react-native-mask-input/lib/module/formatWithMask.js +88 -0
- package/build/esm/node_modules/react-native-mask-input/lib/module/index.js +6 -0
- package/build/esm/node_modules/react-native-mask-input/lib/module/useMaskedInputProps.js +70 -0
- package/build/{index.esm.js → esm/node_modules/zod/lib/index.js} +1 -3377
- package/build/esm/packages/card-validator/dist/evervault-card-validator.main.js +345 -0
- package/build/{sdk.d.ts → esm/sdk.d.ts} +0 -1
- package/build/esm/sdk.js +51 -0
- package/build/{specs → esm/specs}/NativeEvervault.d.ts +0 -1
- package/build/esm/specs/NativeEvervault.js +5 -0
- package/build/{useEvervault.d.ts → esm/useEvervault.d.ts} +0 -1
- package/build/esm/useEvervault.js +12 -0
- package/build/{utils.d.ts → esm/utils.d.ts} +0 -1
- package/build/esm/utils.js +31 -0
- package/package.json +9 -20
- package/build/Card/Cvc.d.ts.map +0 -1
- package/build/Card/Cvc.test.d.ts +0 -2
- package/build/Card/Cvc.test.d.ts.map +0 -1
- package/build/Card/Expiry.d.ts.map +0 -1
- package/build/Card/Holder.d.ts.map +0 -1
- package/build/Card/Number.d.ts.map +0 -1
- package/build/Card/Number.test.d.ts +0 -2
- package/build/Card/Number.test.d.ts.map +0 -1
- package/build/Card/Root.d.ts.map +0 -1
- package/build/Card/Root.test.d.ts +0 -2
- package/build/Card/Root.test.d.ts.map +0 -1
- package/build/Card/index.d.ts.map +0 -1
- package/build/Card/schema.d.ts.map +0 -1
- package/build/Card/types.d.ts.map +0 -1
- package/build/Card/utils.d.ts.map +0 -1
- package/build/Card/utils.test.d.ts +0 -2
- package/build/Card/utils.test.d.ts.map +0 -1
- package/build/EvervaultProvider.d.ts.map +0 -1
- package/build/EvervaultProvider.test.d.ts +0 -2
- package/build/EvervaultProvider.test.d.ts.map +0 -1
- package/build/Input.d.ts.map +0 -1
- package/build/Input.test.d.ts +0 -2
- package/build/Input.test.d.ts.map +0 -1
- package/build/ThreeDSecure/Frame.d.ts.map +0 -1
- package/build/ThreeDSecure/Frame.test.d.ts +0 -2
- package/build/ThreeDSecure/Frame.test.d.ts.map +0 -1
- package/build/ThreeDSecure/Root.d.ts.map +0 -1
- package/build/ThreeDSecure/Root.test.d.ts +0 -2
- package/build/ThreeDSecure/Root.test.d.ts.map +0 -1
- package/build/ThreeDSecure/config.d.ts.map +0 -1
- package/build/ThreeDSecure/context.d.ts.map +0 -1
- package/build/ThreeDSecure/event.d.ts.map +0 -1
- package/build/ThreeDSecure/index.d.ts.map +0 -1
- package/build/ThreeDSecure/session.d.ts.map +0 -1
- package/build/ThreeDSecure/session.test.d.ts +0 -2
- package/build/ThreeDSecure/session.test.d.ts.map +0 -1
- package/build/ThreeDSecure/types.d.ts.map +0 -1
- package/build/ThreeDSecure/useThreeDSecure.d.ts.map +0 -1
- package/build/ThreeDSecure/useThreeDSecure.test.d.ts +0 -2
- package/build/ThreeDSecure/useThreeDSecure.test.d.ts.map +0 -1
- package/build/__mocks__/NativeEvervault.d.ts.map +0 -1
- package/build/__mocks__/react-native-webview.d.ts.map +0 -1
- package/build/context.d.ts.map +0 -1
- package/build/index.cjs.js.map +0 -1
- package/build/index.d.ts.map +0 -1
- package/build/sdk.d.ts.map +0 -1
- package/build/sdk.test.d.ts +0 -2
- package/build/sdk.test.d.ts.map +0 -1
- package/build/specs/NativeEvervault.d.ts.map +0 -1
- package/build/useEvervault.d.ts.map +0 -1
- package/build/useEvervault.test.d.ts +0 -2
- package/build/useEvervault.test.d.ts.map +0 -1
- package/build/utils.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -8,8 +8,6 @@ The [Evervault](https://evervault.com/) React Native SDK is a toolkit for encryp
|
|
|
8
8
|
|
|
9
9
|
Before starting with the Evervault React Native SDK, you will need to [create an account](https://app.evervault.com/register) and a team.
|
|
10
10
|
|
|
11
|
-
For full installation support, [book time here](https://calendly.com/evervault/support).
|
|
12
|
-
|
|
13
11
|
## Documentation
|
|
14
12
|
|
|
15
13
|
See the Evervault [React Native SDK documentation](https://docs.evervault.com/sdks/react-native).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var Input = require('../Input.js');
|
|
6
|
+
var evervaultCardValidator_main = require('../packages/card-validator/dist/evervault-card-validator.main.js');
|
|
7
|
+
var index_esm = require('../node_modules/react-hook-form/dist/index.esm.js');
|
|
8
|
+
|
|
9
|
+
const DEFAULT_CARD_CVC_MASK = Input.mask("[999]");
|
|
10
|
+
const CARD_CVC_MASKS = {
|
|
11
|
+
"american-express": Input.mask("[9999]"),
|
|
12
|
+
};
|
|
13
|
+
const CardCvc = React.forwardRef(function CardCvc(props, ref) {
|
|
14
|
+
const methods = index_esm.useFormContext();
|
|
15
|
+
const number = methods.watch("number");
|
|
16
|
+
const mask = React.useMemo(() => {
|
|
17
|
+
if (!number) {
|
|
18
|
+
return DEFAULT_CARD_CVC_MASK;
|
|
19
|
+
}
|
|
20
|
+
const brand = evervaultCardValidator_main.validateNumber(number).brand;
|
|
21
|
+
if (brand && CARD_CVC_MASKS[brand]) {
|
|
22
|
+
return CARD_CVC_MASKS[brand];
|
|
23
|
+
}
|
|
24
|
+
return DEFAULT_CARD_CVC_MASK;
|
|
25
|
+
}, [number]);
|
|
26
|
+
return (jsxRuntime.jsx(Input.EvervaultInput, { placeholder: "CVC", ...props, ref: ref, name: "cvc", mask: mask, inputMode: "numeric", autoComplete: "cc-csc", keyboardType: "number-pad" }));
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
exports.CardCvc = CardCvc;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var Input = require('../Input.js');
|
|
6
|
+
|
|
7
|
+
const CARD_EXPIRY_MASK = Input.mask("99 / 99");
|
|
8
|
+
const CardExpiry = React.forwardRef(function CardExpiry(props, ref) {
|
|
9
|
+
return (jsxRuntime.jsx(Input.EvervaultInput, { placeholder: "MM / YY", ...props, ref: ref, name: "expiry", mask: CARD_EXPIRY_MASK, inputMode: "numeric", autoComplete: "cc-exp", keyboardType: "number-pad" }));
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
exports.CardExpiry = CardExpiry;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var reactNative = require('react-native');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var Input = require('../Input.js');
|
|
7
|
+
|
|
8
|
+
const CardHolder = React.forwardRef(function CardHolder(props, ref) {
|
|
9
|
+
return (jsxRuntime.jsx(Input.EvervaultInput, { placeholder: "Johnny Appleseed", ...props, ref: ref, name: "name", inputMode: "text", autoComplete: reactNative.Platform.select({
|
|
10
|
+
ios: "cc-name",
|
|
11
|
+
default: "name",
|
|
12
|
+
}), keyboardType: "default" }));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
exports.CardHolder = CardHolder;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var Input = require('../Input.js');
|
|
6
|
+
var evervaultCardValidator_main = require('../packages/card-validator/dist/evervault-card-validator.main.js');
|
|
7
|
+
|
|
8
|
+
const DEFAULT_CARD_NUMBER_MASK = Input.mask("9999 99[99 9999 9999]");
|
|
9
|
+
const CARD_NUMBER_MASKS = {
|
|
10
|
+
unionpay: Input.mask("9999 99[99 9999 9999 999]"),
|
|
11
|
+
"american-express": Input.mask("9999 99[9999 99999]"),
|
|
12
|
+
};
|
|
13
|
+
const CardNumber = React.forwardRef(function CardNumber(props, ref) {
|
|
14
|
+
const mask = React.useCallback((text) => {
|
|
15
|
+
if (!text) {
|
|
16
|
+
return DEFAULT_CARD_NUMBER_MASK;
|
|
17
|
+
}
|
|
18
|
+
const brand = evervaultCardValidator_main.validateNumber(text).brand;
|
|
19
|
+
if (brand && CARD_NUMBER_MASKS[brand]) {
|
|
20
|
+
return CARD_NUMBER_MASKS[brand];
|
|
21
|
+
}
|
|
22
|
+
return DEFAULT_CARD_NUMBER_MASK;
|
|
23
|
+
}, []);
|
|
24
|
+
return (jsxRuntime.jsx(Input.EvervaultInput, { placeholder: "1234 1234 1234 1234", ...props, ref: ref, name: "number", mask: mask, inputMode: "numeric", autoComplete: "cc-number", keyboardType: "number-pad" }));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
exports.CardNumber = CardNumber;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var index_esm = require('../node_modules/react-hook-form/dist/index.esm.js');
|
|
6
|
+
var schema = require('./schema.js');
|
|
7
|
+
var zod = require('../node_modules/@hookform/resolvers/zod/dist/zod.js');
|
|
8
|
+
var useEvervault = require('../useEvervault.js');
|
|
9
|
+
var utils = require('./utils.js');
|
|
10
|
+
var Input = require('../Input.js');
|
|
11
|
+
|
|
12
|
+
const DEFAULT_ACCEPTED_BRANDS = [];
|
|
13
|
+
const Card = React.forwardRef(function Card({ children, defaultValues, onChange, onError, acceptedBrands = DEFAULT_ACCEPTED_BRANDS, validationMode = "all", }, ref) {
|
|
14
|
+
const evervault = useEvervault.useEvervault();
|
|
15
|
+
const resolver = React.useMemo(() => {
|
|
16
|
+
const schema$1 = schema.getCardFormSchema(acceptedBrands);
|
|
17
|
+
return zod.zodResolver(schema$1);
|
|
18
|
+
}, [acceptedBrands]);
|
|
19
|
+
const methods = index_esm.useForm({
|
|
20
|
+
defaultValues,
|
|
21
|
+
resolver,
|
|
22
|
+
mode: validationMode,
|
|
23
|
+
shouldUseNativeValidation: false,
|
|
24
|
+
});
|
|
25
|
+
const inputContext = React.useMemo(() => ({
|
|
26
|
+
validationMode,
|
|
27
|
+
}), [validationMode]);
|
|
28
|
+
// Use refs to prevent closures from being captured
|
|
29
|
+
const onChangeRef = React.useRef(onChange);
|
|
30
|
+
onChangeRef.current = onChange;
|
|
31
|
+
const onErrorRef = React.useRef(onError);
|
|
32
|
+
onErrorRef.current = onError;
|
|
33
|
+
React.useEffect(() => {
|
|
34
|
+
if (!onChange)
|
|
35
|
+
return;
|
|
36
|
+
let abortController;
|
|
37
|
+
function handleChange(values) {
|
|
38
|
+
if (abortController) {
|
|
39
|
+
abortController.abort();
|
|
40
|
+
}
|
|
41
|
+
abortController = new AbortController();
|
|
42
|
+
const signal = abortController.signal;
|
|
43
|
+
requestAnimationFrame(async () => {
|
|
44
|
+
try {
|
|
45
|
+
const payload = await utils.formatPayload(values, {
|
|
46
|
+
encrypt: evervault.encrypt,
|
|
47
|
+
form: methods,
|
|
48
|
+
});
|
|
49
|
+
if (signal.aborted)
|
|
50
|
+
return;
|
|
51
|
+
onChangeRef.current?.(payload);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
onErrorRef.current?.(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
handleChange(methods.getValues());
|
|
59
|
+
const subscription = methods.watch(handleChange);
|
|
60
|
+
return () => subscription.unsubscribe();
|
|
61
|
+
}, [evervault.encrypt]);
|
|
62
|
+
React.useImperativeHandle(ref, React.useCallback(() => ({
|
|
63
|
+
reset() {
|
|
64
|
+
methods.reset();
|
|
65
|
+
},
|
|
66
|
+
}), []));
|
|
67
|
+
return (jsxRuntime.jsx(index_esm.FormProvider, { ...methods, children: jsxRuntime.jsx(Input.EvervaultInputContext.Provider, { value: inputContext, children: children }) }));
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
exports.Card = Card;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Root = require('./Root.js');
|
|
4
|
+
var Holder = require('./Holder.js');
|
|
5
|
+
var Expiry = require('./Expiry.js');
|
|
6
|
+
var Cvc = require('./Cvc.js');
|
|
7
|
+
var Number = require('./Number.js');
|
|
8
|
+
|
|
9
|
+
const Card = Object.assign(Root.Card, {
|
|
10
|
+
Holder: Holder.CardHolder,
|
|
11
|
+
Expiry: Expiry.CardExpiry,
|
|
12
|
+
Cvc: Cvc.CardCvc,
|
|
13
|
+
Number: Number.CardNumber,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
exports.CardHolder = Holder.CardHolder;
|
|
17
|
+
exports.CardExpiry = Expiry.CardExpiry;
|
|
18
|
+
exports.CardCvc = Cvc.CardCvc;
|
|
19
|
+
exports.CardNumber = Number.CardNumber;
|
|
20
|
+
exports.Card = Card;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index = require('../node_modules/zod/lib');
|
|
4
|
+
var evervaultCardValidator_main = require('../packages/card-validator/dist/evervault-card-validator.main.js');
|
|
5
|
+
var utils = require('./utils.js');
|
|
6
|
+
|
|
7
|
+
function getCardFormSchema(acceptedBrands) {
|
|
8
|
+
return index.default.object({
|
|
9
|
+
name: index.default.string().min(1, "Missing name"),
|
|
10
|
+
number: index.default
|
|
11
|
+
.string()
|
|
12
|
+
.min(1, "Required")
|
|
13
|
+
.refine((value) => evervaultCardValidator_main.validateNumber(value).isValid, {
|
|
14
|
+
message: "Invalid card number",
|
|
15
|
+
})
|
|
16
|
+
.refine((value) => utils.isAcceptedBrand(acceptedBrands, evervaultCardValidator_main.validateNumber(value)), { message: "Brand not accepted" }),
|
|
17
|
+
expiry: index.default
|
|
18
|
+
.string()
|
|
19
|
+
.min(1, "Required")
|
|
20
|
+
.refine((value) => evervaultCardValidator_main.validateExpiry(value).isValid, {
|
|
21
|
+
message: "Invalid expiry",
|
|
22
|
+
}),
|
|
23
|
+
cvc: index.default
|
|
24
|
+
.string()
|
|
25
|
+
.min(1, "Required")
|
|
26
|
+
.refine((value) => evervaultCardValidator_main.validateCVC(value).isValid, {
|
|
27
|
+
message: "Invalid CVC",
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.getCardFormSchema = getCardFormSchema;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const CARD_BRAND_NAMES = [
|
|
4
|
+
"american-express",
|
|
5
|
+
"visa",
|
|
6
|
+
"mastercard",
|
|
7
|
+
"discover",
|
|
8
|
+
"jcb",
|
|
9
|
+
"diners-club",
|
|
10
|
+
"unionpay",
|
|
11
|
+
"maestro",
|
|
12
|
+
"mir",
|
|
13
|
+
"elo",
|
|
14
|
+
"hipercard",
|
|
15
|
+
"hiper",
|
|
16
|
+
"szep",
|
|
17
|
+
"uatp",
|
|
18
|
+
"rupay",
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
exports.CARD_BRAND_NAMES = CARD_BRAND_NAMES;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var evervaultCardValidator_main = require('../packages/card-validator/dist/evervault-card-validator.main.js');
|
|
4
|
+
|
|
5
|
+
async function formatPayload(values, context) {
|
|
6
|
+
const number = values.number?.replace(/\s/g, "") || "";
|
|
7
|
+
const { brand, localBrands, bin, lastFour, isValid: isNumberValid, } = evervaultCardValidator_main.validateNumber(number);
|
|
8
|
+
if (number.length > 0 &&
|
|
9
|
+
brand !== "american-express" &&
|
|
10
|
+
values.cvc?.length === 4) {
|
|
11
|
+
context.form.setValue("cvc", values.cvc?.slice(0, 3));
|
|
12
|
+
}
|
|
13
|
+
const { cvc, isValid: isCvcValid } = evervaultCardValidator_main.validateCVC(values.cvc ?? "", number);
|
|
14
|
+
const formErrors = context.form.formState.errors;
|
|
15
|
+
const isValid = !Object.keys(formErrors).length;
|
|
16
|
+
const isComplete = areValuesComplete(values);
|
|
17
|
+
const errors = {};
|
|
18
|
+
if (formErrors.name?.message) {
|
|
19
|
+
errors.name = formErrors.name.message;
|
|
20
|
+
}
|
|
21
|
+
if (formErrors.number?.message) {
|
|
22
|
+
errors.number = formErrors.number.message;
|
|
23
|
+
}
|
|
24
|
+
if (formErrors.expiry?.message) {
|
|
25
|
+
errors.expiry = formErrors.expiry.message;
|
|
26
|
+
}
|
|
27
|
+
if (formErrors.cvc?.message) {
|
|
28
|
+
errors.cvc = formErrors.cvc.message;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
card: {
|
|
32
|
+
name: values.name ?? null,
|
|
33
|
+
brand,
|
|
34
|
+
localBrands,
|
|
35
|
+
bin,
|
|
36
|
+
lastFour,
|
|
37
|
+
expiry: formatExpiry(values.expiry ?? ""),
|
|
38
|
+
number: isNumberValid ? await context.encrypt(number) : null,
|
|
39
|
+
cvc: isCvcValid ? await context.encrypt(cvc ?? "") : null,
|
|
40
|
+
},
|
|
41
|
+
isComplete,
|
|
42
|
+
isValid: isValid && isComplete,
|
|
43
|
+
errors,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function areValuesComplete(values) {
|
|
47
|
+
if ("name" in values && !values.name?.length) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if ("number" in values && !evervaultCardValidator_main.validateNumber(values.number ?? "").isValid) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
if ("expiry" in values && !evervaultCardValidator_main.validateExpiry(values.expiry ?? "").isValid) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if ("cvc" in values &&
|
|
57
|
+
!evervaultCardValidator_main.validateCVC(values.cvc ?? "", values.number).isValid) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
function isAcceptedBrand(acceptedBrands, cardNumberValidationResult) {
|
|
63
|
+
if (!acceptedBrands?.length)
|
|
64
|
+
return true;
|
|
65
|
+
if (!cardNumberValidationResult.isValid)
|
|
66
|
+
return false;
|
|
67
|
+
const { brand, localBrands } = cardNumberValidationResult;
|
|
68
|
+
const acceptedBrandsSet = new Set(acceptedBrands);
|
|
69
|
+
const isBrandAccepted = brand !== null && acceptedBrandsSet.has(brand);
|
|
70
|
+
const isLocalBrandAccepted = localBrands.some((localBrand) => acceptedBrandsSet.has(localBrand));
|
|
71
|
+
return isBrandAccepted || isLocalBrandAccepted;
|
|
72
|
+
}
|
|
73
|
+
function formatExpiry(expiry) {
|
|
74
|
+
const parsedExpiry = evervaultCardValidator_main.validateExpiry(expiry);
|
|
75
|
+
if (!parsedExpiry.isValid) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
month: parsedExpiry.month,
|
|
80
|
+
year: parsedExpiry.year,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
exports.areValuesComplete = areValuesComplete;
|
|
85
|
+
exports.formatExpiry = formatExpiry;
|
|
86
|
+
exports.formatPayload = formatPayload;
|
|
87
|
+
exports.isAcceptedBrand = isAcceptedBrand;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var context = require('./context.js');
|
|
6
|
+
var sdk = require('./sdk.js');
|
|
7
|
+
|
|
8
|
+
function EvervaultProvider({ teamId, appId, children, }) {
|
|
9
|
+
const instanceId = React.useMemo(() => sdk.sdk.initialize(teamId, appId), [teamId, appId]);
|
|
10
|
+
const encrypt = React.useCallback(function (data) {
|
|
11
|
+
return sdk.sdk.encrypt(instanceId, data);
|
|
12
|
+
}, [instanceId]);
|
|
13
|
+
const context$1 = React.useMemo(() => ({ teamId, appId, encrypt }), [teamId, appId, encrypt]);
|
|
14
|
+
return (jsxRuntime.jsx(context.EvervaultContext.Provider, { value: context$1, children: children }));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.EvervaultProvider = EvervaultProvider;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var utils = require('./utils.js');
|
|
6
|
+
var index_esm = require('./node_modules/react-hook-form/dist/index.esm.js');
|
|
7
|
+
var MaskInput = require('./node_modules/react-native-mask-input/lib/module/MaskInput.js');
|
|
8
|
+
|
|
9
|
+
const EvervaultInputContext = React.createContext({
|
|
10
|
+
validationMode: "all",
|
|
11
|
+
});
|
|
12
|
+
function useForwardedInputRef(ref) {
|
|
13
|
+
const inputRef = React.useRef(null);
|
|
14
|
+
React.useImperativeHandle(ref, React.useCallback(() => ({
|
|
15
|
+
isFocused() {
|
|
16
|
+
return inputRef.current?.isFocused() ?? false;
|
|
17
|
+
},
|
|
18
|
+
focus() {
|
|
19
|
+
inputRef.current?.focus();
|
|
20
|
+
},
|
|
21
|
+
blur() {
|
|
22
|
+
inputRef.current?.blur();
|
|
23
|
+
},
|
|
24
|
+
clear() {
|
|
25
|
+
inputRef.current?.clear();
|
|
26
|
+
},
|
|
27
|
+
measure(callback) {
|
|
28
|
+
inputRef.current?.measure(callback);
|
|
29
|
+
},
|
|
30
|
+
measureInWindow(callback) {
|
|
31
|
+
inputRef.current?.measureInWindow(callback);
|
|
32
|
+
},
|
|
33
|
+
measureLayout(relativeToNativeComponentRef, onSuccess, onFail) {
|
|
34
|
+
inputRef.current?.measureLayout(relativeToNativeComponentRef, onSuccess, onFail);
|
|
35
|
+
},
|
|
36
|
+
}), [inputRef]));
|
|
37
|
+
return inputRef;
|
|
38
|
+
}
|
|
39
|
+
function mask(format) {
|
|
40
|
+
const maskArray = [];
|
|
41
|
+
let isObfuscated = false;
|
|
42
|
+
format.split("").forEach((char) => {
|
|
43
|
+
if (char === "[") {
|
|
44
|
+
isObfuscated = true;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
else if (char === "]") {
|
|
48
|
+
isObfuscated = false;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
let value = char;
|
|
52
|
+
if (char === "9") {
|
|
53
|
+
value = isObfuscated ? [/\d/] : /\d/;
|
|
54
|
+
}
|
|
55
|
+
maskArray.push(value);
|
|
56
|
+
});
|
|
57
|
+
return maskArray;
|
|
58
|
+
}
|
|
59
|
+
const EvervaultInput = React.forwardRef(function EvervaultInput({ name, mask, obfuscateValue, ...props }, ref) {
|
|
60
|
+
const { validationMode } = React.useContext(EvervaultInputContext);
|
|
61
|
+
const inputRef = useForwardedInputRef(ref);
|
|
62
|
+
const methods = index_esm.useFormContext();
|
|
63
|
+
const { field, fieldState } = index_esm.useController({
|
|
64
|
+
control: methods.control,
|
|
65
|
+
name,
|
|
66
|
+
shouldUnregister: true,
|
|
67
|
+
});
|
|
68
|
+
const obfuscationCharacter = React.useMemo(() => {
|
|
69
|
+
if (typeof obfuscateValue === "string") {
|
|
70
|
+
return obfuscateValue;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return "•";
|
|
74
|
+
}
|
|
75
|
+
}, [obfuscateValue]);
|
|
76
|
+
return (jsxRuntime.jsx(MaskInput.default
|
|
77
|
+
// Overridable props
|
|
78
|
+
, {
|
|
79
|
+
// Overridable props
|
|
80
|
+
id: field.name, ...props,
|
|
81
|
+
// Strict props
|
|
82
|
+
ref: utils.mergeRefs(inputRef, field.ref), editable: !field.disabled && (props.editable ?? true), onBlur: (evt) => {
|
|
83
|
+
const shouldValidate = validationMode === "onBlur" ||
|
|
84
|
+
validationMode === "onTouched" ||
|
|
85
|
+
validationMode === "all";
|
|
86
|
+
methods.setValue(field.name, field.value, {
|
|
87
|
+
shouldDirty: true,
|
|
88
|
+
shouldTouch: true,
|
|
89
|
+
shouldValidate,
|
|
90
|
+
});
|
|
91
|
+
props.onBlur?.(evt);
|
|
92
|
+
}, mask: mask, maskAutoComplete: !!mask, obfuscationCharacter: obfuscationCharacter, showObfuscatedValue: !!obfuscateValue, value: field.value, onChangeText: (masked, unmasked) => {
|
|
93
|
+
const shouldValidate = (validationMode === "onTouched" && fieldState.isTouched) ||
|
|
94
|
+
((validationMode === "onChange" || validationMode === "all") &&
|
|
95
|
+
(!!fieldState.error || fieldState.isTouched));
|
|
96
|
+
methods.setValue(field.name, unmasked, {
|
|
97
|
+
shouldDirty: true,
|
|
98
|
+
shouldValidate,
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
// Remove unwanted props
|
|
102
|
+
defaultValue: undefined, onChange: undefined }));
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
exports.EvervaultInput = EvervaultInput;
|
|
106
|
+
exports.EvervaultInputContext = EvervaultInputContext;
|
|
107
|
+
exports.mask = mask;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var reactNative = require('react-native');
|
|
6
|
+
var useEvervault = require('../useEvervault.js');
|
|
7
|
+
var reactNativeWebview = require('react-native-webview');
|
|
8
|
+
var config = require('./config.js');
|
|
9
|
+
var context = require('./context.js');
|
|
10
|
+
|
|
11
|
+
function ThreeDSecureFrame({ style }) {
|
|
12
|
+
const evervault = useEvervault.useEvervault();
|
|
13
|
+
const context$1 = React.useContext(context.ThreeDSecureContext);
|
|
14
|
+
if (!context$1) {
|
|
15
|
+
throw new Error("`ThreeDSecure.Frame` must be used within a `ThreeDSecure` component.");
|
|
16
|
+
}
|
|
17
|
+
const uri = React.useMemo(() => {
|
|
18
|
+
if (!context$1.session)
|
|
19
|
+
return null;
|
|
20
|
+
const params = new URLSearchParams();
|
|
21
|
+
params.set("session", context$1.session.sessionId);
|
|
22
|
+
params.set("app", evervault.appId);
|
|
23
|
+
params.set("team", evervault.teamId);
|
|
24
|
+
return `https://${config.CHALLENGE_DOMAIN_3DS}/?${params.toString()}`;
|
|
25
|
+
}, [context$1.session, evervault.appId, evervault.teamId]);
|
|
26
|
+
if (!uri)
|
|
27
|
+
return null;
|
|
28
|
+
return (jsxRuntime.jsx(reactNativeWebview.WebView, { containerStyle: [defaultStyles.webView, style], source: { uri }, hideKeyboardAccessoryView: true, overScrollMode: "content" }));
|
|
29
|
+
}
|
|
30
|
+
const defaultStyles = reactNative.StyleSheet.create({
|
|
31
|
+
webView: {
|
|
32
|
+
flex: 1,
|
|
33
|
+
width: "100%",
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
exports.ThreeDSecureFrame = ThreeDSecureFrame;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var useEvervault = require('../useEvervault.js');
|
|
5
|
+
var context = require('./context.js');
|
|
6
|
+
|
|
7
|
+
function ThreeDSecure({ state, children }) {
|
|
8
|
+
useEvervault.useEvervault();
|
|
9
|
+
if (!state.session)
|
|
10
|
+
return null;
|
|
11
|
+
return (jsxRuntime.jsx(context.ThreeDSecureContext.Provider, { value: state, children: state.isVisible && children }));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.ThreeDSecure = ThreeDSecure;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const EV_API_DOMAIN = process.env.EV_API_DOMAIN || "api.evervault.com";
|
|
4
|
+
const CHALLENGE_DOMAIN_3DS = process.env.CHALLENGE_DOMAIN_3DS || "3ds.evervault.com";
|
|
5
|
+
|
|
6
|
+
exports.CHALLENGE_DOMAIN_3DS = CHALLENGE_DOMAIN_3DS;
|
|
7
|
+
exports.EV_API_DOMAIN = EV_API_DOMAIN;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class ThreeDSecureEvent {
|
|
4
|
+
type;
|
|
5
|
+
session;
|
|
6
|
+
_defaultPrevented;
|
|
7
|
+
constructor(type, session, _defaultPrevented = false) {
|
|
8
|
+
this.type = type;
|
|
9
|
+
this.session = session;
|
|
10
|
+
this._defaultPrevented = _defaultPrevented;
|
|
11
|
+
}
|
|
12
|
+
preventDefault() {
|
|
13
|
+
this._defaultPrevented = true;
|
|
14
|
+
}
|
|
15
|
+
get defaultPrevented() {
|
|
16
|
+
return this._defaultPrevented;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
exports.ThreeDSecureEvent = ThreeDSecureEvent;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Root = require('./Root.js');
|
|
4
|
+
var Frame = require('./Frame.js');
|
|
5
|
+
var useThreeDSecure = require('./useThreeDSecure.js');
|
|
6
|
+
|
|
7
|
+
const ThreeDSecure = Object.assign(Root.ThreeDSecure, {
|
|
8
|
+
Frame: Frame.ThreeDSecureFrame,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
exports.useThreeDSecure = useThreeDSecure.useThreeDSecure;
|
|
12
|
+
exports.ThreeDSecure = ThreeDSecure;
|