diff --git a/App.tsx b/App.tsx index 290539e12100d8068954ac8facd2ed6004ad1c78..92e1e50abb9c9e30f66a141a0fc429e952da6778 100644 --- a/App.tsx +++ b/App.tsx @@ -10,6 +10,10 @@ import { initStoredLanguage } from './src/localization'; import toastConfig from './src/components/toast/ToastConfig'; import './src/seal/injectCryptoServiceMobile'; import {observer} from "mobx-react"; +import {Buffer} from "buffer"; + +// Required by @vereign/lib-mime +global.Buffer = Buffer; const navigationTheme = { diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e7805a8a832e847db6ec56f008e0ad5bcdafc880..80d2436352f828726dc8e4c382bf95f4ad3598e5 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,4 +1,12 @@ PODS: + - anoncreds (0.1.0): + - React + - React-callinvoker + - React-Core + - aries-askar (0.1.1): + - React + - React-callinvoker + - React-Core - boost (1.76.0) - CatCrypto (0.3.2) - DoubleConversion (1.1.6) @@ -12,6 +20,36 @@ PODS: - ReactCommon/turbomodule/core (= 0.71.10) - fmt (6.2.1) - glog (0.3.5) + - GoogleDataTransport (9.2.5): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleMLKit/BarcodeScanning (4.0.0): + - GoogleMLKit/MLKitCore + - MLKitBarcodeScanning (~> 3.0.0) + - GoogleMLKit/MLKitCore (4.0.0): + - MLKitCommon (~> 9.0.0) + - GoogleToolboxForMac/DebugUtils (2.3.2): + - GoogleToolboxForMac/Defines (= 2.3.2) + - GoogleToolboxForMac/Defines (2.3.2) + - GoogleToolboxForMac/Logger (2.3.2): + - GoogleToolboxForMac/Defines (= 2.3.2) + - "GoogleToolboxForMac/NSData+zlib (2.3.2)": + - GoogleToolboxForMac/Defines (= 2.3.2) + - "GoogleToolboxForMac/NSDictionary+URLArguments (2.3.2)": + - GoogleToolboxForMac/DebugUtils (= 2.3.2) + - GoogleToolboxForMac/Defines (= 2.3.2) + - "GoogleToolboxForMac/NSString+URLArguments (= 2.3.2)" + - "GoogleToolboxForMac/NSString+URLArguments (2.3.2)" + - GoogleUtilities/Environment (7.11.5): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.11.5): + - GoogleUtilities/Environment + - GoogleUtilities/UserDefaults (7.11.5): + - GoogleUtilities/Logger + - GoogleUtilitiesComponents (1.1.0): + - GoogleUtilities/Logger + - GTMSessionFetcher/Core (2.3.0) - hermes-engine (0.71.10): - hermes-engine/Pre-built (= 0.71.10) - hermes-engine/Pre-built (0.71.10) @@ -19,7 +57,35 @@ PODS: - indy-sdk-react-native (0.3.1): - Indy - React + - indy-vdr (0.1.0): + - React + - React-callinvoker + - React-Core - libevent (2.1.12) + - MLImage (1.0.0-beta4) + - MLKitBarcodeScanning (3.0.0): + - MLKitCommon (~> 9.0) + - MLKitVision (~> 5.0) + - MLKitCommon (9.0.0): + - GoogleDataTransport (~> 9.0) + - GoogleToolboxForMac/Logger (~> 2.1) + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - "GoogleToolboxForMac/NSDictionary+URLArguments (~> 2.1)" + - GoogleUtilities/UserDefaults (~> 7.0) + - GoogleUtilitiesComponents (~> 1.0) + - GTMSessionFetcher/Core (< 3.0, >= 1.1) + - MLKitVision (5.0.0): + - GoogleToolboxForMac/Logger (~> 2.1) + - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" + - GTMSessionFetcher/Core (< 3.0, >= 1.1) + - MLImage (= 1.0.0-beta4) + - MLKitCommon (~> 9.0) + - nanopb (2.30909.0): + - nanopb/decode (= 2.30909.0) + - nanopb/encode (= 2.30909.0) + - nanopb/decode (2.30909.0) + - nanopb/encode (2.30909.0) + - PromisesObjC (2.3.1) - RCT-Folly (2021.07.22.00): - boost - DoubleConversion @@ -434,9 +500,18 @@ PODS: - React-Core - RNVectorIcons (9.2.0): - React-Core + - vision-camera-code-scanner (0.2.0): + - GoogleMLKit/BarcodeScanning + - React-Core + - VisionCamera (2.15.4): + - React + - React-callinvoker + - React-Core - Yoga (1.14.0) DEPENDENCIES: + - "anoncreds (from `../node_modules/@hyperledger/anoncreds-react-native`)" + - "aries-askar (from `../node_modules/@hyperledger/aries-askar-react-native`)" - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) @@ -444,6 +519,7 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - indy-sdk-react-native (from `../node_modules/indy-sdk-react-native`) + - "indy-vdr (from `../node_modules/@hyperledger/indy-vdr-react-native`)" - libevent (~> 2.1.12) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) @@ -496,11 +572,25 @@ DEPENDENCIES: - RNShare (from `../node_modules/react-native-share`) - RNSVG (from `../node_modules/react-native-svg`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - vision-camera-code-scanner (from `../node_modules/vision-camera-code-scanner`) + - VisionCamera (from `../node_modules/react-native-vision-camera`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: https://github.com/CocoaPods/Specs.git: - CatCrypto + - GoogleDataTransport + - GoogleMLKit + - GoogleToolboxForMac + - GoogleUtilities + - GoogleUtilitiesComponents + - GTMSessionFetcher + - MLImage + - MLKitBarcodeScanning + - MLKitCommon + - MLKitVision + - nanopb + - PromisesObjC https://github.com/hyperledger/indy-sdk-react-native: - Indy trunk: @@ -508,6 +598,10 @@ SPEC REPOS: - libevent EXTERNAL SOURCES: + anoncreds: + :path: "../node_modules/@hyperledger/anoncreds-react-native" + aries-askar: + :path: "../node_modules/@hyperledger/aries-askar-react-native" boost: :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: @@ -522,6 +616,8 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" indy-sdk-react-native: :path: "../node_modules/indy-sdk-react-native" + indy-vdr: + :path: "../node_modules/@hyperledger/indy-vdr-react-native" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTRequired: @@ -622,10 +718,16 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-svg" RNVectorIcons: :path: "../node_modules/react-native-vector-icons" + vision-camera-code-scanner: + :path: "../node_modules/vision-camera-code-scanner" + VisionCamera: + :path: "../node_modules/react-native-vision-camera" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: + anoncreds: 8e6ab626d5250ae6301c3e96d6fc739186e083f0 + aries-askar: 738c677e194913ed3c256adc953db3fe0494f8f8 boost: 57d2868c099736d80fcd648bf211b4431e51a558 CatCrypto: a477899b6be4954e75be4897e732da098cc0a5a8 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 @@ -633,10 +735,23 @@ SPEC CHECKSUMS: FBReactNativeSpec: 90fc1a90b4b7a171e0a7c20ea426c1bf6ce4399c fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 + GoogleMLKit: 2bd0dc6253c4d4f227aad460f69215a504b2980e + GoogleToolboxForMac: 8bef7c7c5cf7291c687cf5354f39f9db6399ad34 + GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084 + GoogleUtilitiesComponents: 679b2c881db3b615a2777504623df6122dd20afe + GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2 hermes-engine: d27603b55a48402501ad1928c05411dae9cd6b85 Indy: d9976ce47c0308bd1fea6f90e3ad3db59a3b49b9 indy-sdk-react-native: d98862d0fffa42cc427d5ceffb6589e7c7ce8c46 + indy-vdr: 85cd66089f151256581323440e78988891f4082e libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 + MLImage: 7bb7c4264164ade9bf64f679b40fb29c8f33ee9b + MLKitBarcodeScanning: 04e264482c5f3810cb89ebc134ef6b61e67db505 + MLKitCommon: c1b791c3e667091918d91bda4bba69a91011e390 + MLKitVision: 8baa5f46ee3352614169b85250574fde38c36f49 + nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 + PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 RCTRequired: 8ef706f91e2b643cd32c26a57700b5f24fab0585 RCTTypeSafety: 5fbddd8eb9242b91ac0d901c01da3673f358b1b7 @@ -687,6 +802,8 @@ SPEC CHECKSUMS: RNShare: d82e10f6b7677f4b0048c23709bd04098d5aee6c RNSVG: 53c661b76829783cdaf9b7a57258f3d3b4c28315 RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 + vision-camera-code-scanner: dda884a7f3ec8243a2a6d6489b91860648371bca + VisionCamera: c6356b309f7b8e185b7be2e703ec67bb35acf345 Yoga: e7ea9e590e27460d28911403b894722354d73479 PODFILE CHECKSUM: a70b8841dadb169ce8704d6b9fb1be7df2e4bbbf diff --git a/package.json b/package.json index 6750057dc9e9fa1971d7d3c2e5c78a2d3656eec9..79d7c8976c28298662631171b013a5fce692cd6d 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "@vereign/light-utils": "git+ssh://git@code.vereign.com:seal/building-blocks/signing-verification-utilities.git#feature-seal-reading-injecting", "buffer": "^6.0.3", "date-fns": "^2.30.0", - "emailjs-mime-parser": "^2.0.7", "i18next": "^22.5.1", "indy-sdk-react-native": "^0.3.1", "intl-pluralrules": "^2.0.0", diff --git a/src/screens/EmailDetails/index.tsx b/src/screens/EmailDetails/index.tsx index 72eb27f3a0e70c59d5e7003aa5247f372627a3d0..4741594b8c3f0f20ee742413eabf870dca48943f 100644 --- a/src/screens/EmailDetails/index.tsx +++ b/src/screens/EmailDetails/index.tsx @@ -3,20 +3,20 @@ import { StackScreenProps } from '@react-navigation/stack'; import { StyleSheet, Text, - Alert, View, - FlatList, StatusBar, ScrollView, NativeModules, + useWindowDimensions, } from 'react-native'; import {observer} from "mobx-react"; import {EmailStackParams, Screens} from 'src/type/navigators'; import { ColorPallet, TextTheme } from 'src/theme/theme'; +import MimeParser from "@vereign/lib-mime"; import {getImapConfig} from "../../utils/keychain"; import {successToast, warningToast} from "../../utils/toast"; import Button, {ButtonType} from "../../components/Button"; -import MimeParser from 'emailjs-mime-parser' +import RenderHtml from "react-native-render-html"; const {VereignImapModule} = NativeModules; @@ -32,9 +32,11 @@ const EmailDetails: React.FC<EmailDetailsProps> = observer(({ const [configValid, setConfigValid] = useState(true); const [savingToEmailBox, setSavingToEmailBox] = useState(false); const [userEmail, setUserEmail] = useState(''); + const [messageId, setMessageId] = useState(''); const [html, setHtml] = useState(''); - const [plainText, setPlainText] = useState(''); - const email = route.params.email; + // const [plainText, setPlainText] = useState(''); + const emailContent = route.params.emailMime; + const { width } = useWindowDimensions(); const checkConfig = async () => { const config = await getImapConfig(); @@ -46,40 +48,23 @@ const EmailDetails: React.FC<EmailDetailsProps> = observer(({ } const parseMime = async () => { try { -// const parser = new MimeParser(); -// -// // Add listener to handle body data -// let htmlContent = ''; -// let plainTextContent = ''; -// parser.onbody = (node, chunk) => { -// switch(node.contentType.value) { -// case 'text/plain': -// plainTextContent += chunk.toString('utf-8'); -// break; -// case 'text/html': -// htmlContent += chunk.toString('utf-8'); -// break; -// } -// }; -// -// parser.write(email); -// parser.end(); -// -// // Extract x-message-id header -// const xMessageId = parser.node.headers['x-message-id'][0].value; -// -// console.log('x-message-id:', xMessageId); -// console.log('PlainText:', plainTextContent); -// console.log('HTML:', htmlContent); - - - // const node = parse(email); - // const mimeParser = new MIMEParser(email); - // const html = await mimeParser.getHTML(); - // const plain = await mimeParser.getPlain(); - // const messageId = mimeParser.getGlobalHeaderValue("x-message-id"); - - // console.log('node', node); + let parser = new MimeParser(emailContent); + + const messageIdHeader = parser.getGlobalHeaderValue('x-message-id'); + + if (messageIdHeader) { + setMessageId(messageIdHeader[0]); + } + + const html = parser.getHTML() as any; + + if (typeof html === 'string') { + setHtml(html); + } else if (html._j) { // TODO really don't know what's the bug. It must be a string + setHtml(html._j); + } else { + setHtml("<div>Can not display email</div>") + } } catch (e: any) { warningToast(e.message); console.error(e); @@ -89,14 +74,14 @@ const EmailDetails: React.FC<EmailDetailsProps> = observer(({ useEffect(() => { checkConfig(); parseMime(); - }, [email]); + }, [emailContent]); const saveEmail = async () => { setSavingToEmailBox(true); try { const config = await getImapConfig(); if (config) { - VereignImapModule.saveMessage(config!.host, config!.username, config!.password, email, (success: boolean, error: any) => { + VereignImapModule.saveMessage(config!.host, config!.username, config!.password, emailContent, (success: boolean, error: any) => { if (success) { successToast("Email is saved"); notifySVDXServer(); @@ -147,9 +132,15 @@ const EmailDetails: React.FC<EmailDetailsProps> = observer(({ <Text style={styles.headerProp}> Email: </Text> - <Text style={styles.headerProp}> - {email} - </Text> + {html && ( + <RenderHtml + baseStyle={styles.html} + contentWidth={width - 100} + source={{ + html, + }} + /> + )} </View> </ScrollView> @@ -176,5 +167,8 @@ const styles = StyleSheet.create({ warn: { ...TextTheme.normal, color: 'red' - } + }, + html: { + color: ColorPallet.baseColors.black, + }, }); diff --git a/src/screens/ImapConfiguration/index.tsx b/src/screens/ImapConfiguration/index.tsx index 810b204bba13c7dbcf1320a45bcd5f353cd87db9..d72e401edf36d77843dced90c0249814f4197464 100644 --- a/src/screens/ImapConfiguration/index.tsx +++ b/src/screens/ImapConfiguration/index.tsx @@ -61,78 +61,76 @@ const ImapConfiguration = () => { } return ( - <SafeAreaScrollView> + <View style={styles.container}> <StatusBar barStyle="light-content" /> - <View style={styles.container}> - <TextInput - label="host" - placeholder="host" - accessible - accessibilityLabel="host" - labelBold - labelCenter - autoFocus - value={imapValues.host} - onChangeText={(value) => setImapValues({ - ...imapValues, - host: value - })} - returnKeyType="done" - /> - <TextInput - label="username" - placeholder="username" - accessible - accessibilityLabel="username" - labelBold - labelCenter - value={imapValues.username} - onChangeText={(value) => setImapValues({ - ...imapValues, - username: value - })} - returnKeyType="done" - /> - <TextInput - label="password" - placeholder="password" - accessible - accessibilityLabel="password" - labelBold - labelCenter - secureTextEntry - value={imapValues.password} - onChangeText={(value) => setImapValues({ - ...imapValues, - password: value - })} - returnKeyType="done" - /> - <TextInput - label="port" - placeholder="port" - accessible - accessibilityLabel="port" - labelBold - labelCenter - value={imapValues.port} - onChangeText={(value) => setImapValues({ - ...imapValues, - port: value - })} - returnKeyType="done" - /> + <TextInput + label="host" + placeholder="host" + accessible + accessibilityLabel="host" + labelBold + labelCenter + autoFocus + value={imapValues.host} + onChangeText={(value) => setImapValues({ + ...imapValues, + host: value + })} + returnKeyType="done" + /> + <TextInput + label="username" + placeholder="username" + accessible + accessibilityLabel="username" + labelBold + labelCenter + value={imapValues.username} + onChangeText={(value) => setImapValues({ + ...imapValues, + username: value + })} + returnKeyType="done" + /> + <TextInput + label="password" + placeholder="password" + accessible + accessibilityLabel="password" + labelBold + labelCenter + secureTextEntry + value={imapValues.password} + onChangeText={(value) => setImapValues({ + ...imapValues, + password: value + })} + returnKeyType="done" + /> + <TextInput + label="port" + placeholder="port" + accessible + accessibilityLabel="port" + labelBold + labelCenter + value={imapValues.port} + onChangeText={(value) => setImapValues({ + ...imapValues, + port: value + })} + returnKeyType="done" + /> - <Button - title="Save" - disabled={loading} - buttonType={ButtonType.Primary} - onPress={() => saveConfig()} - /> - </View> - </SafeAreaScrollView> + <Button + title="Save" + disabled={loading} + buttonType={ButtonType.Primary} + onPress={() => saveConfig()} + /> + </View> ); }; diff --git a/src/store/AgentStore.ts b/src/store/AgentStore.ts index 5917a0d362035e81fe5e9d7a71dc62f6ee5281b3..82ba6c74741fcc407b4fa6facb4c7723510df710 100644 --- a/src/store/AgentStore.ts +++ b/src/store/AgentStore.ts @@ -12,24 +12,18 @@ import { DidsModule, HttpOutboundTransport, InitConfig, - Key, KeyDerivationMethod, KeyDidRegistrar, KeyDidResolver, - KeyType, LogLevel, MediationRecipientModule, - MediatorPickupStrategy, PeerDidRegistrar, PeerDidResolver, ProofsModule, - TypedArrayEncoder, V2CredentialProtocol, V2ProofProtocol, - WalletKeyExistsError, WsOutboundTransport, } from "@aries-framework/core"; -import axios, { AxiosError } from "axios"; import {agentDependencies} from '@aries-framework/react-native'; import { AnonCredsCredentialFormatService, @@ -71,11 +65,12 @@ import {WalletConfig, WalletExportImportConfig} from "@aries-framework/core/buil import { LegacyIndyCredentialFormatService } from "@aries-framework/anoncreds/build/formats/LegacyIndyCredentialFormatService"; -import {infoToast, successToast, warningToast} from 'src/utils/toast'; +import {infoToast, warningToast} from 'src/utils/toast'; import {Screens} from "../type/navigators"; import {Buffer} from "buffer"; + class AgentStore { private _rootStore: RootStore; private _agent: Agent | null = null; @@ -225,11 +220,6 @@ class AgentStore { async (ev: BasicMessageStateChangedEvent) => { if (ev.payload.basicMessageRecord.role === BasicMessageRole.Receiver) { - - - //1. receive the message - console.log(JSON.stringify(ev.payload.basicMessageRecord, null, 2)) - infoToast("Received new message"); let emailContent = ev.payload.basicMessageRecord.content; @@ -240,54 +230,7 @@ class AgentStore { warningToast("Email content is not base64 encoded"); } - this._navigation.navigate(Screens.EmailDetails, { email: emailContent }); - - - - // let parser = new MimeParser(); - // - // let headerValue; - // let htmlContent; - // - // parser.onheader = (node) => { - // // If the header name is 'X-Special-Header', capture its value - // if (node.headers['x-message-id']) { - // headerValue = node.headers['x-message-id'][0].value; - // } - // }; - // - // parser.onbody = (node, chunk) => { - // if (node.contentType.value === 'text/html') { - // htmlContent = chunk.toString('utf-8'); - // } - // }; - // - // parser.write(mimeContent); - // parser.end(); - // - // console.log('Header Value:', headerValue); - // console.log('HTML Content:', htmlContent); - - - - - // "x-message-id": - // POST /v1/message/read - // - // { - // "messageId":"..." - // } - - //2. decode it from base64 - - //3. parse mime and get header value - - //4. sent request to svdx to notify that you received the message - - //5. show on screen ? - - //6. put in IMAP ?? - + this._navigation.navigate(Screens.EmailDetails, { emailMime: emailContent }); } }, ); diff --git a/src/type/navigators.ts b/src/type/navigators.ts index 30289731481efec0a81df7793740eab02129fb51..719b8e558a803410d01f8f854950f31297df98eb 100644 --- a/src/type/navigators.ts +++ b/src/type/navigators.ts @@ -50,7 +50,7 @@ export type MainStackParams = { [Screens.Scan]: undefined; [Screens.ListContacts]: undefined; [Screens.ConnectionInvitation]: undefined; - [Screens.EmailDetails]: { email: string }; + [Screens.EmailDetails]: { emailMime: string }; [Stacks.SettingsStack]: undefined; [Stacks.NotificationStack]: undefined; }; @@ -65,7 +65,7 @@ export type ContactStackParams = { }; export type EmailStackParams = { - [Screens.EmailDetails]: { email: string }; + [Screens.EmailDetails]: { emailMime: string }; }; export type SealStackParams = { diff --git a/yarn.lock b/yarn.lock index 02388038f4899a481562e67b0fc146811e0200b0..f2c8180fce35fd0ab4717738aef5380b771fa470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4262,34 +4262,6 @@ electron-to-chromium@^1.4.411: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.425.tgz#399df13091b836d28283a545c25c8e4d9da86da8" integrity sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg== -emailjs-addressparser@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/emailjs-addressparser/-/emailjs-addressparser-2.0.3.tgz#b9c1cbaf70da13622075944ce757f3be5451fb99" - integrity sha512-GjahNdp1fRsWBGxmwC4o7XEoEf7QsdsVrbZFoeulEKNp49NrIUZcZfGMKCPDv5kExiuJLulq/7tJY+ei6BRitA== - -emailjs-base64@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/emailjs-base64/-/emailjs-base64-1.1.4.tgz#392fa38cb6aa35dccd3af3637ffc14c1c7ce9612" - integrity sha512-4h0xp1jgVTnIQBHxSJWXWanNnmuc5o+k4aHEpcLXSToN8asjB5qbXAexs7+PEsUKcEyBteNYsSvXUndYT2CGGA== - -emailjs-mime-codec@^2.0.8: - version "2.0.9" - resolved "https://registry.yarnpkg.com/emailjs-mime-codec/-/emailjs-mime-codec-2.0.9.tgz#d184451b6f2e55c5868b0f0a82d18fe2b82f0c97" - integrity sha512-7qJo4pFGcKlWh/kCeNjmcgj34YoJWY0ekZXEHYtluWg4MVBnXqGM4CRMtZQkfYwitOhUgaKN5EQktJddi/YIDQ== - dependencies: - emailjs-base64 "^1.1.4" - ramda "^0.26.1" - text-encoding "^0.7.0" - -emailjs-mime-parser@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/emailjs-mime-parser/-/emailjs-mime-parser-2.0.7.tgz#b9641a5564aeef1bd9ff4f7c51ab09b0cd7524d7" - integrity sha512-rOrRtAzq0OVLrxbTkRLyrtoY/YQldPgIzAk6lcD3LfXR0Gw3+PzsN2rO1QENY+cIQD94vYr2t2Ri0Zxlc9aeew== - dependencies: - emailjs-addressparser "^2.0.1" - emailjs-mime-codec "^2.0.8" - ramda "^0.26.1" - emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -7827,11 +7799,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -ramda@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" - integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== - ramda@^0.27.2: version "0.27.2" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" @@ -9052,11 +9019,6 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-encoding@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" - integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"