@evervault/evervault-react-native 1.0.1 → 1.1.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 +34 -39
- package/dist/commonjs/components/Card/Card.js +13 -13
- package/dist/commonjs/components/Card/CardCVC.js +7 -7
- package/dist/commonjs/components/Card/CardExpiry.js +6 -6
- package/dist/commonjs/components/Card/CardHolder.js +5 -5
- package/dist/commonjs/components/Card/CardNumber.js +6 -6
- package/dist/commonjs/components/Card/CardNumber.js.map +1 -1
- package/dist/commonjs/components/Card/context.js +5 -5
- package/dist/commonjs/components/Card/utilities.js +5 -5
- package/dist/commonjs/components/EvervaultProvider.js +62 -0
- package/dist/commonjs/components/EvervaultProvider.js.map +1 -0
- package/dist/commonjs/index.js +8 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/native.js +2 -2
- package/dist/commonjs/sdk.js +10 -3
- package/dist/commonjs/sdk.js.map +1 -1
- package/dist/module/components/Card/Card.js +25 -25
- package/dist/module/components/Card/Card.js.map +1 -1
- package/dist/module/components/Card/CardCVC.js +12 -12
- package/dist/module/components/Card/CardExpiry.js +10 -10
- package/dist/module/components/Card/CardHolder.js +9 -9
- package/dist/module/components/Card/CardNumber.js +11 -11
- package/dist/module/components/Card/CardNumber.js.map +1 -1
- package/dist/module/components/Card/context.js +6 -6
- package/dist/module/components/Card/index.js +1 -1
- package/dist/module/components/Card/utilities.js +6 -6
- package/dist/module/components/EvervaultProvider.js +53 -0
- package/dist/module/components/EvervaultProvider.js.map +1 -0
- package/dist/module/index.js +3 -2
- package/dist/module/index.js.map +1 -1
- package/dist/module/native.js +3 -3
- package/dist/module/sdk.js +13 -5
- package/dist/module/sdk.js.map +1 -1
- package/dist/typescript/src/components/Card/Card.d.ts +8 -8
- package/dist/typescript/src/components/Card/Card.d.ts.map +1 -1
- package/dist/typescript/src/components/Card/CardCVC.d.ts +2 -2
- package/dist/typescript/src/components/Card/CardExpiry.d.ts +2 -2
- package/dist/typescript/src/components/Card/CardHolder.d.ts +2 -2
- package/dist/typescript/src/components/Card/CardNumber.d.ts +2 -2
- package/dist/typescript/src/components/Card/context.d.ts +4 -4
- package/dist/typescript/src/components/Card/index.d.ts +1 -1
- package/dist/typescript/src/components/Card/types.d.ts +2 -2
- package/dist/typescript/src/components/Card/utilities.d.ts +3 -3
- package/dist/typescript/src/components/EvervaultProvider.d.ts +29 -0
- package/dist/typescript/src/components/EvervaultProvider.d.ts.map +1 -0
- package/dist/typescript/src/index.d.ts +4 -3
- package/dist/typescript/src/index.d.ts.map +1 -1
- package/dist/typescript/src/sdk.d.ts +7 -0
- package/dist/typescript/src/sdk.d.ts.map +1 -1
- package/package.json +4 -79
- package/src/components/Card/Card.tsx +27 -27
- package/src/components/Card/CardCVC.tsx +13 -13
- package/src/components/Card/CardExpiry.tsx +11 -11
- package/src/components/Card/CardHolder.tsx +10 -10
- package/src/components/Card/CardNumber.tsx +12 -12
- package/src/components/Card/context.tsx +9 -9
- package/src/components/Card/index.ts +1 -1
- package/src/components/Card/types.ts +14 -14
- package/src/components/Card/utilities.ts +8 -8
- package/src/components/EvervaultProvider.tsx +64 -0
- package/src/index.tsx +4 -3
- package/src/native.ts +4 -4
- package/src/sdk.ts +12 -5
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
-
import { validateNumber } from
|
|
3
|
-
import * as React from
|
|
4
|
-
import { useEffect, useMemo } from
|
|
5
|
-
import { TextInputMask } from
|
|
6
|
-
import { removeFieldFromSet, useCardContext } from
|
|
2
|
+
import { validateNumber } from "@evervault/card-validator";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useEffect, useMemo } from "react";
|
|
5
|
+
import { TextInputMask } from "react-native-masked-text";
|
|
6
|
+
import { removeFieldFromSet, useCardContext } from "./context";
|
|
7
7
|
export const CardCVC = props => {
|
|
8
8
|
const context = useCardContext();
|
|
9
9
|
const mask = useMemo(() => {
|
|
10
10
|
if (!context.values.number) {
|
|
11
|
-
return
|
|
11
|
+
return "9999";
|
|
12
12
|
}
|
|
13
13
|
const type = validateNumber(context.values.number).brand;
|
|
14
|
-
if (type ===
|
|
15
|
-
return
|
|
14
|
+
if (type === "american-express") {
|
|
15
|
+
return "9999";
|
|
16
16
|
}
|
|
17
|
-
return
|
|
17
|
+
return "999";
|
|
18
18
|
}, [context.values.number]);
|
|
19
19
|
const {
|
|
20
20
|
onChange,
|
|
21
21
|
onBlur
|
|
22
|
-
} = context.register(
|
|
22
|
+
} = context.register("cvc");
|
|
23
23
|
useEffect(() => {
|
|
24
|
-
context.setRegisteredFields(prev => new Set(prev).add(
|
|
25
|
-
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev,
|
|
24
|
+
context.setRegisteredFields(prev => new Set(prev).add("cvc"));
|
|
25
|
+
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev, "cvc"));
|
|
26
26
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
27
27
|
}, []);
|
|
28
28
|
return /*#__PURE__*/React.createElement(TextInputMask, _extends({}, props, {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
-
import { TextInputMask } from
|
|
3
|
-
import { removeFieldFromSet, useCardContext } from
|
|
4
|
-
import * as React from
|
|
5
|
-
import { useEffect } from
|
|
2
|
+
import { TextInputMask } from "react-native-masked-text";
|
|
3
|
+
import { removeFieldFromSet, useCardContext } from "./context";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { useEffect } from "react";
|
|
6
6
|
export function CardExpiry(props) {
|
|
7
7
|
const context = useCardContext();
|
|
8
8
|
const {
|
|
9
9
|
onBlur,
|
|
10
10
|
onChange
|
|
11
|
-
} = context.register(
|
|
11
|
+
} = context.register("expiry");
|
|
12
12
|
useEffect(() => {
|
|
13
|
-
context.setRegisteredFields(prev => new Set(prev).add(
|
|
14
|
-
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev,
|
|
13
|
+
context.setRegisteredFields(prev => new Set(prev).add("expiry"));
|
|
14
|
+
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev, "expiry"));
|
|
15
15
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
16
|
}, []);
|
|
17
17
|
return /*#__PURE__*/React.createElement(TextInputMask, _extends({}, props, {
|
|
@@ -19,16 +19,16 @@ export function CardExpiry(props) {
|
|
|
19
19
|
value: context.values.expiry
|
|
20
20
|
// store the expiry as MMYY not MM / YY
|
|
21
21
|
,
|
|
22
|
-
onChangeText: rawExpiry => onChange(rawExpiry.replace(
|
|
22
|
+
onChangeText: rawExpiry => onChange(rawExpiry.replace(" / ", "")),
|
|
23
23
|
options: {
|
|
24
|
-
format:
|
|
24
|
+
format: "99 / 99"
|
|
25
25
|
},
|
|
26
26
|
id: "expiry",
|
|
27
27
|
onBlur: e => {
|
|
28
28
|
onBlur(e);
|
|
29
29
|
props.onBlur?.(e);
|
|
30
30
|
},
|
|
31
|
-
placeholder: props.placeholder ??
|
|
31
|
+
placeholder: props.placeholder ?? "MM / YY",
|
|
32
32
|
inputMode: "numeric",
|
|
33
33
|
autoComplete: "cc-exp"
|
|
34
34
|
}));
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
-
import { useEffect } from
|
|
3
|
-
import * as React from
|
|
4
|
-
import { Platform, TextInput } from
|
|
5
|
-
import { removeFieldFromSet, useCardContext } from
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Platform, TextInput } from "react-native";
|
|
5
|
+
import { removeFieldFromSet, useCardContext } from "./context";
|
|
6
6
|
export function CardHolder(props) {
|
|
7
7
|
const context = useCardContext();
|
|
8
8
|
const {
|
|
9
9
|
onBlur,
|
|
10
10
|
onChange
|
|
11
|
-
} = context.register(
|
|
11
|
+
} = context.register("name");
|
|
12
12
|
useEffect(() => {
|
|
13
|
-
context.setRegisteredFields(prev => new Set(prev).add(
|
|
14
|
-
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev,
|
|
13
|
+
context.setRegisteredFields(prev => new Set(prev).add("name"));
|
|
14
|
+
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev, "name"));
|
|
15
15
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
16
|
}, []);
|
|
17
17
|
return /*#__PURE__*/React.createElement(TextInput, _extends({}, props, {
|
|
@@ -22,8 +22,8 @@ export function CardHolder(props) {
|
|
|
22
22
|
props.onBlur?.(e);
|
|
23
23
|
},
|
|
24
24
|
autoComplete: Platform.select({
|
|
25
|
-
ios:
|
|
26
|
-
android:
|
|
25
|
+
ios: "cc-name",
|
|
26
|
+
android: "name"
|
|
27
27
|
}),
|
|
28
28
|
onChangeText: v => onChange(v)
|
|
29
29
|
}));
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
-
import { validateNumber } from
|
|
3
|
-
import * as React from
|
|
4
|
-
import { useEffect, useMemo, useRef } from
|
|
5
|
-
import { TextInputMask } from
|
|
6
|
-
import { removeFieldFromSet, useCardContext } from
|
|
2
|
+
import { validateNumber } from "@evervault/card-validator";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
5
|
+
import { TextInputMask } from "react-native-masked-text";
|
|
6
|
+
import { removeFieldFromSet, useCardContext } from "./context";
|
|
7
7
|
export function CardNumber(props) {
|
|
8
8
|
const context = useCardContext();
|
|
9
9
|
const ref = useRef(null);
|
|
@@ -13,9 +13,9 @@ export function CardNumber(props) {
|
|
|
13
13
|
brand
|
|
14
14
|
} = validateNumber(value);
|
|
15
15
|
const masks = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
default: "9999 9999 9999 9999",
|
|
17
|
+
unionpay: "9999 9999 9999 9999 999",
|
|
18
|
+
"american-express": "9999 999999 99999"
|
|
19
19
|
};
|
|
20
20
|
if (brand && !!masks[brand]) {
|
|
21
21
|
return [value, masks[brand]];
|
|
@@ -25,10 +25,10 @@ export function CardNumber(props) {
|
|
|
25
25
|
const {
|
|
26
26
|
onBlur,
|
|
27
27
|
onChange
|
|
28
|
-
} = context.register(
|
|
28
|
+
} = context.register("number");
|
|
29
29
|
useEffect(() => {
|
|
30
|
-
context.setRegisteredFields(prev => new Set(prev).add(
|
|
31
|
-
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev,
|
|
30
|
+
context.setRegisteredFields(prev => new Set(prev).add("number"));
|
|
31
|
+
return () => context.setRegisteredFields(prev => removeFieldFromSet(prev, "number"));
|
|
32
32
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
33
|
}, []);
|
|
34
34
|
return /*#__PURE__*/React.createElement(TextInputMask, _extends({}, props, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["validateNumber","React","useEffect","useMemo","useRef","TextInputMask","removeFieldFromSet","useCardContext","CardNumber","props","context","ref","innerValue","mask","value","values","number","brand","masks","default","onBlur","onChange","register","setRegisteredFields","prev","Set","add","createElement","_extends","type","options","id","onChangeText","e","inputMode","autoComplete"],"sourceRoot":"../../../../src","sources":["components/Card/CardNumber.tsx"],"mappings":";AAAA,SAASA,cAAc,QAAQ,2BAA2B;AAC1D,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,SAASC,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAClD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,kBAAkB,EAAEC,cAAc,QAAQ,WAAW;AAK9D,OAAO,SAASC,UAAUA,CAACC,KAAsB,EAAE;EACjD,MAAMC,OAAO,GAAGH,cAAc,CAAC,CAAC;EAChC,MAAMI,GAAG,GAAGP,MAAM,CAAgB,IAAI,CAAC;EAEvC,MAAM,CAACQ,UAAU,EAAEC,IAAI,CAAC,GAAGV,OAAO,CAAC,MAAM;IACvC,MAAMW,KAAK,GAAGJ,OAAO,CAACK,MAAM,CAACC,MAAM;IAEnC,MAAM;MAAEC;IAAM,CAAC,GAAGjB,cAAc,CAACc,KAAK,CAAC;IAEvC,MAAMI,KAAK,GAAG;
|
|
1
|
+
{"version":3,"names":["validateNumber","React","useEffect","useMemo","useRef","TextInputMask","removeFieldFromSet","useCardContext","CardNumber","props","context","ref","innerValue","mask","value","values","number","brand","masks","default","unionpay","onBlur","onChange","register","setRegisteredFields","prev","Set","add","createElement","_extends","type","options","id","onChangeText","e","inputMode","autoComplete"],"sourceRoot":"../../../../src","sources":["components/Card/CardNumber.tsx"],"mappings":";AAAA,SAASA,cAAc,QAAQ,2BAA2B;AAC1D,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,SAASC,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAClD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,kBAAkB,EAAEC,cAAc,QAAQ,WAAW;AAK9D,OAAO,SAASC,UAAUA,CAACC,KAAsB,EAAE;EACjD,MAAMC,OAAO,GAAGH,cAAc,CAAC,CAAC;EAChC,MAAMI,GAAG,GAAGP,MAAM,CAAgB,IAAI,CAAC;EAEvC,MAAM,CAACQ,UAAU,EAAEC,IAAI,CAAC,GAAGV,OAAO,CAAC,MAAM;IACvC,MAAMW,KAAK,GAAGJ,OAAO,CAACK,MAAM,CAACC,MAAM;IAEnC,MAAM;MAAEC;IAAM,CAAC,GAAGjB,cAAc,CAACc,KAAK,CAAC;IAEvC,MAAMI,KAAK,GAAG;MACZC,OAAO,EAAE,qBAAqB;MAC9BC,QAAQ,EAAE,yBAAyB;MACnC,kBAAkB,EAAE;IACtB,CAA2B;IAE3B,IAAIH,KAAK,IAAI,CAAC,CAACC,KAAK,CAACD,KAAK,CAAC,EAAE;MAC3B,OAAO,CAACH,KAAK,EAAEI,KAAK,CAACD,KAAK,CAAC,CAAC;IAC9B;IACA,OAAO,CAACH,KAAK,EAAEI,KAAK,CAACC,OAAO,CAAC;EAC/B,CAAC,EAAE,CAACT,OAAO,CAACK,MAAM,CAACC,MAAM,CAAC,CAAC;EAE3B,MAAM;IAAEK,MAAM;IAAEC;EAAS,CAAC,GAAGZ,OAAO,CAACa,QAAQ,CAAC,QAAQ,CAAC;EAEvDrB,SAAS,CAAC,MAAM;IACdQ,OAAO,CAACc,mBAAmB,CAAEC,IAAI,IAAK,IAAIC,GAAG,CAACD,IAAI,CAAC,CAACE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAElE,OAAO,MACLjB,OAAO,CAACc,mBAAmB,CAAEC,IAAI,IAAKnB,kBAAkB,CAACmB,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3E;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,oBACExB,KAAA,CAAA2B,aAAA,CAACvB,aAAa,EAAAwB,QAAA,KACRpB,KAAK;IACTE,GAAG,EAAEA,GAAI;IACTmB,IAAI,EAAC,QAAQ;IACbC,OAAO,EAAE;MAAElB;IAAK,CAAE;IAClBmB,EAAE,EAAC,QAAQ;IACXlB,KAAK,EAAEF,UAAW;IAClBqB,YAAY,EAAEX,QAAS;IACvBD,MAAM,EAAGa,CAAC,IAAK;MACbb,MAAM,CAACa,CAAC,CAAC;MACTzB,KAAK,CAACY,MAAM,GAAGa,CAAC,CAAC;IACnB,CAAE;IACFC,SAAS,EAAC,SAAS;IACnBC,YAAY,EAAC;EAAW,EACzB,CAAC;AAEN","ignoreList":[]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { createContext, useContext } from
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
2
|
export const removeFieldFromSet = (prev, field) => {
|
|
3
3
|
const next = new Set(prev);
|
|
4
|
-
next.delete(
|
|
4
|
+
next.delete("name");
|
|
5
5
|
return next;
|
|
6
6
|
};
|
|
7
7
|
export const CardContext = /*#__PURE__*/createContext({
|
|
8
8
|
values: {
|
|
9
|
-
name:
|
|
10
|
-
number:
|
|
11
|
-
cvc:
|
|
12
|
-
expiry:
|
|
9
|
+
name: "",
|
|
10
|
+
number: "",
|
|
11
|
+
cvc: "",
|
|
12
|
+
expiry: ""
|
|
13
13
|
},
|
|
14
14
|
register: () => ({
|
|
15
15
|
onChange: () => {},
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Card } from
|
|
1
|
+
export { Card } from "./Card";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { validateNumber, validateExpiry, validateCVC } from
|
|
1
|
+
import { validateNumber, validateExpiry, validateCVC } from "@evervault/card-validator";
|
|
2
2
|
export async function changePayload(encrypt, form, fields) {
|
|
3
3
|
const {
|
|
4
4
|
name,
|
|
@@ -6,7 +6,7 @@ export async function changePayload(encrypt, form, fields) {
|
|
|
6
6
|
expiry,
|
|
7
7
|
cvc
|
|
8
8
|
} = form.values;
|
|
9
|
-
const number = rawNumber.replace(/\s/g,
|
|
9
|
+
const number = rawNumber.replace(/\s/g, "");
|
|
10
10
|
const {
|
|
11
11
|
brand,
|
|
12
12
|
localBrands,
|
|
@@ -31,18 +31,18 @@ export async function changePayload(encrypt, form, fields) {
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
export function isComplete(form, fields) {
|
|
34
|
-
if (fields.includes(
|
|
34
|
+
if (fields.includes("name")) {
|
|
35
35
|
if (form.values.name.length === 0) return false;
|
|
36
36
|
}
|
|
37
|
-
if (fields.includes(
|
|
37
|
+
if (fields.includes("number")) {
|
|
38
38
|
const cardValidation = validateNumber(form.values.number);
|
|
39
39
|
if (!cardValidation.isValid) return false;
|
|
40
40
|
}
|
|
41
|
-
if (fields.includes(
|
|
41
|
+
if (fields.includes("expiry")) {
|
|
42
42
|
const expiryValidation = validateExpiry(form.values.expiry);
|
|
43
43
|
if (!expiryValidation.isValid) return false;
|
|
44
44
|
}
|
|
45
|
-
if (fields.includes(
|
|
45
|
+
if (fields.includes("cvc")) {
|
|
46
46
|
const cvcValidation = validateCVC(form.values.cvc, form.values.number);
|
|
47
47
|
if (!cvcValidation.isValid) return false;
|
|
48
48
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createContext, useContext, useEffect } from "react";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { EvervaultSdk } from "../native";
|
|
4
|
+
const Ctx = /*#__PURE__*/createContext({
|
|
5
|
+
teamUuid: undefined,
|
|
6
|
+
appUuid: undefined
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// this isn't publicly exposed
|
|
10
|
+
export const useEvervault = () => useContext(Ctx);
|
|
11
|
+
/**
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* function App() {
|
|
15
|
+
* return (
|
|
16
|
+
* <EvervaultProvider teamId="team_123" appId="app_123">
|
|
17
|
+
* <Card onChange={(card) => console.log(card)}>
|
|
18
|
+
* <Card.Number />
|
|
19
|
+
* </Card>
|
|
20
|
+
* </EvervaultProvider>
|
|
21
|
+
* );
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
const EvervaultProvider = ({
|
|
26
|
+
teamId,
|
|
27
|
+
appId,
|
|
28
|
+
children
|
|
29
|
+
}) => {
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
async function initEvervault() {
|
|
32
|
+
try {
|
|
33
|
+
if (!teamId || !appId) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
return EvervaultSdk.initialize(teamId, appId);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
throw new Error(`Failed to initialize the Evervault SDK ${error}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (teamId || appId) {
|
|
42
|
+
initEvervault();
|
|
43
|
+
}
|
|
44
|
+
}, [teamId, appId]);
|
|
45
|
+
return /*#__PURE__*/React.createElement(Ctx.Provider, {
|
|
46
|
+
value: {
|
|
47
|
+
teamUuid: teamId,
|
|
48
|
+
appUuid: appId
|
|
49
|
+
}
|
|
50
|
+
}, children);
|
|
51
|
+
};
|
|
52
|
+
export default EvervaultProvider;
|
|
53
|
+
//# sourceMappingURL=EvervaultProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","useContext","useEffect","React","EvervaultSdk","Ctx","teamUuid","undefined","appUuid","useEvervault","EvervaultProvider","teamId","appId","children","initEvervault","initialize","error","Error","createElement","Provider","value"],"sourceRoot":"../../../src","sources":["components/EvervaultProvider.tsx"],"mappings":"AAAA,SAAoBA,aAAa,EAAEC,UAAU,EAAEC,SAAS,QAAQ,OAAO;AACvE,OAAO,KAAKC,KAAK,MAAM,OAAO;AAC9B,SAASC,YAAY,QAAQ,WAAW;AAOxC,MAAMC,GAAG,gBAAGL,aAAa,CAAmB;EAC1CM,QAAQ,EAAEC,SAAS;EACnBC,OAAO,EAAED;AACX,CAAC,CAAC;;AAEF;AACA,OAAO,MAAME,YAAY,GAAGA,CAAA,KAAMR,UAAU,CAACI,GAAG,CAAC;AAQjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMK,iBAAiB,GAAGA,CAAC;EAAEC,MAAM;EAAEC,KAAK;EAAEC;AAAyB,CAAC,KAAK;EACzEX,SAAS,CAAC,MAAM;IACd,eAAeY,aAAaA,CAAA,EAAG;MAC7B,IAAI;QACF,IAAI,CAACH,MAAM,IAAI,CAACC,KAAK,EAAE;UACrB;QACF;QAEA,OAAOR,YAAY,CAACW,UAAU,CAACJ,MAAM,EAAEC,KAAK,CAAC;MAC/C,CAAC,CAAC,OAAOI,KAAK,EAAE;QACd,MAAM,IAAIC,KAAK,CAAE,0CAAyCD,KAAM,EAAC,CAAC;MACpE;IACF;IAEA,IAAIL,MAAM,IAAIC,KAAK,EAAE;MACnBE,aAAa,CAAC,CAAC;IACjB;EACF,CAAC,EAAE,CAACH,MAAM,EAAEC,KAAK,CAAC,CAAC;EAEnB,oBACET,KAAA,CAAAe,aAAA,CAACb,GAAG,CAACc,QAAQ;IAACC,KAAK,EAAE;MAAEd,QAAQ,EAAEK,MAAM;MAAEH,OAAO,EAAEI;IAAM;EAAE,GACvDC,QACW,CAAC;AAEnB,CAAC;AAED,eAAeH,iBAAiB","ignoreList":[]}
|
package/dist/module/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { Card } from
|
|
2
|
-
export { init, encrypt } from
|
|
1
|
+
export { Card } from "./components/Card";
|
|
2
|
+
export { init, encrypt } from "./sdk";
|
|
3
|
+
export { default as EvervaultProvider } from "./components/EvervaultProvider";
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Card","init","encrypt"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAAyBA,IAAI,QAAQ,mBAAmB;AACxD,SAASC,IAAI,EAAEC,OAAO,QAAQ,OAAO","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Card","init","encrypt","default","EvervaultProvider"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAAyBA,IAAI,QAAQ,mBAAmB;AACxD,SAASC,IAAI,EAAEC,OAAO,QAAQ,OAAO;AASrC,SAASC,OAAO,IAAIC,iBAAiB,QAAQ,gCAAgC","ignoreList":[]}
|
package/dist/module/native.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { NativeModules, Platform } from
|
|
1
|
+
import { NativeModules, Platform } from "react-native";
|
|
2
2
|
const LINKING_ERROR = `The package '@evervault/evervault-react-native' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
3
3
|
ios: "- You have run 'pod install'\n",
|
|
4
|
-
default:
|
|
5
|
-
}) +
|
|
4
|
+
default: ""
|
|
5
|
+
}) + "- You rebuilt the app after installing the package\n" + "- You are not using Expo Go\n";
|
|
6
6
|
export const EvervaultSdk = NativeModules.EvervaultSdk ? NativeModules.EvervaultSdk : new Proxy({}, {
|
|
7
7
|
get() {
|
|
8
8
|
throw new Error(LINKING_ERROR);
|
package/dist/module/sdk.js
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
import { Platform } from
|
|
2
|
-
import { EvervaultSdk } from
|
|
1
|
+
import { Platform } from "react-native";
|
|
2
|
+
import { EvervaultSdk } from "./native";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated Deprecated since version 1.1.0. Use `EvervaultProvider` instead.
|
|
6
|
+
* @see `EvervaultProvider` instead
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import { EvervaultProvider } from "@evervault/evervault-react-native";
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
3
11
|
export async function init(teamUuid, appUuid) {
|
|
4
|
-
if (!teamUuid
|
|
12
|
+
if (!teamUuid?.startsWith("team_")) {
|
|
5
13
|
throw new Error("Invalid Evervault Team UUID");
|
|
6
14
|
}
|
|
7
|
-
if (!appUuid
|
|
15
|
+
if (!appUuid?.startsWith("app_")) {
|
|
8
16
|
throw new Error("Invalid Evervault App UUID");
|
|
9
17
|
}
|
|
10
18
|
return EvervaultSdk.initialize(teamUuid, appUuid);
|
|
11
19
|
}
|
|
12
20
|
export async function encrypt(data) {
|
|
13
|
-
if (Platform.OS ===
|
|
21
|
+
if (Platform.OS === "android" && typeof data !== "string") {
|
|
14
22
|
throw new Error(`The Evervault SDK does not currently support encrypting non-string data on Android.
|
|
15
23
|
If this is required for your use case, please get in touch with us at support@evervault.com. Please do not
|
|
16
24
|
serialize other data types to strings and pass them to this method as this will result in the data
|
package/dist/module/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","EvervaultSdk","init","teamUuid","appUuid","startsWith","Error","initialize","encrypt","data","OS"],"sourceRoot":"../../src","sources":["sdk.ts"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,YAAY,QAAQ,UAAU;
|
|
1
|
+
{"version":3,"names":["Platform","EvervaultSdk","init","teamUuid","appUuid","startsWith","Error","initialize","encrypt","data","OS"],"sourceRoot":"../../src","sources":["sdk.ts"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,YAAY,QAAQ,UAAU;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,IAAIA,CAACC,QAAgB,EAAEC,OAAe,EAAiB;EAC3E,IAAI,CAACD,QAAQ,EAAEE,UAAU,CAAC,OAAO,CAAC,EAAE;IAClC,MAAM,IAAIC,KAAK,CAAC,6BAA6B,CAAC;EAChD;EAEA,IAAI,CAACF,OAAO,EAAEC,UAAU,CAAC,MAAM,CAAC,EAAE;IAChC,MAAM,IAAIC,KAAK,CAAC,4BAA4B,CAAC;EAC/C;EAEA,OAAOL,YAAY,CAACM,UAAU,CAACJ,QAAQ,EAAEC,OAAO,CAAC;AACnD;AAEA,OAAO,eAAeI,OAAOA,CAACC,IAAS,EAAmB;EACxD,IAAIT,QAAQ,CAACU,EAAE,KAAK,SAAS,IAAI,OAAOD,IAAI,KAAK,QAAQ,EAAE;IACzD,MAAM,IAAIH,KAAK,CAAE;AACrB;AACA;AACA,2EAA2E,CAAC;EAC1E;EAEA,OAAOL,YAAY,CAACO,OAAO,CAACC,IAAI,CAAC;AACnC","ignoreList":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import { ReactNode } from
|
|
3
|
-
import type { CardForm, CardConfig, CardPayload } from
|
|
4
|
-
import { CardNumber } from
|
|
5
|
-
import { CardHolder } from
|
|
6
|
-
import { CardExpiry } from
|
|
7
|
-
import { StyleProp, TextInputProps, TextStyle } from
|
|
8
|
-
export interface BaseProps extends Omit<TextInputProps,
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
import type { CardForm, CardConfig, CardPayload } from "./types";
|
|
4
|
+
import { CardNumber } from "./CardNumber";
|
|
5
|
+
import { CardHolder } from "./CardHolder";
|
|
6
|
+
import { CardExpiry } from "./CardExpiry";
|
|
7
|
+
import { StyleProp, TextInputProps, TextStyle } from "react-native";
|
|
8
|
+
export interface BaseProps extends Omit<TextInputProps, "onChange" | "onChangeText" | "inputMode" | "autoComplete" | "value"> {
|
|
9
9
|
}
|
|
10
10
|
export interface CardProps {
|
|
11
11
|
initialValue?: CardForm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/Card.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../../../src/components/Card/Card.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAa,WAAW,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAQ,MAAM,cAAc,CAAC;AAE1E,MAAM,WAAW,SACf,SAAQ,IAAI,CACV,cAAc,EACd,UAAU,GAAG,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CACrE;CAAG;AAEN,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,iBAAS,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,SAAS,qBAyF3E;AAED,QAAA,MAAM,aAAa;;;;;CAKjB,CAAC;AAEH,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import { BaseProps } from
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { BaseProps } from "./Card";
|
|
3
3
|
export interface CardExpiryProps extends BaseProps {
|
|
4
4
|
}
|
|
5
5
|
export declare function CardExpiry(props: CardExpiryProps): React.JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import { BaseProps } from
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { BaseProps } from "./Card";
|
|
3
3
|
export interface CardHolderProps extends BaseProps {
|
|
4
4
|
}
|
|
5
5
|
export declare function CardHolder(props: CardHolderProps): React.JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as React from
|
|
2
|
-
import { BaseProps } from
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { BaseProps } from "./Card";
|
|
3
3
|
interface CardNumberProps extends BaseProps {
|
|
4
4
|
}
|
|
5
5
|
export declare function CardNumber(props: CardNumberProps): React.JSX.Element;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { UseFormReturn } from
|
|
2
|
-
import { Dispatch, SetStateAction } from
|
|
3
|
-
import { CardForm, CardField } from
|
|
1
|
+
import { UseFormReturn } from "../useForm";
|
|
2
|
+
import { Dispatch, SetStateAction } from "react";
|
|
3
|
+
import { CardForm, CardField } from "./types";
|
|
4
4
|
type Context<T> = {
|
|
5
5
|
values: CardForm;
|
|
6
|
-
register: UseFormReturn<T>[
|
|
6
|
+
register: UseFormReturn<T>["register"];
|
|
7
7
|
setRegisteredFields: Dispatch<SetStateAction<Set<CardField>>>;
|
|
8
8
|
};
|
|
9
9
|
export declare const removeFieldFromSet: (prev: Set<CardField>, field: CardField) => Set<CardField>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Card, type CardProps } from
|
|
1
|
+
export { Card, type CardProps } from "./Card";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type CardBrandName =
|
|
1
|
+
export type CardBrandName = "american-express" | "visa" | "mastercard" | "discover" | "jcb" | "diners-club" | "unionpay" | "maestro" | "mir" | "elo" | "hipercard" | "hiper" | "szep";
|
|
2
2
|
export interface CardConfig {
|
|
3
3
|
acceptedBrands?: CardBrandName[];
|
|
4
4
|
}
|
|
@@ -8,7 +8,7 @@ export interface CardForm {
|
|
|
8
8
|
cvc: string;
|
|
9
9
|
expiry: string;
|
|
10
10
|
}
|
|
11
|
-
export type CardField =
|
|
11
|
+
export type CardField = "name" | "number" | "expiry" | "cvc";
|
|
12
12
|
export interface CardExpiry {
|
|
13
13
|
month: string | null;
|
|
14
14
|
year: string | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { CardNumberValidationResult } from
|
|
2
|
-
import type { CardForm, CardBrandName, CardField, CardPayload } from
|
|
3
|
-
import { UseFormReturn } from
|
|
1
|
+
import { CardNumberValidationResult } from "@evervault/card-validator";
|
|
2
|
+
import type { CardForm, CardBrandName, CardField, CardPayload } from "./types";
|
|
3
|
+
import { UseFormReturn } from "../useForm";
|
|
4
4
|
export declare function changePayload(encrypt: (value: string) => Promise<string>, form: UseFormReturn<CardForm>, fields: CardField[]): Promise<CardPayload>;
|
|
5
5
|
export declare function isComplete(form: UseFormReturn<CardForm>, fields: CardField[]): boolean;
|
|
6
6
|
export declare function isAcceptedBrand(acceptedBrands: CardBrandName[] | undefined, cardNumberValidationResult: CardNumberValidationResult): boolean;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
export interface EvervaultContext {
|
|
4
|
+
teamUuid?: string;
|
|
5
|
+
appUuid?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const useEvervault: () => EvervaultContext;
|
|
8
|
+
interface EvervaultProps {
|
|
9
|
+
appId: string;
|
|
10
|
+
teamId: string;
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* function App() {
|
|
17
|
+
* return (
|
|
18
|
+
* <EvervaultProvider teamId="team_123" appId="app_123">
|
|
19
|
+
* <Card onChange={(card) => console.log(card)}>
|
|
20
|
+
* <Card.Number />
|
|
21
|
+
* </Card>
|
|
22
|
+
* </EvervaultProvider>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare const EvervaultProvider: ({ teamId, appId, children }: EvervaultProps) => React.JSX.Element;
|
|
28
|
+
export default EvervaultProvider;
|
|
29
|
+
//# sourceMappingURL=EvervaultProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EvervaultProvider.d.ts","sourceRoot":"","sources":["../../../../src/components/EvervaultProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,iBAAiB,gCAAiC,cAAc,sBAwBrE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { type CardProps, Card } from
|
|
2
|
-
export { init, encrypt } from
|
|
3
|
-
export type { CardPayload, CardExpiry, CardBrandName, CardConfig, CardForm, CardField, } from
|
|
1
|
+
export { type CardProps, Card } from "./components/Card";
|
|
2
|
+
export { init, encrypt } from "./sdk";
|
|
3
|
+
export type { CardPayload, CardExpiry, CardBrandName, CardConfig, CardForm, CardField, } from "./components/Card/types";
|
|
4
|
+
export { default as EvervaultProvider } from "./components/EvervaultProvider";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtC,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,GACV,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtC,YAAY,EACV,WAAW,EACX,UAAU,EACV,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,GACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Deprecated since version 1.1.0. Use `EvervaultProvider` instead.
|
|
3
|
+
* @see `EvervaultProvider` instead
|
|
4
|
+
* ```tsx
|
|
5
|
+
* import { EvervaultProvider } from "@evervault/evervault-react-native";
|
|
6
|
+
* ```
|
|
7
|
+
*/
|
|
1
8
|
export declare function init(teamUuid: string, appUuid: string): Promise<void>;
|
|
2
9
|
export declare function encrypt(data: any): Promise<string>;
|
|
3
10
|
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/sdk.ts"],"names":[],"mappings":"AAGA,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CASxD"}
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/sdk.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CASxD"}
|