From 6a6ddf6031cd2ca84996fc8584c77a2302a221c0 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 4 Dec 2018 13:24:50 +0100 Subject: [PATCH 01/61] Rewrite and refactor helper functions to use better names and directories --- README.md | 2 +- src/react/Actions/accounts.js | 2 +- src/react/Actions/bunq_me_tab.js | 2 +- src/react/Actions/bunq_me_tabs.js | 4 +-- src/react/Actions/card_cvc2.js | 2 +- src/react/Actions/cards.js | 2 +- src/react/Actions/contacts.js | 6 ++--- src/react/Actions/export_new.js | 2 +- src/react/Actions/exports.js | 2 +- src/react/Actions/master_card_action_info.js | 2 +- src/react/Actions/master_card_actions.js | 4 +-- src/react/Actions/note_texts.js | 2 +- src/react/Actions/pay.js | 2 +- src/react/Actions/payment_info.js | 2 +- src/react/Actions/payments.js | 6 ++--- src/react/Actions/pending_payments.js | 2 +- src/react/Actions/registration.js | 2 +- src/react/Actions/request_inquiries.js | 4 +-- src/react/Actions/request_inquiry.js | 2 +- src/react/Actions/request_inquiry_batches.js | 4 +-- src/react/Actions/request_inquiry_info.js | 2 +- src/react/Actions/request_response.js | 2 +- src/react/Actions/request_response_info.js | 2 +- src/react/Actions/request_responses.js | 4 +-- src/react/Actions/scheduled_payments.js | 2 +- .../Actions/share_invite_bank_inquiries.js | 4 +-- .../Actions/share_invite_bank_inquiry.js | 2 +- .../Actions/share_invite_bank_response.js | 11 +++----- .../Actions/share_invite_bank_responses.js | 4 +-- src/react/Actions/users.js | 2 +- src/react/BunqDesktopClient.ts | 2 +- src/react/Components/AccountCard.jsx | 6 ++--- .../Components/AccountList/AccountList.jsx | 8 +++--- .../AccountList/AccountListItem.jsx | 6 ++--- .../AttachmentImage/AttachmentImage.jsx | 2 +- .../Components/Categories/CategoryChips.jsx | 2 +- .../Categories}/CategoryHelper.js | 0 .../Components/Categories/CategoryIcons.jsx | 2 +- .../Components/CodeSplitting/Loading.jsx | 2 +- .../Components/CombinedList/CombinedList.jsx | 4 +-- .../Components/CombinedList/EventData.jsx | 2 +- .../CombinedList/MapperFunctions.jsx | 4 +-- src/react/Components/ErrorBoundary.jsx | 2 +- src/react/Components/ExportDialog.jsx | 2 +- .../FilterComponents/ClearFilter.jsx | 2 +- src/react/Components/FilterCreationDialog.jsx | 2 +- .../FormFields/AccountSelectorDialog.jsx | 8 +++--- .../Components/FormFields/IconPicker.jsx | 2 +- .../FormFields/MoneyFormatInput.jsx | 2 +- .../FormFields/MoneyFormatInputDefault.jsx | 2 +- .../FormFields/SchedulePaymentForm.jsx | 4 +-- .../Components/FormFields/TargetChip.jsx | 2 +- .../Components/FormFields/TargetChipList.jsx | 9 +------ .../Components/FormFields/TargetSelection.jsx | 2 +- src/react/Components/Header.jsx | 2 +- src/react/Components/Layout.jsx | 8 +++--- .../Components/LimitedPremiumListItem.jsx | 2 +- .../ListItems/BunqMeTabListItem.jsx | 2 +- .../ListItems/MasterCardActionListItem.jsx | 6 ++--- .../Components/ListItems/PaymentListItem.jsx | 6 ++--- .../ListItems/RequestInquiryBatchListItem.jsx | 2 +- .../ListItems/RequestInquiryListItem.jsx | 4 +-- .../ListItems/RequestResponseListItem.jsx | 6 ++--- .../Components/NoteTexts/NoteTextForm.jsx | 2 +- .../Components/NoteTexts/NoteTextItem.jsx | 4 +-- .../PDFExportHelper/Base64BunqLogo.js | 1 + .../{ => PDFExportHelper}/PDFExportHelper.jsx | 10 +++---- src/react/Components/QR/AccountQRCode.jsx | 8 +++++- .../Components/QR/AccountQRFullscreen.jsx | 2 +- src/react/Components/Queue/QueueManager.jsx | 8 +++--- .../ReduxForm/Fields/renderDateTimePicker.jsx | 2 +- src/react/Components/ReduxForm/Validators.js | 2 +- src/react/Components/SavingsGoals/Helpers.js | 8 +++--- .../SavingsGoals/SavingsGoalListItem.jsx | 2 +- src/react/Components/Sidebar.jsx | 2 +- src/react/Components/TransactionHeader.jsx | 2 +- src/react/{Helpers => Functions}/Analytics.js | 0 .../BunqErrorHandler.js | 0 .../ConnectGetPermissions.js} | 27 +++++++++++++++++-- .../{Helpers => Functions/Crypto}/Crypto.js | 0 .../Crypto}/CryptoWorkerWrapper.js | 2 +- .../Crypto}/CustomForge.js | 0 .../{Helpers => Functions}/DataFilters.js | 2 +- .../DefaultImageHandlers.js | 0 .../EventStatusTexts.js} | 0 .../FilterDisabledChecker.js | 0 src/react/{Helpers => Functions}/IpChecker.js | 0 src/react/{Helpers => Functions}/IsDarwin.js | 0 src/react/{Helpers => Functions}/Logger.js | 0 .../{Helpers => Functions}/MergeApiObjects.js | 0 .../NoteTextTypeParser.js | 0 .../NotificationHelper.js | 0 src/react/{Helpers => Functions}/PhoneLib.js | 0 .../{Helpers => Functions}/ScheduleTexts.js | 0 .../StatsFormattingTemplates.js | 0 src/react/{Helpers => Functions}/Utils.js | 0 .../{Helpers => Functions}/VersionChecker.js | 0 src/react/Helpers/Base64Images.js | 2 -- src/react/Helpers/GetShareDetailBudget.js | 22 --------------- src/react/Models/SavingsGoal.ts | 2 +- src/react/Pages/AccountInfo.jsx | 6 ++--- src/react/Pages/ApplicationInfo.jsx | 6 ++--- .../Pages/BunqMeTab/ConfirmationDialog.jsx | 2 +- src/react/Pages/Cards/Cards.jsx | 2 +- src/react/Pages/Connect/Connect.jsx | 6 ++--- src/react/Pages/Connect/ConnectListItem.jsx | 2 +- src/react/Pages/Disclaimer.jsx | 2 +- src/react/Pages/Exports.jsx | 10 +++---- src/react/Pages/Login/Login.jsx | 4 +-- src/react/Pages/Login/OAuthManagement.jsx | 4 +-- src/react/Pages/MasterCardActionInfo.jsx | 6 ++--- src/react/Pages/Pay/ConfirmationDialog.jsx | 2 +- src/react/Pages/Pay/Pay.jsx | 19 +++++++------ src/react/Pages/PaymentInfo.jsx | 6 ++--- .../PendingPayments/PendingPaymentRow.jsx | 6 ++--- .../Pages/PendingPayments/PendingPayments.jsx | 6 ++--- src/react/Pages/Profile/Profile.jsx | 4 +-- .../RequestInquiry/ConfirmationDialog.jsx | 2 +- .../Pages/RequestInquiry/RequestInquiry.jsx | 6 ++--- .../Pages/RequestInquiry/SplitAmountItem.jsx | 2 +- src/react/Pages/RequestInquiryInfo.jsx | 6 ++--- .../RequestResponseInfo.jsx | 6 ++--- .../ScheduledPaymentItem.jsx | 4 +-- src/react/Pages/Settings/Settings.jsx | 10 ++++--- .../PieChart/CategoryTransactionPieChart.jsx | 2 +- .../EventSplitTransactionPieChart.jsx | 2 +- .../PieChart/EventTransactionPieChart.jsx | 2 +- .../Timeline/CategoryCountHistoryChart.jsx | 2 +- .../CategoryTransactionHistoryChart.jsx | 2 +- .../Chart/Timeline/EventTypeHistoryChart.jsx | 2 +- .../Timeline/EventTypeSplitHistoryChart.jsx | 2 +- .../EventTypeSplitTransactionHistoryChart.jsx | 2 +- .../EventTypeTransactionHistoryChart.jsx | 2 +- src/react/Reducers/accounts.js | 2 +- src/react/Reducers/bunq_me_tabs.js | 4 +-- src/react/Reducers/categories.js | 2 +- src/react/Reducers/master_card_actions.js | 4 +-- src/react/Reducers/payments.js | 4 +-- src/react/Reducers/pending_payments.js | 4 +-- src/react/Reducers/request_inquiries.js | 4 +-- src/react/Reducers/request_inquiry_batches.js | 4 +-- src/react/Reducers/request_responses.js | 4 +-- src/react/Reducers/savings_goals.js | 2 +- .../Reducers/share_invite_bank_inquiries.js | 2 +- .../Reducers/share_invite_bank_responses.js | 2 +- .../{Helpers => StaticData}/CountryCodes.json | 0 src/react/{Helpers => StaticData}/Icons.json | 0 src/react/Types/RuleCollection.ts | 2 +- src/react/WebWorkers/crypto.worker.js | 2 +- src/react/WebWorkers/stats.worker.js | 5 ++-- src/react/react-app.jsx | 4 +-- tasks/generate_icons.js | 2 +- 152 files changed, 255 insertions(+), 263 deletions(-) rename src/react/{Helpers => Components/Categories}/CategoryHelper.js (100%) create mode 100644 src/react/Components/PDFExportHelper/Base64BunqLogo.js rename src/react/Components/{ => PDFExportHelper}/PDFExportHelper.jsx (96%) rename src/react/{Helpers => Functions}/Analytics.js (100%) rename src/react/{Helpers => Functions}/BunqErrorHandler.js (100%) rename src/react/{Helpers/GetConnectPermissions.js => Functions/ConnectGetPermissions.js} (59%) rename src/react/{Helpers => Functions/Crypto}/Crypto.js (100%) rename src/react/{Helpers => Functions/Crypto}/CryptoWorkerWrapper.js (95%) rename src/react/{Helpers => Functions/Crypto}/CustomForge.js (100%) rename src/react/{Helpers => Functions}/DataFilters.js (99%) rename src/react/{Helpers => Functions}/DefaultImageHandlers.js (100%) rename src/react/{Helpers/StatusTexts.js => Functions/EventStatusTexts.js} (100%) rename src/react/{Helpers => Functions}/FilterDisabledChecker.js (100%) rename src/react/{Helpers => Functions}/IpChecker.js (100%) rename src/react/{Helpers => Functions}/IsDarwin.js (100%) rename src/react/{Helpers => Functions}/Logger.js (100%) rename src/react/{Helpers => Functions}/MergeApiObjects.js (100%) rename src/react/{Helpers => Functions}/NoteTextTypeParser.js (100%) rename src/react/{Helpers => Functions}/NotificationHelper.js (100%) rename src/react/{Helpers => Functions}/PhoneLib.js (100%) rename src/react/{Helpers => Functions}/ScheduleTexts.js (100%) rename src/react/{Helpers => Functions}/StatsFormattingTemplates.js (100%) rename src/react/{Helpers => Functions}/Utils.js (100%) rename src/react/{Helpers => Functions}/VersionChecker.js (100%) delete mode 100644 src/react/Helpers/Base64Images.js delete mode 100644 src/react/Helpers/GetShareDetailBudget.js rename src/react/{Helpers => StaticData}/CountryCodes.json (100%) rename src/react/{Helpers => StaticData}/Icons.json (100%) diff --git a/README.md b/README.md index b2a0431d..8406b19f 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Check out the settings page to see where this information is stored and to chang ## Privacy At no point is your API key, session information or other data directly sent to other servers or systems. All requests to the bunq API are done directly from the bunqDesktop client to the bunq servers. -We use Google Analytics with minimal settings ([Source code](./src/react/Helpers/Analytics.js)) to check +We use Google Analytics with minimal settings ([Source code](./src/react/Functions/Analytics.js)) to check which version of the application is used and other basic information like system language, OS version and country. Your IP address is anonymized using [IP Anonymization in Analytics](https://support.google.com/analytics/answer/2763052?hl=en). Google Analytics can be disabled on the settings page whenever you want. diff --git a/src/react/Actions/accounts.js b/src/react/Actions/accounts.js index 8fce4907..7ee1aa70 100644 --- a/src/react/Actions/accounts.js +++ b/src/react/Actions/accounts.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import MonetaryAccount from "../Models/MonetaryAccount"; diff --git a/src/react/Actions/bunq_me_tab.js b/src/react/Actions/bunq_me_tab.js index 83f0a921..8eb7601e 100644 --- a/src/react/Actions/bunq_me_tab.js +++ b/src/react/Actions/bunq_me_tab.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import { bunqMeTabsUpdate } from "./bunq_me_tabs"; diff --git a/src/react/Actions/bunq_me_tabs.js b/src/react/Actions/bunq_me_tabs.js index 8f4bc3d3..03fe7243 100644 --- a/src/react/Actions/bunq_me_tabs.js +++ b/src/react/Actions/bunq_me_tabs.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import BunqMeTab from "../Models/BunqMeTab.ts"; export const STORED_BUNQ_ME_TABS = "BUNQDESKTOP_STORED_BUNQ_ME_TABS"; diff --git a/src/react/Actions/card_cvc2.js b/src/react/Actions/card_cvc2.js index dec19415..9b935e0d 100644 --- a/src/react/Actions/card_cvc2.js +++ b/src/react/Actions/card_cvc2.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; export function cardCvc2SetInfo(cvc2_codes, user_id, card_id) { return { diff --git a/src/react/Actions/cards.js b/src/react/Actions/cards.js index 999338f3..2d392a49 100644 --- a/src/react/Actions/cards.js +++ b/src/react/Actions/cards.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; export function cardsSetInfo(cards, user_id) { return { diff --git a/src/react/Actions/contacts.js b/src/react/Actions/contacts.js index e7ae0a7d..7b8f3a81 100644 --- a/src/react/Actions/contacts.js +++ b/src/react/Actions/contacts.js @@ -1,9 +1,9 @@ import url from "url"; import axios from "axios"; const vcf = require("vcf"); -import Logger from "../Helpers/Logger"; -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { getInternationalFormat } from "../Helpers/PhoneLib"; +import Logger from "../Functions/Logger"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { getInternationalFormat } from "../Functions/PhoneLib"; import fs from "../ImportWrappers/fs"; export const STORED_CONTACTS = "BUNQDESKTOP_STORED_CONTACTS"; diff --git a/src/react/Actions/export_new.js b/src/react/Actions/export_new.js index bf76f06d..c070e727 100644 --- a/src/react/Actions/export_new.js +++ b/src/react/Actions/export_new.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; export function exportNew( BunqJSClient, diff --git a/src/react/Actions/exports.js b/src/react/Actions/exports.js index d980f34c..6c0f1e5a 100644 --- a/src/react/Actions/exports.js +++ b/src/react/Actions/exports.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; export function exportsSetInfo(exports, user_id, account_id) { return { diff --git a/src/react/Actions/master_card_action_info.js b/src/react/Actions/master_card_action_info.js index e70a81fe..b8104ddb 100644 --- a/src/react/Actions/master_card_action_info.js +++ b/src/react/Actions/master_card_action_info.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import MasterCardAction from "../Models/MasterCardAction"; import { masterCardActionsSetInfo } from "./master_card_actions"; diff --git a/src/react/Actions/master_card_actions.js b/src/react/Actions/master_card_actions.js index 9ff8067d..9ab9e553 100644 --- a/src/react/Actions/master_card_actions.js +++ b/src/react/Actions/master_card_actions.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import MasterCardAction from "../Models/MasterCardAction"; export const STORED_MASTER_CARD_ACTIONS = "BUNQDESKTOP_STORED_MASTER_CARD_ACTIONS"; diff --git a/src/react/Actions/note_texts.js b/src/react/Actions/note_texts.js index 2b1e1a7b..d10de06d 100644 --- a/src/react/Actions/note_texts.js +++ b/src/react/Actions/note_texts.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; export function noteTextsSetInfo(noteTexts, event_type, user_id, account_id, event_id) { return { diff --git a/src/react/Actions/pay.js b/src/react/Actions/pay.js index 7f31303f..091865f8 100644 --- a/src/react/Actions/pay.js +++ b/src/react/Actions/pay.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import { paymentInfoUpdate } from "./payments"; import { accountsUpdate } from "./accounts"; diff --git a/src/react/Actions/payment_info.js b/src/react/Actions/payment_info.js index dd5fa7f0..4dad712f 100644 --- a/src/react/Actions/payment_info.js +++ b/src/react/Actions/payment_info.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import Payment from "../Models/Payment"; import { paymentsSetInfo } from "./payments"; diff --git a/src/react/Actions/payments.js b/src/react/Actions/payments.js index 01862b69..32f1b82d 100644 --- a/src/react/Actions/payments.js +++ b/src/react/Actions/payments.js @@ -1,6 +1,6 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; -import { paymentApiFilter } from "../Helpers/DataFilters"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; +import { paymentApiFilter } from "../Functions/DataFilters"; import Payment from "../Models/Payment"; diff --git a/src/react/Actions/pending_payments.js b/src/react/Actions/pending_payments.js index 3aa85fab..800266ad 100644 --- a/src/react/Actions/pending_payments.js +++ b/src/react/Actions/pending_payments.js @@ -1,4 +1,4 @@ -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const PENDING_PAYMENTS_LOCATION = "BUNQDESKTOP_STORED_PENDING_PAYMENTS"; diff --git a/src/react/Actions/registration.js b/src/react/Actions/registration.js index 314074a5..a04273dc 100644 --- a/src/react/Actions/registration.js +++ b/src/react/Actions/registration.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { applicationSetStatus } from "./application"; import { userSetInfo } from "./user"; import { loadStoredPayments } from "./payments"; diff --git a/src/react/Actions/request_inquiries.js b/src/react/Actions/request_inquiries.js index 48470829..c7b333b8 100644 --- a/src/react/Actions/request_inquiries.js +++ b/src/react/Actions/request_inquiries.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import RequestInquiry from "../Models/RequestInquiry"; export const STORED_REQUEST_INQUIRIES = "BUNQDESKTOP_STORED_REQUEST_INQUIRIES"; diff --git a/src/react/Actions/request_inquiry.js b/src/react/Actions/request_inquiry.js index f63f0d03..b2b0802f 100644 --- a/src/react/Actions/request_inquiry.js +++ b/src/react/Actions/request_inquiry.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import { requestInquiryUpdate } from "./request_inquiry_info"; import { requestInquiryBatchesUpdate } from "./request_inquiry_batches"; diff --git a/src/react/Actions/request_inquiry_batches.js b/src/react/Actions/request_inquiry_batches.js index 9adffd76..3dbbc0e7 100644 --- a/src/react/Actions/request_inquiry_batches.js +++ b/src/react/Actions/request_inquiry_batches.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import RequestInquiryBatch from "../Models/RequestInquiryBatch"; export const STORED_REQUEST_INQUIRY_BATCHES = "BUNQDESKTOP_STORED_REQUEST_INQUIRY_BATCHES"; diff --git a/src/react/Actions/request_inquiry_info.js b/src/react/Actions/request_inquiry_info.js index 1a2c8af3..9a075d14 100644 --- a/src/react/Actions/request_inquiry_info.js +++ b/src/react/Actions/request_inquiry_info.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import RequestInquiry from "../Models/RequestInquiry"; import { requestInquiriesSetInfo } from "./request_inquiries"; diff --git a/src/react/Actions/request_response.js b/src/react/Actions/request_response.js index 1e02c35a..04461741 100644 --- a/src/react/Actions/request_response.js +++ b/src/react/Actions/request_response.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import { requestResponseUpdate } from "./request_response_info"; import { requestInquiryBatchesUpdate } from "./request_inquiry_batches"; diff --git a/src/react/Actions/request_response_info.js b/src/react/Actions/request_response_info.js index 45489b2f..d4e13e5a 100644 --- a/src/react/Actions/request_response_info.js +++ b/src/react/Actions/request_response_info.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import RequestResponse from "../Models/RequestResponse"; import { requestResponsesSetInfo } from "./request_responses"; diff --git a/src/react/Actions/request_responses.js b/src/react/Actions/request_responses.js index 779485a1..cc4e76fd 100644 --- a/src/react/Actions/request_responses.js +++ b/src/react/Actions/request_responses.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import RequestResponse from "../Models/RequestResponse"; export const STORED_REQUEST_RESPONSES = "BUNQDESKTOP_STORED_REQUEST_RESPONSES"; diff --git a/src/react/Actions/scheduled_payments.js b/src/react/Actions/scheduled_payments.js index 7186c3df..1fd0f226 100644 --- a/src/react/Actions/scheduled_payments.js +++ b/src/react/Actions/scheduled_payments.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; export function scheduledPaymentsSetInfo(scheduled_payments, account_id) { return { diff --git a/src/react/Actions/share_invite_bank_inquiries.js b/src/react/Actions/share_invite_bank_inquiries.js index b1360f83..e37a55bc 100644 --- a/src/react/Actions/share_invite_bank_inquiries.js +++ b/src/react/Actions/share_invite_bank_inquiries.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const STORED_SHARE_INVITE_BANK_INQUIRIES = "BUNQDESKTOP_SHARE_INVITE_BANK_INQUIRIES"; diff --git a/src/react/Actions/share_invite_bank_inquiry.js b/src/react/Actions/share_invite_bank_inquiry.js index f9159a51..d9f22255 100644 --- a/src/react/Actions/share_invite_bank_inquiry.js +++ b/src/react/Actions/share_invite_bank_inquiry.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import { shareInviteBankInquiriesInfoUpdate } from "./share_invite_bank_inquiries"; diff --git a/src/react/Actions/share_invite_bank_response.js b/src/react/Actions/share_invite_bank_response.js index 547d30e8..f5c7961f 100644 --- a/src/react/Actions/share_invite_bank_response.js +++ b/src/react/Actions/share_invite_bank_response.js @@ -1,13 +1,8 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { openSnackbar } from "./snackbar"; import { shareInviteBankResponsesInfoUpdate } from "./share_invite_bank_responses"; -export function shareInviteBankResponseChangeStatus( - BunqJSClient, - userId, - shareInviteBankResponseId, - status -) { +export function shareInviteBankResponseChangeStatus(BunqJSClient, userId, shareInviteBankResponseId, status) { const failedMessage = window.t("We received the following error while updating your connect request"); const successMessage = window.t("Connect request was updated successfully!"); @@ -15,7 +10,7 @@ export function shareInviteBankResponseChangeStatus( dispatch(shareInviteBankResponseLoading()); BunqJSClient.api.shareInviteBankResponse - .putStatus(userId, shareInviteBankResponseId, status) + .putStatus(userId, shareInviteBankResponseId, status) .then(result => { dispatch(openSnackbar(successMessage)); diff --git a/src/react/Actions/share_invite_bank_responses.js b/src/react/Actions/share_invite_bank_responses.js index a9a33bf4..9a64422e 100644 --- a/src/react/Actions/share_invite_bank_responses.js +++ b/src/react/Actions/share_invite_bank_responses.js @@ -1,5 +1,5 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { storeDecryptString } from "../Helpers/CryptoWorkerWrapper"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const STORED_SHARE_INVITE_BANK_RESPONSES = "BUNQDESKTOP_SHARE_INVITE_BANK_RESPONSES"; diff --git a/src/react/Actions/users.js b/src/react/Actions/users.js index da9f67ec..27fb3c79 100644 --- a/src/react/Actions/users.js +++ b/src/react/Actions/users.js @@ -1,4 +1,4 @@ -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; import { userSetInfo } from "./user"; export function usersUpdate(BunqJSClient, updated = false) { diff --git a/src/react/BunqDesktopClient.ts b/src/react/BunqDesktopClient.ts index 383935fc..c85ed934 100644 --- a/src/react/BunqDesktopClient.ts +++ b/src/react/BunqDesktopClient.ts @@ -1,6 +1,6 @@ import BunqJSClient from "@bunq-community/bunq-js-client"; import awaiting from "awaiting"; -import { decryptString, derivePasswordKey, encryptString } from "./Helpers/Crypto"; +import { decryptString, derivePasswordKey, encryptString } from "./Functions/Crypto/Crypto"; import { Environment, StoredApiKey } from "./Types/Types"; export const SALT_LOCATION = "BUNQDESKTOP_PASSWORD_SALT"; diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index 29272224..510150a9 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -23,8 +23,8 @@ import AccountAvatarCircularProgress from "./AccountList/AccountAvatarCircularPr import LazyAttachmentImage from "./AttachmentImage/LazyAttachmentImage"; import AccountQRFullscreen from "./QR/AccountQRFullscreen"; -import { formatMoney, formatIban } from "../Helpers/Utils"; -import GetShareDetailBudget from "../Helpers/GetShareDetailBudget"; +import { formatMoney, formatIban } from "../Functions/Utils"; +import { connectGetBudget } from "../Functions/ConnectGetPermissions"; const styles = { avatar: { @@ -54,7 +54,7 @@ class AccountCard extends React.Component { let formattedBalance = account.balance ? account.balance.value : 0; if (this.props.shareInviteBankResponses.length > 0) { - const connectBudget = GetShareDetailBudget(this.props.shareInviteBankResponses); + const connectBudget = connectGetBudget(this.props.shareInviteBankResponses); if (connectBudget) formattedBalance = connectBudget; } diff --git a/src/react/Components/AccountList/AccountList.jsx b/src/react/Components/AccountList/AccountList.jsx index 062390b6..3c30a0d3 100644 --- a/src/react/Components/AccountList/AccountList.jsx +++ b/src/react/Components/AccountList/AccountList.jsx @@ -18,9 +18,9 @@ import CheckBoxOutlinedIcon from "@material-ui/icons/CheckBoxOutlined"; import LimitedPremiumListItem from "../LimitedPremiumListItem"; import AccountListItem from "./AccountListItem"; import AddAccount from "./AddAccount"; -import { formatMoney } from "../../Helpers/Utils"; -import GetShareDetailBudget from "../../Helpers/GetShareDetailBudget"; -import { filterShareInviteBankResponses } from "../../Helpers/DataFilters"; +import { formatMoney } from "../../Functions/Utils"; +import { connectGetBudget } from "../../Functions/ConnectGetPermissions"; +import { filterShareInviteBankResponses } from "../../Functions/DataFilters"; import { accountsSelectAccount, @@ -92,7 +92,7 @@ class AccountList extends React.Component { // get budget from this response if (filteredResponses.length > 0) { - const connectBudget = GetShareDetailBudget(filteredResponses); + const connectBudget = connectGetBudget(filteredResponses); if (connectBudget) { accountTrayItem.balance = formatMoney(parseFloat(connectBudget)); diff --git a/src/react/Components/AccountList/AccountListItem.jsx b/src/react/Components/AccountList/AccountListItem.jsx index 766efb12..4c341131 100644 --- a/src/react/Components/AccountList/AccountListItem.jsx +++ b/src/react/Components/AccountList/AccountListItem.jsx @@ -15,8 +15,8 @@ import LazyAttachmentImage from "../../Components/AttachmentImage/LazyAttachment import NavLink from "../../Components/Routing/NavLink"; import AccountAvatarCircularProgress from "./AccountAvatarCircularProgress"; -import { formatMoney } from "../../Helpers/Utils"; -import GetShareDetailBudget from "../../Helpers/GetShareDetailBudget"; +import { formatMoney } from "../../Functions/Utils"; +import { connectGetBudget } from "../../Functions/ConnectGetPermissions"; import { accountsSelectAccount } from "../../Actions/accounts.js"; import { addAccountIdFilter, removeAccountIdFilter, toggleAccountIdFilter } from "../../Actions/filters"; @@ -75,7 +75,7 @@ class AccountListItem extends React.Component { let accountBalance = account.balance ? account.balance.value : 0; if (shareInviteBankResponses.length > 0) { - const connectBudget = GetShareDetailBudget(shareInviteBankResponses); + const connectBudget = connectGetBudget(shareInviteBankResponses); if (connectBudget) { accountBalance = connectBudget; } diff --git a/src/react/Components/AttachmentImage/AttachmentImage.jsx b/src/react/Components/AttachmentImage/AttachmentImage.jsx index 6a518a99..58974255 100644 --- a/src/react/Components/AttachmentImage/AttachmentImage.jsx +++ b/src/react/Components/AttachmentImage/AttachmentImage.jsx @@ -1,6 +1,6 @@ import React from "react"; import localforage from "../../ImportWrappers/localforage"; -import Logger from "../../Helpers/Logger"; +import Logger from "../../Functions/Logger"; class AttachmentImage extends React.PureComponent { constructor(props, context) { diff --git a/src/react/Components/Categories/CategoryChips.jsx b/src/react/Components/Categories/CategoryChips.jsx index 6696fc2d..2c67222c 100644 --- a/src/react/Components/Categories/CategoryChips.jsx +++ b/src/react/Components/Categories/CategoryChips.jsx @@ -1,7 +1,7 @@ import React from "react"; import { connect } from "react-redux"; import CategoryChip from "./CategoryChip"; -import CategoryHelper from "../../Helpers/CategoryHelper"; +import CategoryHelper from "./CategoryHelper"; import PrioritySorter from "./PrioritySorter"; const style = { diff --git a/src/react/Helpers/CategoryHelper.js b/src/react/Components/Categories/CategoryHelper.js similarity index 100% rename from src/react/Helpers/CategoryHelper.js rename to src/react/Components/Categories/CategoryHelper.js diff --git a/src/react/Components/Categories/CategoryIcons.jsx b/src/react/Components/Categories/CategoryIcons.jsx index 75a8c438..4aee2815 100644 --- a/src/react/Components/Categories/CategoryIcons.jsx +++ b/src/react/Components/Categories/CategoryIcons.jsx @@ -1,6 +1,6 @@ import React from "react"; import { connect } from "react-redux"; -import CategoryHelper from "../../Helpers/CategoryHelper"; +import CategoryHelper from "./CategoryHelper"; import PrioritySorter from "./PrioritySorter"; import CategoryIcon from "./CategoryIcon"; diff --git a/src/react/Components/CodeSplitting/Loading.jsx b/src/react/Components/CodeSplitting/Loading.jsx index a6a22a3f..54da1773 100644 --- a/src/react/Components/CodeSplitting/Loading.jsx +++ b/src/react/Components/CodeSplitting/Loading.jsx @@ -1,5 +1,5 @@ import React from "react"; -import Logger from "../../Helpers/Logger"; +import Logger from "../../Functions/Logger"; export default ({ isLoading, pastDelay, error }) => { if (isLoading && pastDelay) { diff --git a/src/react/Components/CombinedList/CombinedList.jsx b/src/react/Components/CombinedList/CombinedList.jsx index 65605e02..8d8e053d 100644 --- a/src/react/Components/CombinedList/CombinedList.jsx +++ b/src/react/Components/CombinedList/CombinedList.jsx @@ -19,7 +19,7 @@ import { openSnackbar } from "../../Actions/snackbar"; import { bunqMeTabPut } from "../../Actions/bunq_me_tab"; import { nextPage, previousPage, setPage, setPageSize, firstPage } from "../../Actions/pagination"; -import { humanReadableDate } from "../../Helpers/Utils"; +import { humanReadableDate } from "../../Functions/Utils"; import { paymentMapper, bunqMeTabsMapper, @@ -30,7 +30,7 @@ import { shareInviteBankInquiryMapper, shareInviteBankResponseMapper } from "./MapperFunctions"; -import FilterDisabledChecker from "../../Helpers/FilterDisabledChecker"; +import FilterDisabledChecker from "../../Functions/FilterDisabledChecker"; const styles = { button: { diff --git a/src/react/Components/CombinedList/EventData.jsx b/src/react/Components/CombinedList/EventData.jsx index b46da74f..a5b6c1da 100644 --- a/src/react/Components/CombinedList/EventData.jsx +++ b/src/react/Components/CombinedList/EventData.jsx @@ -9,7 +9,7 @@ import IncomingIcon from "@material-ui/icons/KeyboardArrowDown"; import OutgoingIcon from "@material-ui/icons/KeyboardArrowUp"; import ChangeIcon from "@material-ui/icons/CompareArrows"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; const styles = { gridContainer: { diff --git a/src/react/Components/CombinedList/MapperFunctions.jsx b/src/react/Components/CombinedList/MapperFunctions.jsx index 20720c4a..2ac64c8b 100644 --- a/src/react/Components/CombinedList/MapperFunctions.jsx +++ b/src/react/Components/CombinedList/MapperFunctions.jsx @@ -9,7 +9,7 @@ import RequestInquiryBatchListItem from "../ListItems/RequestInquiryBatchListIte import ShareInviteBankInquiryListItem from "../ListItems/ShareInviteBankInquiryListItem"; import ShareInviteBankResponseListItem from "../ListItems/ShareInviteBankResponseListItem"; -import { UTCDateToLocalDate } from "../../Helpers/Utils"; +import { UTCDateToLocalDate } from "../../Functions/Utils"; import { paymentFilter, bunqMeTabsFilter, @@ -19,7 +19,7 @@ import { requestResponseFilter, shareInviteBankInquiryFilter, shareInviteBankResponseFilter -} from "../../Helpers/DataFilters"; +} from "../../Functions/DataFilters"; export const paymentMapper = (settings, hiddenPaymentIds = []) => { if (settings.hiddenTypes.includes("Payment")) return []; diff --git a/src/react/Components/ErrorBoundary.jsx b/src/react/Components/ErrorBoundary.jsx index 56ee9b2d..12f4d22c 100644 --- a/src/react/Components/ErrorBoundary.jsx +++ b/src/react/Components/ErrorBoundary.jsx @@ -1,7 +1,7 @@ import React from "react"; import Typography from "@material-ui/core/Typography"; -import Logger from "../Helpers/Logger"; +import Logger from "../Functions/Logger"; import TranslateButton from "./TranslationHelpers/Button"; import TranslateTypography from "./TranslationHelpers/Typography"; diff --git a/src/react/Components/ExportDialog.jsx b/src/react/Components/ExportDialog.jsx index 9ebb038c..2657d473 100644 --- a/src/react/Components/ExportDialog.jsx +++ b/src/react/Components/ExportDialog.jsx @@ -8,7 +8,7 @@ import Slide from "@material-ui/core/Slide"; import TranslateButton from "./TranslationHelpers/Button"; import ReactJsonWrapper from "./ReactJsonWrapper"; -import { anonymizeObject } from "../Helpers/Utils"; +import { anonymizeObject } from "../Functions/Utils"; const Transition = props => ; diff --git a/src/react/Components/FilterComponents/ClearFilter.jsx b/src/react/Components/FilterComponents/ClearFilter.jsx index ca9dc1fb..122117b9 100644 --- a/src/react/Components/FilterComponents/ClearFilter.jsx +++ b/src/react/Components/FilterComponents/ClearFilter.jsx @@ -4,7 +4,7 @@ import Button from "@material-ui/core/Button"; import IconButton from "@material-ui/core/IconButton"; import ClearIcon from "@material-ui/icons/Clear"; -import FilterDisabledChecker from "../../Helpers/FilterDisabledChecker"; +import FilterDisabledChecker from "../../Functions/FilterDisabledChecker"; import { resetFilters } from "../../Actions/filters"; diff --git a/src/react/Components/FilterCreationDialog.jsx b/src/react/Components/FilterCreationDialog.jsx index 6ca43b6c..eaf8597e 100644 --- a/src/react/Components/FilterCreationDialog.jsx +++ b/src/react/Components/FilterCreationDialog.jsx @@ -9,7 +9,7 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import NavLink from "./Routing/NavLink"; -import { formatIban } from "../Helpers/Utils"; +import { formatIban } from "../Functions/Utils"; export default props => { const { t, item, open, onClose } = props; diff --git a/src/react/Components/FormFields/AccountSelectorDialog.jsx b/src/react/Components/FormFields/AccountSelectorDialog.jsx index 3c71fa24..732cbcb6 100644 --- a/src/react/Components/FormFields/AccountSelectorDialog.jsx +++ b/src/react/Components/FormFields/AccountSelectorDialog.jsx @@ -11,10 +11,10 @@ import Dialog from "@material-ui/core/Dialog"; import DialogContent from "@material-ui/core/DialogContent"; import DialogTitle from "@material-ui/core/DialogTitle"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; -import { filterShareInviteBankResponses } from "../../Helpers/DataFilters"; -import GetShareDetailBudget from "../../Helpers/GetShareDetailBudget"; +import { filterShareInviteBankResponses } from "../../Functions/DataFilters"; +import { connectGetBudget } from "../../Functions/ConnectGetPermissions"; const styles = { formControl: { @@ -37,7 +37,7 @@ const AccountItem = ({ account, onClick, BunqJSClient, hideBalance, shareInviteB // attempt to get connect budget if possible if (filteredInviteResponses.length > 0) { - const connectBudget = GetShareDetailBudget(filteredInviteResponses); + const connectBudget = connectGetBudget(filteredInviteResponses); if (connectBudget) { formattedBalance = connectBudget; } diff --git a/src/react/Components/FormFields/IconPicker.jsx b/src/react/Components/FormFields/IconPicker.jsx index 92ec59e9..57633c4f 100644 --- a/src/react/Components/FormFields/IconPicker.jsx +++ b/src/react/Components/FormFields/IconPicker.jsx @@ -8,7 +8,7 @@ import TextField from "@material-ui/core/TextField"; import Dialog from "@material-ui/core/Dialog"; import DialogTitle from "@material-ui/core/DialogTitle"; -import Icons from "../../Helpers/Icons"; +import Icons from "../../StaticData/Icons"; import CustomIcon from "../CustomIcon"; const styles = { diff --git a/src/react/Components/FormFields/MoneyFormatInput.jsx b/src/react/Components/FormFields/MoneyFormatInput.jsx index e8a7115e..ceacb7ad 100644 --- a/src/react/Components/FormFields/MoneyFormatInput.jsx +++ b/src/react/Components/FormFields/MoneyFormatInput.jsx @@ -1,6 +1,6 @@ import React from "react"; import NumberFormat from "react-number-format"; -import { preferedThousandSeparator, preferedDecimalSeparator } from "../../Helpers/Utils"; +import { preferedThousandSeparator, preferedDecimalSeparator } from "../../Functions/Utils"; import { withTheme } from "@material-ui/core/styles"; diff --git a/src/react/Components/FormFields/MoneyFormatInputDefault.jsx b/src/react/Components/FormFields/MoneyFormatInputDefault.jsx index 15e610f9..b059bfe8 100644 --- a/src/react/Components/FormFields/MoneyFormatInputDefault.jsx +++ b/src/react/Components/FormFields/MoneyFormatInputDefault.jsx @@ -2,7 +2,7 @@ import React from "react"; import NumberFormat from "react-number-format"; import Input from "@material-ui/core/Input"; import FormControl from "@material-ui/core/FormControl"; -import { preferedThousandSeparator, preferedDecimalSeparator } from "../../Helpers/Utils"; +import { preferedThousandSeparator, preferedDecimalSeparator } from "../../Functions/Utils"; import { withTheme } from "@material-ui/core/styles"; diff --git a/src/react/Components/FormFields/SchedulePaymentForm.jsx b/src/react/Components/FormFields/SchedulePaymentForm.jsx index 91388667..8be5a59f 100644 --- a/src/react/Components/FormFields/SchedulePaymentForm.jsx +++ b/src/react/Components/FormFields/SchedulePaymentForm.jsx @@ -11,8 +11,8 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import TranslateMenuItem from "../TranslationHelpers/MenuItem"; -import scheduleTexts from "../../Helpers/ScheduleTexts"; -import { getUTCDate, UTCDateToLocalDate } from "../../Helpers/Utils"; +import scheduleTexts from "../../Functions/ScheduleTexts"; +import { getUTCDate, UTCDateToLocalDate } from "../../Functions/Utils"; const styles = { textField: { diff --git a/src/react/Components/FormFields/TargetChip.jsx b/src/react/Components/FormFields/TargetChip.jsx index d24edd79..c6155d54 100644 --- a/src/react/Components/FormFields/TargetChip.jsx +++ b/src/react/Components/FormFields/TargetChip.jsx @@ -44,7 +44,7 @@ const TargetChip = ({ target, targetKey, accounts, onClick = false, onDelete = f label={targetValue} style={{ ...styles.chip, - ...style, + ...style }} avatar={ diff --git a/src/react/Components/FormFields/TargetChipList.jsx b/src/react/Components/FormFields/TargetChipList.jsx index 47482ada..600ddfaa 100644 --- a/src/react/Components/FormFields/TargetChipList.jsx +++ b/src/react/Components/FormFields/TargetChipList.jsx @@ -10,14 +10,7 @@ const styles = { const TargetChipList = ({ targets, ...restProps }) => { return targets.map((target, targetKey) => { - return ( - - ); + return ; }); }; diff --git a/src/react/Components/FormFields/TargetSelection.jsx b/src/react/Components/FormFields/TargetSelection.jsx index 9b5e0cb2..eb521bc4 100644 --- a/src/react/Components/FormFields/TargetSelection.jsx +++ b/src/react/Components/FormFields/TargetSelection.jsx @@ -16,7 +16,7 @@ import NavLink from "../Routing/NavLink"; import InputSuggestions from "./InputSuggestions"; import AccountSelectorDialog from "./AccountSelectorDialog"; import { openSnackbar } from "../../Actions/snackbar"; -import { formatIban } from "../../Helpers/Utils"; +import { formatIban } from "../../Functions/Utils"; import TargetChipList from "./TargetChipList"; const styles = { diff --git a/src/react/Components/Header.jsx b/src/react/Components/Header.jsx index f346ce90..7f4d2f4e 100644 --- a/src/react/Components/Header.jsx +++ b/src/react/Components/Header.jsx @@ -12,7 +12,7 @@ import MinimizeIcon from "./CustomSVG/Minimize"; import QueueHeaderIcon from "./Queue/QueueHeaderIcon"; import TranslateTypography from "./TranslationHelpers/Typography"; -import IsDarwin from "../Helpers/IsDarwin"; +import IsDarwin from "../Functions/IsDarwin"; import { toggleSidebar } from "../Actions/sidebar"; const remote = require("electron").remote; diff --git a/src/react/Components/Layout.jsx b/src/react/Components/Layout.jsx index e75c8eee..e8f977ab 100644 --- a/src/react/Components/Layout.jsx +++ b/src/react/Components/Layout.jsx @@ -9,9 +9,9 @@ import MuiThemeProvider from "@material-ui/core/styles/MuiThemeProvider"; import createMuiTheme from "@material-ui/core/styles/createMuiTheme"; // custom components -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import Logger from "../Helpers/Logger"; -import VersionChecker from "../Helpers/VersionChecker"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import Logger from "../Functions/Logger"; +import VersionChecker from "../Functions/VersionChecker"; import NetworkStatusChecker from "./NetworkStatusChecker"; import RuleCollectionChecker from "./RuleCollectionChecker"; import QueueManager from "./Queue/QueueManager"; @@ -343,7 +343,7 @@ const mapDispatchToProps = (dispatch, ownProps) => { // functions to clear user data registrationClearUserInfo: () => dispatch(registrationClearUserInfo()), - registrationLoadBunqDesktopClient: () => dispatch(registrationSetBunqDesktopClientData()), + registrationLoadBunqDesktopClient: () => dispatch(registrationSetBunqDesktopClientData()) }; }; diff --git a/src/react/Components/LimitedPremiumListItem.jsx b/src/react/Components/LimitedPremiumListItem.jsx index da63c6ef..a476641d 100644 --- a/src/react/Components/LimitedPremiumListItem.jsx +++ b/src/react/Components/LimitedPremiumListItem.jsx @@ -6,7 +6,7 @@ import ListItemText from "@material-ui/core/ListItemText"; import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import LinearProgress from "./LinearProgress"; -import { formatMoney } from "../Helpers/Utils"; +import { formatMoney } from "../Functions/Utils"; const styles = { iconButton: { diff --git a/src/react/Components/ListItems/BunqMeTabListItem.jsx b/src/react/Components/ListItems/BunqMeTabListItem.jsx index 6e798b12..af317bd2 100644 --- a/src/react/Components/ListItems/BunqMeTabListItem.jsx +++ b/src/react/Components/ListItems/BunqMeTabListItem.jsx @@ -22,7 +22,7 @@ import PaymentListItem from "./PaymentListItem"; import AccountQRFullscreen from "../QR/AccountQRFullscreen"; import TranslateButton from "../TranslationHelpers/Button"; import CategoryIcons from "../Categories/CategoryIcons"; -import { humanReadableDate, formatMoney } from "../../Helpers/Utils"; +import { humanReadableDate, formatMoney } from "../../Functions/Utils"; const styles = { actionListItem: { diff --git a/src/react/Components/ListItems/MasterCardActionListItem.jsx b/src/react/Components/ListItems/MasterCardActionListItem.jsx index d23249f3..5aa00968 100644 --- a/src/react/Components/ListItems/MasterCardActionListItem.jsx +++ b/src/react/Components/ListItems/MasterCardActionListItem.jsx @@ -12,9 +12,9 @@ import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; import CategoryIcons from "../Categories/CategoryIcons"; import MoneyAmountLabel from "../MoneyAmountLabel"; -import { masterCardActionParser } from "../../Helpers/StatusTexts"; -import { formatMoney } from "../../Helpers/Utils"; -import { defaultMastercardImage } from "../../Helpers/DefaultImageHandlers"; +import { masterCardActionParser } from "../../Functions/EventStatusTexts"; +import { formatMoney } from "../../Functions/Utils"; +import { defaultMastercardImage } from "../../Functions/DefaultImageHandlers"; const styles = { listItemText: { diff --git a/src/react/Components/ListItems/PaymentListItem.jsx b/src/react/Components/ListItems/PaymentListItem.jsx index 0a340c41..813e1477 100644 --- a/src/react/Components/ListItems/PaymentListItem.jsx +++ b/src/react/Components/ListItems/PaymentListItem.jsx @@ -6,9 +6,9 @@ import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import Avatar from "@material-ui/core/Avatar"; import Divider from "@material-ui/core/Divider"; -import { formatMoney } from "../../Helpers/Utils"; -import { paymentText } from "../../Helpers/StatusTexts"; -import { defaultPaymentImage } from "../../Helpers/DefaultImageHandlers"; +import { formatMoney } from "../../Functions/Utils"; +import { paymentText } from "../../Functions/EventStatusTexts"; +import { defaultPaymentImage } from "../../Functions/DefaultImageHandlers"; import NavLink from "../Routing/NavLink"; import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; diff --git a/src/react/Components/ListItems/RequestInquiryBatchListItem.jsx b/src/react/Components/ListItems/RequestInquiryBatchListItem.jsx index 0e9c09fd..23ba1cf3 100644 --- a/src/react/Components/ListItems/RequestInquiryBatchListItem.jsx +++ b/src/react/Components/ListItems/RequestInquiryBatchListItem.jsx @@ -19,7 +19,7 @@ import Share from "@material-ui/icons/Share"; import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; import RequestInquiryListItem from "./RequestInquiryListItem"; -import { formatMoney, humanReadableDate } from "../../Helpers/Utils"; +import { formatMoney, humanReadableDate } from "../../Functions/Utils"; const styles = { listItemText: { diff --git a/src/react/Components/ListItems/RequestInquiryListItem.jsx b/src/react/Components/ListItems/RequestInquiryListItem.jsx index b2b757c1..90b02319 100644 --- a/src/react/Components/ListItems/RequestInquiryListItem.jsx +++ b/src/react/Components/ListItems/RequestInquiryListItem.jsx @@ -6,8 +6,8 @@ import { translate } from "react-i18next"; import Avatar from "@material-ui/core/Avatar"; import Divider from "@material-ui/core/Divider"; -import { formatMoney } from "../../Helpers/Utils"; -import { requestInquiryText } from "../../Helpers/StatusTexts"; +import { formatMoney } from "../../Functions/Utils"; +import { requestInquiryText } from "../../Functions/EventStatusTexts"; import NavLink from "../../Components/Routing/NavLink"; import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; import CategoryIcons from "../Categories/CategoryIcons"; diff --git a/src/react/Components/ListItems/RequestResponseListItem.jsx b/src/react/Components/ListItems/RequestResponseListItem.jsx index c45122e7..d3a04198 100644 --- a/src/react/Components/ListItems/RequestResponseListItem.jsx +++ b/src/react/Components/ListItems/RequestResponseListItem.jsx @@ -6,9 +6,9 @@ import { translate } from "react-i18next"; import Avatar from "@material-ui/core/Avatar"; import Divider from "@material-ui/core/Divider"; -import { formatMoney } from "../../Helpers/Utils"; -import { requestResponseText } from "../../Helpers/StatusTexts"; -import { defaultRequestResponseImage } from "../../Helpers/DefaultImageHandlers"; +import { formatMoney } from "../../Functions/Utils"; +import { requestResponseText } from "../../Functions/EventStatusTexts"; +import { defaultRequestResponseImage } from "../../Functions/DefaultImageHandlers"; import NavLink from "../../Components/Routing/NavLink"; import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; diff --git a/src/react/Components/NoteTexts/NoteTextForm.jsx b/src/react/Components/NoteTexts/NoteTextForm.jsx index b6f5de84..5b7be833 100644 --- a/src/react/Components/NoteTexts/NoteTextForm.jsx +++ b/src/react/Components/NoteTexts/NoteTextForm.jsx @@ -16,7 +16,7 @@ import { // notesTextsUpdateNote, notesTextsDeleteNote } from "../../Actions/note_texts"; -import NoteTextTypeParser from "../../Helpers/NoteTextTypeParser"; +import NoteTextTypeParser from "../../Functions/NoteTextTypeParser"; const styles = { paper: { diff --git a/src/react/Components/NoteTexts/NoteTextItem.jsx b/src/react/Components/NoteTexts/NoteTextItem.jsx index 3ebb8851..501d94ca 100644 --- a/src/react/Components/NoteTexts/NoteTextItem.jsx +++ b/src/react/Components/NoteTexts/NoteTextItem.jsx @@ -6,8 +6,8 @@ import IconButton from "@material-ui/core/IconButton"; import DeleteIcon from "@material-ui/icons/Delete"; // import EditIcon from "@material-ui/icons/Edit"; -import { humanReadableDate } from "../../Helpers/Utils"; -import NoteTextTypeParser from "../../Helpers/NoteTextTypeParser"; +import { humanReadableDate } from "../../Functions/Utils"; +import NoteTextTypeParser from "../../Functions/NoteTextTypeParser"; const styles = {}; diff --git a/src/react/Components/PDFExportHelper/Base64BunqLogo.js b/src/react/Components/PDFExportHelper/Base64BunqLogo.js new file mode 100644 index 00000000..36fedc75 --- /dev/null +++ b/src/react/Components/PDFExportHelper/Base64BunqLogo.js @@ -0,0 +1 @@ +export default "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAJgCAYAAAAUORHjAAABgmlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kctLQkEUh7+06GUYFNTChUS10ugBUpsgJSyQEDPIaqM3H4GPy71KSNugrVAQtem1qL+gtkHrICiKIIJ2rYvalNzOzcCIPMOZ881v5hxmzoAlnFYyev0gZLJ5LeT3OucjC87GJ6x00Uw7jqiiqxPBYICa9n5LnRmv3Wat2uf+tdbluK5AXZPwuKJqeeEp4cBqXjV5S7hTSUWXhU+EXZpcUPjG1GMVfjY5WeFPk7VwyAeWdmFn8hfHfrGS0jLC8nJ6M+mC8nMf8yW2eHZuVmKPuAOdEH68OJlmEh8ehhiT2YObYQZkRY38we/8GXKSq8isUkRjhSQp8rhELUj1uMSE6HEZaYpm///2VU+MDFeq27zQ8GgYr33QuAnlkmF8HBhG+RCsD3Cerebn9mH0TfRSVevdA/s6nF5Utdg2nG1A970a1aLfklXckkjAyzG0RaDjCloWKz372efoDsJr8lWXsLML/XLevvQFGoRnw8U5SPkAAAAJcEhZcwAALEsAACxLAaU9lqkAACAASURBVHic7N15lFTVuffx3z6nqnqimxkEhxbboRHQihKjN9cxailgoqJxwnkeMkiSF0M0mkGiSa43uYmzOMQ5CTEmorbBWRPjVdMKAoogrVERkKnpsarOfv8ArsSANtDdz6mu72ct1spS6f0l9LDrqXP2kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgZ3DWAcD6aqZkvOX68yfX8TUBAAAAoEcKrAMAAAAAAEDXYwAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARSFgHANiwXf4rkwqT2lfS57y0g5O2kzRETv2dU5mcSp1TyjklFCh0Tk6S5OW9V15S1ntl5dUqqUVeTd5rhY/U4L1elFddqkJzXz27zhv+MQGgINScd2eZj7L7+Si3v/e5z8lH1d5HvSRfJh+VeJ9PykcJ7/OhfLTm+7ELvHNBXi7MS0HWOdcmF7Q5F6ySS8x3QVjvXPicXPjMghtPazb+I6JINKTTrizdNtwllXFJ/3l5VStQH4WqcKEvcwmVutAnlVDSJX3oElqzw8jL+7zyPu+yitSuSK3yavF5t8K3ufejNtfgW928qMX9w6X8c4Pvmp2z/rMC+HfOOgBYX82UjOmL0fmT60y+JmqmZMrDlA4JE/qyC7V3EGr7IFS56+JrdHwkH0VapUjvea/Zkp6MIt0/5+t1H3XtygAQX8POumkbyZ/tfXSgj7I7+Kh9gM+3lUhd9yPKBSXtLkwtc0FyoQuS050Lb15w0xkfdtmCKAqLjh3RX6E/Lij1Bwblfteg3G8d9IqqgtKufQ3g81LU6pp9q3vHt7u/KfB/TA6OHqu6ZF5rV64L4LMxAECsFMsAYPgvM0PkdZYLNM6F2iUI1TsIu2Plz+a9FOXUHOU1y0e6zzndPPvrdautuwCgq+x00e8r8u2rTovyrV+Nci2f8/mWSusmSQoS5Y0uLK13QfIBFyRvW3DjaSusmxBvHxw1ojLsF50d9vLHBZXRyKDcd/mbCR3lI/mo0a2IWtzrvt09HrW5qYOmznnXugsoNgwAECs9eQBQMyWzg6SxksZVDNChrkC++ryXorw+9JGektfPX7+o7iXrJgDYUsPOumE7Sd+P8u1jo1zTVvJ566TP4BQkKpYGibLfuyBx+YKbzlxsXYR4eH/cyNGJ/tG3wz7RAYn++cEuZV3UMT6Swr0qV/jV+cfUGv2k8viZ9dZNQDEokJcgKBY9bQBQMyUzVNIpkk6WtOu6f95rYGeu0r3yOa2Msnosn9VVb3yr7hXrnkJ29UvjTT/fJ42exs+ALbDnr+eY/v29fNFw/v420U4X/SGRa1v2zSjXfEGUbRzWlZf0d61AQbJyfpAovcEFyf9ZcONp7dZF6F5LL6zdQ5G+G/TyhyT6Rb0LdUcfHtB3zf/wkm/MrfKNuce1Kn9l5emvv9xVazbeP2rboLrsna76+BtSsfeLBfo3hJ6IQwCBTlYzJZPSmnf6z5A0Rj3saRthQr3DhI5NlunYEddmPvR53RiE+smsC+u4rw9ALNWcd9foKNf0s7ZV8//TR209YO8TKcqurImyK3/mguRV259x7f/u+8/nv3XnY/f81boMXee9Q0eVJrfOfTcxIDo30T8/2LqnUznJVSWqXFXiKA3VUavr9ljiW6O7nNP3e325vnNvQ3Ruj079eECB6QE/BIF4qJmS2UbSNySdKqmA3+PvuERKgyV930f63ohrM0/I69zXL6p727oLACSpduKM2pblrz/avnphtXVLV/FRNsy3L997n6VvPj9w/3FvNJQPOGfaI7c/Y92FzvPBV0buEPbP35Ac0nZQWOljcmJQF3KS650Y6HrrYt8efb3xwd2f0Mr8RZWnzHqzUz5+qFGd8nGAAsUAANhCNVMyNZIu0ZoX/knjHBMuUJhI6RDvtWDErzOvRDldOOebdS9YdwEoTrUTZ+wu6XuSjomyjUVx6W0or10aP9ilZvWHT299wJfffLNyyPmP/vnGJ6y7sPkWnz58n6DcX5sc3Pa5Qrmvv7O5VBC6wSWH+P7+jcYH03PVmDu/csKsp7bogwZup86pAwoTAwBgM9VMyYyQNFnS8ephl/lvLuekRIn28Cn9bcSvM2/vMDhx4Z+Pnf6IdReA4lA7ccYekn4gaZx1i5WEjzRi1Xs777x60eM7HHjU/DlVW5/95IO/ftK6Cx3XkE7vWHlwy1/C/rntC+XA4K7mEk5ucKrWD0w+ufrhz833rdFFlUe/+uhmfazQbd+5dUBhYQAAbKKaKZkhkq7Rmhf+2IC1g4BhA8rDh4+aNm7uR835E585+ZF/WHcB6JlqJ87oK+lKSeeJA44lSckor91XvlMzfNV7T4w48MiXlqcqjr277u6F1l3YuIZ0ekdJV0g6ITEg4o2FDXCBk/ola5z0yOpHPzffr8idWHn8zBc36YMk3FZdlAcUBAYAQAfVTMkEks6U9DNJvY1zCoJzTn3LwtpeqeDlMfePfXBZc37CC6c/2mTdBaBnqJ04w2nNU1Z+riI5e2VTpXxeo1a+O7o1SCwYtP8R90bOnfLLp/4U92ceFpWGdLpMa24lvERSkV7sv+lcn2SNKhN/b3xg9+e0LHt05Zmzl3ToNyZc/y5OA2KN6SLQATVTMrtIelLSTeLF/yZLhs5tVZk4srpvcumh9475mnUPgMJXO3HGSElPS7pDvPj/TKVRztU2vn9i72zzkiPGnnWQdQ/WaEinx0iaJen74sX/JnOhUzCk5D/dDmXvN/5utx+vumqnz74CKOl6dUMaEFtcAQB8irWP9Jsk6VLxg3mLVaSC0opU8D9HTRt3cWNbdOSMEx9+zboJQGGpnTgjIekyrTnkr+efiN7Jtm5Z3rdf2+rHKzIn//b5gbuc+O5dl3I1gIGGdHo7Sb+QdJR1S0/gysKE2zb8nq9KnNX4+92OrTzmtWc3+h8nA/ZzKGpcAQBsRM2UzD6SXpH0Q/Hiv1P1LQuHDa1K1B/xu7HTDrtvLP/fAuiQ2okzhkqaoTXvlvLifzOVRVkduGT2V8e/+/d3D/rKhTta9xSThnQ6bEinvyNpjnjx3+lc78RgN7TkmcYHd//jql/X/tuTmRrvH7WtS3C0IoobAwDgE2qmZKpqpmSulfS8pBHWPT1VInBuYEXi6D5lwYdj7h/LM3kBfKraiTMOlVQvaX/rlp5ieOP7Qw5ZNHPu8ZmTL7JuKQYN6fRWkh6T9FNJ5cY5PZYLnILBJV8Jdixb1HjnyN3+9V+6PYyygNhgAACsp2ZK5khJsyVdIE6S7hblyaBP//Kw/vD7x7IBBfBvaifOSNROnHGlpEfFvf6drl+2Kdx/yZxfXXjgkU8cPeb0Euuenqohnf6S1gywOH+hm7g+yX5uu9J/NP52t0n/9w9D8YYDih4DAOBfPSBpa+uIYpMMXbBVr/BX43479s+735zhsl4AkqTaiTP6S3pc0mQxlO0ygbx2W/nugaNWvLPohMyEGuuenmTtJf8/kPQXSYOte4qNKwmCYLvSqxr/lH6u8a6RZQrcTtZNgDUGAABiwTmnQb0S43bol3znP+44rNq6B4Ct2okztpX0rKT9rFuKxdDWFX1GrPznrPGHn5a2bukJGtLpIfr4zAoGWIaCQakvusGpRa4k2Nu6BbDGAABArPQtC4du2zs578C7Dh9j3QLARu3EGbtK+quk4dYtxWZge2PpnssX/O9RY04/wLqlkDWk05/Xmkv+DzBOwVquMlHl+iV3tu4ArDEAABA7FakguU3v5ENj7h97sXULgO5VO3HGPpKek7SNdUux6t/elNj7o7ceP2LsWUdbtxSihnT6UElPShpk3QIAn8QAAEAsJUPnBvcKrzlq2rjbrFsAdI/aiTPGas09/32tW4pdn2xzsN+SOb8fN/bsc6xbCklDOn2ipOmSKqxbAGBDGAAAiC3nnPqWhacdNW3cn6xbAHSt2okzxkj6o6Qy6xasUZVrdQctnnXj0YeffqF1SyFoSKe/IeluSQnrFgDYGAYAAGKvb1l4xBG/HfvY7jdnOEQJ6IHWXvb/e/HCKXYq8u3af8mcX512yHGnW7fEVUM67RrS6SmSfmHdAgCfhQEAgIIwsFfikKFViScZAgA9y9oD/6aLd/5jqzTKuj2XvT31wgOPPN66JW4a0mkn6XpJ37VuAYCOYAAAoGAMqUzsP7Qy8UfrDgCdY+2j/urEPf+xl/J5V7N68V3HZ07ew7olZq6UdK51BAB0FAMAAAVlq6rElw+/f+wt1h0AtkztxBn9tebFP6f9F4iKfFu4S+P7z37h6ImDrVviYO09/7zzD6CgMAAAUFCcpK16Jc4cc//Yq6xbAGye2okzEpL+IGm4dQs2zdDWFeWjly94edsJPy7q8xoa0ukTxD3/AAoQAwAABcc5aVCvcNLY+8d+27oFwGb5gaT9rCOweXZb+e7W+y+e/TvrDisN6fShku6w7gCAzVHU01sg7ryXfF4tUaTFPtJb8nrVS2/La7GkDyV9IK9Fa//zoZKGymmwpEHOaTsXaHc57RgEGuxClboedHxe4JwGVIQ/G/vbsR9N/+r026x7AHRM7cQZh6oHXDbtwtK2ICxZ5sLSfwZhyTy58G3JLZA0zzn3RpRrSUp+D++jUfLRTt7nt5fPD/FRvr/32Uqfbyux/jNsib0/mndk6+Gnnvv7R+640bqlOzWk05/XmqtXktYtnclHUtTkWqNm96FvdfN81r0m6R3vtViRPpTX+z7n3pckBdrKOQ2R84PlNMglNMwlfdqV+JqgzA8Kyn2Z4xUGEFt8eQIx4r0U5bQkyus5H+k3zmn67K/XZTv421dJmruxf7nTTzNliRKNcYGOD0LtFyQ0qNAHAmHg1LcsvOWQe8a88JcTH55j3QPg09VOnDFU0l1aczdPQXFBUkGy8p9BWDYtSJT99K3rjn+/A7/tPUl/3tC/2OHc23f0+bZLo1zzEVGuqV/n1na9pI/0+WULrm0fe+bTf5o+daM/e3qShnR6iKSHJFVYt2wpn5fyy4LF+cbgGd+u+xIDoof7/fyNlg7+9lWS3tzYv/xg/IhkWBWNdSX+1LCX/2LYJxrIQACID74cAWM+ks9nNctHus173TLnG3WNXbHOvP9X1yJp2tpf2uW/Mn2ChM4LQk0IkxrugsK8JSgVuqB3WfD0F+84fOjzpz6Ss+4BsGFr7/u/R9JA65aOcwpL+i4KU73vTJT0u+aNXxy+6LN/T8csuPG0tySdJknDzp66q4+yl/p88+FRrrlPZ63R1fpkm8NRK959TmPPHPKn6VM7OqwuSA3pdCjpbkmDrFs2V9SqKL8snBO1ubsk3TDwxjkrumKdIdNez0r649pfWnTsiKqgV3RmWOlPDwfkRwapwhsAAj0JAwDASD6rZVFOd/tI35/zzbou+SH8ad74Vt0KSVdJumrX/8lUSvpRkNCpYVIFs/lcp6okHNha5v8oaZx1C4CNukzS/tYRHeKSPkxVzggSvb694MZTXuvq5d6++czZkk6UpGFn35L2UXZKvn3FYfL52L9Q2q7lo/6NydLHJB1o3dLFLlOB/hlzy4MV+Y+CO3IfBZcNeeD1LnmT4dNs9bvXV0n6b0n//eGEXfsEZf6HYZ/opET/qOCufAF6gtj/YEFxqZmS8dYN3eCBVIWun/ONur9Yh2xI7X9nvpwo0S/DpLbf0o+159alnVDUMZH3en9V7qzHTnh4arctuoWufmm86ef7pNHT+BmwBfb89RzTv7+XLxpeMH9/tRNnjJT0Dxm88dC0+IVN+K+dwpJ+ryVKBxzx1rXHvtNlUR2ww7m3j4yyjQ/k21fu2JH//tLZD3R10kZFcnpuwM7j7n7snulmEV2oIZ0+SNIMdeO+ue/xTVv0+31eyi4KF/o2942BN835UydldarFp+56SPmxqZtc/9T2Pf0VScXeL/bwPyEKSUFe8gsUqFckHTB/ct3RcX3xL0lzL67706wL6oblszo2ymuZdU9HBc5pQHl4w353Hr69dQuAj9VOnOEkXaeYX3XowtKWZPlWZyycev7u1i/+JWnBjafNWnjr13ZKlG11jgtLm617Pk0gr+rmpb/ZdsKPe9yLnIZ0eiutuXWlYP5s7e+GHzX9reSYAb+aOyyuL/4ladAds//Sa1z9sGh+8+l+eXaldQ9QLBgAAF3vfa25z/Pz8yfXPW3c0mGzLqj7fRBqYL5dV/hI7dY9HVGaDBL9ysJnd785E1q3APg/J0va1zpi45zCVJ+HgkR5/wU3nRm7J4q8ffNZN4fJqj5hyYC75cLYXiVX3fxRv/0Xz77KuqMzrb3v/y5Jg61bOiK7JGhrejF1edPzpYOGPjRrmnVPR1VOmHV79OrqftGClp/6xlyPPksCiAMGAEDXaZH0Q0k7z59cd8f8yXWRddCmevXsumjWhXU/kDQgn9V93iu2m891+pWH2wypTNxq3QFAqp04o6+kn1t3bIwLS5cHycr9Ft560RELp17Q0RPQu93bt5yTXTj1vAmJ0oE7B8mq96x7NmbXVe9N/I+jv1lAhzx+pomSvmQd8VmiZueb65P3NT1XOmDIH17/YXV9fcHtN6oumRdVnjhzUjS7aUC0sGWab41iv98AChUDAKBr3Kk1L/wvnz+5bstu5IuB186ta5x1Qd0JuTbtlmtXg3XPZxnUKzx5zP1j97buAKAfK6an/idKBz4XJMq3arjt689at3TU2zef9VaitP+wMNX3VeuWDenfvjpRu+r9gnnn+dM0pNPbSbrCuuOzZBcHC1tmJkdudd/sE7b7+6urrXu2VNU33lhVefzMY/zbLaP8yty71j1AT8QAAOhcWUmnzJ9cd8r8yXX/tI7pbLO/VjerdaWGZVt0k4/xbD4ROFdVGvz5jIe/UjD3bAI9Te3EGXtIOt+6Y0OS5UPuLamq2W/h1AsK4vam9c2//qRskKzYIyzp/6h1y4bstuKdfQ/8ykUFeVr+J/xCUrl1xMb4rNQ2P3FjclC0w5AHXp9t3dPZKk9//XXXO1Htl7Tf7bkYAOhUDACAzrNc0iHzJ9fdaR3SleZPrvOzv153br5dJ/pIOeuejSlPBgOWNuV+YN0BFLEfKIYHpyVKB9204KYzT5x7zcEF+6piwY2nRQunnn94onTALdYtn1QWZbXbyncK5mksG9KQTo+RdJR1x8bklgW55ldSJw68ec55VZfMK9jP489SsfeLvtcR9RP8u63n+9ao4G5rAOKKAQDQOd6StHchHfK3pV6/qO7eKNLoKK/Y3uLQqyS4ZL87D6+07gCKTe3EGWlJ46w7Piks6feLt28551zrjs7y9i3nnZ0oHXh53OYsw1e9P+yUQ0442rpjczSk02WSfmXdsTHZD8Km5pdSo4c88Pq91i3dpfK4mTf4+c37+GXZ2O43gELCAADYcs9L2mf+5Lo3rUO626zz616V145RTousWzakNBEkK0uCu6w7gCI02Trgk4Jk758snHrBxdYdne3tW879YaJ0wBltQSI27wQ7ee3QtPha647NdImkHawjNqS9IVzU/I/Ujts8MTOWZ0B0pcozZ78Yvb56WPRBW2wPwQQKBQMAYMvcK+ng+ZPrllqHWJl5ft0iOe2Qz+o165YN6VsWHrHP7YeNtO4AikXtxBm1ko6x7lhfmOrzi4bbvha7oURnefuWc2+bUzn0R9Yd6xvSumKrs750bOyuAvk0Den0jlozAIid1nmJV5vrUzts+8xrsRy4d4eq78xb4he27BR92P6GdQtQyBgAAJvvR5JOmj+5rtU6xNrM8+pawqQ+l2vXI9Ytn5QKnetfHt5h3QEUkUsUo2vSE2WDH11460U97p3/T7r+yQcuf7PXVn+37lhfZa71p9YNm+gKSSnriE9qnZd4uOXlks9t97fXYvuoyu5SdfGbLVraPsJ/lH3RugUoVAwAgM3z/+ZPrvv+/Ml1sbnk0tqrZ9dFr19YNybbqsesWz6pX3m4xwF3Hb6HdQfQ09VOnDFM0gTrjvU8U1I57AjriO6yLNXrwEWlvVdZd6xT3bRk+F7jv7WLdUdHrH33/wTrjk9qfzesGzR1ztjq+nr2G2tVnjk77/on9/bLs89ZtwCFiAEAsOnulfRz64i48nkdns9qnnXH+hKBU5/S8FbrDqAInCsptI5Ya4mkE+Zec3Bsn1bS2W6bcX/L/IrBBzWHqVicmF4WZbVz4wc/s+7ooEmK2b64/d3wzfzKYIx1RxxV7P2i9ytz+/sl7bHabwCFIFbf6IAC8Jqks3jnf+PmfLMuck57RnmtsG5ZX5+yYPfD7hv7eesOoKeqnTgjVHze/feSJsy95uD3rUO622/+cu/Ls3pv+z3rjnWGNS05dNsJP471frMhnd5W0qnWHetrfy9c0TIztefgu2bHYpgTR5XHz4yiN5v38Eval1u3AIUk1t+QgZhZLumo+ZPrmq1D4m7m+XWNkvZpbo/y1i3rBM6pV8rdZt0B9GAHSNraOmKtKXOvOTh2tyN1l6kzfnvVrKptnrHukKRtWpaV7LH87bgMhjbmO5KS1hHrWd5Sn9p722deW20dEndV33pzdfRe236+OR+b/QYQdwwAgI7xkk6cP7lugXVIoZh5Xt3cJU358yMfn4slKkuCEWPuH7ubdQfQQ51iHbDWy1pzmFtRe6Nq6CEfpXrF4tC46qal37Fu2JiGdHqwpLOtO9bjJZ247bOvcdJ9B1WdN2eWf6/tIp+Pz34DiDMGAEDHfG/+5LpHrSMKzeMnPXzzsub8Q9Yd6zjnlAj0C+sOoKepnTijl6Tx1h1rXV5M9/1vzGN/ur79nfL+sfh+N6xp8YjDjji3r3XHRkyUVGodsZ7vVdfXs9/YRJUnz7rBf9D2gHUHUAgYAACf7Q+SrrKOKFRh4I5sao+WWHesU5EK9tvr1sNKrDuAHuYoSRXWEVrz7v/D1hFxURLlLovDVQDl+Xa3TfOyH1h3fFJDOp2SdJZ1x3rYb2yJnD/GL8u+a50BxB0DAODTzZV0Gof+bb4Hxj+Uz0V+/3zkWFEu7QAAIABJREFUY3GQUVkyCHuXBhdYdwA9zEnWAWv9cO41B/P9eq1fPvWnfEP5gF9ad0jSVq0rjrdu2IDDJfWzjlhrrqTTeNzf5qs8fmbkG3Nf8C35dusWIM4YAACf7rz5k+sarSMK3bSjH5rT2BZdbd2xTkWKAQDQWWonzijVmgMArb0q6c/WEXFTGmUvXRqDqwAGt64ceOiXz+9l3fEJcTm3QpLOq66vZ7+xhSqPm/mBX9x+sXUHEGcMAICNe2z+5LqnrSN6ij5l4fdWteUXW3dIUmVJsON/3HHYIOsOoIfYR1Icbqvh3f8N+OVTf8ovrBj4a+uOlM9rYNuqE6071mlIp/tJOsK6Y63Hquvr2W90ksrjZl7nl2U/tO4A4ooBALBxl1oH9CS3jnnQf9iYPzkf2e/Pk6FT79LwcusOoIc4yDpA0kxJf7SOiKvmRMnkpalerdYdvbKtR1s3rOeris+j/9hvdDK/LHuB7LcbQCwxAAA27IH5k+v+1zqip3n2lEceW96Sf9O6Q5Iqku446waghzjQOkDSj+dec3AszhmJo7vr7s41VAy83rqjd7Z5T+uG9cTl8v8Hquvr2W90ssoJs/4QLWnn0c3ABjAAAP6dl3SZdURP1dgWnRN5+7F8ZUnY/8C7Do/TZhQoOGsf//cF44zV4t3/z5R37oqss932DWxbNWCX4y8zPwegIZ3eSWtuXbHGfqMrLW0/zefs9xtA3DAAAP7d3fMn171uHdFTPTnhkadXtUbzrDuck3qVBN+37gAK3H9KShg3zJh7zcGc+v0Zps743aoPS/uY3hddlWtVdfPSoywb1jrGOmCtu6vr69lvdJHKM2Y/6z9se9W6A4gbBgDAv8pJusI6oqdrzfkLfAyuAqhIBftbNwAFLg5fQ49aBxSK5amKJ60bBrWujMOL7y9ZB4j9RrfwH7af7Nu4OwhYHwMA4F9NnT+5br51RE/38HHTZzS1e/N788oSrveY+8f2tu4ACtiu1gGS6qwDCkVjovQG64YBbY2jLNdvSKdLJX3RsmGtqdX19ew3uljVBXNn+hW5eusOIE4YAAAfa5f0Y+uIYpH3/uvWDc45STrJugMoYLsYrz937jUHLzRuKBh3/OW+p5cny01vlxjY1jjUcn1Je0sqNW5gv9GdvL/YOgGIEwYAwMeemD+57p/WEcVi2tEPTW9uj5ZZdyQCfdm6AShEtRNnJCXVGGc8Yrx+wVlSUmV6z3n/9saSS/Y9rL9hQhyeWvFEdX09+41uUnnkq0/5pvwK6w4gLhgAAB/7s3VAsVnRmv+tdUMydHtYNwAFagfZHwDI/f+baGWy/PeW6ztJjYlSy7MjDjJcex32G93Mr8rxvQJYiwEA8LHp1gHFZkVrdE1kfBZgaSIYsPvNmQrbCqAgWV/+3yLpGeOGgtOYLL0+60LThpYwZXIOQEM6XaE1twBYY7/R3VbkfiLOAgQkMQAA1nlt/uS6BuuIYvPCaY/Oa2qPGi0bShLOVZYER1g2AAXKegDw2txrDm41big49z965/LlqfImy4ZIzupzJw6PrXytur6e/UY3qzz99df8svaV1h1AHDAAANbgcjwjrbnoReuGipQbY90AFKCdjNdfZLx+wWoLkqst13fS9kZLx+GWL/YbRvwKbgMAJAYAwDoPWQcUq2ze32HdUJoIdrduAAqQ5UFuEgOAzdYeJJZbrp+Kcn2Mlra+akViv2HGL8/dJOPbDoE4YAAASEskmb8LXawa2/y92bw3vTOvNOGqLdcHClSl8fofGq9fsNqDxBLL9UuibC+jpa0HAOw3LDXln/bN+Zx1BmCNAQAgTZ8/uY6jYYw8f+ojudZctNCyoTThqs54+Cu2p2IBhcd6AMAVAJspG4QfWK5fEuXKu3vNhnTayX4AML26vp79hpGqS+bl1ZJfYN0BWGMAAHA/nrls3vZZ3mHg3MrW/BcsG4ACZD0A4AqAzZRz4buW65fksyUGyw6Q1Ndg3fWx3zDm8/qLdQNgjQEAip2X+GFgLQx0rXVDe97H4XAooJBYDwC4AmAz5YJgvuX6pVE2ZbCs9bv/7DdiwJUEt1k3ANYYAKDYNcyfXGf6GDpI045+aE5bzpvelxdFqrVcHyhA1gMArgDYTDkXvmm5fmk+a/EoPusBQEN1fT37DWOuT+IfPhdxGwaKGgMAFLt51gFYIxd5042Rl2os1wcKkNVBbuswANhMkXOzLNcvzbdb7D+tBwDsN2KgYu8XIzVFpk/BAKwxAECxM30XBB/zXh9Zrh84DbRcHyhAScvF515zsOmz7AvZnY/dazo8Sdo8+GWQxaLrYb8RF+2R6RkYgDUGACh2/ECOCS+9b7l+GDjry5kBAF3H+ns8+434+Kd1AGCJAQCK3VvWAfg/71guHjhVWK4PAOhS1gMA9htx4dRgnQBYYgCAYrfMOgDreNOJfOhUZrk+AKBLWQ8A2G/Eh+kVh4A1BgAodpzIGxORN78FwOK51ACA7mE9AGC/ERdR9x4g6rM8dQDxwgAAxY5DpGLCe71nuX7gZPFcagBA97AeALDfiAnvffe+4eCc69b1gM/AAADFjol8THhpoeX6YeBCy/UBAF3KegDAfiMuuvsNBycGAIgVBgAodkzkYyLytofyJAK+HwJAD9bLeH32G3GRV/c+BpDdBWKGT0nEDfdJAQAAoEfgDgDEDQMAxE17N69n/Y4A1gqcqi3Xz0UMnwCgB7N+B579RlyE2tY6AbDEAABx090DAOt7ArGWk7a3XD8f+bzl+gCALmV9Dz77jbhw2to6AbDEAABxwxUARcoZ/0COfLd/7gEAuo/1AID9Rkw454ZaNwCWGAAgbgZ083pM5GMicDL9gZyPfJvl+gCALmU9AGC/EReBBlsnAJYYAKDY9bMOwDpuG8vV814tlusDALqU9QCA/UZ8cAUAihoDABS7Ha0D8H+2s1w88mqyXB8A0KWsBwDsN+LC2x46DFhjAIBit7N1ANZwxhP5fOStN4cAgK5j/T2e/UZ8mF5xCFhjAIBixw/kmHBO/S3Xj7yWGCybNVjz/1z90ngOpdpMe9/zzCDTAMdTK4FNtNh4ffYbcZEKeAwgihoDABS7nawDsEYicKYHJDlpvsGy1s+l5iCkzeS9djUNCPJMAIBN84bx+uw3YqDphb0CVQR9rTsASwwAUOyqa6ZkOJnX2Pg/jBteknAJy4Yg0FyDZa0vSWUAsLm8M93MuyDKWa4PFCDrAUB1QzrNfsOYX5H7nEsEvP5BUeMLAMXOSTrEOqLY5SNdaN2QCt0rBstaDwC2Ml6/cHk3zHJ5F+RNbx8BCpD1AID9Rgz4tuh06wbAGgMAQDrCOqDYJUMdbrl+PvK+d2n4d4OlrQcAXAGwmbw3voc0iFpN1wcKz1JJy40b2G8YcyFDGIABACCNrZmS4WvByBfvODxRmgi2t2xozflVt455MG+wtPUAgCsANpd3QyyXd0HUYrk+UGiq6+u97K8CGNuQTrPfMLLqqp1ClYU7WHcA1vgmBEgDJe1lHVGsKkvcCcnQmX4vas35BqOlrQcAXAGwuaJgoOn6Qd76AEmgEFkPANhvWKoI93floel5Q0AcMAAA1hhnHVCskqE71bqhNRe9arT0R0brrsMVAJvJ+6Cf5fou8Css1wcKlPUAQGK/Ycb1TZwjZ10B2GMAAKzBfXlGShOB+bshTe3+YaOl5xmtuw4DgM3kc4k+xgVWV60AhczisNdPYr9hxPVJHGbdAMQBAwBgjd1qpmSqrSOKzd63H7ZTRSowfSxSW877xrboz0bLW78btdvVL40vNW4oOHv95q+DfXtJL9MI7940XR8oTM9Jsn6E5m4N6TT7jW7WeNuI3Vy/VG/rDiAOGAAAHxtrHVBs+pQGEwPjy/Fac9HSV8+uazJa3noAUCZpP+OGQnSujK8j9VE4yzQAKEDV9fVNkl6w7hD7je7XJ/FdXvUAa/ClAHyMy/K6WZ/S8KvWDdm8t7wkdIHs343ikshNlU98xTbAS949ZtsAFKwnrAPEfqPbuSou/wfWYQAAfOygmimZbawjisX4P4wbV56yPUhNknKR/mS19qTR07KS5lutv9bhxusXnKg9NcJyfZdqa33x9C9wCCCweZ60DpB0UEM6zX6jmzT+cfcDXEVofG4LEB8MAICPpSRdah1RLELnfmnd4L2XpLuNM6xvA6i9+qXx2xs3FIx97n98D58tKbFsCFLtH1iuDxS4FyS1Gjew3+hOzv23dQIQJwwAgH91Zs2UTI11RE835v6xB1ek3A7WHS05v/Lh46avNM6Ybby+JGWsAwpFlE2dZ93gkm0zrRuAQlVdX98q6XnrDklnNqTT7De62Krrake5Pom0dQcQJwwAgH+VkHSFdURPV5pw1zln/zDepvboaesGSXFo4N7IDvLZ1CHWDUGq7Q/WDUCBe9w6QOw3uoUbnLrTlfByB1gfXxHAvzupZkpmpHVET3XgXYfvX1Ua7GTd4b20ui36oXWH4vFYqoOvfml8yrgh9va6/e/98i0Vto/vCnMKy5ummTYAhe/31gFrndSQTrPf6CKNt+66rxtcsrt1BxA3DACAf+ckxeGFYY9UWRLcFMTg3f/GtvxHT0545GXrjkmjp62W9HfjjF6SjjRuiD+vnysKTT95g1TrR8+NPXK1ZQNQ6Krr6+dJ+pt1h9hvdK0Bqdtdwn6/AcQNAwBgw46qmZL5vHVET7Pfbw7P9C0Ld7bukKSmrL/fumE9cTiV+tKrXxrPz4SN+MJv/pqM2spOsu5widw/rBuAHuI31gFrHdWQTrPf6GSNd408OhiYMj9rCIgjNnvAxv3YOqAnOePhr7hBleFvwsB+Gp/Ne61szf/AumM9cXgu9ShxFcCn8Ff6XNL8NgkX5h60bgB6iN9KareOWIv9Ridz/ZLXyX67AcQSAwBg4w6tmZI5wDqip1jRkr+yqiQcZN0hSY1t0Vt/PfXRxdYd6/mbpDbrCEnfv/ql8WyZPmHfR6cF+bayC607JC8X+LusK4CeoLq+fpmkh6w71jq0IZ0+wDqip2i8f9SFrl9ysHUHEFcMAIBPd33NlEyldUShG/+HccMrS4JJ1h3rNLVH11k3rG/S6Gmtkp6y7pC0u6QjrCPiJrus/7d9W1m5dUdQ1vzhCyfut8K6A+hB4nIbgCRd35BOs9/YQo33jRrqBqWuse4A4owBAPDpaiXdXjMlw7uim+mw+8YmkoF7OgxcLL7ftGSj/MrWeA0A1rrbOmCty7kK4GP7PjrN5VvLv2vdIUlBSUtcPkeAnuIRSR9ZR6xVK+n2hnSa77+bqXHqrqGrSrzgykLz27WAOIvFhhyIuaMlXWIdUahSoR4oTwUDrTvWaWqPnnnxjEfjcLn9Jz0gqck6QtIeksZYR8RF+9JBk6Pmyj7WHQpzPixv4rRwoBNV19e3S5pq3bEe9htbonfid65fclvrDCDuGAAAHXNlzZTMYdYRheZLd485p195OM66Yx3vvXKRvmndsSFrHwcYl+e7/+Dql8YnrCOsff6Wl/vlGnt/37pDksKyptf/evRhK607gB7oGkmt1hHrubIhnWa/sYka7xx5nhtScpR1B1AIGAAAHeMk3VMzJcMjZTpo1A2Z2oEV4XWBi8/VjI1t0esPHzf9NeuOTxGX+1H3lHSFdYQ552cob3/yvyQFZU0/s24AeqLq+voPJd1s3bEeJ+med/fdbRfrkEKx6obhI93WJb92YXz2G0CcMQAAOq6vpAdqpmQqrEPibtT1mUpJL5SngtC6ZZ3IezVl/WnWHZ/hKUnvWUesNfnql8ZnrCOsfOHO5ydHLRWfs+6QpKCkpS3ZewWn/wNd52eSstYR6+lblm5/4d19d+NQwM+w6r927hVsXfKsKw9js98A4o4BALBpdpN0M4cCbtzwX2QC7/VyEKq3dcv6VrRErz5y3PSXrDs+zaTR0/KS4vJCz0m66+qXxm9tHdLd9vntjNr86sofWXesE5Q1Pf7sYeMj6w6gp6qur39X0h3WHetLbZ3vU7Zb+0sfTtiVvfpGNN43Kgh2Ln/FDUzZn9MCFBC+qQCb7gRJ37aOiCsX6pEwqZ2sO9aXi7xWtObPsO7ooBsl5a0j1hog6Z5iOg9g30enJfJNlU/6fDIePx9dpLCs+TvWGUARuFpSrAZtqW3zO4e9o4etO+Ko6YW9nOudeNoNTMVqvwEUgnhscIDC89OaKZkfcSXAx3a/OROMuDbzSLJUh1q3fNKy5vwrT0145BXrjo6YNHra24rPVQCStJ+K6DyAAckP/pxvqtrKumOdoKx53l/HZ2ZbdwA9XXV9/VuS7rXu+KTUtvnM4jOGP8zjAT/WOHXX0H+UfcH1Tf6ndQtQiBgAAJvvUkl310zJlFqHWBt1Q6Ysn9U/EinF7uTi9rz3HzXnT7Xu2EQ/keStI9ZTFOcBnPnM5b9cmh0Sq89hF+a+Z90AFJErJLVbR3xS6c65w8v2bKt/Z5/dyqxbrK36753LNDD1uuuf3Mu6BShUDACALXOCpBk1UzIDrEOsjLo+M0Reb4dJ7WbdsiHLW/J//ttpj86y7tgUk0ZPe0PS76071uMk3Xf60z843Tqkq5z77OSfvN1S+3XrjvUFpU3/fPHUfX5n3QEUi7VXAVxl3bEhpTvlditPty94d7/dYnOFUndb9dOdBrnty94KBqV4QgKwBRgAAFvui5JeqJmS2dk6pLuNvD6TltO8IKHB1i0b0pqL2hvbognWHZvpSuuAT+jzdssut57y1JWXWYd0ttOe/tEv5jalL8n6WDzxbw3nFVasPs86AyhCV0laYB2xIanq/Fble7S99c+DRu1u3dLdGqfuulcwsteCYEjJUOsWoNAxAAA6R43WDAH2tw7pLiOuzZwQBHopCBXbxyKubouufubkRxqtOzbHpNHTXpX0kHXH+vJKamHrzj886cmrb7Ju6SwnPPmzm+e31H4jUryeIBX2WrnghRMOmG7dARSb6vr6FkkXWXdsTHKrqKJ8dPtLHxw14gTrlu7SeP+o811N+d9cv2Rs9xtAIWEAAHSevpL+UjMlc7J1SFeqmZJxu/5P5sYwqXtcELNXTetpzkZLB1QkLrfu2EKXK15nAcgr0DttO5593BPXPHLmM1cU7M+QfR+d5o5+/Ff3/bNth7Ni96MwyCvRa+WZ1hlAsaqur39E0gPWHRuT6Bclyvdov2fJOcNvXHXVTj32cMCmF/Zyq/+cvtttW3qdKw1i9o0aKFx8MQGdKynpNzVTMnfWTMlsYx3T2Xb9VWZkaW+9nSzTOS7GW45c5P2q1uiIW8c8GKsXz5tq0uhpr0i63rpjQ95vrz5sebb/Kyc9dXXSumVTfeP5i1MDkoueWZIdepx1y4YkKlc+99fxhz1l3QEUuW9KaraO2BiXlEp2yJ2TXRy8/cHRI0ZY93S2xttGjPArcw1uYOpEF8R4wwEUIAYAQNeYIOnNmimZH9ZMyfSyjtlSu92YqRx5Xea+RIleS6RUbd3zWRavzt/58HHTX7Du6CSXSlpiHbEhS7JDd1+dq3r77Gcu29G6paO+8fzF+7/busOipdmtYvn4KJdoz4cVjeOtO4BiV11f/44K4BGoyUFRddnI7MxFx+963zt77V5p3bOlVv1yl6rG+0b9wQ0rm+l6J7a17gF6IgYAQNcpk3SZ1gwCTquZkim4r7fdb84EI6/NXCFpaZjUcc4p9mP4Zc359z5ozJ1h3dFZJo2etlzSt607NmZZbtDW81uGv3nik1ffdeYzV8ToFL1/9Y3nLy6b8NRPps9cvddTS7JD+1r3bExY0XjdX48+bLF1BwBJ0jWSnrCO+CxBuXfl6exxFfu2Lv3gqBGXN6TTBbffWHXVTkHjPaOuDkZULA22LzvKlfK2P9BVCu4bBFCAhki6TdJLNVMyBxi3dNjI6zLHRHktCVO63AWK7Qu79bVmo9xHzfkvvnp2Xd66pZPdKelZ64iNyfoS927bjie937bt8lOeuvIs655PmvDUT05/s3nUsobWncfE6qT/T3Cp1pUujL5p3QFgjer6+rykkyR9aN3SEcmBUariC+1XVHyxdcn740YeY93TUY13jTwt2L3X8mCHsv/neiUK7rYyoNAwAAC6z+ckPVkzJfPA8F9mDraO2ZjaX2S+MvK6zMIwqd8FofpZ93RU5L2WNOfPe/aURxqsWzrbpNHTvKQLJMV6sLE636f87dbam496/NfzTn36xyOte456/NrtvjLjupkNrTvfujrfu9S659N5hWXNZ71w4n6RdQmAj1XX1y/SmiFAwZwpk9o2369in7bfLf1a7cIl5wz/snXPxiw+bfghqx9KLwxqym9zfZNV1j1AsUhYBwBF6MhUuY4ceV1meZTTPVFel829uG65ZdCuv8pUyevHQUInh0n1sWzZXEub8g/95YSHp1p3dJVJo6fNuvql8VdK+r51y2dZmh2y4/LsgNeOe+Kaul6JlZOn7veDf3Tn+hOe+kk655M//bC9/8E5nyyIy0gTVcsf+fvJX/y9dQeAf1ddX/94Qzr9Q615MktBcKGU2jpfLenBZZN2WZH/KLgztyS8dMiDs1ZZdi0+Zde+LuV/FPaNTkz0z/V1Awr+2AKg4DAAAIyESfUNk7rQR7pgxK8zs3yk2710y5yv13XLD+dd/ivTJ0jovCDUyWFSw10Q//v7N2ZVW37J8pboKOuObvBDSfuv/RVreSXd++3Vh7l2f9i4GTetqAxXPloatPzotv2/P7sr1vtS3d1DKsJV38r6kgkNrb0Hd8UaXSUoX704rFwV23fpAEiSfiRpP0kHWodsqkTfqE+ib/S15Da5Cz+qrp0btbk7Jd0w8MY5K7pj/UXHjqgKKqKzwip/WmJgdqRLFu5+A+gJ+AJErNRMyRTMJXZbotfADf9z76UopyVRXs/7SHc4p+mzv16X7Yw1d/pppixRorEu0PFBqP2ChAZ29aP89ty666+6bs/7/IercyP/csLDc7t8sRi4+qXxQyXVS9rIZ1HXeWjpiVv4Ebz6JJYt6xWufCgVtP74jv0vm7clH+2YJ345VPKXNOcrj27M9966s36kNb+1a6d8nI5wyfZ8st/i4X879pAt+v/CQu3EGabfr+deczB7mC1w4x57mv79nfvKywX399eQTg/Rmu+/g7p6rb7HN3Xpx/d5Kb88WJJfFTzts7o/0T+a3u/nb7R0xsf+YPyIZFgVjQ1K/WlBhf+PsE800G3kLcfwgNieydqpKvZ+seA+39FzcQUAECPOSWFSA8OkjpR0pPfSqOszrVGkxT7SW/J61UsL5bVYaw4l+kBe73sv55y2ljRUToMlDXJO27pAu8tpxyDQIBeqtKtf8He3fOS1oiV/VrG8+JekSaOnvX/1S+MnSHpUBTfEdVqR699vRa7/KVJ0ymGP3daWDNobk659WcJlPwhdbmHC5eYFLj8rUPRKc75Xe6SwNu/DnfI+HBYpGOaknSIfbpP1yb6L2ytKfCEfZeMiJXovu6AQX/wDxai6vv6DhnR6nKQnJVVY92wJF0qJAdHAxIDoGEnH+Eha/r2dW6Nmt9i3unk+616T9K73WqxIH8rrfUXuPR/JK9BQ5zREToPl/CCX0PYu6dOuxNcEZX5QUNFe6kLrPyGAjWEAAMSYc5JLqDSQttOaXwdZN8VF5L2WNuW/M/246bdbt3S3SaOnPXb1S+N/ImmydcvmC9QUVZUoUomkAZJ2VgHc2tCZEr2XPfTC8QfeZN0BoOOq6+v/tyGdPlrSQ5J6zIn1LpDCSl8aVvp1+40vWTcB6BoF/NYJgGLlvbR4df6q6cdN/7l1i6HLJT1jHYHNE1asWpQasLgYzq0Aepzq+vrHJJ1q3QEAm4MBAICC4iUtWp2b+vBx079r3WJp0uhpOUlHS5pj3YJN45JtbWFF4+hnDxufs24BsHmq6+vvlfRN6w4A2FQMAAAUlEWrcg8+ctz0s6w74mDS6GkfScpI+qd1CzooyEVBWXPmb189+D3rFABbprq+/v+3d/dBdtX1HYC/5967G7LJhiRE0yp2a6NT8GUM7VZRsSWlslYQhIBEQNECFgulrZYuXW0JjoZmbKut1upUp29OdZzZpkMIuBl8ASkkFPEiAjqywQCGhJD3TTa7957z6x8bB0QlRBPO7p7nmdmZnZ2dvZ+dOfeecz7n9/IPEXFd2TkADoUCAJgyHtvTvmXTnrZh00/R3zv4SEyUANvLzsJB1NpFY86uM+985+tuKTsKcNh8ICI+U3YIgGdLAQBMCVv3ttdu2t1ecs+lQ5XYKvJQ9PcO3h8Rp0fEYdnCiSOg3k4d87ZdsP7Ck24oOwpw+PQ0myki3hsRK8rOAvBsKACASW/HaL569blr+tz8/2z9vYN3RMQ5EWFe+WRTb0fn/McvW/f2k79YdhTg8OtpNlNPs/mBiPiTsrMAHIwCAJi0UkqxYzT/11VLbzij7CxTQX/v4I0RcWYYCTB51Nup85jH33PHeafY7g+muZ5m8x8j4vyIaJWdBeBnUQAAk1IrT2nLSP6+VUtv+IOys0wlB0qAUyJiR9lZKq/eLjrmPbHsjred8i9lRwGeGwd2Bzg9IvaWnQXgp1EAAJPO3vGi9eiu1mk3nrfmY2VnmYoOTAc4KewOUJ56O2/M2XHaumVLvlR2FOC51dNsro2IJRHxeNlZAJ5OAQARn4uI28sOwYQdo/mmR3a1Xvq1C2+6qewsU9mBhQFfFxEPlJ2larLG+Hhj1u4l6y/47S+XnQUoR0+z+X8RsTgivlZ2FoCnUgBAxB0RcXJErCw5R6UVKcWWkfbqDdtbv3L7RV/eWHae6eDAFoFviIhby85SFbWuPY835m5/6fp3vv4bZWcBytXTbD4WEW+MiGsjwiK2wKSgAICIR4cHhlrDA0NXR8RpEbGt7EBV08pTsWUk/+M1b1tzxj2XDuVl55lO+nsHt8XEmgAfCRegR05WRGPS8YOBAAANAUlEQVTutjWd87ceu27ZkofLjgNMDj3NZt7TbC6PiN+LiC0lx6mc1CqK4rExD3jgKRQAEPHIj74ZHhi6MSaG7N1WXpxq2Tde7Ny2L19803lrPll2lumqv3ew3d87+MGIeFNEbC07z3STdYznHfMfv2z9hSed/r9vPc3q38BP6Gk2vxoT1xdfKTtLVaQ97YfS9vZx3Wfdc3XZWWAyUQDA0xZKGx4YejQmFu95f0TsKyVRBbSLlLbubQ/u3F8svPG8NfeWnacK+nsH18bEBegtZWeZLmpde7Z0HLPl+HVvX/KZsrMAk1tPs7k5Ivoi4qpwfXHEpDwVaXvrI1l3Y1H3mc3vl50HJhsFAFW3e3hgaPfTfzg8MNQeHhj6+4h4WUSsfu5jTW87RvMNm3a3F68+d805X162ZrzsPFXS3zu4KSaGon4oItolx5m6Job8X98xb9uxd5xzqgtM4Fk5MCXgbyPi+Ij477LzTDdpNN8Q48Wvz37ztz4468Q7TXuDn0IBQNU94zZpwwNDGyPizIg4OyJ++Jwkmsb2jhf7H93VunLV0hsW3Xz+jd8uO09VHZgScE1EnBARFqs7RFnH2Ehjzo6z1l940pm3n/X7ShTgkPU0mw/3NJtLI+LNEbGh7DxTXRovxtLu9l9kM+svnb3kmw+WnQcmMwUAVffIwX5heGAoDQ8MrYqJ0QAfjwhPrA9RK09p8572qod3to5Z+/YbP1F2Hib09w5+JyJ+JyLeGfarPqis0cobc7Z/qjZjbO76d5z0P2XnAaa+nmbzpoh4RUzsFDBWcpwpJ+UppSfGV8V4cczsU+/+6KwT7yzKzgSTXaPsAFCyZxwB8FQHpgr82aIVfR+LiA9GxLvDe+gZpZRix2jxwPbR/IJb33HTt8rOw0/q7x1MEfGfK+9aekNEfDgi3hsRWbmpJplaHo3uXbfVukbOuWNpn1W8gcOqp9kcjYjlGxcv/nxEXBMR54eHdM8sRaRt4w+mkfzs7mX3WkcIDoGbF6ruWRcAPzI8MPRwRLxn0Yq+lRHx1xFxYThR/5iUIvLxeOiJffnlq89dc1PZeTi4/t7BHRFx+cq7ln4uIpZHxFvKTTQJZCnqs3cNN7p3XXL72W/6etlxgOmtp9l8MCLesXHx4mvbW2tr6wuKF2fq2B+TUorYnT+Sdrev6D7329eXnQemIgUAVXfQKQA/y/DA0HBEXLRoRd91MVEEnBsVf08duPH/ZtGOKx7406F195UdiEPW3zt4d0ScsfKupa+KiIGYOK4rdwlamzmysT5r5A/XLVsyVHYWoFp6ms0Hoxm/9vi7jj+xNiv9U2Nh/hu1zrJTlSvlKWJH6740WlzZfe63v1p2HpjKKn2zAvFzjAB4uuGBoe9GxPmLVvS9LyIuiYj3RMSLftG/O5WkIvK8HV+JFJfdd8XQQ2Xn4RfX3zt4T0Sct/KupddExNUxMdKlXm6qI62I53Vs/sGj3b/8vjsvet2qstMA1fb8f3tgXUT85qa3vOLFjQX5pztekJ9S707T/HP4x6WxokjbW7fF7vZ7uy+67/6y88B0oACg6n7uEQBPNzwwtDkiPrxoRd/fxMSqvn8UE/v9Tlvt8diS8vjnWj1W3nf50P6y83D49fcOfjci3rXyrqXX/lLnI/+1o7Xgt8bSzGl1ATojG20f3dj+jc7a2FVfWHLVN8vOA/BUL1j9nYciou+Hp77yqI4Xtq9uLCguaxxTLCw715GSUooYyZ9Ie/P/iP3FX3Uvu3df2ZlgOlEAUHW/8AiApxseGGpHxPURcf2iFX2LYmII9Vsj4jWH+7XKkLdjV9GKobwV133v/UPNsvPw3OjvHXwoYvC1F9+6vHO86LxyJJ9z2Y7W8xblU/Q0Uo92zOvYumFWfc8nR/KjPzF4ypW28wMmtReuvXd/TKzRsvyJy487IYr4y9rsdGpjfnH0dJiolXa396aR/OYYL67pXnbvPWXngelqGnxcwNSwaEXfCyPijIg4a9aCeONUWdgnpYgij82piFsixUfvu2LIE1IiIuLiW5c/fzSfee2efO45u9vzFhSTfIZALfLU3di55ejG9hvmNbZ96JMnffSwjQACKMum01/R25hf/Hl9XnFy45h8YTZF1gtIeUT9Nd070kh+c+zN/677gu+sP1KvtXfdq9OR+tvPxqwT75wiV31UgYMRSnDcx/qOzbK4JKvF72b1eHmtHvNq9cnxfkwpomjHviKPe1MRX8yy+Oz9Vw6NlJ2Lye3iW5fPHS863zVWzDx7b979qj350XNSyZtjZFFEd33nnq76yN2d2fiX9hWz/n3VKVfsLTUUwBG0+ZyXz64dXVxan53Oq3UXr6x1pa5skuxTlIqIYl+2s9iXfa/Yl60uRmqfW/j5+zc/F6+tAIAnORhhEli0om9GY0acWqvHWVk9Xlurx4tq9Zh1pE/aqYiiKGJPFPFoSnF/RHw9FfHF+68c2n5kX5np7t23XLuwlTovGStmnjZWzHjxWNE1f7To6jxSpUAWRcys7RubURvd2lkb29BV2/O1rvrez376Ddcd9mk+AFPFY2e/fH7WEctqM4uTa13pZbWudGxtdtFdO+rINrSpiEj7s33FvmxDGs/WRz1d37GwuHnO1d8vZT6/AgCe5GCESer4j/c1snq8PlKckCJeEhG/mkW8ILKYm2XRFVnMyCa+GlGLepYdOJmnKFKKIiJaKcV4pNgfEaORYm9KsTMVsTGlWB8p1nbOiu/dc+lQqSdFquPiW5d3tVP9pDw13tBKnYtbRedL8lTvLqJ+VJ7qnUWqd+TRaOSpXm+njiwiopG1Uj3L83q027UsH69lxVg98v31rD3SWRv7QSNr3V2P/JbxNOMbX1hylYUoAQ5i4+LF2cwTxo7LGnFq1pFeHSl6Iou5UY9ZWSPNzOpxVNZIndGIjqwj1bJG1CKLiDyKlEcRRdZKRYxHEWORYjS1sm1pPNtUjMfDaX82XIxlzca84rYFn/rueNn/648oAOBJDkYAAGDaUgDAkybJrCAAAADgSFIAAAAAQAUoAAAAAKACFAAAAABQAQoAAAAAqAAFAAAAAFSAAgAAAAAqQAEAAAAAFaAAAAAAgApQAAAAAEAFKAAAAACgAhQAAAAAUAEKAAAAAKgABQAAAABUgAIAAAAAKkABAAAAABWgAAAAAIAKUAAAAABABSgAAAAAoAIUAAAAAFABCgAAAACoAAUAAAAAVIACAAAAACpAAQAAAAAVoAAAAACAClAAAAAAQAUoAAAAAKACFAAAAABQAQoAAAAAqAAFAAAAAFSAAgAAAAAqQAEAAAAAFaAAAAAAgApQAAAAAEAFKAAAAACgAhQAAAAAUAEKAAAAAKgABQAAAABUgAIAAAAAKkABAAAAABWgAAAAAIAKUAAAAABABSgAAAAAoAIUAAAAAFABCgAAAACoAAUAAAAAVIACAAAAACpAAQAAAAAVoAAAAACAClAAAAAAQAUoAAAAAKACFAAAAABQAQoAAAAAqAAFAAAAAFSAAgAAAAAqQAEAAAAAFaAAAAAAgApQAAAAAEAFKAAAAACgAhQAAAAAUAEKAAAAAKgABQAAAABUgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYMv4fMvJlkPRTaiYAAAAASUVORK5CYII=\n"; diff --git a/src/react/Components/PDFExportHelper.jsx b/src/react/Components/PDFExportHelper/PDFExportHelper.jsx similarity index 96% rename from src/react/Components/PDFExportHelper.jsx rename to src/react/Components/PDFExportHelper/PDFExportHelper.jsx index bcf3b58c..f73d584c 100644 --- a/src/react/Components/PDFExportHelper.jsx +++ b/src/react/Components/PDFExportHelper/PDFExportHelper.jsx @@ -6,12 +6,12 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import Divider from "@material-ui/core/Divider"; -import { bunqTransparantLogo } from "../Helpers/Base64Images"; -import { formatIban } from "../Helpers/Utils"; +import bunqTransparantLogo from "./Base64BunqLogo"; +import { formatIban } from "../../Functions/Utils"; -import { applicationSetPDFMode } from "../Actions/application"; -import { openSnackbar } from "../Actions/snackbar"; -import { setTheme } from "../Actions/options"; +import { applicationSetPDFMode } from "../../Actions/application"; +import { openSnackbar } from "../../Actions/snackbar"; +import { setTheme } from "../../Actions/options"; const styles = { bunqLogo: { diff --git a/src/react/Components/QR/AccountQRCode.jsx b/src/react/Components/QR/AccountQRCode.jsx index 8b489ac8..5a256bcf 100644 --- a/src/react/Components/QR/AccountQRCode.jsx +++ b/src/react/Components/QR/AccountQRCode.jsx @@ -35,7 +35,13 @@ class AccountQRCode extends React.Component { const value = `https://qr.bunq.com/2/8/${currentAccount.avatar.anchor_uuid}`; - return ; + return ( + + ); } } diff --git a/src/react/Components/QR/AccountQRFullscreen.jsx b/src/react/Components/QR/AccountQRFullscreen.jsx index b2717cc7..22ece6ac 100644 --- a/src/react/Components/QR/AccountQRFullscreen.jsx +++ b/src/react/Components/QR/AccountQRFullscreen.jsx @@ -15,7 +15,7 @@ import LazyAttachmentImage from "../AttachmentImage/LazyAttachmentImage"; import QRSvg from "./QRSvg"; import QRCode from "./QRCode"; -import { formatIban } from "../../Helpers/Utils"; +import { formatIban } from "../../Functions/Utils"; const styles = theme => ({ btnIcon: { diff --git a/src/react/Components/Queue/QueueManager.jsx b/src/react/Components/Queue/QueueManager.jsx index bd6bfa37..7167ab82 100644 --- a/src/react/Components/Queue/QueueManager.jsx +++ b/src/react/Components/Queue/QueueManager.jsx @@ -9,9 +9,9 @@ import RequestInquiry from "../../Models/RequestInquiry"; import RequestInquiryBatch from "../../Models/RequestInquiryBatch"; import MasterCardAction from "../../Models/MasterCardAction"; -import NotificationHelper from "../../Helpers/NotificationHelper"; -import { getConnectPermissions } from "../../Helpers/GetConnectPermissions"; -import { paymentApiFilter } from "../../Helpers/DataFilters"; +import NotificationHelper from "../../Functions/NotificationHelper"; +import { connectGetPermissions } from "../../Functions/ConnectGetPermissions"; +import { paymentApiFilter } from "../../Functions/DataFilters"; import { queueDecreaseRequestCounter, @@ -141,7 +141,7 @@ class QueueManager extends React.Component { filteredAccounts.forEach(account => { const accountId = account.id; - const connectPermissions = getConnectPermissions(this.props.shareInviteBankResponses, account.id); + const connectPermissions = connectGetPermissions(this.props.shareInviteBankResponses, account.id); if (connectPermissions === true || connectPermissions.view_new_events) { bufferedCounter += 6; this.paymentsUpdate(userId, accountId, false, eventCount); diff --git a/src/react/Components/ReduxForm/Fields/renderDateTimePicker.jsx b/src/react/Components/ReduxForm/Fields/renderDateTimePicker.jsx index a7687398..a0e3af9c 100644 --- a/src/react/Components/ReduxForm/Fields/renderDateTimePicker.jsx +++ b/src/react/Components/ReduxForm/Fields/renderDateTimePicker.jsx @@ -3,7 +3,7 @@ import { translate } from "react-i18next"; import DateTimePicker from "material-ui-pickers/DateTimePicker"; import Typography from "@material-ui/core/Typography"; -import { getUTCDate, UTCDateToLocalDate } from "../../../Helpers/Utils"; +import { getUTCDate, UTCDateToLocalDate } from "../../../Functions/Utils"; const styles = { dateTimePicker: {} diff --git a/src/react/Components/ReduxForm/Validators.js b/src/react/Components/ReduxForm/Validators.js index 0172086b..9fcc5222 100644 --- a/src/react/Components/ReduxForm/Validators.js +++ b/src/react/Components/ReduxForm/Validators.js @@ -1,5 +1,5 @@ import EmailValidator from "email-validator"; -import { isValidPhonenumber } from "../../Helpers/PhoneLib"; +import { isValidPhonenumber } from "../../Functions/PhoneLib"; const t = window.t; diff --git a/src/react/Components/SavingsGoals/Helpers.js b/src/react/Components/SavingsGoals/Helpers.js index f3cb3aa2..7651697d 100644 --- a/src/react/Components/SavingsGoals/Helpers.js +++ b/src/react/Components/SavingsGoals/Helpers.js @@ -1,6 +1,6 @@ -import GetShareDetailBudget from "../../Helpers/GetShareDetailBudget"; -import { filterShareInviteBankResponses } from "../../Helpers/DataFilters"; -import { formatMoney } from "../../Helpers/Utils"; +import { connectGetBudget } from "../../Functions/ConnectGetPermissions"; +import { filterShareInviteBankResponses } from "../../Functions/DataFilters"; +import { formatMoney } from "../../Functions/Utils"; export const calculateTotalBalance = (accounts, accountIds, shareInviteBankResponses = []) => { return accounts.reduce((accumulator, account) => { @@ -12,7 +12,7 @@ export const calculateTotalBalance = (accounts, accountIds, shareInviteBankRespo // get budget from this response if (filteredResponses.length > 0) { - const connectBudget = GetShareDetailBudget(filteredResponses); + const connectBudget = connectGetBudget(filteredResponses); if (connectBudget) { accountBalance = parseFloat(connectBudget); } diff --git a/src/react/Components/SavingsGoals/SavingsGoalListItem.jsx b/src/react/Components/SavingsGoals/SavingsGoalListItem.jsx index 0ce044cd..f9edb3fb 100644 --- a/src/react/Components/SavingsGoals/SavingsGoalListItem.jsx +++ b/src/react/Components/SavingsGoals/SavingsGoalListItem.jsx @@ -12,7 +12,7 @@ import ExpiredIcon from "@material-ui/icons/TimerOff"; import LinearProgressCustom from "../LinearProgress"; import NavLink from "../Routing/NavLink"; -import { formatMoney, humanReadableDate } from "../../Helpers/Utils"; +import { formatMoney, humanReadableDate } from "../../Functions/Utils"; const styles = { listItem: { diff --git a/src/react/Components/Sidebar.jsx b/src/react/Components/Sidebar.jsx index f813d437..b80182b5 100644 --- a/src/react/Components/Sidebar.jsx +++ b/src/react/Components/Sidebar.jsx @@ -27,7 +27,7 @@ import TrophyIcon from "./CustomSVG/Trophy"; import QueueSidebarListItem from "./Queue/QueueSidebarListItem"; import NavLink from "./Routing/NavLink"; import ListItemWrapper from "./ListItemWrapper"; -import IsDarwin from "../Helpers/IsDarwin"; +import IsDarwin from "../Functions/IsDarwin"; import { closeSidebar } from "../Actions/sidebar"; diff --git a/src/react/Components/TransactionHeader.jsx b/src/react/Components/TransactionHeader.jsx index 85b0c907..60de28ba 100644 --- a/src/react/Components/TransactionHeader.jsx +++ b/src/react/Components/TransactionHeader.jsx @@ -14,7 +14,7 @@ import { defaultMastercardImage, defaultRequestResponseImage, defaultPaymentImage -} from "../Helpers/DefaultImageHandlers"; +} from "../Functions/DefaultImageHandlers"; const styles = { targetWrapper: { diff --git a/src/react/Helpers/Analytics.js b/src/react/Functions/Analytics.js similarity index 100% rename from src/react/Helpers/Analytics.js rename to src/react/Functions/Analytics.js diff --git a/src/react/Helpers/BunqErrorHandler.js b/src/react/Functions/BunqErrorHandler.js similarity index 100% rename from src/react/Helpers/BunqErrorHandler.js rename to src/react/Functions/BunqErrorHandler.js diff --git a/src/react/Helpers/GetConnectPermissions.js b/src/react/Functions/ConnectGetPermissions.js similarity index 59% rename from src/react/Helpers/GetConnectPermissions.js rename to src/react/Functions/ConnectGetPermissions.js index d24c44ed..8f911639 100644 --- a/src/react/Helpers/GetConnectPermissions.js +++ b/src/react/Functions/ConnectGetPermissions.js @@ -12,7 +12,7 @@ const getInviteResponse = (shareInviteBankResponses, accountId) => { return firstInviteResponse.ShareInviteBankResponse; }; -export const getConnectPermissions = (shareInviteBankResponses, accountId) => { +export const connectGetPermissions = (shareInviteBankResponses, accountId) => { const inviteResponse = getInviteResponse(shareInviteBankResponses, accountId); if (!inviteResponse || inviteResponse === true) return true; @@ -23,7 +23,7 @@ export const getConnectPermissions = (shareInviteBankResponses, accountId) => { return {}; }; -export const getConnectType = (shareInviteBankResponses, accountId) => { +export const connectGetType = (shareInviteBankResponses, accountId) => { const inviteResponse = getInviteResponse(shareInviteBankResponses, accountId); if (!inviteResponse || inviteResponse === true) return true; @@ -33,3 +33,26 @@ export const getConnectType = (shareInviteBankResponses, accountId) => { return true; }; + +export const connectGetBudget = (shareInviteBankResponses, accountId) => { + let inviteResponse = null; + if (accountId) { + inviteResponse = getInviteResponse(shareInviteBankResponses, accountId); + } else { + inviteResponse = shareInviteBankResponses.pop(); + if (inviteResponse) inviteResponse = inviteResponse.ShareInviteBankResponse; + } + if (!inviteResponse || inviteResponse === true) return true; + + // check if share details are available + if (inviteResponse.share_detail && inviteResponse.share_detail.ShareDetailPayment) { + // get budget from share invite bank response + const budgetInfo = inviteResponse.share_detail.ShareDetailPayment.budget; + + if (budgetInfo) { + // get the available balance for this budget + return parseFloat(budgetInfo.amount_available.value); + } + } + return false; +}; diff --git a/src/react/Helpers/Crypto.js b/src/react/Functions/Crypto/Crypto.js similarity index 100% rename from src/react/Helpers/Crypto.js rename to src/react/Functions/Crypto/Crypto.js diff --git a/src/react/Helpers/CryptoWorkerWrapper.js b/src/react/Functions/Crypto/CryptoWorkerWrapper.js similarity index 95% rename from src/react/Helpers/CryptoWorkerWrapper.js rename to src/react/Functions/Crypto/CryptoWorkerWrapper.js index 4ed70b1e..04ce0e3d 100644 --- a/src/react/Helpers/CryptoWorkerWrapper.js +++ b/src/react/Functions/Crypto/CryptoWorkerWrapper.js @@ -1,5 +1,5 @@ import store from "store"; -const CryptoWorker = require("worker-loader!../WebWorkers/crypto.worker.js"); +const CryptoWorker = require("react/WebWorkers/crypto.worker.js"); /** * Decrypt data stored in a specific location diff --git a/src/react/Helpers/CustomForge.js b/src/react/Functions/Crypto/CustomForge.js similarity index 100% rename from src/react/Helpers/CustomForge.js rename to src/react/Functions/Crypto/CustomForge.js diff --git a/src/react/Helpers/DataFilters.js b/src/react/Functions/DataFilters.js similarity index 99% rename from src/react/Helpers/DataFilters.js rename to src/react/Functions/DataFilters.js index 59236dfd..1257fdf0 100644 --- a/src/react/Helpers/DataFilters.js +++ b/src/react/Functions/DataFilters.js @@ -1,4 +1,4 @@ -import CategoryHelper from "./CategoryHelper"; +import CategoryHelper from "../Components/Categories/CategoryHelper"; const checkDateRange = (fromDate, toDate, date) => { // nothing to check so always valid diff --git a/src/react/Helpers/DefaultImageHandlers.js b/src/react/Functions/DefaultImageHandlers.js similarity index 100% rename from src/react/Helpers/DefaultImageHandlers.js rename to src/react/Functions/DefaultImageHandlers.js diff --git a/src/react/Helpers/StatusTexts.js b/src/react/Functions/EventStatusTexts.js similarity index 100% rename from src/react/Helpers/StatusTexts.js rename to src/react/Functions/EventStatusTexts.js diff --git a/src/react/Helpers/FilterDisabledChecker.js b/src/react/Functions/FilterDisabledChecker.js similarity index 100% rename from src/react/Helpers/FilterDisabledChecker.js rename to src/react/Functions/FilterDisabledChecker.js diff --git a/src/react/Helpers/IpChecker.js b/src/react/Functions/IpChecker.js similarity index 100% rename from src/react/Helpers/IpChecker.js rename to src/react/Functions/IpChecker.js diff --git a/src/react/Helpers/IsDarwin.js b/src/react/Functions/IsDarwin.js similarity index 100% rename from src/react/Helpers/IsDarwin.js rename to src/react/Functions/IsDarwin.js diff --git a/src/react/Helpers/Logger.js b/src/react/Functions/Logger.js similarity index 100% rename from src/react/Helpers/Logger.js rename to src/react/Functions/Logger.js diff --git a/src/react/Helpers/MergeApiObjects.js b/src/react/Functions/MergeApiObjects.js similarity index 100% rename from src/react/Helpers/MergeApiObjects.js rename to src/react/Functions/MergeApiObjects.js diff --git a/src/react/Helpers/NoteTextTypeParser.js b/src/react/Functions/NoteTextTypeParser.js similarity index 100% rename from src/react/Helpers/NoteTextTypeParser.js rename to src/react/Functions/NoteTextTypeParser.js diff --git a/src/react/Helpers/NotificationHelper.js b/src/react/Functions/NotificationHelper.js similarity index 100% rename from src/react/Helpers/NotificationHelper.js rename to src/react/Functions/NotificationHelper.js diff --git a/src/react/Helpers/PhoneLib.js b/src/react/Functions/PhoneLib.js similarity index 100% rename from src/react/Helpers/PhoneLib.js rename to src/react/Functions/PhoneLib.js diff --git a/src/react/Helpers/ScheduleTexts.js b/src/react/Functions/ScheduleTexts.js similarity index 100% rename from src/react/Helpers/ScheduleTexts.js rename to src/react/Functions/ScheduleTexts.js diff --git a/src/react/Helpers/StatsFormattingTemplates.js b/src/react/Functions/StatsFormattingTemplates.js similarity index 100% rename from src/react/Helpers/StatsFormattingTemplates.js rename to src/react/Functions/StatsFormattingTemplates.js diff --git a/src/react/Helpers/Utils.js b/src/react/Functions/Utils.js similarity index 100% rename from src/react/Helpers/Utils.js rename to src/react/Functions/Utils.js diff --git a/src/react/Helpers/VersionChecker.js b/src/react/Functions/VersionChecker.js similarity index 100% rename from src/react/Helpers/VersionChecker.js rename to src/react/Functions/VersionChecker.js diff --git a/src/react/Helpers/Base64Images.js b/src/react/Helpers/Base64Images.js deleted file mode 100644 index 5dcf617a..00000000 --- a/src/react/Helpers/Base64Images.js +++ /dev/null @@ -1,2 +0,0 @@ -export const bunqTransparantLogo = - "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAJgCAYAAAAUORHjAAABgmlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kctLQkEUh7+06GUYFNTChUS10ugBUpsgJSyQEDPIaqM3H4GPy71KSNugrVAQtem1qL+gtkHrICiKIIJ2rYvalNzOzcCIPMOZ881v5hxmzoAlnFYyev0gZLJ5LeT3OucjC87GJ6x00Uw7jqiiqxPBYICa9n5LnRmv3Wat2uf+tdbluK5AXZPwuKJqeeEp4cBqXjV5S7hTSUWXhU+EXZpcUPjG1GMVfjY5WeFPk7VwyAeWdmFn8hfHfrGS0jLC8nJ6M+mC8nMf8yW2eHZuVmKPuAOdEH68OJlmEh8ehhiT2YObYQZkRY38we/8GXKSq8isUkRjhSQp8rhELUj1uMSE6HEZaYpm///2VU+MDFeq27zQ8GgYr33QuAnlkmF8HBhG+RCsD3Cerebn9mH0TfRSVevdA/s6nF5Utdg2nG1A970a1aLfklXckkjAyzG0RaDjCloWKz372efoDsJr8lWXsLML/XLevvQFGoRnw8U5SPkAAAAJcEhZcwAALEsAACxLAaU9lqkAACAASURBVHic7N15lFTVuffx3z6nqnqimxkEhxbboRHQihKjN9cxailgoqJxwnkeMkiSF0M0mkGiSa43uYmzOMQ5CTEmorbBWRPjVdMKAoogrVERkKnpsarOfv8ArsSANtDdz6mu72ct1spS6f0l9LDrqXP2kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgZ3DWAcD6aqZkvOX68yfX8TUBAAAAoEcKrAMAAAAAAEDXYwAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEARYAAAAAAAAEAR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\n"; diff --git a/src/react/Helpers/GetShareDetailBudget.js b/src/react/Helpers/GetShareDetailBudget.js deleted file mode 100644 index 4d2a48a9..00000000 --- a/src/react/Helpers/GetShareDetailBudget.js +++ /dev/null @@ -1,22 +0,0 @@ -export default shareInviteBankResponses => { - // get first connect (should only be one) - const shareInviteResponseFirst = shareInviteBankResponses.pop(); - - // check if atleast one item was found - if (shareInviteResponseFirst) { - const shareInviteResponse = shareInviteResponseFirst.ShareInviteBankResponse; - - // check if share details are available - if (shareInviteResponse.share_detail && shareInviteResponse.share_detail.ShareDetailPayment) { - // get budget from share invite bank response - const budgetInfo = shareInviteResponse.share_detail.ShareDetailPayment.budget; - - if (budgetInfo) { - // get the available balance for this budget - return parseFloat(budgetInfo.amount_available.value); - } - } - } - - return false; -}; diff --git a/src/react/Models/SavingsGoal.ts b/src/react/Models/SavingsGoal.ts index 57c883e5..fa7a1fa5 100644 --- a/src/react/Models/SavingsGoal.ts +++ b/src/react/Models/SavingsGoal.ts @@ -1,5 +1,5 @@ import MonetaryAccount from "./MonetaryAccount"; -import { generateGUID } from "../Helpers/Utils"; +import { generateGUID } from "../Functions/Utils"; import { calculateTotalBalance } from "../Components/SavingsGoals/Helpers.js"; export type SavingsGoalSettings = { diff --git a/src/react/Pages/AccountInfo.jsx b/src/react/Pages/AccountInfo.jsx index 1b148735..74fac25d 100644 --- a/src/react/Pages/AccountInfo.jsx +++ b/src/react/Pages/AccountInfo.jsx @@ -31,7 +31,7 @@ import AccountCard from "../Components/AccountCard"; import TranslateButton from "../Components/TranslationHelpers/Button"; import MoneyFormatInput from "../Components/FormFields/MoneyFormatInput"; -import { filterShareInviteBankResponses, filterShareInviteBankInquiries } from "../Helpers/DataFilters"; +import { filterShareInviteBankResponses, filterShareInviteBankInquiries } from "../Functions/DataFilters"; import { openSnackbar } from "../Actions/snackbar"; import { accountsUpdate, accountsUpdateSettings, accountsDeactivate } from "../Actions/accounts"; @@ -45,7 +45,7 @@ import { shareInviteBankInquiriesInfoUpdate } from "../Actions/share_invite_bank import { shareInviteBankResponsesInfoUpdate } from "../Actions/share_invite_bank_responses"; import { shareInviteBankResponseChangeStatus } from "../Actions/share_invite_bank_response"; import { shareInviteBankInquiryChangeStatus } from "../Actions/share_invite_bank_inquiry"; -import { getConnectPermissions } from "../Helpers/GetConnectPermissions"; +import { connectGetPermissions } from "../Functions/ConnectGetPermissions"; const styles = { paper: { @@ -139,7 +139,7 @@ class AccountInfo extends React.Component { this.props.shareInviteBankInquiriesInfoUpdate(userId, accountId); } this.props.shareInviteBankResponsesInfoUpdate(userId); - const connectPermissions = getConnectPermissions(this.props.shareInviteBankResponses, accountId); + const connectPermissions = connectGetPermissions(this.props.shareInviteBankResponses, accountId); if (connectPermissions && connectPermissions.view_new_events) { this.props.paymentsUpdate(userId, accountId); this.props.bunqMeTabsUpdate(userId, accountId); diff --git a/src/react/Pages/ApplicationInfo.jsx b/src/react/Pages/ApplicationInfo.jsx index 1b8a6779..d88355ee 100644 --- a/src/react/Pages/ApplicationInfo.jsx +++ b/src/react/Pages/ApplicationInfo.jsx @@ -23,9 +23,9 @@ import TranslateButton from "../Components/TranslationHelpers/Button"; import TranslateTypography from "../Components/TranslationHelpers/Typography"; import { openSnackbar } from "../Actions/snackbar"; -import { allReleases } from "../Helpers/VersionChecker"; -import { humanReadableDate } from "../Helpers/Utils"; -import Logger from "../Helpers/Logger"; +import { allReleases } from "../Functions/VersionChecker"; +import { humanReadableDate } from "../Functions/Utils"; +import Logger from "../Functions/Logger"; const styles = { avatar: { diff --git a/src/react/Pages/BunqMeTab/ConfirmationDialog.jsx b/src/react/Pages/BunqMeTab/ConfirmationDialog.jsx index aabdce10..fa1a5f58 100644 --- a/src/react/Pages/BunqMeTab/ConfirmationDialog.jsx +++ b/src/react/Pages/BunqMeTab/ConfirmationDialog.jsx @@ -8,7 +8,7 @@ import DialogContent from "@material-ui/core/DialogContent"; import DialogTitle from "@material-ui/core/DialogTitle"; import Dialog from "@material-ui/core/Dialog"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; import TranslateButton from "../../Components/TranslationHelpers/Button"; diff --git a/src/react/Pages/Cards/Cards.jsx b/src/react/Pages/Cards/Cards.jsx index c5d7b223..987d77d6 100644 --- a/src/react/Pages/Cards/Cards.jsx +++ b/src/react/Pages/Cards/Cards.jsx @@ -17,7 +17,7 @@ import CardListItem from "./CardListItem"; import AccountListItem from "../../Components/AccountList/AccountListItem"; import TranslateTypography from "../../Components/TranslationHelpers/Typography"; -import { cardStatus, cardOrderStatus } from "../../Helpers/StatusTexts"; +import { cardStatus, cardOrderStatus } from "../../Functions/EventStatusTexts"; import { cardsUpdate, cardsSetCardOrder } from "../../Actions/cards"; const styles = { diff --git a/src/react/Pages/Connect/Connect.jsx b/src/react/Pages/Connect/Connect.jsx index bb044723..c69ccca5 100644 --- a/src/react/Pages/Connect/Connect.jsx +++ b/src/react/Pages/Connect/Connect.jsx @@ -27,9 +27,9 @@ import FullAccess from "../../Components/ListItems/ShareInviteBankTypes/FullAcce import DraftAccess from "../../Components/ListItems/ShareInviteBankTypes/DraftAccess"; import ShowOnly from "../../Components/ListItems/ShareInviteBankTypes/ShowOnly"; -import { filterShareInviteBankInquiries, filterShareInviteBankResponses } from "../../Helpers/DataFilters"; -import { getInternationalFormat, isValidPhonenumber } from "../../Helpers/PhoneLib"; -import { getUTCDate } from "../../Helpers/Utils"; +import { filterShareInviteBankInquiries, filterShareInviteBankResponses } from "../../Functions/DataFilters"; +import { getInternationalFormat, isValidPhonenumber } from "../../Functions/PhoneLib"; +import { getUTCDate } from "../../Functions/Utils"; import { shareInviteBankResponsesInfoUpdate } from "../../Actions/share_invite_bank_responses"; import { shareInviteBankInquiriesInfoUpdate } from "../../Actions/share_invite_bank_inquiries"; diff --git a/src/react/Pages/Connect/ConnectListItem.jsx b/src/react/Pages/Connect/ConnectListItem.jsx index 0b5be5aa..659ec376 100644 --- a/src/react/Pages/Connect/ConnectListItem.jsx +++ b/src/react/Pages/Connect/ConnectListItem.jsx @@ -8,7 +8,7 @@ import Button from "@material-ui/core/Button"; import LazyAttachmentImage from "../../Components/AttachmentImage/LazyAttachmentImage"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; import { shareInviteBankInquiryChangeStatus } from "../../Actions/share_invite_bank_inquiry"; import { shareInviteBankResponseChangeStatus } from "../../Actions/share_invite_bank_response"; diff --git a/src/react/Pages/Disclaimer.jsx b/src/react/Pages/Disclaimer.jsx index ee3e46aa..f12cd24f 100644 --- a/src/react/Pages/Disclaimer.jsx +++ b/src/react/Pages/Disclaimer.jsx @@ -18,7 +18,7 @@ import LiveHelpIcon from "@material-ui/icons/LiveHelp"; import TranslateButton from "../Components/TranslationHelpers/Button"; -import Analytics from "../Helpers/Analytics"; +import Analytics from "../Functions/Analytics"; import { setAnalyticsEnabled } from "../Actions/options"; const styles = { diff --git a/src/react/Pages/Exports.jsx b/src/react/Pages/Exports.jsx index 54caa958..14753e14 100644 --- a/src/react/Pages/Exports.jsx +++ b/src/react/Pages/Exports.jsx @@ -40,15 +40,15 @@ import TranslateTypography from "../Components/TranslationHelpers/Typography"; import TranslateButton from "../Components/TranslationHelpers/Button"; import CombinedList from "../Components/CombinedList/CombinedList"; -import Logger from "../Helpers/Logger"; -import BunqErrorHandler from "../Helpers/BunqErrorHandler"; -import { humanReadableDate, formatIban } from "../Helpers/Utils"; -import CategoryHelper from "../Helpers/CategoryHelper"; +import Logger from "../Functions/Logger"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; +import { humanReadableDate, formatIban } from "../Functions/Utils"; +import CategoryHelper from "../Components/Categories/CategoryHelper"; import { openSnackbar } from "../Actions/snackbar"; import { exportNew } from "../Actions/export_new"; import { exportInfoUpdate } from "../Actions/exports"; -import { paymentFilter, masterCardActionFilter } from "../Helpers/DataFilters"; +import { paymentFilter, masterCardActionFilter } from "../Functions/DataFilters"; const escapeCsv = val => `"${val.replace('"', '"""')}"`; diff --git a/src/react/Pages/Login/Login.jsx b/src/react/Pages/Login/Login.jsx index 71b9064a..25f5d1c0 100644 --- a/src/react/Pages/Login/Login.jsx +++ b/src/react/Pages/Login/Login.jsx @@ -29,8 +29,8 @@ import OAuthManagement from "./OAuthManagement"; import SideOptions from "./SideOptions"; import { registrationLogOut, registrationLogin } from "../../Actions/registration"; -import BunqErrorHandler from "../../Helpers/BunqErrorHandler"; -import Logger from "../../Helpers/Logger"; +import BunqErrorHandler from "../../Functions/BunqErrorHandler"; +import Logger from "../../Functions/Logger"; const styles = { card: { diff --git a/src/react/Pages/Login/OAuthManagement.jsx b/src/react/Pages/Login/OAuthManagement.jsx index 6ba81a9b..6aa3a909 100644 --- a/src/react/Pages/Login/OAuthManagement.jsx +++ b/src/react/Pages/Login/OAuthManagement.jsx @@ -13,8 +13,8 @@ import CircularProgress from "@material-ui/core/CircularProgress"; import TranslateTypography from "../../Components/TranslationHelpers/Typography"; import TranslateButton from "../../Components/TranslationHelpers/Button"; -import Logger from "../../Helpers/Logger"; -import BunqErrorHandler from "../../Helpers/BunqErrorHandler"; +import Logger from "../../Functions/Logger"; +import BunqErrorHandler from "../../Functions/BunqErrorHandler"; import { oauthSetDetails } from "../../Actions/oauth"; import { openSnackbar } from "../../Actions/snackbar"; diff --git a/src/react/Pages/MasterCardActionInfo.jsx b/src/react/Pages/MasterCardActionInfo.jsx index 31593d4f..9111cc4f 100644 --- a/src/react/Pages/MasterCardActionInfo.jsx +++ b/src/react/Pages/MasterCardActionInfo.jsx @@ -23,7 +23,7 @@ import ArrowDownIcon from "@material-ui/icons/ArrowDownward"; import FilterIcon from "@material-ui/icons/FilterList"; import FilterCreationDialog from "../Components/FilterCreationDialog"; -import PDFExportHelper from "../Components/PDFExportHelper"; +import PDFExportHelper from "../Components/PDFExportHelper/PDFExportHelper"; import ExportDialog from "../Components/ExportDialog"; import SpeedDial from "../Components/SpeedDial"; import TransactionHeader from "../Components/TransactionHeader"; @@ -32,8 +32,8 @@ import CategorySelectorDialog from "../Components/Categories/CategorySelectorDia import CategoryChips from "../Components/Categories/CategoryChips"; import NoteTextForm from "../Components/NoteTexts/NoteTextForm"; -import { formatMoney, humanReadableDate } from "../Helpers/Utils"; -import { masterCardActionText, masterCardActionParser } from "../Helpers/StatusTexts"; +import { formatMoney, humanReadableDate } from "../Functions/Utils"; +import { masterCardActionText, masterCardActionParser } from "../Functions/EventStatusTexts"; import { masterCardActionInfoUpdate } from "../Actions/master_card_action_info"; import { applicationSetPDFMode } from "../Actions/application"; diff --git a/src/react/Pages/Pay/ConfirmationDialog.jsx b/src/react/Pages/Pay/ConfirmationDialog.jsx index c8d5d5e5..6e8c2e6a 100644 --- a/src/react/Pages/Pay/ConfirmationDialog.jsx +++ b/src/react/Pages/Pay/ConfirmationDialog.jsx @@ -12,7 +12,7 @@ import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; import DialogTitle from "@material-ui/core/DialogTitle"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; const styles = {}; diff --git a/src/react/Pages/Pay/Pay.jsx b/src/react/Pages/Pay/Pay.jsx index 0bf1c53a..480fc2a8 100644 --- a/src/react/Pages/Pay/Pay.jsx +++ b/src/react/Pages/Pay/Pay.jsx @@ -39,12 +39,11 @@ import { paySchedule, paySend } from "../../Actions/pay"; import { paymentInfoUpdate } from "../../Actions/payments"; import { pendingPaymentsAddPayment } from "../../Actions/pending_payments"; -import { getInternationalFormat, isValidPhonenumber } from "../../Helpers/PhoneLib"; -import { formatMoney, getUTCDate } from "../../Helpers/Utils"; -import { filterShareInviteBankResponses } from "../../Helpers/DataFilters"; -import GetShareDetailBudget from "../../Helpers/GetShareDetailBudget"; -import scheduleTexts from "../../Helpers/ScheduleTexts"; -import { getConnectType, getConnectPermissions } from "../../Helpers/GetConnectPermissions"; +import { getInternationalFormat, isValidPhonenumber } from "../../Functions/PhoneLib"; +import { formatMoney, getUTCDate } from "../../Functions/Utils"; +import { filterShareInviteBankResponses } from "../../Functions/DataFilters"; +import scheduleTexts from "../../Functions/ScheduleTexts"; +import { connectGetBudget, connectGetType, connectGetPermissions } from "../../Functions/ConnectGetPermissions"; const styles = { payButton: { @@ -241,7 +240,7 @@ class Pay extends React.Component { const account = accounts[selectedAccount]; // no results means no checks required - const connectType = getConnectType(shareInviteBankResponses, account.id); + const connectType = connectGetType(shareInviteBankResponses, account.id); if (connectType === "ShareDetailDraftPayment" && !sendDraftPayment) { this.setState({ sendDraftPayment: true @@ -429,7 +428,7 @@ class Pay extends React.Component { // get budget if atleast one connect if (filteredInviteResponses.length > 0) { - const connectBudget = GetShareDetailBudget(filteredInviteResponses); + const connectBudget = connectGetBudget(filteredInviteResponses); if (connectBudget) { accountBalance = connectBudget; } @@ -572,7 +571,7 @@ class Pay extends React.Component { } setTimeout(() => { - const connectPermissions = getConnectPermissions(this.props.shareInviteBankResponses, account.id); + const connectPermissions = connectGetPermissions(this.props.shareInviteBankResponses, account.id); if (connectPermissions && connectPermissions.view_new_events) { this.props.paymentInfoUpdate(userId, account.id); } @@ -615,7 +614,7 @@ class Pay extends React.Component { // regular balance value accountBalance = account.balance ? account.balance.value : 0; if (filteredInviteResponses.length > 0) { - const connectBudget = GetShareDetailBudget(filteredInviteResponses); + const connectBudget = connectGetBudget(filteredInviteResponses); if (connectBudget) { accountBalance = connectBudget; } diff --git a/src/react/Pages/PaymentInfo.jsx b/src/react/Pages/PaymentInfo.jsx index 299ad419..aadcfeec 100644 --- a/src/react/Pages/PaymentInfo.jsx +++ b/src/react/Pages/PaymentInfo.jsx @@ -21,12 +21,12 @@ import HelpIcon from "@material-ui/icons/Help"; import BookmarkIcon from "@material-ui/icons/Bookmark"; import FilterIcon from "@material-ui/icons/FilterList"; -import { formatMoney, humanReadableDate, formatIban } from "../Helpers/Utils"; -import { paymentText, paymentTypeParser } from "../Helpers/StatusTexts"; +import { formatMoney, humanReadableDate, formatIban } from "../Functions/Utils"; +import { paymentText, paymentTypeParser } from "../Functions/EventStatusTexts"; import FilterCreationDialog from "../Components/FilterCreationDialog"; import GeoLocationListItem from "../Components/GeoLocation/GeoLocationListItem"; -import PDFExportHelper from "../Components/PDFExportHelper"; +import PDFExportHelper from "../Components/PDFExportHelper/PDFExportHelper"; import SpeedDial from "../Components/SpeedDial"; import ExportDialog from "../Components/ExportDialog"; import MoneyAmountLabel from "../Components/MoneyAmountLabel"; diff --git a/src/react/Pages/PendingPayments/PendingPaymentRow.jsx b/src/react/Pages/PendingPayments/PendingPaymentRow.jsx index ad4a1be0..b27caf9e 100644 --- a/src/react/Pages/PendingPayments/PendingPaymentRow.jsx +++ b/src/react/Pages/PendingPayments/PendingPaymentRow.jsx @@ -12,7 +12,7 @@ import DeleteIcon from "@material-ui/icons/Delete"; import TargetChipList from "../../Components/FormFields/TargetChipList"; import TargetChip from "../../Components/FormFields/TargetChip"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; const styles = { subdirectoryIconGrid: { @@ -37,9 +37,7 @@ export default ({ pendingPayment, selectedCheckBoxes, accounts, togglePaymentChe let targetComponents = null; if (paymentObject.counterparty_aliases) { - targetComponents = ( - - ); + targetComponents = ; } else { targetComponents = ; } diff --git a/src/react/Pages/PendingPayments/PendingPayments.jsx b/src/react/Pages/PendingPayments/PendingPayments.jsx index faefcff5..083a9d5e 100644 --- a/src/react/Pages/PendingPayments/PendingPayments.jsx +++ b/src/react/Pages/PendingPayments/PendingPayments.jsx @@ -22,8 +22,8 @@ import TranslateTypography from "../../Components/TranslationHelpers/Typography" import ConfirmationDialog from "./ConfirmationDialog"; import PendingPaymentRow from "./PendingPaymentRow"; -import { formatMoney } from "../../Helpers/Utils"; -import BunqErrorHandler from "../../Helpers/BunqErrorHandler"; +import { formatMoney } from "../../Functions/Utils"; +import BunqErrorHandler from "../../Functions/BunqErrorHandler"; import { pendingPaymentsClear, @@ -84,7 +84,7 @@ class PendingPayments extends React.Component { componentDidUpdate(previousProps, previousState) { if (previousState.paymentPromiseCount > 0 && this.state.paymentPromiseCount <= 0) { this.props.openSnackbar(this.props.t("Finished handling the selected payments")); - + this.setState({ paymentPromiseCount: 0 }); diff --git a/src/react/Pages/Profile/Profile.jsx b/src/react/Pages/Profile/Profile.jsx index bb1e6625..e48c2882 100644 --- a/src/react/Pages/Profile/Profile.jsx +++ b/src/react/Pages/Profile/Profile.jsx @@ -20,8 +20,8 @@ import ProfileDetailsForm from "./ProfileDetailsForm"; import { openSnackbar } from "../../Actions/snackbar"; import { usersUpdate } from "../../Actions/users"; -import BunqErrorHandler from "../../Helpers/BunqErrorHandler"; -import { formatMoney } from "../../Helpers/Utils"; +import BunqErrorHandler from "../../Functions/BunqErrorHandler"; +import { formatMoney } from "../../Functions/Utils"; const styles = { title: { diff --git a/src/react/Pages/RequestInquiry/ConfirmationDialog.jsx b/src/react/Pages/RequestInquiry/ConfirmationDialog.jsx index 451cd3da..bbd7c740 100644 --- a/src/react/Pages/RequestInquiry/ConfirmationDialog.jsx +++ b/src/react/Pages/RequestInquiry/ConfirmationDialog.jsx @@ -8,7 +8,7 @@ import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; import DialogTitle from "@material-ui/core/DialogTitle"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; export default class ConfirmationDialog extends React.Component { render() { diff --git a/src/react/Pages/RequestInquiry/RequestInquiry.jsx b/src/react/Pages/RequestInquiry/RequestInquiry.jsx index c4d286e9..a54234e1 100644 --- a/src/react/Pages/RequestInquiry/RequestInquiry.jsx +++ b/src/react/Pages/RequestInquiry/RequestInquiry.jsx @@ -26,9 +26,9 @@ import { openSnackbar } from "../../Actions/snackbar"; import { requestInquirySend } from "../../Actions/request_inquiry"; import { requestInquiriesUpdate } from "../../Actions/request_inquiries"; -import { getInternationalFormat, isValidPhonenumber } from "../../Helpers/PhoneLib"; +import { getInternationalFormat, isValidPhonenumber } from "../../Functions/PhoneLib"; import TotalSplitHelper from "./TotalSplitHelper"; -import { getConnectPermissions } from "../../Helpers/GetConnectPermissions"; +import { connectGetPermissions } from "../../Functions/ConnectGetPermissions"; const styles = { payButton: { @@ -435,7 +435,7 @@ class RequestInquiry extends React.Component { this.props.requestInquirySend(userId, account.id, requestInquiries); setTimeout(() => { - const connectPermissions = getConnectPermissions(this.props.shareInviteBankResponses, account.id); + const connectPermissions = connectGetPermissions(this.props.shareInviteBankResponses, account.id); if (connectPermissions && connectPermissions.view_new_events) { this.props.requestInquiriesUpdate(userId, account.id); } diff --git a/src/react/Pages/RequestInquiry/SplitAmountItem.jsx b/src/react/Pages/RequestInquiry/SplitAmountItem.jsx index 2457ccf1..9efcb599 100644 --- a/src/react/Pages/RequestInquiry/SplitAmountItem.jsx +++ b/src/react/Pages/RequestInquiry/SplitAmountItem.jsx @@ -10,7 +10,7 @@ import RemoveIcon from "@material-ui/icons/Remove"; import TableRow from "@material-ui/core/TableRow"; import TableCell from "@material-ui/core/TableCell"; -import { formatMoney } from "../../Helpers/Utils"; +import { formatMoney } from "../../Functions/Utils"; import AccountListItemChip from "../../Components/AccountList/AccountListItemChip"; diff --git a/src/react/Pages/RequestInquiryInfo.jsx b/src/react/Pages/RequestInquiryInfo.jsx index 0667106a..25959bbe 100644 --- a/src/react/Pages/RequestInquiryInfo.jsx +++ b/src/react/Pages/RequestInquiryInfo.jsx @@ -26,7 +26,7 @@ import FilterIcon from "@material-ui/icons/FilterList"; import FilterCreationDialog from "../Components/FilterCreationDialog"; import ExportDialog from "../Components/ExportDialog"; -import PDFExportHelper from "../Components/PDFExportHelper"; +import PDFExportHelper from "../Components/PDFExportHelper/PDFExportHelper"; import SpeedDial from "../Components/SpeedDial"; import TranslateButton from "../Components/TranslationHelpers/Button"; import MoneyAmountLabel from "../Components/MoneyAmountLabel"; @@ -34,8 +34,8 @@ import TransactionHeader from "../Components/TransactionHeader"; import CategorySelector from "../Components/Categories/CategorySelector"; import NoteTextForm from "../Components/NoteTexts/NoteTextForm"; -import { formatMoney, humanReadableDate } from "../Helpers/Utils"; -import { requestInquiryText } from "../Helpers/StatusTexts"; +import { formatMoney, humanReadableDate } from "../Functions/Utils"; +import { requestInquiryText } from "../Functions/EventStatusTexts"; import { requestInquiryCancel } from "../Actions/request_inquiry"; import { requestInquiryUpdate } from "../Actions/request_inquiry_info"; import { applicationSetPDFMode } from "../Actions/application"; diff --git a/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx b/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx index 51b6c906..b961ca9e 100644 --- a/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx +++ b/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx @@ -22,7 +22,7 @@ import FilterIcon from "@material-ui/icons/FilterList"; import FilterCreationDialog from "../../Components/FilterCreationDialog"; import AccountSelectorDialog from "../../Components/FormFields/AccountSelectorDialog"; -import PDFExportHelper from "../../Components/PDFExportHelper"; +import PDFExportHelper from "../../Components/PDFExportHelper/PDFExportHelper"; import ExportDialog from "../../Components/ExportDialog"; import SpeedDial from "../../Components/SpeedDial"; import TranslateButton from "../../Components/TranslationHelpers/Button"; @@ -32,8 +32,8 @@ import CategorySelector from "../../Components/Categories/CategorySelector"; import NoteTextForm from "../../Components/NoteTexts/NoteTextForm"; import GeoLocationListItem from "../../Components/GeoLocation/GeoLocationListItem"; -import { formatMoney, humanReadableDate } from "../../Helpers/Utils"; -import { requestResponseText, requestResponseTypeParser } from "../../Helpers/StatusTexts"; +import { formatMoney, humanReadableDate } from "../../Functions/Utils"; +import { requestResponseText, requestResponseTypeParser } from "../../Functions/EventStatusTexts"; import { requestResponseUpdate } from "../../Actions/request_response_info"; import { requestResponseReject, requestResponseAccept } from "../../Actions/request_response"; diff --git a/src/react/Pages/ScheduledPayments/ScheduledPaymentItem.jsx b/src/react/Pages/ScheduledPayments/ScheduledPaymentItem.jsx index f8d86631..61e92b96 100644 --- a/src/react/Pages/ScheduledPayments/ScheduledPaymentItem.jsx +++ b/src/react/Pages/ScheduledPayments/ScheduledPaymentItem.jsx @@ -11,8 +11,8 @@ import DeleteIcon from "@material-ui/icons/Delete"; import LazyAttachmentImage from "../../Components/AttachmentImage/LazyAttachmentImage"; import MoneyAmountLabel from "../../Components/MoneyAmountLabel"; -import scheduleTexts from "../../Helpers/ScheduleTexts"; -import { formatMoney, humanReadableDate } from "../../Helpers/Utils"; +import scheduleTexts from "../../Functions/ScheduleTexts"; +import { formatMoney, humanReadableDate } from "../../Functions/Utils"; const styles = { paper: { diff --git a/src/react/Pages/Settings/Settings.jsx b/src/react/Pages/Settings/Settings.jsx index 04857099..1a2a4c82 100644 --- a/src/react/Pages/Settings/Settings.jsx +++ b/src/react/Pages/Settings/Settings.jsx @@ -25,7 +25,7 @@ import RemoveIcon from "@material-ui/icons/Delete"; import HomeIcon from "@material-ui/icons/Home"; import path from "../../ImportWrappers/path"; -import { getPrettyLanguage } from "../../Helpers/Utils"; +import { getPrettyLanguage } from "../../Functions/Utils"; const packageInfo = require("../../../../package.json"); const SUPPORTED_LANGUAGES = packageInfo.supported_languages; @@ -653,9 +653,11 @@ class Settings extends React.Component { {settingsContainer} - {this.props.registrationReady && - - } + {this.props.registrationReady && ( + + + + )} {dataManagementContainer} diff --git a/src/react/Pages/Stats/Chart/PieChart/CategoryTransactionPieChart.jsx b/src/react/Pages/Stats/Chart/PieChart/CategoryTransactionPieChart.jsx index 1ae4b098..dfb88c93 100644 --- a/src/react/Pages/Stats/Chart/PieChart/CategoryTransactionPieChart.jsx +++ b/src/react/Pages/Stats/Chart/PieChart/CategoryTransactionPieChart.jsx @@ -1,6 +1,6 @@ import React from "react"; import { Pie } from "react-chartjs-2"; -import { moneyTemplate } from "../../../../Helpers/StatsFormattingTemplates"; +import { moneyTemplate } from "../../../../Functions/StatsFormattingTemplates"; const ensurePositive = value => { return value < 0 ? value * -1 : value; diff --git a/src/react/Pages/Stats/Chart/PieChart/EventSplitTransactionPieChart.jsx b/src/react/Pages/Stats/Chart/PieChart/EventSplitTransactionPieChart.jsx index c143c9ed..f896d631 100644 --- a/src/react/Pages/Stats/Chart/PieChart/EventSplitTransactionPieChart.jsx +++ b/src/react/Pages/Stats/Chart/PieChart/EventSplitTransactionPieChart.jsx @@ -9,7 +9,7 @@ import { requestResponseColor, tapAndPayPaymentColor } from "../../Colors"; -import { moneyTemplate } from "../../../../Helpers/StatsFormattingTemplates"; +import { moneyTemplate } from "../../../../Functions/StatsFormattingTemplates"; const countReducer = (a, b) => a + b; diff --git a/src/react/Pages/Stats/Chart/PieChart/EventTransactionPieChart.jsx b/src/react/Pages/Stats/Chart/PieChart/EventTransactionPieChart.jsx index b18cbeb5..2d6fe937 100644 --- a/src/react/Pages/Stats/Chart/PieChart/EventTransactionPieChart.jsx +++ b/src/react/Pages/Stats/Chart/PieChart/EventTransactionPieChart.jsx @@ -7,7 +7,7 @@ import { requestInquiryColor, requestResponseColor } from "../../Colors"; -import { moneyTemplate } from "../../../../Helpers/StatsFormattingTemplates"; +import { moneyTemplate } from "../../../../Functions/StatsFormattingTemplates"; const countReducer = (a, b) => a + b; diff --git a/src/react/Pages/Stats/Chart/Timeline/CategoryCountHistoryChart.jsx b/src/react/Pages/Stats/Chart/Timeline/CategoryCountHistoryChart.jsx index a2e0413e..b3a4f807 100644 --- a/src/react/Pages/Stats/Chart/Timeline/CategoryCountHistoryChart.jsx +++ b/src/react/Pages/Stats/Chart/Timeline/CategoryCountHistoryChart.jsx @@ -1,6 +1,6 @@ import React from "react"; import { Bar } from "react-chartjs-2"; -import { sortLinearChartTooltips } from "../../../../Helpers/StatsFormattingTemplates"; +import { sortLinearChartTooltips } from "../../../../Functions/StatsFormattingTemplates"; export default props => { const defaultOptions = { diff --git a/src/react/Pages/Stats/Chart/Timeline/CategoryTransactionHistoryChart.jsx b/src/react/Pages/Stats/Chart/Timeline/CategoryTransactionHistoryChart.jsx index e97f5ae7..b561f520 100644 --- a/src/react/Pages/Stats/Chart/Timeline/CategoryTransactionHistoryChart.jsx +++ b/src/react/Pages/Stats/Chart/Timeline/CategoryTransactionHistoryChart.jsx @@ -1,6 +1,6 @@ import React from "react"; import { Bar } from "react-chartjs-2"; -import { moneyTemplate, sortLinearChartTooltips } from "../../../../Helpers/StatsFormattingTemplates"; +import { moneyTemplate, sortLinearChartTooltips } from "../../../../Functions/StatsFormattingTemplates"; export default props => { const defaultOptions = { diff --git a/src/react/Pages/Stats/Chart/Timeline/EventTypeHistoryChart.jsx b/src/react/Pages/Stats/Chart/Timeline/EventTypeHistoryChart.jsx index 98c8718e..6707869c 100644 --- a/src/react/Pages/Stats/Chart/Timeline/EventTypeHistoryChart.jsx +++ b/src/react/Pages/Stats/Chart/Timeline/EventTypeHistoryChart.jsx @@ -7,7 +7,7 @@ import { requestInquiryColor, requestResponseColor } from "../../Colors"; -import { sortLinearChartTooltips } from "../../../../Helpers/StatsFormattingTemplates"; +import { sortLinearChartTooltips } from "../../../../Functions/StatsFormattingTemplates"; export default props => { const defaultOptions = { diff --git a/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitHistoryChart.jsx b/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitHistoryChart.jsx index bc1eb68a..cc2a971c 100644 --- a/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitHistoryChart.jsx +++ b/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitHistoryChart.jsx @@ -10,7 +10,7 @@ import { requestInquiryColor, requestResponseColor } from "../../Colors"; -import { sortLinearChartTooltips } from "../../../../Helpers/StatsFormattingTemplates"; +import { sortLinearChartTooltips } from "../../../../Functions/StatsFormattingTemplates"; export default props => { const defaultOptions = { diff --git a/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitTransactionHistoryChart.jsx b/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitTransactionHistoryChart.jsx index d41dacbe..3a11b0a1 100644 --- a/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitTransactionHistoryChart.jsx +++ b/src/react/Pages/Stats/Chart/Timeline/EventTypeSplitTransactionHistoryChart.jsx @@ -10,7 +10,7 @@ import { requestInquiryColor, requestResponseColor } from "../../Colors"; -import { moneyTemplate, sortLinearChartTooltips } from "../../../../Helpers/StatsFormattingTemplates"; +import { moneyTemplate, sortLinearChartTooltips } from "../../../../Functions/StatsFormattingTemplates"; export default props => { const defaultOptions = { diff --git a/src/react/Pages/Stats/Chart/Timeline/EventTypeTransactionHistoryChart.jsx b/src/react/Pages/Stats/Chart/Timeline/EventTypeTransactionHistoryChart.jsx index bebb3d22..064b3959 100644 --- a/src/react/Pages/Stats/Chart/Timeline/EventTypeTransactionHistoryChart.jsx +++ b/src/react/Pages/Stats/Chart/Timeline/EventTypeTransactionHistoryChart.jsx @@ -7,7 +7,7 @@ import { requestInquiryColor, requestResponseColor } from "../../Colors"; -import { moneyTemplate, sortLinearChartTooltips } from "../../../../Helpers/StatsFormattingTemplates"; +import { moneyTemplate, sortLinearChartTooltips } from "../../../../Functions/StatsFormattingTemplates"; export default props => { const defaultOptions = { diff --git a/src/react/Reducers/accounts.js b/src/react/Reducers/accounts.js index b3bed0a7..966b155a 100644 --- a/src/react/Reducers/accounts.js +++ b/src/react/Reducers/accounts.js @@ -3,7 +3,7 @@ import { ipcRenderer } from "electron"; import settings from "../ImportWrappers/electronSettings"; import { STORED_ACCOUNTS } from "../Actions/accounts"; -import { formatMoney } from "../Helpers/Utils"; +import { formatMoney } from "../Functions/Utils"; export const SELECTED_ACCOUNT_LOCAION = "BUNQDESKTOP_SELECTED_ACCOUNT"; export const EXCLUDED_ACCOUNT_IDS = "BUNQDESKTOP_EXCLUDED_ACCOUNT_IDS"; diff --git a/src/react/Reducers/bunq_me_tabs.js b/src/react/Reducers/bunq_me_tabs.js index f4f1c964..cb147d93 100644 --- a/src/react/Reducers/bunq_me_tabs.js +++ b/src/react/Reducers/bunq_me_tabs.js @@ -1,6 +1,6 @@ import store from "store"; -import MergeApiObjects from "../Helpers/MergeApiObjects"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import MergeApiObjects from "../Functions/MergeApiObjects"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_BUNQ_ME_TABS } from "../Actions/bunq_me_tabs"; diff --git a/src/react/Reducers/categories.js b/src/react/Reducers/categories.js index 589254b9..ce17cab3 100644 --- a/src/react/Reducers/categories.js +++ b/src/react/Reducers/categories.js @@ -1,5 +1,5 @@ import settings from "../ImportWrappers/electronSettings"; -import { generateGUID } from "../Helpers/Utils"; +import { generateGUID } from "../Functions/Utils"; // default categories if no previous were found const defaultCategories = require("@bunq-community/bunqdesktop-templates/categories.json"); diff --git a/src/react/Reducers/master_card_actions.js b/src/react/Reducers/master_card_actions.js index 7769406e..5bfc7b02 100644 --- a/src/react/Reducers/master_card_actions.js +++ b/src/react/Reducers/master_card_actions.js @@ -1,6 +1,6 @@ import store from "store"; -import MergeApiObjects from "../Helpers/MergeApiObjects"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import MergeApiObjects from "../Functions/MergeApiObjects"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_MASTER_CARD_ACTIONS } from "../Actions/master_card_actions"; diff --git a/src/react/Reducers/payments.js b/src/react/Reducers/payments.js index e38f7bc7..b79b95b3 100644 --- a/src/react/Reducers/payments.js +++ b/src/react/Reducers/payments.js @@ -1,6 +1,6 @@ import store from "store"; -import MergeApiObjects from "../Helpers/MergeApiObjects"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import MergeApiObjects from "../Functions/MergeApiObjects"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_PAYMENTS } from "../Actions/payments"; diff --git a/src/react/Reducers/pending_payments.js b/src/react/Reducers/pending_payments.js index d687cff0..0ebe0d30 100644 --- a/src/react/Reducers/pending_payments.js +++ b/src/react/Reducers/pending_payments.js @@ -1,6 +1,6 @@ import store from "store"; -import { generateGUID } from "../Helpers/Utils"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import { generateGUID } from "../Functions/Utils"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { PENDING_PAYMENTS_LOCATION } from "../Actions/pending_payments"; export const defaultState = { diff --git a/src/react/Reducers/request_inquiries.js b/src/react/Reducers/request_inquiries.js index 5365746d..9cb92e8b 100644 --- a/src/react/Reducers/request_inquiries.js +++ b/src/react/Reducers/request_inquiries.js @@ -1,6 +1,6 @@ import store from "store"; -import MergeApiObjects from "../Helpers/MergeApiObjects"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import MergeApiObjects from "../Functions/MergeApiObjects"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_REQUEST_INQUIRIES } from "../Actions/request_inquiries"; diff --git a/src/react/Reducers/request_inquiry_batches.js b/src/react/Reducers/request_inquiry_batches.js index d435f2f0..0c1d78e7 100644 --- a/src/react/Reducers/request_inquiry_batches.js +++ b/src/react/Reducers/request_inquiry_batches.js @@ -1,6 +1,6 @@ import store from "store"; -import MergeApiObjects from "../Helpers/MergeApiObjects"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import MergeApiObjects from "../Functions/MergeApiObjects"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_REQUEST_INQUIRY_BATCHES } from "../Actions/request_inquiry_batches"; diff --git a/src/react/Reducers/request_responses.js b/src/react/Reducers/request_responses.js index f1d865a2..725f1109 100644 --- a/src/react/Reducers/request_responses.js +++ b/src/react/Reducers/request_responses.js @@ -1,6 +1,6 @@ import store from "store"; -import MergeApiObjects from "../Helpers/MergeApiObjects"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import MergeApiObjects from "../Functions/MergeApiObjects"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_REQUEST_RESPONSES } from "../Actions/request_responses"; diff --git a/src/react/Reducers/savings_goals.js b/src/react/Reducers/savings_goals.js index 44448c3a..54ec1c7b 100644 --- a/src/react/Reducers/savings_goals.js +++ b/src/react/Reducers/savings_goals.js @@ -1,5 +1,5 @@ import settings from "../ImportWrappers/electronSettings"; -import { generateGUID } from "../Helpers/Utils"; +import { generateGUID } from "../Functions/Utils"; import SavingsGoal from "../Models/SavingsGoal"; export const BUNQDESKTOP_SAVINGS_GOALS = "BUNQDESKTOP_SAVINGS_GOALS"; diff --git a/src/react/Reducers/share_invite_bank_inquiries.js b/src/react/Reducers/share_invite_bank_inquiries.js index 08fe30a8..c4a8a7e6 100644 --- a/src/react/Reducers/share_invite_bank_inquiries.js +++ b/src/react/Reducers/share_invite_bank_inquiries.js @@ -1,6 +1,6 @@ import store from "store"; import { STORED_SHARE_INVITE_BANK_INQUIRIES } from "../Actions/share_invite_bank_inquiries"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const defaultState = { share_invite_bank_inquiries: [], diff --git a/src/react/Reducers/share_invite_bank_responses.js b/src/react/Reducers/share_invite_bank_responses.js index b1e706e6..7b731f66 100644 --- a/src/react/Reducers/share_invite_bank_responses.js +++ b/src/react/Reducers/share_invite_bank_responses.js @@ -1,6 +1,6 @@ import store from "store"; import { STORED_SHARE_INVITE_BANK_RESPONSES } from "../Actions/share_invite_bank_responses"; -import { storeEncryptString } from "../Helpers/CryptoWorkerWrapper"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const defaultState = { share_invite_bank_responses: [], diff --git a/src/react/Helpers/CountryCodes.json b/src/react/StaticData/CountryCodes.json similarity index 100% rename from src/react/Helpers/CountryCodes.json rename to src/react/StaticData/CountryCodes.json diff --git a/src/react/Helpers/Icons.json b/src/react/StaticData/Icons.json similarity index 100% rename from src/react/Helpers/Icons.json rename to src/react/StaticData/Icons.json diff --git a/src/react/Types/RuleCollection.ts b/src/react/Types/RuleCollection.ts index 91d39682..5303df3e 100644 --- a/src/react/Types/RuleCollection.ts +++ b/src/react/Types/RuleCollection.ts @@ -3,7 +3,7 @@ import TransactionAmountRule from "./Rules/TransactionAmountRule"; import ValueRule from "./Rules/ValueRule"; import TypeRule from "./Rules/TypeRule"; import AccountRule from "./Rules/AccountRule"; -import { generateGUID } from "../Helpers/Utils"; +import { generateGUID } from "../Functions/Utils"; import { RuleTypes, EventObject, EventTypes } from "./Types"; export type RuleCollectionMatchType = "OR" | "AND"; diff --git a/src/react/WebWorkers/crypto.worker.js b/src/react/WebWorkers/crypto.worker.js index 70d91072..317c0719 100644 --- a/src/react/WebWorkers/crypto.worker.js +++ b/src/react/WebWorkers/crypto.worker.js @@ -1,4 +1,4 @@ -import { decryptString, encryptString } from "../Helpers/Crypto.js"; +import { decryptString, encryptString } from "../Functions/Crypto/Crypto.js"; const defaultError = error => { console.error(error); diff --git a/src/react/WebWorkers/stats.worker.js b/src/react/WebWorkers/stats.worker.js index 806c4231..10bad3bb 100644 --- a/src/react/WebWorkers/stats.worker.js +++ b/src/react/WebWorkers/stats.worker.js @@ -12,16 +12,15 @@ import differenceInCalendarMonths from "date-fns/differenceInCalendarMonths"; import differenceInCalendarYears from "date-fns/differenceInCalendarYears"; import format from "date-fns/format"; -import CategoryHelper from "../Helpers/CategoryHelper"; +import CategoryHelper from "../Components/Categories/CategoryHelper"; import { bunqMeTabsFilter, masterCardActionFilter, paymentFilter, requestInquiryFilter, requestResponseFilter -} from "../Helpers/DataFilters"; +} from "../Functions/DataFilters"; -import MonetaryAccount from "../Models/MonetaryAccount"; import Payment from "../Models/Payment"; import MasterCardAction from "../Models/MasterCardAction"; import RequestInquiry from "../Models/RequestInquiry"; diff --git a/src/react/react-app.jsx b/src/react/react-app.jsx index dd9ba7dc..0589bc70 100644 --- a/src/react/react-app.jsx +++ b/src/react/react-app.jsx @@ -12,8 +12,8 @@ import "../scss/main.scss"; import "animate.css"; import "typeface-roboto"; -import Logger from "./Helpers/Logger"; -import Analytics from "./Helpers/Analytics"; +import Logger from "./Functions/Logger"; +import Analytics from "./Functions/Analytics"; Analytics(); diff --git a/tasks/generate_icons.js b/tasks/generate_icons.js index ed3bda58..e1f4dad1 100644 --- a/tasks/generate_icons.js +++ b/tasks/generate_icons.js @@ -13,7 +13,7 @@ const icons = []; */ const writeIconsFile = () => { fs.writeFileSync( - `${__dirname}/../src/react/Helpers/Icons.json`, + `${__dirname}/../src/react/StaticData/Functions/Con`, JSON.stringify({ icons: icons }) From 91ef880c71587c7dc1120476f5e127858d435ea2 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 4 Dec 2018 15:08:07 +0100 Subject: [PATCH 02/61] Add balance property to payments and fix invalid imports --- src/react/Models/BunqMeTab.ts | 5 ++--- src/react/Models/MasterCardAction.ts | 4 ++-- src/react/Models/Payment.ts | 15 +++++++++++++-- src/react/Models/RequestInquiry.ts | 4 ++-- src/react/Models/RequestInquiryBatch.ts | 4 ++-- src/react/Models/RequestResponse.ts | 4 ++-- src/react/WebWorkers/stats.worker.js | 4 ---- 7 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/react/Models/BunqMeTab.ts b/src/react/Models/BunqMeTab.ts index e52b8f4a..4b5cbbf6 100644 --- a/src/react/Models/BunqMeTab.ts +++ b/src/react/Models/BunqMeTab.ts @@ -1,13 +1,12 @@ import { BunqMeTabEntry, BunqMeTabResultInquiry, BunqMeTabStatus } from "../Types/Types"; -import Event, { EventType } from "../Types/Event"; -import RequestInquiry from "./RequestInquiry"; +import Event, { EventTypeValue } from "../Types/Event"; export default class BunqMeTab implements Event { // the original raw object private _rawData: any; public BunqMeTab = this; - get eventType(): EventType { + get eventType(): EventTypeValue { return "BunqMeTab"; } diff --git a/src/react/Models/MasterCardAction.ts b/src/react/Models/MasterCardAction.ts index 93cdc9c3..077d4855 100644 --- a/src/react/Models/MasterCardAction.ts +++ b/src/react/Models/MasterCardAction.ts @@ -1,5 +1,5 @@ import { Amount, LabelCard, PaymentAlias, RequestReferenceSplitTheBill } from "../Types/Types"; -import Event, { EventType } from "../Types/Event"; +import Event, { EventTypeValue } from "../Types/Event"; export type PanEntryModeUser = "ATM" | "ICC" | "MAGNETIC_STRIPE" | "E_COMMERCE"; @@ -8,7 +8,7 @@ export default class MasterCardAction implements Event { private _rawData: any; public MasterCardAction = this; - get eventType(): EventType { + get eventType(): EventTypeValue { return "MasterCardAction"; } diff --git a/src/react/Models/Payment.ts b/src/react/Models/Payment.ts index 60547385..3dae06ca 100644 --- a/src/react/Models/Payment.ts +++ b/src/react/Models/Payment.ts @@ -8,14 +8,14 @@ import { PaymentType, RequestReferenceSplitTheBill } from "../Types/Types"; -import Event, { EventType } from "../Types/Event"; +import Event, { EventTypeValue } from "../Types/Event"; export default class Payment implements Event { // the original raw object private _rawData: any; public Payment = this; - get eventType(): EventType { + get eventType(): EventTypeValue { return "Payment"; } @@ -35,6 +35,7 @@ export default class Payment implements Event { private _bunqto_expiry: string | null; private _bunqto_time_responded: string | null; private _attachment: AttachmentList; + private _balance_after_mutation: Amount | undefined = undefined; private _merchant_reference: string; private _batch_id: number | null; private _scheduled_id: number | null; @@ -58,6 +59,13 @@ export default class Payment implements Event { this._updated = new Date(this._updated); this._created = new Date(this._created); + + // ignore balance after mutation value for older payments + if (this._balance_after_mutation) { + if (this._balance_after_mutation.value === "999999999.99") { + this._balance_after_mutation = undefined; + } + } } /** @@ -131,6 +139,9 @@ export default class Payment implements Event { get attachment(): AttachmentList { return this._attachment; } + get balance_after_mutation(): Amount | undefined { + return this._balance_after_mutation; + } get merchant_reference(): string { return this._merchant_reference; } diff --git a/src/react/Models/RequestInquiry.ts b/src/react/Models/RequestInquiry.ts index b3f2aae8..67eff6b5 100644 --- a/src/react/Models/RequestInquiry.ts +++ b/src/react/Models/RequestInquiry.ts @@ -8,14 +8,14 @@ import { RequestStatus, RequestSplitTheBill } from "../Types/Types"; -import Event, { EventType } from "../Types/Event"; +import Event, { EventTypeValue } from "../Types/Event"; export default class RequestInquiry implements Event { // the original raw object private _rawData: any; public RequestInquiry = this; - get eventType(): EventType { + get eventType(): EventTypeValue { return "RequestInquiry"; } diff --git a/src/react/Models/RequestInquiryBatch.ts b/src/react/Models/RequestInquiryBatch.ts index b8fcbdbc..fbd7d39a 100644 --- a/src/react/Models/RequestInquiryBatch.ts +++ b/src/react/Models/RequestInquiryBatch.ts @@ -1,5 +1,5 @@ import { Amount, RequestSplitTheBill } from "../Types/Types"; -import Event, { EventType } from "../Types/Event"; +import Event, { EventTypeValue } from "../Types/Event"; import RequestInquiry from "./RequestInquiry"; export default class RequestInquiryBatch implements Event { @@ -7,7 +7,7 @@ export default class RequestInquiryBatch implements Event { private _rawData: any; public RequestInquiryBatch = this; - get eventType(): EventType { + get eventType(): EventTypeValue { return "RequestInquiryBatch"; } diff --git a/src/react/Models/RequestResponse.ts b/src/react/Models/RequestResponse.ts index 6e785cf7..c1c6ef4e 100644 --- a/src/react/Models/RequestResponse.ts +++ b/src/react/Models/RequestResponse.ts @@ -9,14 +9,14 @@ import { RequestResponseType, RequestResponseSubType } from "../Types/Types"; -import Event, { EventType } from "../Types/Event"; +import Event, { EventTypeValue } from "../Types/Event"; export default class RequestResponse implements Event { // the original raw object private _rawData: any; public RequestResponse = this; - get eventType(): EventType { + get eventType(): EventTypeValue { return "RequestResponse"; } diff --git a/src/react/WebWorkers/stats.worker.js b/src/react/WebWorkers/stats.worker.js index 10bad3bb..f533a923 100644 --- a/src/react/WebWorkers/stats.worker.js +++ b/src/react/WebWorkers/stats.worker.js @@ -41,10 +41,6 @@ const labelFormat = (date, type = "daily") => { } }; -const roundMoney = amount => { - return Math.round(amount * 100) / 100; -}; - const paymentMapper = (payments, paymentFilterSettings, categories, categoryConnections, hiddenPaymentIds = []) => { const data = []; payments From 7864d48d580f6be6c9f4c8824927e607a0868677 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 4 Dec 2018 19:38:15 +0100 Subject: [PATCH 03/61] Upgrade react to 16.6.3 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index fcd85fe5..26dd35dd 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,7 @@ "prettier": "^1.14.2", "prop-types": "^15.6.2", "qrcode.react": "^0.8.0", - "react": "^16.6.1", + "react": "^16.6.3", "react-chartjs-2": "^2.7.2", "react-color": "^2.14.1", "react-copy-to-clipboard": "^5.0.1", diff --git a/yarn.lock b/yarn.lock index d8ac267b..5f5184b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10370,15 +10370,15 @@ react-windowed-list@^2.0.0: raf "^3.3.2" remeasure "^3.0.1" -react@^16.6.1: - version "16.6.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.6.1.tgz#ee2aef4f0a09e494594882029821049772f915fe" - integrity sha512-OtawJThYlvRgm9BXK+xTL7BIlDx8vv21j+fbQDjRRUyok6y7NyjlweGorielTahLZHYIdKUoK2Dp9ByVWuMqxw== +react@^16.6.3: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c" + integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.11.0" + scheduler "^0.11.2" reactcss@^1.2.0: version "1.2.3" @@ -11155,10 +11155,10 @@ sax@>=0.6.0, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.0.tgz#def1f1bfa6550cc57981a87106e65e8aea41a6b5" - integrity sha512-MAYbBfmiEHxF0W+c4CxMpEqMYK+rYF584VP/qMKSiHM6lTkBKKYOJaDiSILpJHla6hBOsVd6GucPL46o2Uq3sg== +scheduler@^0.11.2: + version "0.11.3" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" + integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" From 9cee2384c5920a1d59021e4d83d94d87b94a3bc2 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Fri, 7 Dec 2018 11:43:50 +0100 Subject: [PATCH 04/61] Upgrade electron-localshort version for potential keybind fix --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c677a19b..e496a232 100644 --- a/package.json +++ b/package.json @@ -126,7 +126,7 @@ ] }, "dependencies": { - "electron-localshortcut": "^2.0.2", + "electron-localshortcut": "^3.1.0", "electron-log": "^2.2.9", "electron-settings": "^3.1.3", "fs-jetpack": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index d8ac267b..0e428b89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4052,13 +4052,15 @@ electron-is-accelerator@^0.1.0: resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" integrity sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns= -electron-localshortcut@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-2.0.2.tgz#6a1adcd6514c957328ec7912f5ccb5e1c10706db" - integrity sha512-PVPhNwQ7hOPRqGZuK0YTzjAu2gzPOPCDPDU7kzXuuFtNNNAdOdpaXe8XTJW7LOw9JdmT/akrzdGitZ+6xOSnIw== +electron-localshortcut@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz#10c1ffd537b8d39170aaf6e1551341f7780dd2ce" + integrity sha512-MgL/j5jdjW7iA0R6cI7S045B0GlKXWM1FjjujVPjlrmyXRa6yH0bGSaIAfxXAF9tpJm3pLEiQzerYHkRh9JG/A== dependencies: debug "^2.6.8" electron-is-accelerator "^0.1.0" + keyboardevent-from-electron-accelerator "^1.1.0" + keyboardevents-areequal "^0.2.1" electron-log@^2.2.9: version "2.2.14" @@ -7529,6 +7531,16 @@ kdbush@^2.0.1: resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-2.0.1.tgz#90c6128e3001ac68c550d7c9e2f222c0269666f1" integrity sha512-9KqSdmWCkBIisFIGclT0FRagKhI7IVbMyUjsxCFG0Ly1Dg6whlxJ7b9lrq8ifk3X/fGeJzok1R75LQfZTfA5zQ== +keyboardevent-from-electron-accelerator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz#324614f6e33490c37ffc5be5876b3e85fe223c84" + integrity sha512-VDC4vKWGrR3VgIKCE4CsXnvObGgP8C2idnTKEMUkuEuvDGE1GEBX9FtNdJzrD00iQlhI3xFxRaeItsUmlERVng== + +keyboardevents-areequal@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" + integrity sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw== + keycode@^2.1.9, keycode@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" From 429b611b710b9b19b10aec7b8ce510439a2848df Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Fri, 7 Dec 2018 20:30:47 +0100 Subject: [PATCH 05/61] Upgrade gulp and set background (fixes #452) (fixes #454) --- gulpfile.js | 1 - package.json | 17 +-- .../AttachmentImage/LazyAttachmentImage.jsx | 12 +- src/react/Components/Layout.jsx | 12 +- src/scss/partials/base.scss | 1 - tasks/build_app.js | 54 ++++---- tasks/build_tests.js | 59 -------- tasks/bundle.js | 130 +++++++++++------- tasks/start.js | 22 +-- 9 files changed, 152 insertions(+), 156 deletions(-) delete mode 100644 tasks/build_tests.js diff --git a/gulpfile.js b/gulpfile.js index 6ef82a6a..3e3b70b4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,3 +1,2 @@ require('./tasks/build_app'); -require('./tasks/build_tests'); require('./tasks/start'); diff --git a/package.json b/package.json index e496a232..7fd775ce 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ }, "devDependencies": { "@babel/cli": "^7.0.0", - "@babel/core": "^7.0.0", + "@babel/core": "^7.2.0", "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-decorators": "^7.0.0", "@babel/plugin-proposal-do-expressions": "^7.0.0", @@ -160,7 +160,7 @@ "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@bunq-community/bunq-js-client": "^0.33.0", + "@bunq-community/bunq-js-client": "^0.35.2", "@bunq-community/bunqdesktop-templates": "^1.2.0", "@fortawesome/fontawesome-free": "^5.2.0", "@material-ui/core": "^3.5.1", @@ -174,7 +174,6 @@ "animate.css": "^3.6.1", "awaiting": "^2.0.1", "axios": "^0.18.0", - "babel-core": "^7.0.0-bridge.0", "babel-loader": "^8.0.0", "babel-plugin-dynamic-import-node": "^2.0.0", "babel-plugin-react-html-attrs": "^2.1.0", @@ -193,17 +192,15 @@ "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", "file-loader": "^2.0.0", - "gulp": "^3.9.1", + "gulp": "^4.0.0", "gulp-batch": "^1.0.5", - "gulp-less": "^3.5.0", - "gulp-plumber": "^1.2.0", "gulp-util": "^3.0.8", - "gulp-watch": "^5.0.0", + "gulp-watch": "^5.0.1", "hard-source-webpack-plugin": "^0.12.0", "html-webpack-plugin": "^3.2.0", "iban": "^0.0.10", "increase-memory-limit": "^1.0.6", - "jest": "^23.2.0", + "jest": "^23.6.0", "libphonenumber-js": "^1.6.4", "localforage": "^1.7.2", "loglevel": "^1.6.1", @@ -211,7 +208,7 @@ "mini-css-extract-plugin": "^0.4.0", "minimist": "^1.2.0", "mocha": "^5.2.0", - "natives": "^1.1.4", + "natives": "1.1.6", "node-forge": "^0.7.5", "node-sass": "^4.9.0", "prettier": "^1.14.2", @@ -234,7 +231,7 @@ "react-spring": "^3.1.0", "react-sticky-box": "^0.6.1", "react-test-renderer": "^16.3.1", - "react-visibility-sensor": "^3.11.0", + "react-visibility-sensor": "^5.0.2", "react-windowed-list": "^2.0.0", "redux": "^3.7.2", "redux-form": "^7.4.2", diff --git a/src/react/Components/AttachmentImage/LazyAttachmentImage.jsx b/src/react/Components/AttachmentImage/LazyAttachmentImage.jsx index 67403154..46ed878d 100644 --- a/src/react/Components/AttachmentImage/LazyAttachmentImage.jsx +++ b/src/react/Components/AttachmentImage/LazyAttachmentImage.jsx @@ -11,15 +11,21 @@ class LazyAttachmentImage extends React.PureComponent { } onVisibilityChange = visible => { - this.setState({ visible: visible }); + if (!this.state.visible) { + this.setState({ visible: visible }); + } }; render() { return ( - + {state => { // if currently visible or previously visible render the image - return state.isVisible || this.state.visible ? :
; + return state.isVisible || this.state.visible ? ( + + ) : ( +
+ ); }} ); diff --git a/src/react/Components/Layout.jsx b/src/react/Components/Layout.jsx index e75c8eee..afea6554 100644 --- a/src/react/Components/Layout.jsx +++ b/src/react/Components/Layout.jsx @@ -143,6 +143,16 @@ class Layout extends React.Component { // make sure language is up-to-date this.checkLanguageChange(nextProps); + if (nextProps.theme === "DefaultTheme") { + if (document.documentElement.style.backgroundColor !== "#ffffff") { + document.documentElement.style.backgroundColor = "#ffffff"; + } + } else { + if (document.documentElement.style.backgroundColor !== "#303030") { + document.documentElement.style.backgroundColor = "#303030"; + } + } + if (nextProps.apiKey !== this.props.apiKey || nextProps.environment !== this.props.environment) { if (this.props.apiKey !== false) { // clear our old data associated with the previous session @@ -343,7 +353,7 @@ const mapDispatchToProps = (dispatch, ownProps) => { // functions to clear user data registrationClearUserInfo: () => dispatch(registrationClearUserInfo()), - registrationLoadBunqDesktopClient: () => dispatch(registrationSetBunqDesktopClientData()), + registrationLoadBunqDesktopClient: () => dispatch(registrationSetBunqDesktopClientData()) }; }; diff --git a/src/scss/partials/base.scss b/src/scss/partials/base.scss index cafd3710..be82b04b 100644 --- a/src/scss/partials/base.scss +++ b/src/scss/partials/base.scss @@ -11,7 +11,6 @@ body { min-height: 100%; width: 100%; display: flex; - background-color: rgb(48, 48, 48); } input, diff --git a/tasks/build_app.js b/tasks/build_app.js index 4f940e4c..5e3dc538 100644 --- a/tasks/build_app.js +++ b/tasks/build_app.js @@ -1,8 +1,6 @@ const gulp = require("gulp"); -const less = require("gulp-less"); -const watch = require("gulp-watch"); -const batch = require("gulp-batch"); -const plumber = require("gulp-plumber"); +const gulpWatch = require("gulp-watch"); +const gulpBatch = require("gulp-batch"); const jetpack = require("fs-jetpack"); const bundle = require("./bundle"); const utils = require("./utils"); @@ -18,27 +16,35 @@ gulp.task("bundle", () => { ]); }); -gulp.task("environment", () => { - const configFile = `config/env_${utils.getEnvName()}.json`; - projectDir.copy(configFile, destDir.path("env.json"), { overwrite: true }); -}); +gulp.task( + "environment", + gulp.series(done => { + const configFile = `config/env_${utils.getEnvName()}.json`; + projectDir.copy(configFile, destDir.path("env.json"), { overwrite: true }); + done(); + }) +); -gulp.task("watch", () => { - const beepOnError = done => { - return err => { - if (err) { - utils.beepSound(); - } - done(err); +gulp.task( + "watch", + gulp.series(done => { + const beepOnError = done => { + return err => { + if (err) { + utils.beepSound(); + } + done(err); + }; }; - }; - watch( - "src/**/*.js", - batch((events, done) => { - gulp.start("bundle", beepOnError(done)); - }) - ); -}); + gulpWatch( + "src/**/*.js", + gulpBatch((events, done) => { + gulp.start("bundle", beepOnError(done)); + }) + ); + done(); + }) +); -gulp.task("build", ["bundle", "environment"]); +gulp.task("build", gulp.series("bundle", "environment")); diff --git a/tasks/build_tests.js b/tasks/build_tests.js deleted file mode 100644 index 4e1d7e06..00000000 --- a/tasks/build_tests.js +++ /dev/null @@ -1,59 +0,0 @@ -const gulp = require("gulp"); -const jetpack = require("fs-jetpack"); -const bundle = require("./bundle"); -const istanbul = require("rollup-plugin-istanbul"); - -// Spec files are scattered through the whole project. Here we're searching -// for them and generate one entry file which will run all the tests. -const generateEntryFile = (dir, destFileName, filePattern) => { - const fileBanner = - "// This file is generated automatically.\n" + - "// All modifications will be lost.\n"; - - return dir - .findAsync(".", { matching: filePattern }) - .then(specPaths => { - const fileContent = specPaths - .map(path => { - return `import './${path.replace(/\\/g, "/")}';`; - }) - .join("\n"); - return dir.writeAsync(destFileName, fileBanner + fileContent); - }) - .then(() => { - return dir.path(destFileName); - }); -}; - -gulp.task("build-unit", ["environment"], () => { - const srcDir = jetpack.cwd("src"); - const destDir = jetpack.cwd("app"); - - return generateEntryFile( - srcDir, - "specs.js.autogenerated", - "*.spec.js" - ).then(entryFilePath => { - return bundle(entryFilePath, destDir.path("specs.js.autogenerated"), { - rollupPlugins: [ - istanbul({ - exclude: ["**/*.spec.js", "**/specs.js.autogenerated"], - sourceMap: true - }) - ] - }); - }); -}); - -gulp.task("build-e2e", ["build"], () => { - const srcDir = jetpack.cwd("e2e"); - const destDir = jetpack.cwd("app"); - - return generateEntryFile( - srcDir, - "e2e.js.autogenerated", - "*.e2e.js" - ).then(entryFilePath => { - return bundle(entryFilePath, destDir.path("e2e.js.autogenerated")); - }); -}); diff --git a/tasks/bundle.js b/tasks/bundle.js index aacc2415..e24b47a5 100644 --- a/tasks/bundle.js +++ b/tasks/bundle.js @@ -1,60 +1,92 @@ -const path = require('path'); -const jetpack = require('fs-jetpack'); -const rollup = require('rollup').rollup; +const path = require("path"); +const jetpack = require("fs-jetpack"); +const rollup = require("rollup").rollup; -const nodeBuiltInModules = ['assert', 'buffer', 'child_process', 'cluster', - 'console', 'constants', 'crypto', 'dgram', 'dns', 'domain', 'events', - 'fs', 'http', 'https', 'module', 'net', 'os', 'path', 'process', 'punycode', - 'querystring', 'readline', 'repl', 'stream', 'string_decoder', 'timers', - 'tls', 'tty', 'url', 'util', 'v8', 'vm', 'zlib']; +const nodeBuiltInModules = [ + "assert", + "buffer", + "child_process", + "cluster", + "console", + "constants", + "crypto", + "dgram", + "dns", + "domain", + "events", + "fs", + "http", + "https", + "module", + "net", + "os", + "path", + "process", + "punycode", + "querystring", + "readline", + "repl", + "stream", + "string_decoder", + "timers", + "tls", + "tty", + "url", + "util", + "v8", + "vm", + "zlib" +]; -const electronBuiltInModules = ['electron']; +const electronBuiltInModules = ["electron"]; const generateExternalModulesList = () => { - const appManifest = jetpack.read('./package.json', 'json'); - return [].concat( - nodeBuiltInModules, - electronBuiltInModules, - Object.keys(appManifest.dependencies), - Object.keys(appManifest.devDependencies) - ); + const appManifest = jetpack.read("./package.json", "json"); + return [].concat( + nodeBuiltInModules, + electronBuiltInModules, + Object.keys(appManifest.dependencies), + Object.keys(appManifest.devDependencies) + ); }; const cached = {}; module.exports = (src, dest, opts) => { - const options = opts || {}; - - const plugins = [ - // Add rollup plugins here - ]; - - return rollup({ - entry: src, - external: generateExternalModulesList(), - cache: cached[src], - plugins: plugins.concat(options.rollupPlugins || []), - }) - .then((bundle) => { - cached[src] = bundle; - - const jsFile = path.basename(dest); - return bundle.generate({ - format: 'cjs', - sourceMap: true, - sourceMapFile: jsFile, - }).then(result => { - // Wrap code in self invoking function so the constiables don't - // pollute the global namespace. - const isolatedCode = `(function () {${result.code}\n}());`; - return Promise.all([ - jetpack.writeAsync(dest, `${isolatedCode}\n//# sourceMappingURL=${jsFile}.map`), - jetpack.writeAsync(`${dest}.map`, result.map.toString()), - ]); + const options = opts || {}; + + const plugins = [ + // Add rollup plugins here + ]; + + return rollup({ + entry: src, + external: generateExternalModulesList(), + cache: cached[src], + plugins: plugins.concat(options.rollupPlugins || []) }) - }) - .catch(e => { - console.error(e); - throw e; - }); + .then(bundle => { + cached[src] = bundle; + + const jsFile = path.basename(dest); + return bundle + .generate({ + format: "cjs", + sourceMap: true, + sourceMapFile: jsFile + }) + .then(result => { + // Wrap code in self invoking function so the constiables don't + // pollute the global namespace. + const isolatedCode = `(function () {${result.code}\n}());`; + return Promise.all([ + jetpack.writeAsync(dest, `${isolatedCode}\n//# sourceMappingURL=${jsFile}.map`), + jetpack.writeAsync(`${dest}.map`, result.map.toString()) + ]); + }); + }) + .catch(e => { + console.error(e); + throw e; + }); }; diff --git a/tasks/start.js b/tasks/start.js index c01a0c63..12feba10 100644 --- a/tasks/start.js +++ b/tasks/start.js @@ -2,11 +2,17 @@ const childProcess = require("child_process"); const electron = require("electron"); const gulp = require("gulp"); -gulp.task("start", ["build", "watch"], () => { - childProcess - .spawn(electron, ["."], { stdio: "inherit" }) - .on("close", () => { - // User closed the app. Kill the host process. - process.exit(); - }); -}); +gulp.task( + "start", + gulp.series( + "build", + gulp.parallel("watch", () => { + return new Promise(resolve => { + childProcess.spawn(electron, ["."], { stdio: "inherit" }).on("close", () => { + // User closed the app. Kill the host process. + process.exit(); + }); + }); + }) + ) +); From f1dc79801ccbc029e8d2fd2286397e3204e1d7d7 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Mon, 10 Dec 2018 18:41:57 +0100 Subject: [PATCH 06/61] Add badges to contact section --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b2a0431d..b40d1fa7 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,8 @@ $ yarn start:dev ``` ## Contact +[![Together topic badge](https://img.shields.io/badge/Together-Discuss-orange.svg) ](https://together.bunq.com/d/6180-bunq-cli-a-new-unofficial-command-line-tool-for-the-bunq-api/11) [![Telegram chat badge](https://img.shields.io/badge/Telegram-Discuss-blue.svg) ](https://t.me/bunqcommunity) [![Telegram chat badge](https://img.shields.io/badge/Telegram-Announcements-blue.svg) ](https://t.me/bunqdesktop) + We have a public [Telegram chat group ](https://t.me/bunqcommunity) and a topic on [bunq together](https://together.bunq.com/d/5763-bunqdesktop-the-unofficial-free-and-open-source-desktop-application-for-bunq/). If you just want a notification when a new version is released you can also join the [Telegram updates channel](https://t.me/bunqdesktop). From bfc1866b8b13fbc4d543ebb8eb911dcf04cd548a Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 11 Dec 2018 19:07:42 +0100 Subject: [PATCH 07/61] Overwrite branch with new setup --- package.json | 1 + src/react/Components/AccountCard.jsx | 26 +- .../Components/FileUpload/FileDropZone.jsx | 102 + .../FileUpload/UploadFullscreen.jsx | 135 ++ yarn.lock | 2047 +++++++---------- 5 files changed, 1060 insertions(+), 1251 deletions(-) create mode 100644 src/react/Components/FileUpload/FileDropZone.jsx create mode 100644 src/react/Components/FileUpload/UploadFullscreen.jsx diff --git a/package.json b/package.json index 9795190f..8121b6f5 100644 --- a/package.json +++ b/package.json @@ -219,6 +219,7 @@ "react-color": "^2.14.1", "react-copy-to-clipboard": "^5.0.1", "react-dom": "^16.4.1", + "react-dropzone": "^8.0.0", "react-helmet": "^5.2.0", "react-i18next": "^7.7.0", "react-json-view": "^1.17.1", diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index 510150a9..21dc5702 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -19,7 +19,7 @@ import UrlIcon from "@material-ui/icons/Link"; import LinkIcon from "@material-ui/icons/Link"; import PeopleIcon from "@material-ui/icons/People"; -import AccountAvatarCircularProgress from "./AccountList/AccountAvatarCircularProgress"; +import UploadFullscreen from "./FileUpload/UploadFullscreen"; import LazyAttachmentImage from "./AttachmentImage/LazyAttachmentImage"; import AccountQRFullscreen from "./QR/AccountQRFullscreen"; @@ -42,7 +42,10 @@ const styles = { class AccountCard extends React.Component { constructor(props, context) { super(props, context); - this.state = {}; + + this.state = { + displayUploadScreen: false + }; } copiedValue = type => callback => { @@ -77,10 +80,25 @@ class AccountCard extends React.Component { return ( + + this.setState({ + displayUploadScreen: false + }) + } + /> - - + + this.setState({ + displayUploadScreen: true + }) + } + > ({ + dropZone: { + width: "100%", + height: "100%", + display: "flex", + alignItems: "center", + justifyContent: "center", + + // border styling + borderWidth: 2, + borderColor: "rgb(102, 102, 102)", + borderStyle: "dashed", + borderRadius: 5 + }, + fileUploadIcon: { + width: "100%", + height: "100%" + }, + imagePreview: { + width: "auto", + maxWidth: contentSize, + height: "auto", + maxHeight: contentSize + } +}); + +class FileDropZone extends React.PureComponent { + constructor(props, context) { + super(props, context); + this.state = { + imagePreviewUrl: false + }; + } + + handleFileDrop = (allowedFiles, blockedFiles) => { + const reader = new FileReader(); + const file = allowedFiles[0]; + + if (!file) return; + + reader.onloadend = () => { + this.props.onChange(file); + this.setState({ + imagePreviewUrl: reader.result + }); + }; + + reader.readAsDataURL(file); + }; + + render() { + const { classes, customClasses } = this.props; + const finalClasses = { ...classes, ...customClasses }; + return ( + + {({ getRootProps, getInputProps, isDragActive }) => { + return ( +
+ + {this.state.imagePreviewUrl ? ( + + ) : ( + + )} +
+ ); + }} +
+ ); + } +} + +FileDropZone.defaultProps = { + dropZoneStyle: {}, + imagePreviewStyle: {}, + imageUploadIconStyle: {} +}; + +FileDropZone.propTypes = { + onChange: PropTypes.func.isRequired, + dropZoneStyle: PropTypes.object, + imagePreviewStyle: PropTypes.object, + imageUploadIconStyle: PropTypes.object +}; + +export default withStyles(styles)(FileDropZone); diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx new file mode 100644 index 00000000..d8591030 --- /dev/null +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -0,0 +1,135 @@ +import React from "react"; +import { translate } from "react-i18next"; +import { withStyles } from "@material-ui/core/styles"; +import Dialog from "@material-ui/core/Dialog"; +import Button from "@material-ui/core/Button"; +import Typography from "@material-ui/core/Typography"; +import Slide from "@material-ui/core/Slide"; +import FileDropZone from "./FileDropZone"; + +import FileReaderHelper from "@bunq-community/bunq-js-client/dist/Helpers/FileReaderHelper"; + +const Transition = props => ; + +const contentSize = 320; + +const styles = theme => ({ + dialog: { + marginTop: 50 + }, + header: { + textAlign: "center" + }, + content: { + height: "100%", + display: "flex", + alignItems: "center", + justifyContent: "center" + }, + contentWrapper: { + width: contentSize, + minHeight: contentSize + }, + uploadButton: { + width: "100%" + } +}); + +class UploadFullscreen extends React.PureComponent { + constructor(props, context) { + super(props, context); + this.state = { + file: false + }; + } + + onFileChange = file => this.setState({ file }); + + getFileInfo = async () => { + console.log("start"); + const fileReader = new FileReader(); + + console.log("readAsArrayBuffer"); + // start loading the file as binary + fileReader.readAsArrayBuffer(this.state.file); + + console.log("wait"); + // wrap the filereader callback in a promise + const fileArrayBuffer = await new Promise(resolve => { + console.log("waiting"); + // resolve the output onload + fileReader.onload = () => { + console.log("loaded"); + console.log(this.state.file); + console.log(fileReader); + + resolve(fileReader.result); + }; + }); + + console.log("from arraybuffer"); + const fileBuffer = Buffer.from(fileArrayBuffer); + + return { + contents: fileBuffer + }; + }; + + startUpload = () => { + console.log("dang"); + this.getFileInfo() + .then(result => { + console.log("result", result); + }) + .catch(console.error); + + // this.props.BunqJSClient.api.attachmentPublic + // .post(this.state.file) + // .then(console.log) + // .catch(console.error); + }; + + render() { + const { classes, t } = this.props; + return ( + { + console.log("close", close); + this.props.handleRequestClose(close); + }} + TransitionComponent={Transition} + > +
+
+ + {t(this.props.headlineText)} + + +
+ {this.state.file !== false ? ( + + ) : null} +
+
+
+ ); + } +} + +UploadFullscreen.defaultProps = { + headlineText: "Upload a new avatar", + buttonText: "Upload" +}; + +export default withStyles(styles)(translate("translations")(UploadFullscreen)); diff --git a/yarn.lock b/yarn.lock index d579683c..2bd198e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,21 +38,21 @@ dependencies: "@babel/highlight" "7.0.0-beta.46" -"@babel/core@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0.tgz#0cb0c0fd2e78a0a2bec97698f549ae9ce0b99515" - integrity sha512-nrvxS5u6QUN5gLl1GEakIcmOeoUHT1/gQtdMRq18WFURJ5osn4ppJLVSseMQo4zVWKJfBTF4muIYijXUnKlRLQ== +"@babel/core@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.0.tgz#a4dd3814901998e93340f0086e9867fefa163ada" + integrity sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/helpers" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/generator" "^7.2.0" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.0" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.2.0" convert-source-map "^1.1.0" - debug "^3.1.0" - json5 "^0.5.0" + debug "^4.1.0" + json5 "^2.1.0" lodash "^4.17.10" resolve "^1.3.2" semver "^5.4.1" @@ -69,6 +69,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.1.6", "@babel/generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c" + integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg== + dependencies: + "@babel/types" "^7.2.0" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -127,6 +138,15 @@ "@babel/template" "^7.0.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -232,14 +252,14 @@ "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" -"@babel/helpers@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0.tgz#7213388341eeb07417f44710fd7e1d00acfa6ac0" - integrity sha512-jbvgR8iLZPnyk6m/UqdXYsSxbVtRi7Pd3CzB4OPwPBnmhNG1DWjiiy777NTuoyIcniszK51R40L5pgfXAfHDtw== +"@babel/helpers@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" + integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== dependencies: - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.2.0" "@babel/highlight@7.0.0-beta.46": version "7.0.0-beta.46" @@ -264,6 +284,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0.tgz#697655183394facffb063437ddf52c0277698775" integrity sha512-RgJhNdRinpO8zibnoHbzTTexNs4c8ROkXFBanNDZTLHjwbdLk8J5cJSKulx/bycWTLYmKVNCkxRtVCoJnqPk+g== +"@babel/parser@^7.1.2", "@babel/parser@^7.1.6", "@babel/parser@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.0.tgz#02d01dbc330b6cbf36b76ac93c50752c69027065" + integrity sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg== + "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0.tgz#5d1eb6b44fd388b97f964350007ab9da090b1d70" @@ -916,6 +941,15 @@ "@babel/parser" "^7.0.0" "@babel/types" "^7.0.0" +"@babel/template@^7.1.0", "@babel/template@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + "@babel/traverse@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0.tgz#b1fe9b6567fdf3ab542cfad6f3b31f854d799a61" @@ -931,6 +965,21 @@ globals "^11.1.0" lodash "^4.17.10" +"@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c" + integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.6" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.6" + "@babel/types" "^7.1.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + "@babel/types@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" @@ -940,46 +989,26 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@bunq-community/bunq-js-client@^0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.33.0.tgz#441953518c0258496c40ff53055c7a2387120909" - integrity sha512-znXBcook3PRopwtnmU8Y2lYyaLI3JOvAbwD3fv8bC2C4rQyL6BFxNLNVvyGVgqZ4iu5AbGKQ7iuvgLP7I5qUzQ== - dependencies: - "@babel/cli" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-decorators" "^7.0.0" - "@babel/plugin-proposal-do-expressions" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-export-namespace-from" "^7.0.0" - "@babel/plugin-proposal-function-bind" "^7.0.0" - "@babel/plugin-proposal-function-sent" "^7.0.0" - "@babel/plugin-proposal-json-strings" "^7.0.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-proposal-pipeline-operator" "^7.0.0" - "@babel/plugin-proposal-throw-expressions" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-import-meta" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@types/jest" "^21.1.8" - "@types/moxios" "^0.4.8" - "@types/node" "^8.0.34" +"@babel/types@^7.1.2", "@babel/types@^7.1.6", "@babel/types@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.0.tgz#7941c5b2d8060e06f9601d6be7c223eef906d5d8" + integrity sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@bunq-community/bunq-js-client@^0.35.2": + version "0.35.4" + resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.35.4.tgz#99a397fd82822394da5b3d95e5800388cdd478e2" + integrity sha512-KeB/tTFHyBLQSqMwOaaCQm92t5mwgpqd6JhEAz723QxiVwSEJ71ltTsPVCnW47fbHOCPjfXPG3xHWlgm6K30ug== + dependencies: awaiting "^3.0.0" axios "^0.16.2" - babel-core "^7.0.0-bridge.0" es6-promise-promise "^1.0.0" - jest "^21.2.1" loglevel "^1.4.1" - moxios "^0.4.0" node-forge "^0.7.1" - node-json-db "^0.7.3" store "^2.0.12" - ts-jest "^23.1.4" typescript "^2.5.3" "@bunq-community/bunqdesktop-templates@^1.2.0": @@ -1110,11 +1139,6 @@ resolved "https://registry.yarnpkg.com/@types/i18next/-/i18next-8.4.3.tgz#9136a9551bf5bf7169aa9f3125c1743f1f8dd6de" integrity sha512-ayqHEU+i9H7/Fkefnhyvml1ChKEZXcDwmVqo3jmrxy7PoAtTSY1t4/hr58Xz8hkXLPoCGS1hTc6bLJOUaOAjfQ== -"@types/jest@^21.1.8": - version "21.1.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-21.1.10.tgz#dcacb5217ddf997a090cc822bba219b4b2fd7984" - integrity sha512-qDyqzbcyNgW2RgWbl606xCYQ+5fK9khOW5+Hl3wH7RggVES0dB6GcZvpmPs/XIty5qpu1xYCwpiK+iRkJ3xFBw== - "@types/jest@^22.1.3": version "22.2.3" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" @@ -1145,11 +1169,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.14.tgz#a24767cfa22023f1bf7e751c0ead56a14c07ed45" integrity sha512-TKQqQIaYNO+8MrOsFgobkt3fbMzkfXhBFKcg20Nip5Omptw1HOY/IEvYiFtMwIbr7Me/Y2H/JO+TgNUMJ9NGjA== -"@types/node@^8.0.34": - version "8.10.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac" - integrity sha512-M7x8+5D1k/CuA6jhiwuSCmE8sbUWJF0wYsjcig9WrXvwUI5ArEoUBdOXpV4JcEMrLp02/QbDjw+kI+vQeKyQgg== - "@types/node@^9.4.6": version "9.6.15" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.15.tgz#8a5a313ea0a43a95277235841be5d3f5fb3dfeda" @@ -1336,7 +1355,7 @@ JSV@^4.0.x: resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" integrity sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c= -abab@^1.0.3, abab@^1.0.4: +abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= @@ -1359,26 +1378,6 @@ accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" -accord@^0.28.0: - version "0.28.0" - resolved "https://registry.yarnpkg.com/accord/-/accord-0.28.0.tgz#bec516a2f722e7d50f5f9f42f81b77f3b95448ba" - integrity sha512-sPF34gqHegaCSryKf5wHJ8wREK1dTZnHmC9hsB7D8xjntRdd30DXDPKf0YVIcSvnXJmcYu5SCvZRz28H++kFhQ== - dependencies: - convert-source-map "^1.5.0" - glob "^7.0.5" - indx "^0.2.3" - lodash.clone "^4.3.2" - lodash.defaults "^4.0.1" - lodash.flatten "^4.2.0" - lodash.merge "^4.4.0" - lodash.partialright "^4.1.4" - lodash.pick "^4.2.1" - lodash.uniq "^4.3.0" - resolve "^1.5.0" - semver "^5.3.0" - uglify-js "^2.8.22" - when "^3.7.8" - acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" @@ -1386,13 +1385,6 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= - dependencies: - acorn "^4.0.4" - acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" @@ -1400,11 +1392,6 @@ acorn-globals@^4.1.0: dependencies: acorn "^5.0.0" -acorn@^4.0.4: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - acorn@^5.0.0, acorn@^5.3.0: version "5.5.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" @@ -1425,14 +1412,6 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.2.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -1494,12 +1473,12 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= +ansi-colors@1.1.0, ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== dependencies: - ansi-wrap "0.1.0" + ansi-wrap "^0.1.0" ansi-escapes@^3.0.0: version "3.1.0" @@ -1513,13 +1492,6 @@ ansi-gray@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1547,7 +1519,7 @@ ansi-styles@~1.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= -ansi-wrap@0.1.0: +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= @@ -1638,6 +1610,13 @@ app-builder-lib@~20.33.2: semver "^5.6.0" temp-file "^3.2.0" +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -1696,14 +1675,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -1716,15 +1687,24 @@ arr-diff@^4.0.0: resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" arr-union@^3.1.0: version "3.1.0" @@ -1736,7 +1716,7 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= -array-each@^1.0.1: +array-each@^1.0.0, array-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= @@ -1756,16 +1736,35 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" array-slice@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + array-uniq@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1842,6 +1841,16 @@ async-done@^1.0.0: process-nextick-args "^1.0.7" stream-exhaust "^1.0.1" +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.1.tgz#14b7b73667b864c8f02b5b253fc9c6eddb777f3e" + integrity sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^1.0.7" + stream-exhaust "^1.0.1" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -1862,6 +1871,13 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= + dependencies: + async-done "^1.2.2" + async@1.x, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1884,6 +1900,13 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" integrity sha1-ri1acpR38onWDdf5amMUoi3Wwio= +attr-accept@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-1.1.3.tgz#48230c79f93790ef2775fcec4f0db0f5db41ca52" + integrity sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ== + dependencies: + core-js "^2.5.0" + autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" @@ -1971,11 +1994,6 @@ babel-core@^6.0.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -1998,18 +2016,10 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" - integrity sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ== - dependencies: - babel-plugin-istanbul "^4.0.0" - babel-preset-jest "^21.2.0" - -babel-jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.2.0.tgz#14a9d6a3f4122dfea6069d37085adf26a53a4dba" - integrity sha1-FKnWo/QSLf6mBp03CFrfJqU6Tbo= +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== dependencies: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.2.0" @@ -2039,7 +2049,7 @@ babel-plugin-dynamic-import-node@^2.0.0: babel-plugin-syntax-dynamic-import "^6.18.0" object.assign "^4.1.0" -babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.6: +babel-plugin-istanbul@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== @@ -2049,11 +2059,6 @@ babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.6: istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" -babel-plugin-jest-hoist@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" - integrity sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ== - babel-plugin-jest-hoist@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" @@ -2081,14 +2086,6 @@ babel-plugin-system-import-transformer@^3.1.0: dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" -babel-preset-jest@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" - integrity sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA== - dependencies: - babel-plugin-jest-hoist "^21.2.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - babel-preset-jest@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" @@ -2129,7 +2126,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -2144,7 +2141,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -2159,6 +2156,21 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -2320,7 +2332,7 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== @@ -2378,13 +2390,6 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-resolve@^1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - integrity sha1-j/CbCixCFxihBRwmCzLkj0QpOM4= - dependencies: - resolve "1.1.7" - browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" @@ -2515,6 +2520,11 @@ buffer-equal@0.0.1: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + buffer-fill@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-0.1.1.tgz#76d825c4d6e50e06b7a31eb520c04d08cc235071" @@ -2990,11 +3000,6 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= - clone@^1.0.0, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -3041,6 +3046,15 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3172,7 +3186,7 @@ concat-stream@1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3216,11 +3230,6 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -3265,6 +3274,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + copy-to-clipboard@^3: version "3.0.8" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9" @@ -3338,15 +3355,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-class@^15.5.1: - version "15.6.3" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" - integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - object-assign "^4.1.1" - cross-env@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" @@ -3587,6 +3595,13 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + dependencies: + es5-ext "^0.10.9" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -3696,6 +3711,13 @@ deepmerge@~2.0.1: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" @@ -3703,12 +3725,10 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= define-properties@^1.1.2: version "1.1.2" @@ -3765,11 +3785,6 @@ depd@~1.1.1, depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= - des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -3978,6 +3993,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +each-props@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + earcut@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.3.tgz#ca579545f351941af7c3d0df49c9f7d34af99b0c" @@ -4168,13 +4191,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= - dependencies: - once "~1.3.0" - enhanced-resolve@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" @@ -4247,7 +4263,7 @@ enzyme@^3.3.0: raf "^3.4.0" rst-selector-parser "^2.2.3" -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== @@ -4281,11 +4297,29 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-iterator@^2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es6-promise-promise/-/es6-promise-promise-1.0.0.tgz#3a91f235fdd2b08c4492b5734dfd1f417289b994" @@ -4298,6 +4332,24 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4320,18 +4372,6 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.6.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" - integrity sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escodegen@^1.8.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" @@ -4511,29 +4551,17 @@ expect.js@~0.2.0: resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.2.0.tgz#1028533d2c1c363f74a6796ff57ec0520ded2be1" integrity sha1-EChTPSwcNj90pnlv9X7AUg3tK+E= -expect@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" - integrity sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw== +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== dependencies: ansi-styles "^3.2.0" - jest-diff "^21.2.1" - jest-get-type "^21.2.0" - jest-matcher-utils "^21.2.1" - jest-message-util "^21.2.1" - jest-regex-util "^21.2.0" - -expect@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.2.0.tgz#53a7e135e36fe27e75867b1178ff08aaacc2b0dd" - integrity sha1-U6fhNeNv4n51hnsReP8IqqzCsN0= - dependencies: - ansi-styles "^3.2.0" - jest-diff "^23.2.0" + jest-diff "^23.6.0" jest-get-type "^22.1.0" - jest-matcher-utils "^23.2.0" - jest-message-util "^23.2.0" - jest-regex-util "^23.0.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" express@^4.16.2: version "4.16.3" @@ -4571,13 +4599,6 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4667,7 +4688,7 @@ falafel@^2.1.0: isarray "0.0.1" object-keys "^1.0.6" -fancy-log@^1.1.0, fancy-log@^1.3.2: +fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E= @@ -4720,7 +4741,7 @@ fbemitter@^2.0.0: dependencies: fbjs "^0.8.4" -fbjs@^0.8.0, fbjs@^0.8.4, fbjs@^0.8.9: +fbjs@^0.8.0, fbjs@^0.8.4: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" integrity sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s= @@ -4838,11 +4859,6 @@ find-cache-dir@^2.0.0: make-dir "^1.0.0" pkg-dir "^3.0.0" -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4851,7 +4867,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -4886,11 +4902,6 @@ fined@^1.0.1: object.pick "^1.2.0" parse-filepath "^1.0.1" -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= - first-chunk-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" @@ -4908,7 +4919,7 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= -flush-write-stream@^1.0.0: +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== @@ -5066,6 +5077,14 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -5140,13 +5159,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= - dependencies: - globule "~0.1.0" - gaze@^1.0.0, gaze@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" @@ -5270,31 +5282,33 @@ glob-parent@^3.0.1, glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= dependencies: - gaze "^0.5.1" + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= +glob-watcher@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" + integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== dependencies: - find-index "^0.1.1" + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" @@ -5308,16 +5322,6 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -5340,15 +5344,6 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5400,15 +5395,6 @@ globule@^1.0.0: lodash "~4.17.4" minimatch "~3.0.2" -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - glogg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" @@ -5433,23 +5419,16 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg= - dependencies: - natives "^1.1.0" +graceful-fs@^4.0.0: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= - gray-matter@^3.0.8: version "3.1.1" resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-3.1.1.tgz#101f80d9e69eeca6765cdce437705b18f40876ac" @@ -5483,30 +5462,31 @@ gulp-batch@^1.0.5: async-done "^1.0.0" stream-array "^1.0.1" -gulp-less@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-3.5.0.tgz#8014f469ddfc6544d7dda50098def0371bbb4f78" - integrity sha512-FQLY7unaHdTOXG0jlwxeBQcWoPPrTMQZRA7HfYwSNi9IPVx5l7GJEN72mG4ri2yigp/f/VNGUAJnFMJHBmH3iw== - dependencies: - accord "^0.28.0" - less "2.6.x || ^2.7.1" - object-assign "^4.0.1" - plugin-error "^0.1.2" - replace-ext "^1.0.0" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-plumber@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.0.tgz#18ea03912c9ee483f8a5499973b5954cd90f6ad8" - integrity sha512-L/LJftsbKoHbVj6dN5pvMsyJn9jYI0wT0nMg3G6VZhDac4NesezecYTi8/48rHi+yEic3sUpw6jlSc7qNWh32A== +gulp-cli@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.0.1.tgz#7847e220cb3662f2be8a6d572bf14e17be5a994b" + integrity sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ== dependencies: - chalk "^1.1.3" + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" fancy-log "^1.3.2" - plugin-error "^0.1.2" - through2 "^2.0.3" + gulplog "^1.0.0" + interpret "^1.1.0" + isobject "^3.0.1" + liftoff "^2.5.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.0.1" + yargs "^7.1.0" -gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@^3.0.8: +gulp-util@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= @@ -5530,40 +5510,33 @@ gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@^3.0.8: through2 "^2.0.0" vinyl "^0.5.0" -gulp-watch@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp-watch/-/gulp-watch-5.0.0.tgz#6fb03ab1735972e0d2866475b568555836dfd0eb" - integrity sha512-q+HLppxXd11z9ndqql4Z0sd5xOAesJjycl0PRaq6ImK7b1BqBRL37YvxEE8ngUdIfpfHa0O9OCoovoggcFpCaQ== +gulp-watch@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gulp-watch/-/gulp-watch-5.0.1.tgz#83d378752f5bfb46da023e73c17ed1da7066215d" + integrity sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog== dependencies: + ansi-colors "1.1.0" anymatch "^1.3.0" chokidar "^2.0.0" + fancy-log "1.3.2" glob-parent "^3.0.1" - gulp-util "^3.0.7" object-assign "^4.1.0" path-is-absolute "^1.0.1" + plugin-error "1.0.1" readable-stream "^2.2.2" slash "^1.0.0" vinyl "^2.1.0" vinyl-file "^2.0.0" -gulp@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= +gulp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.0.tgz#95766c601dade4a77ed3e7b2b6dc03881b596366" + integrity sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y= dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" + glob-watcher "^5.0.0" + gulp-cli "^2.0.0" + undertaker "^1.0.0" + vinyl-fs "^3.0.0" gulplog@^1.0.0: version "1.0.0" @@ -5596,11 +5569,6 @@ handlebars@^4.0.1, handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -5616,14 +5584,6 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -5844,7 +5804,7 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" integrity sha1-ZouTd26q5V696POtRkswekljYl4= -html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: +html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== @@ -6022,11 +5982,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -6091,11 +6046,6 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -indx@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" - integrity sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA= - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6104,11 +6054,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= - inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -6163,7 +6108,7 @@ inquirer@~3.3.0: strip-ansi "^4.0.0" through "^2.3.6" -interpret@^1.0.0, interpret@^1.1.0: +interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= @@ -6410,6 +6355,11 @@ is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -6553,11 +6503,16 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" -is-utf8@^0.2.0: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6615,7 +6570,7 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^1.1.1, istanbul-api@^1.3.1: +istanbul-api@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" integrity sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g== @@ -6633,7 +6588,7 @@ istanbul-api@^1.1.1, istanbul-api@^1.3.1: mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: +istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" integrity sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A== @@ -6645,7 +6600,7 @@ istanbul-lib-hook@^1.2.0: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.4.2: +istanbul-lib-instrument@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" integrity sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ== @@ -6668,17 +6623,6 @@ istanbul-lib-report@^1.1.4: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" - integrity sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA== - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - istanbul-lib-source-maps@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" @@ -6717,59 +6661,17 @@ istanbul@^0.4.2: which "^1.1.1" wordwrap "^1.0.0" -jest-changed-files@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" - integrity sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ== +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" + integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== dependencies: throat "^4.0.0" -jest-changed-files@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.2.0.tgz#a145a6e4b66d0129fc7c99cee134dc937a643d9c" - integrity sha1-oUWm5LZtASn8fJnO4TTck3pkPZw= - dependencies: - throat "^4.0.0" - -jest-cli@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" - integrity sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - istanbul-api "^1.1.1" - istanbul-lib-coverage "^1.0.1" - istanbul-lib-instrument "^1.4.2" - istanbul-lib-source-maps "^1.1.0" - jest-changed-files "^21.2.0" - jest-config "^21.2.1" - jest-environment-jsdom "^21.2.1" - jest-haste-map "^21.2.0" - jest-message-util "^21.2.1" - jest-regex-util "^21.2.0" - jest-resolve-dependencies "^21.2.0" - jest-runner "^21.2.1" - jest-runtime "^21.2.1" - jest-snapshot "^21.2.1" - jest-util "^21.2.1" - micromatch "^2.3.11" - node-notifier "^5.0.2" - pify "^3.0.0" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - worker-farm "^1.3.1" - yargs "^9.0.0" - -jest-cli@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.2.0.tgz#3b543a3da5145dd8937931017282379fc696c45b" - integrity sha1-O1Q6PaUUXdiTeTEBcoI3n8aWxFs= +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -6782,22 +6684,22 @@ jest-cli@^23.2.0: istanbul-lib-coverage "^1.2.0" istanbul-lib-instrument "^1.10.1" istanbul-lib-source-maps "^1.2.4" - jest-changed-files "^23.2.0" - jest-config "^23.2.0" - jest-environment-jsdom "^23.2.0" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" jest-get-type "^22.1.0" - jest-haste-map "^23.2.0" - jest-message-util "^23.2.0" - jest-regex-util "^23.0.0" - jest-resolve-dependencies "^23.2.0" - jest-runner "^23.2.0" - jest-runtime "^23.2.0" - jest-snapshot "^23.2.0" - jest-util "^23.2.0" - jest-validate "^23.2.0" - jest-watcher "^23.2.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" jest-worker "^23.2.0" - micromatch "^3.1.10" + micromatch "^2.3.11" node-notifier "^5.2.1" prompts "^0.1.9" realpath-native "^1.0.0" @@ -6808,66 +6710,35 @@ jest-cli@^23.2.0: which "^1.2.12" yargs "^11.0.0" -jest-config@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" - integrity sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A== - dependencies: - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^21.2.1" - jest-environment-node "^21.2.1" - jest-get-type "^21.2.0" - jest-jasmine2 "^21.2.1" - jest-regex-util "^21.2.0" - jest-resolve "^21.2.0" - jest-util "^21.2.1" - jest-validate "^21.2.1" - pretty-format "^21.2.1" - -jest-config@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.2.0.tgz#d2fb556fd5a2a19c39eb56d139dcca5dad2a1c88" - integrity sha1-0vtVb9WioZw561bROdzKXa0qHIg= +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== dependencies: babel-core "^6.0.0" - babel-jest "^23.2.0" + babel-jest "^23.6.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^23.2.0" - jest-environment-node "^23.2.0" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" jest-get-type "^22.1.0" - jest-jasmine2 "^23.2.0" - jest-regex-util "^23.0.0" - jest-resolve "^23.2.0" - jest-util "^23.2.0" - jest-validate "^23.2.0" - pretty-format "^23.2.0" - -jest-diff@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" - integrity sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA== - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^21.2.0" - pretty-format "^21.2.1" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" -jest-diff@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.2.0.tgz#9f2cf4b51e12c791550200abc16b47130af1062a" - integrity sha1-nyz0tR4Sx5FVAgCrwWtHEwrxBio= +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^22.1.0" - pretty-format "^23.2.0" - -jest-docblock@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" - integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== + pretty-format "^23.6.0" jest-docblock@^23.2.0: version "23.2.0" @@ -6876,274 +6747,145 @@ jest-docblock@^23.2.0: dependencies: detect-newline "^2.1.0" -jest-each@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.2.0.tgz#a400f81c857083f50c4f53399b109f12023fb19d" - integrity sha1-pAD4HIVwg/UMT1M5mxCfEgI/sZ0= +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== dependencies: chalk "^2.0.1" - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-environment-jsdom@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" - integrity sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg== - dependencies: - jest-mock "^21.2.0" - jest-util "^21.2.1" - jsdom "^9.12.0" - -jest-environment-jsdom@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.2.0.tgz#3634603a08a975b0ca8a658320f56a54a8e04558" - integrity sha1-NjRgOgipdbDKimWDIPVqVKjgRVg= +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= dependencies: jest-mock "^23.2.0" - jest-util "^23.2.0" + jest-util "^23.4.0" jsdom "^11.5.1" -jest-environment-node@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" - integrity sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw== - dependencies: - jest-mock "^21.2.0" - jest-util "^21.2.1" - -jest-environment-node@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.2.0.tgz#b6fe41372e382093bb6f3d9bdf6c1c4ec0a50f18" - integrity sha1-tv5BNy44IJO7bz2b32wcTsClDxg= +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= dependencies: jest-mock "^23.2.0" - jest-util "^23.2.0" - -jest-get-type@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" - integrity sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q== + jest-util "^23.4.0" jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== -jest-haste-map@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" - integrity sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw== - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - jest-docblock "^21.2.0" - micromatch "^2.3.11" - sane "^2.0.0" - worker-farm "^1.3.1" - -jest-haste-map@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.2.0.tgz#d10cbac007c695948c8ef1821a2b2ed2d4f2d4d8" - integrity sha1-0Qy6wAfGlZSMjvGCGisu0tTy1Ng= +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" + invariant "^2.2.4" jest-docblock "^23.2.0" jest-serializer "^23.0.1" jest-worker "^23.2.0" - micromatch "^3.1.10" + micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" - integrity sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A== - dependencies: - chalk "^2.0.1" - expect "^21.2.1" - graceful-fs "^4.1.11" - jest-diff "^21.2.1" - jest-matcher-utils "^21.2.1" - jest-message-util "^21.2.1" - jest-snapshot "^21.2.1" - p-cancelable "^0.3.0" - -jest-jasmine2@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.2.0.tgz#aa670cdb1e4d5f8ec774c94dda5e105fe33d8bb4" - integrity sha1-qmcM2x5NX47HdMlN2l4QX+M9i7Q= +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== dependencies: + babel-traverse "^6.0.0" chalk "^2.0.1" co "^4.6.0" - expect "^23.2.0" + expect "^23.6.0" is-generator-fn "^1.0.0" - jest-diff "^23.2.0" - jest-each "^23.2.0" - jest-matcher-utils "^23.2.0" - jest-message-util "^23.2.0" - jest-snapshot "^23.2.0" - jest-util "^23.2.0" - pretty-format "^23.2.0" - -jest-leak-detector@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz#c289d961dc638f14357d4ef96e0431ecc1aa377d" - integrity sha1-wonZYdxjjxQ1fU75bgQx7MGqN30= - dependencies: - pretty-format "^23.2.0" - -jest-matcher-utils@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" - integrity sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg== - dependencies: - chalk "^2.0.1" - jest-get-type "^21.2.0" - pretty-format "^21.2.1" - -jest-matcher-utils@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz#4d4981f23213e939e3cedf23dc34c747b5ae1913" - integrity sha1-TUmB8jIT6Tnjzt8j3DTHR7WuGRM= + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-message-util@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" - integrity sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ== - dependencies: - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - -jest-message-util@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.2.0.tgz#591e8148fff69cf89b0414809c721756ebefe744" - integrity sha1-WR6BSP/2nPibBBSAnHIXVuvv50Q= +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= dependencies: "@babel/code-frame" "^7.0.0-beta.35" chalk "^2.0.1" - micromatch "^3.1.10" + micromatch "^2.3.11" slash "^1.0.0" stack-utils "^1.0.1" -jest-mock@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" - integrity sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw== - jest-mock@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= -jest-regex-util@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" - integrity sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ== - -jest-regex-util@^23.0.0: - version "23.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.0.0.tgz#dd5c1fde0c46f4371314cf10f7a751a23f4e8f76" - integrity sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y= - -jest-resolve-dependencies@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" - integrity sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ== - dependencies: - jest-regex-util "^21.2.0" - -jest-resolve-dependencies@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.2.0.tgz#6df8d5709c6406639cd07f54bff074e01b5c0458" - integrity sha1-bfjVcJxkBmOc0H9Uv/B04BtcBFg= - dependencies: - jest-regex-util "^23.0.0" - jest-snapshot "^23.2.0" +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= -jest-resolve@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" - integrity sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw== +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" - is-builtin-module "^1.0.0" + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" -jest-resolve@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.2.0.tgz#a0790ad5a3b99002ab4dbfcbf8d9e2d6a69b3d99" - integrity sha1-oHkK1aO5kAKrTb/L+Nni1qabPZk= +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== dependencies: browser-resolve "^1.11.3" chalk "^2.0.1" realpath-native "^1.0.0" -jest-runner@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" - integrity sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg== - dependencies: - jest-config "^21.2.1" - jest-docblock "^21.2.0" - jest-haste-map "^21.2.0" - jest-jasmine2 "^21.2.1" - jest-message-util "^21.2.1" - jest-runtime "^21.2.1" - jest-util "^21.2.1" - pify "^3.0.0" - throat "^4.0.0" - worker-farm "^1.3.1" - -jest-runner@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.2.0.tgz#0d91967ea82f72b0c705910926086d2055ce75af" - integrity sha1-DZGWfqgvcrDHBZEJJghtIFXOda8= +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== dependencies: exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^23.2.0" + jest-config "^23.6.0" jest-docblock "^23.2.0" - jest-haste-map "^23.2.0" - jest-jasmine2 "^23.2.0" - jest-leak-detector "^23.2.0" - jest-message-util "^23.2.0" - jest-runtime "^23.2.0" - jest-util "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" jest-worker "^23.2.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" - integrity sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA== - dependencies: - babel-core "^6.0.0" - babel-jest "^21.2.0" - babel-plugin-istanbul "^4.0.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - graceful-fs "^4.1.11" - jest-config "^21.2.1" - jest-haste-map "^21.2.0" - jest-regex-util "^21.2.0" - jest-resolve "^21.2.0" - jest-util "^21.2.1" - json-stable-stringify "^1.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^9.0.0" - -jest-runtime@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.2.0.tgz#62dcb01766a1c4c64696dc090209e76ce1aadcbc" - integrity sha1-YtywF2ahxMZGltwJAgnnbOGq3Lw= +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.1.6" @@ -7152,15 +6894,15 @@ jest-runtime@^23.2.0: exit "^0.1.2" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^23.2.0" - jest-haste-map "^23.2.0" - jest-message-util "^23.2.0" - jest-regex-util "^23.0.0" - jest-resolve "^23.2.0" - jest-snapshot "^23.2.0" - jest-util "^23.2.0" - jest-validate "^23.2.0" - micromatch "^3.1.10" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" realpath-native "^1.0.0" slash "^1.0.0" strip-bom "3.0.0" @@ -7172,81 +6914,50 @@ jest-serializer@^23.0.1: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= -jest-snapshot@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" - integrity sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg== - dependencies: - chalk "^2.0.1" - jest-diff "^21.2.1" - jest-matcher-utils "^21.2.1" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^21.2.1" - -jest-snapshot@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.2.0.tgz#c7a3d017177bbad60c8a595869cf90a8782e6a7e" - integrity sha1-x6PQFxd7utYMillYac+QqHguan4= +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== dependencies: + babel-types "^6.0.0" chalk "^2.0.1" - jest-diff "^23.2.0" - jest-matcher-utils "^23.2.0" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^23.2.0" - -jest-util@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" - integrity sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g== - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - jest-message-util "^21.2.1" - jest-mock "^21.2.0" - jest-validate "^21.2.1" - mkdirp "^0.5.1" + pretty-format "^23.6.0" + semver "^5.5.0" -jest-util@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.2.0.tgz#62b770757696d96e094a04b8f1c373ca50a5ab2e" - integrity sha1-YrdwdXaW2W4JSgS48cNzylClqy4= +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= dependencies: callsites "^2.0.0" chalk "^2.0.1" graceful-fs "^4.1.11" is-ci "^1.0.10" - jest-message-util "^23.2.0" + jest-message-util "^23.4.0" mkdirp "^0.5.1" slash "^1.0.0" source-map "^0.6.0" -jest-validate@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" - integrity sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg== - dependencies: - chalk "^2.0.1" - jest-get-type "^21.2.0" - leven "^2.1.0" - pretty-format "^21.2.1" - -jest-validate@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.2.0.tgz#67c8b909e11af1701765238894c67ac3291b195e" - integrity sha1-Z8i5CeEa8XAXZSOIlMZ6wykbGV4= +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-watcher@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.2.0.tgz#678e852896e919e9d9a0eb4b8baf1ae279620ea9" - integrity sha1-Z46FKJbpGenZoOtLi68a4nliDqk= +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw= dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -7259,20 +6970,13 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" -jest@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" - integrity sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw== - dependencies: - jest-cli "^21.2.1" - -jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-23.2.0.tgz#828bf31a096d45dcf06824d1ea03013af7bcfc20" - integrity sha1-govzGgltRdzwaCTR6gMBOve8/CA= +jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== dependencies: import-local "^1.0.0" - jest-cli "^23.2.0" + jest-cli "^23.6.0" js-base64@^2.1.8, js-base64@^2.1.9: version "2.4.3" @@ -7355,31 +7059,6 @@ jsdom@^11.5.1: ws "^4.0.0" xml-name-validator "^3.0.0" -jsdom@^9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" - integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= - dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" - array-equal "^1.0.0" - content-type-parser "^1.0.1" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.79.0" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.2" - webidl-conversions "^4.0.0" - whatwg-encoding "^1.0.1" - whatwg-url "^4.3.0" - xml-name-validator "^2.0.1" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -7415,7 +7094,7 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= @@ -7526,6 +7205,11 @@ jss@^9.3.3: symbol-observable "^1.1.0" warning "^3.0.0" +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + kdbush@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-2.0.1.tgz#90c6128e3001ac68c550d7c9e2f222c0269666f1" @@ -7546,11 +7230,6 @@ keycode@^2.1.9, keycode@^2.2.0: resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -7575,6 +7254,14 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -7613,25 +7300,18 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + left-pad@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== -"less@2.6.x || ^2.7.1": - version "2.7.3" - resolved "https://registry.yarnpkg.com/less/-/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b" - integrity sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ== - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - mime "^1.2.11" - mkdirp "^0.5.0" - promise "^7.1.1" - request "2.81.0" - source-map "^0.5.3" - leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -7661,7 +7341,7 @@ lie@3.1.1: dependencies: immediate "~3.0.5" -liftoff@^2.1.0: +liftoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= @@ -7686,16 +7366,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -7808,11 +7478,6 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clone@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= - lodash.clonedeep@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -7828,11 +7493,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - lodash.escape@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" @@ -7840,11 +7500,6 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -7884,26 +7539,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.4.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== - lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== -lodash.partialright@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" - integrity sha1-ATDYDoM2MmTUAHTzKbij56ihzEs= - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -7942,7 +7582,7 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" -lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= @@ -7952,11 +7592,6 @@ lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lo resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= - loglevel@^1.4.1, loglevel@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" @@ -8009,11 +7644,6 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" @@ -8116,6 +7746,16 @@ mapbox-gl@0.47.0: tinyqueue "^1.1.0" vt-pbf "^3.0.1" +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + material-colors@^1.2.1: version "1.2.5" resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1" @@ -8261,7 +7901,7 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -8305,11 +7945,6 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^1.2.11: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -8345,21 +7980,6 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= - dependencies: - brace-expansion "^1.0.0" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimist@0.0.5: version "0.0.5" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" @@ -8482,11 +8102,6 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -moxios@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/moxios/-/moxios-0.4.0.tgz#fc0da2c65477d725ca6b9679d58370ed0c52f53b" - integrity sha1-/A2ixlR31yXKa5Z51YNw7QxS9Ts= - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -8504,6 +8119,11 @@ multipipe@^0.1.2: dependencies: duplexer2 "0.0.2" +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -8532,15 +8152,10 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -natives@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.3.tgz#44a579be64507ea2d6ed1ca04a9415915cf75558" - integrity sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g== - -natives@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" - integrity sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg== +natives@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== natural-compare@^1.4.0: version "1.4.0" @@ -8576,6 +8191,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" @@ -8625,13 +8245,6 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-json-db@^0.7.3: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-json-db/-/node-json-db-0.7.5.tgz#9906eb6c0df504bd667ae829550c9823ea4cce4e" - integrity sha512-BTx8Dlhdq3s/2S5z76qobs88bmfGJ0vypzOo8Ba/15IcXoPwukV2bzBvE9nJM3InazQmkaxNUJFwFZTAexcvDA== - dependencies: - mkdirp "0.5.x" - node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" @@ -8661,7 +8274,7 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-notifier@^5.0.2, node-notifier@^5.2.1: +node-notifier@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== @@ -8813,6 +8426,13 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +now-and-later@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" + integrity sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4= + dependencies: + once "^1.3.2" + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" @@ -8878,7 +8498,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -"nwmatcher@>= 1.3.9 < 2.0.0", nwmatcher@^1.4.3: +nwmatcher@^1.4.3: version "1.4.4" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== @@ -8954,7 +8574,7 @@ object.assign@^4.0.4, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.defaults@^1.1.0: +object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= @@ -9005,6 +8625,14 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.values@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" @@ -9029,13 +8657,6 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= - dependencies: - wrappy "1" - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -9068,19 +8689,12 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= + readable-stream "^2.0.1" os-browserify@^0.3.0: version "0.3.0" @@ -9139,11 +8753,6 @@ output-file-sync@^2.0.0: is-plain-obj "^1.1.0" mkdirp "^0.5.1" -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -9282,11 +8891,6 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= - parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -9379,13 +8983,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - pbf@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.1.0.tgz#f70004badcb281761eabb1e76c92f179f08189e9" @@ -9410,11 +9007,6 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -9465,16 +9057,15 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= +plugin-error@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" pn@^1.1.0: version "1.1.0" @@ -9807,18 +9398,10 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" - integrity sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017" - integrity sha1-OwqqY8AYpTWDNzwcs6XZbMXoMBc= +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" @@ -9916,11 +9499,6 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.28" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" - integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== - public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" @@ -9949,6 +9527,15 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -9997,11 +9584,6 @@ qs@~6.3.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" integrity sha1-51vV9uJoEioqDgvaYwslUMFmUCw= -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= - qs@~6.5.1: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -10165,6 +9747,14 @@ react-dom@^16.4.1: object-assign "^4.1.1" prop-types "^15.6.0" +react-dropzone@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-8.0.0.tgz#09ecf6973ac8fb598dd2d77c1a5890fe3cafdb83" + integrity sha512-k4/Un1LD62NDDRg7Y10Ywb8VBBQ2Gi3yjYJUf38CuMulsENCWrB87QwsTxDIb9gSd5d3tReOpXTprIEf1JdtnA== + dependencies: + attr-accept "^1.1.3" + prop-types "^15.6.2" + react-event-listener@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.2.tgz#df405e9578be052b77a76e4c3914686637caecff" @@ -10363,13 +9953,12 @@ react-transition-group@^2.5.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-visibility-sensor@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/react-visibility-sensor/-/react-visibility-sensor-3.11.0.tgz#2da089ccb18b33ec3539914b300b120684aff2e0" - integrity sha512-4ZLCYR50zGKH2WgsenuOaQTlCOkc69z882RaDGPpYAJqCY6ZXshzFhEuyv/LTPwoj6VBt8sSJRdvg0x+TeuyQA== +react-visibility-sensor@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/react-visibility-sensor/-/react-visibility-sensor-5.0.2.tgz#e360fff81572cb3a2a9fd680484447a9da09a55d" + integrity sha512-7+1lr7oQOO2vKr5u/uxoDGFWAAy7lsDy2aJU3Zy1/OymI+TRqOBk8m2L8YE1B0UyfCDWxVAWO+aifVGqNOvqeQ== dependencies: - create-react-class "^15.5.1" - prop-types "^15.5.4" + prop-types "^15.6.2" react-windowed-list@^2.0.0: version "2.0.0" @@ -10422,14 +10011,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -10439,16 +10020,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -10461,7 +10033,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": +readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= @@ -10741,7 +10313,24 @@ remeasure@^3.0.1: raf "^3.3.2" resize-observer-polyfill "^1.5.0" -remove-trailing-separator@^1.0.1: +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= @@ -10784,6 +10373,15 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" @@ -10800,7 +10398,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2, request@2.x, request@^2.45.0, request@^2.79.0, request@^2.81.0, request@^2.83.0: +request@2, request@2.x, request@^2.45.0, request@^2.81.0, request@^2.83.0: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" integrity sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg== @@ -10828,34 +10426,6 @@ request@2, request@2.x, request@^2.45.0, request@^2.79.0, request@^2.81.0, reque tunnel-agent "^0.6.0" uuid "^3.1.0" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - request@~2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" @@ -10945,6 +10515,13 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" @@ -10967,14 +10544,14 @@ resolve@1.1.7, resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.5, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.1.5, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.5.0: +resolve@^1.1.6, resolve@^1.1.7: version "1.7.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== @@ -11162,7 +10739,7 @@ sass-loader@^7.1.0: pify "^3.0.0" semver "^5.5.0" -sax@>=0.6.0, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11217,16 +10794,18 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= - semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -11256,11 +10835,6 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= - serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" @@ -11384,11 +10958,6 @@ shuffle-seed@^1.1.6: dependencies: seedrandom "^2.4.2" -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -11536,7 +11105,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -11662,6 +11231,11 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" @@ -11749,11 +11323,6 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-consume@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" - integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== - stream-each@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" @@ -11869,19 +11438,11 @@ strip-bom-string@^1.0.0: resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= -strip-bom@3.0.0, strip-bom@^3.0.0: +strip-bom@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -11954,6 +11515,14 @@ supports-color@~5.0.0: dependencies: has-flag "^2.0.0" +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -11977,7 +11546,7 @@ symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.1, symbol-tree@^3.2.2: +symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= @@ -12060,13 +11629,13 @@ throttleit@0.0.2: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" + through2 "~2.0.0" + xtend "~4.0.0" through2@^2.0.0, through2@^2.0.3, through2@~2.0.3: version "2.0.3" @@ -12084,18 +11653,19 @@ through2@~0.2.3: readable-stream "~1.1.9" xtend "~2.1.1" +through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + through@2, through@^2.3.6, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= - dependencies: - os-homedir "^1.0.0" - time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" @@ -12135,6 +11705,14 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -12180,6 +11758,13 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + toggle-selection@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" @@ -12197,14 +11782,6 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2. dependencies: punycode "^1.4.1" -tough-cookie@^2.3.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c" - integrity sha512-vahm+X8lSV/KjXziec8x5Vp0OTC9mq8EVCOApIsRAooeuMPSO8aT7PFACYkaL0yZ/3hVqw+8DzhCJwl8H2Ad6w== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -12212,11 +11789,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -12350,7 +11922,7 @@ uglify-js@3.3.x: commander "~2.15.0" source-map "~0.6.1" -uglify-js@^2.6, uglify-js@^2.8.22: +uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= @@ -12408,6 +11980,26 @@ underscore@~1.6.0: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.0.tgz#339da4646252d082dc378e708067299750e11b49" + integrity sha1-M52kZGJS0ILcN45wgGcpl1DhG0k= + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -12472,10 +12064,13 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + integrity sha1-WqADz76Uxf+GbE59ZouxxNuts2k= + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" unique-string@^1.0.0: version "1.0.0" @@ -12587,11 +12182,6 @@ use@^3.1.0: dependencies: kind-of "^6.0.2" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" @@ -12642,12 +12232,12 @@ v8-compile-cache@^2.0.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= +v8flags@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.1.tgz#42259a1461c08397e37fe1d4f1cfb59cad85a053" + integrity sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ== dependencies: - user-home "^1.1.1" + homedir-polyfill "^1.0.1" validate-npm-package-license@^3.0.1: version "3.0.3" @@ -12662,6 +12252,11 @@ value-equal@^0.4.0: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -12709,34 +12304,41 @@ vinyl-file@^2.0.0: strip-bom-stream "^2.0.0" vinyl "^1.1.0" -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== dependencies: - source-map "^0.5.1" + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" -vinyl@^0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" vinyl@^0.5.0: version "0.5.3" @@ -12756,7 +12358,7 @@ vinyl@^1.1.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vinyl@^2.1.0: +vinyl@^2.0.0, vinyl@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== @@ -12871,12 +12473,7 @@ webdriverio@^4.8.0: wdio-dot-reporter "~0.0.8" wgxpath "~1.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: +webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== @@ -12982,14 +12579,6 @@ whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== -whatwg-url@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" - integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" @@ -12999,11 +12588,6 @@ whatwg-url@^6.4.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -when@^3.7.8: - version "3.7.8" - resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" - integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I= - whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" @@ -13060,7 +12644,7 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -worker-farm@^1.3.1, worker-farm@^1.5.2: +worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== @@ -13122,11 +12706,6 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -13155,7 +12734,7 @@ xregexp@4.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -13201,13 +12780,6 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -13269,7 +12841,7 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^7.0.0: +yargs@^7.0.0, yargs@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= @@ -13288,25 +12860,6 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" -yargs@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From c188880615cf4f1e14d40a53e631863fb3023bb3 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 11 Dec 2018 21:11:31 +0100 Subject: [PATCH 08/61] Remove lib and begin implementing custom file picker --- package.json | 3 +- src/react/Components/AccountCard.jsx | 22 ++- .../Components/FileUpload/FileDropZone.jsx | 102 ------------ .../Components/FileUpload/FilePicker.jsx | 96 +++++++++++ .../FileUpload/UploadFullscreen.jsx | 151 ++++++++++-------- yarn.lock | 23 +-- 6 files changed, 203 insertions(+), 194 deletions(-) delete mode 100644 src/react/Components/FileUpload/FileDropZone.jsx create mode 100644 src/react/Components/FileUpload/FilePicker.jsx diff --git a/package.json b/package.json index 8121b6f5..d1791834 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@bunq-community/bunq-js-client": "^0.35.2", + "@bunq-community/bunq-js-client": "^0.36.0", "@bunq-community/bunqdesktop-templates": "^1.2.0", "@fortawesome/fontawesome-free": "^5.2.0", "@material-ui/core": "^3.5.1", @@ -219,7 +219,6 @@ "react-color": "^2.14.1", "react-copy-to-clipboard": "^5.0.1", "react-dom": "^16.4.1", - "react-dropzone": "^8.0.0", "react-helmet": "^5.2.0", "react-i18next": "^7.7.0", "react-json-view": "^1.17.1", diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index 21dc5702..aed1f382 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -48,10 +48,25 @@ class AccountCard extends React.Component { }; } + componentDidMount(){ + this.handleFileUpload("aa8aa19c-c4a1-45b4-8df1-15b32b228208") + } + copiedValue = type => callback => { this.props.openSnackbar(`Copied ${type} to your clipboard`); }; + handleFileUpload = fileUUID => { + this.toggleFileUploadDialog(); + console.log("File upload", fileUUID); + }; + + toggleFileUploadDialog = () => { + this.setState({ + displayUploadScreen: !this.state.displayUploadScreen + }); + }; + render() { const { account, hideBalance } = this.props; let formattedBalance = account.balance ? account.balance.value : 0; @@ -83,11 +98,8 @@ class AccountCard extends React.Component { - this.setState({ - displayUploadScreen: false - }) - } + onComplete={this.handleFileUpload} + onClose={this.toggleFileUploadDialog} /> diff --git a/src/react/Components/FileUpload/FileDropZone.jsx b/src/react/Components/FileUpload/FileDropZone.jsx deleted file mode 100644 index 3f44e880..00000000 --- a/src/react/Components/FileUpload/FileDropZone.jsx +++ /dev/null @@ -1,102 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { withStyles } from "@material-ui/core/styles"; -import Dropzone from "react-dropzone"; - -import FileUpload from "../CustomSVG/FileUpload"; - -const contentSize = 320; - -const styles = theme => ({ - dropZone: { - width: "100%", - height: "100%", - display: "flex", - alignItems: "center", - justifyContent: "center", - - // border styling - borderWidth: 2, - borderColor: "rgb(102, 102, 102)", - borderStyle: "dashed", - borderRadius: 5 - }, - fileUploadIcon: { - width: "100%", - height: "100%" - }, - imagePreview: { - width: "auto", - maxWidth: contentSize, - height: "auto", - maxHeight: contentSize - } -}); - -class FileDropZone extends React.PureComponent { - constructor(props, context) { - super(props, context); - this.state = { - imagePreviewUrl: false - }; - } - - handleFileDrop = (allowedFiles, blockedFiles) => { - const reader = new FileReader(); - const file = allowedFiles[0]; - - if (!file) return; - - reader.onloadend = () => { - this.props.onChange(file); - this.setState({ - imagePreviewUrl: reader.result - }); - }; - - reader.readAsDataURL(file); - }; - - render() { - const { classes, customClasses } = this.props; - const finalClasses = { ...classes, ...customClasses }; - return ( - - {({ getRootProps, getInputProps, isDragActive }) => { - return ( -
- - {this.state.imagePreviewUrl ? ( - - ) : ( - - )} -
- ); - }} -
- ); - } -} - -FileDropZone.defaultProps = { - dropZoneStyle: {}, - imagePreviewStyle: {}, - imageUploadIconStyle: {} -}; - -FileDropZone.propTypes = { - onChange: PropTypes.func.isRequired, - dropZoneStyle: PropTypes.object, - imagePreviewStyle: PropTypes.object, - imageUploadIconStyle: PropTypes.object -}; - -export default withStyles(styles)(FileDropZone); diff --git a/src/react/Components/FileUpload/FilePicker.jsx b/src/react/Components/FileUpload/FilePicker.jsx new file mode 100644 index 00000000..82011a0b --- /dev/null +++ b/src/react/Components/FileUpload/FilePicker.jsx @@ -0,0 +1,96 @@ +import React from "react"; +import PropTypes from "prop-types"; + +import FileUpload from "../CustomSVG/FileUpload"; + +const contentSize = 320; + +const styles = { + dropZone: { + width: "100%", + height: "100%", + display: "flex", + alignItems: "center", + justifyContent: "center", + + // border styling + borderWidth: 2, + borderColor: "rgb(102, 102, 102)", + borderStyle: "dashed", + borderRadius: 5 + }, + fileInput: { + display: "none" + }, + fileUploadIcon: { + width: "100%", + height: "100%" + }, + imagePreview: { + width: "auto", + maxWidth: contentSize, + height: "auto", + maxHeight: contentSize + } +}; + +const allowedFileTypes = ["image/jpeg", "image/png", "image/gif"]; + +class FilePicker extends React.Component { + constructor(props, context) { + super(props, context); + this.state = { + imagePreviewUrl: false + }; + + this.fileInput = React.createRef(); + } + + handleFileDrop = files => { + if (this.fileInput.current.files.length > 0) { + const file = this.fileInput.current.files[0]; + + if (allowedFileTypes.includes(file.type)) { + if (!file) return; + + this.props.handleFileDrop(file); + + const reader = new FileReader(); + reader.onloadend = () => { + this.setState({ + imagePreviewUrl: reader.result + }); + }; + reader.readAsDataURL(file); + } + } + }; + + render() { + return ( +
+ + +
+ ); + } +} + +FilePicker.propTypes = { + onChange: PropTypes.func.isRequired +}; + +export default FilePicker; diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx index d8591030..f37df08b 100644 --- a/src/react/Components/FileUpload/UploadFullscreen.jsx +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -1,19 +1,20 @@ import React from "react"; +import { connect } from "react-redux"; import { translate } from "react-i18next"; -import { withStyles } from "@material-ui/core/styles"; import Dialog from "@material-ui/core/Dialog"; -import Button from "@material-ui/core/Button"; import Typography from "@material-ui/core/Typography"; import Slide from "@material-ui/core/Slide"; -import FileDropZone from "./FileDropZone"; +import Button from "@material-ui/core/Button"; -import FileReaderHelper from "@bunq-community/bunq-js-client/dist/Helpers/FileReaderHelper"; +import FilePicker from "./FilePicker"; + +import { openSnackbar } from "../../Actions/snackbar"; const Transition = props => ; const contentSize = 320; -const styles = theme => ({ +const styles = { dialog: { marginTop: 50 }, @@ -30,96 +31,99 @@ const styles = theme => ({ width: contentSize, minHeight: contentSize }, + closeButton: { + position: "fixed", + top: 20, + left: 20 + }, uploadButton: { width: "100%" } -}); +}; + +class UploadFullscreen extends React.Component { + constructor(props) { + super(props); -class UploadFullscreen extends React.PureComponent { - constructor(props, context) { - super(props, context); this.state = { - file: false + file: false, + uploadingFile: false }; } - onFileChange = file => this.setState({ file }); + handleFileDrop = file => { + this.setState({ file }); + window.file = file; + }; + + startUpload = () => { + const file = this.state.file; - getFileInfo = async () => { - console.log("start"); - const fileReader = new FileReader(); + this.setState({ + uploadingFile: true + }); - console.log("readAsArrayBuffer"); - // start loading the file as binary - fileReader.readAsArrayBuffer(this.state.file); + // start loading the file as array buffer + const fileReader = new FileReader(); + fileReader.readAsArrayBuffer(file); - console.log("wait"); // wrap the filereader callback in a promise - const fileArrayBuffer = await new Promise(resolve => { - console.log("waiting"); + new Promise(resolve => { // resolve the output onload - fileReader.onload = () => { - console.log("loaded"); - console.log(this.state.file); - console.log(fileReader); - - resolve(fileReader.result); - }; + fileReader.onload = () => resolve(fileReader.result); + }).then(fileArrayBuffer => { + // transform array buffer into regular buffer + const fileBuffer = Buffer.from(fileArrayBuffer); + + this.props.BunqJSClient.api.attachmentPublic + .post(fileBuffer, file.type) + .then(response => { + this.props.onComplete(response); + this.setState({ + uploadingFile: false + }); + }) + .catch(error => { + this.props.openSnackbar(this.props.t("Failed to upload image")); + this.setState({ + uploadingFile: false + }); + }); }); - - console.log("from arraybuffer"); - const fileBuffer = Buffer.from(fileArrayBuffer); - - return { - contents: fileBuffer - }; - }; - - startUpload = () => { - console.log("dang"); - this.getFileInfo() - .then(result => { - console.log("result", result); - }) - .catch(console.error); - - // this.props.BunqJSClient.api.attachmentPublic - // .post(this.state.file) - // .then(console.log) - // .catch(console.error); }; render() { - const { classes, t } = this.props; + const { t } = this.props; + + t("Failed to upload image") + return ( { - console.log("close", close); - this.props.handleRequestClose(close); - }} + onClose={this.props.onClose} TransitionComponent={Transition} > -
-
- + +
+
+ {t(this.props.headlineText)} - -
- {this.state.file !== false ? ( + + {this.state.file && ( - ) : null} + )}
@@ -132,4 +136,19 @@ UploadFullscreen.defaultProps = { buttonText: "Upload" }; -export default withStyles(styles)(translate("translations")(UploadFullscreen)); +const mapStateToProps = state => { + return {}; +}; + +const mapDispatchToProps = dispatch => { + return { + openSnackbar: message => dispatch(openSnackbar(message)) + }; +}; + +export default translate("translations")( + connect( + mapStateToProps, + mapDispatchToProps + )(UploadFullscreen) +); diff --git a/yarn.lock b/yarn.lock index 2bd198e8..cc3f7d0f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -998,10 +998,10 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@bunq-community/bunq-js-client@^0.35.2": - version "0.35.4" - resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.35.4.tgz#99a397fd82822394da5b3d95e5800388cdd478e2" - integrity sha512-KeB/tTFHyBLQSqMwOaaCQm92t5mwgpqd6JhEAz723QxiVwSEJ71ltTsPVCnW47fbHOCPjfXPG3xHWlgm6K30ug== +"@bunq-community/bunq-js-client@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.36.0.tgz#0eb0be823d7f17cf7c5bdb757caa565def31bc7c" + integrity sha512-Q6Rj9r9meIvTYUG+KCGh4vVtJ9LG2JFiPCUzWMrcWN5EyP62sBOBBnO7QU/1UweKcJe24OKqjZFeVlHFbf9A2Q== dependencies: awaiting "^3.0.0" axios "^0.16.2" @@ -1900,13 +1900,6 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" integrity sha1-ri1acpR38onWDdf5amMUoi3Wwio= -attr-accept@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-1.1.3.tgz#48230c79f93790ef2775fcec4f0db0f5db41ca52" - integrity sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ== - dependencies: - core-js "^2.5.0" - autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" @@ -9747,14 +9740,6 @@ react-dom@^16.4.1: object-assign "^4.1.1" prop-types "^15.6.0" -react-dropzone@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-8.0.0.tgz#09ecf6973ac8fb598dd2d77c1a5890fe3cafdb83" - integrity sha512-k4/Un1LD62NDDRg7Y10Ywb8VBBQ2Gi3yjYJUf38CuMulsENCWrB87QwsTxDIb9gSd5d3tReOpXTprIEf1JdtnA== - dependencies: - attr-accept "^1.1.3" - prop-types "^15.6.2" - react-event-listener@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.2.tgz#df405e9578be052b77a76e4c3914686637caecff" From 790c3fdb1a9d947430d81145826e9ffb12052352 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Fri, 14 Dec 2018 21:20:56 +0100 Subject: [PATCH 09/61] Upgrade bunqjsclient --- package.json | 2 +- yarn.lock | 2032 +++++++++++++++++++------------------------------- 2 files changed, 786 insertions(+), 1248 deletions(-) diff --git a/package.json b/package.json index 9795190f..16c757cd 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@bunq-community/bunq-js-client": "^0.35.2", + "@bunq-community/bunq-js-client": "^0.36.1", "@bunq-community/bunqdesktop-templates": "^1.2.0", "@fortawesome/fontawesome-free": "^5.2.0", "@material-ui/core": "^3.5.1", diff --git a/yarn.lock b/yarn.lock index d579683c..d776441d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,21 +38,21 @@ dependencies: "@babel/highlight" "7.0.0-beta.46" -"@babel/core@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0.tgz#0cb0c0fd2e78a0a2bec97698f549ae9ce0b99515" - integrity sha512-nrvxS5u6QUN5gLl1GEakIcmOeoUHT1/gQtdMRq18WFURJ5osn4ppJLVSseMQo4zVWKJfBTF4muIYijXUnKlRLQ== +"@babel/core@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.0.tgz#a4dd3814901998e93340f0086e9867fefa163ada" + integrity sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/helpers" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/generator" "^7.2.0" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.0" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.2.0" convert-source-map "^1.1.0" - debug "^3.1.0" - json5 "^0.5.0" + debug "^4.1.0" + json5 "^2.1.0" lodash "^4.17.10" resolve "^1.3.2" semver "^5.4.1" @@ -69,6 +69,17 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.1.6", "@babel/generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c" + integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg== + dependencies: + "@babel/types" "^7.2.0" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -127,6 +138,15 @@ "@babel/template" "^7.0.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -232,14 +252,14 @@ "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" -"@babel/helpers@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0.tgz#7213388341eeb07417f44710fd7e1d00acfa6ac0" - integrity sha512-jbvgR8iLZPnyk6m/UqdXYsSxbVtRi7Pd3CzB4OPwPBnmhNG1DWjiiy777NTuoyIcniszK51R40L5pgfXAfHDtw== +"@babel/helpers@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" + integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== dependencies: - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.2.0" "@babel/highlight@7.0.0-beta.46": version "7.0.0-beta.46" @@ -264,6 +284,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0.tgz#697655183394facffb063437ddf52c0277698775" integrity sha512-RgJhNdRinpO8zibnoHbzTTexNs4c8ROkXFBanNDZTLHjwbdLk8J5cJSKulx/bycWTLYmKVNCkxRtVCoJnqPk+g== +"@babel/parser@^7.1.2", "@babel/parser@^7.1.6", "@babel/parser@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.0.tgz#02d01dbc330b6cbf36b76ac93c50752c69027065" + integrity sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg== + "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0.tgz#5d1eb6b44fd388b97f964350007ab9da090b1d70" @@ -916,6 +941,15 @@ "@babel/parser" "^7.0.0" "@babel/types" "^7.0.0" +"@babel/template@^7.1.0", "@babel/template@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + "@babel/traverse@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0.tgz#b1fe9b6567fdf3ab542cfad6f3b31f854d799a61" @@ -931,6 +965,21 @@ globals "^11.1.0" lodash "^4.17.10" +"@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c" + integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.6" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.6" + "@babel/types" "^7.1.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + "@babel/types@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" @@ -940,46 +989,26 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@bunq-community/bunq-js-client@^0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.33.0.tgz#441953518c0258496c40ff53055c7a2387120909" - integrity sha512-znXBcook3PRopwtnmU8Y2lYyaLI3JOvAbwD3fv8bC2C4rQyL6BFxNLNVvyGVgqZ4iu5AbGKQ7iuvgLP7I5qUzQ== - dependencies: - "@babel/cli" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-decorators" "^7.0.0" - "@babel/plugin-proposal-do-expressions" "^7.0.0" - "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-export-namespace-from" "^7.0.0" - "@babel/plugin-proposal-function-bind" "^7.0.0" - "@babel/plugin-proposal-function-sent" "^7.0.0" - "@babel/plugin-proposal-json-strings" "^7.0.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-proposal-pipeline-operator" "^7.0.0" - "@babel/plugin-proposal-throw-expressions" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-syntax-import-meta" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@types/jest" "^21.1.8" - "@types/moxios" "^0.4.8" - "@types/node" "^8.0.34" +"@babel/types@^7.1.2", "@babel/types@^7.1.6", "@babel/types@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.0.tgz#7941c5b2d8060e06f9601d6be7c223eef906d5d8" + integrity sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@bunq-community/bunq-js-client@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.36.1.tgz#c78c5474c01961c12cad622119c1ee5c9ac97ed0" + integrity sha512-/3vwu1ZN3kNpw2URxHqm7dTfeAFHvmxdth05ykI49W+p+sQ4YFiGSaPqO44VOpvGr4Is1x7NcVY6kpRmjtFTyw== + dependencies: awaiting "^3.0.0" axios "^0.16.2" - babel-core "^7.0.0-bridge.0" es6-promise-promise "^1.0.0" - jest "^21.2.1" loglevel "^1.4.1" - moxios "^0.4.0" node-forge "^0.7.1" - node-json-db "^0.7.3" store "^2.0.12" - ts-jest "^23.1.4" typescript "^2.5.3" "@bunq-community/bunqdesktop-templates@^1.2.0": @@ -1110,11 +1139,6 @@ resolved "https://registry.yarnpkg.com/@types/i18next/-/i18next-8.4.3.tgz#9136a9551bf5bf7169aa9f3125c1743f1f8dd6de" integrity sha512-ayqHEU+i9H7/Fkefnhyvml1ChKEZXcDwmVqo3jmrxy7PoAtTSY1t4/hr58Xz8hkXLPoCGS1hTc6bLJOUaOAjfQ== -"@types/jest@^21.1.8": - version "21.1.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-21.1.10.tgz#dcacb5217ddf997a090cc822bba219b4b2fd7984" - integrity sha512-qDyqzbcyNgW2RgWbl606xCYQ+5fK9khOW5+Hl3wH7RggVES0dB6GcZvpmPs/XIty5qpu1xYCwpiK+iRkJ3xFBw== - "@types/jest@^22.1.3": version "22.2.3" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d" @@ -1145,11 +1169,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.14.tgz#a24767cfa22023f1bf7e751c0ead56a14c07ed45" integrity sha512-TKQqQIaYNO+8MrOsFgobkt3fbMzkfXhBFKcg20Nip5Omptw1HOY/IEvYiFtMwIbr7Me/Y2H/JO+TgNUMJ9NGjA== -"@types/node@^8.0.34": - version "8.10.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.20.tgz#fe674ea52e13950ab10954433a7824438aabbcac" - integrity sha512-M7x8+5D1k/CuA6jhiwuSCmE8sbUWJF0wYsjcig9WrXvwUI5ArEoUBdOXpV4JcEMrLp02/QbDjw+kI+vQeKyQgg== - "@types/node@^9.4.6": version "9.6.15" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.15.tgz#8a5a313ea0a43a95277235841be5d3f5fb3dfeda" @@ -1336,7 +1355,7 @@ JSV@^4.0.x: resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" integrity sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c= -abab@^1.0.3, abab@^1.0.4: +abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= @@ -1359,26 +1378,6 @@ accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" -accord@^0.28.0: - version "0.28.0" - resolved "https://registry.yarnpkg.com/accord/-/accord-0.28.0.tgz#bec516a2f722e7d50f5f9f42f81b77f3b95448ba" - integrity sha512-sPF34gqHegaCSryKf5wHJ8wREK1dTZnHmC9hsB7D8xjntRdd30DXDPKf0YVIcSvnXJmcYu5SCvZRz28H++kFhQ== - dependencies: - convert-source-map "^1.5.0" - glob "^7.0.5" - indx "^0.2.3" - lodash.clone "^4.3.2" - lodash.defaults "^4.0.1" - lodash.flatten "^4.2.0" - lodash.merge "^4.4.0" - lodash.partialright "^4.1.4" - lodash.pick "^4.2.1" - lodash.uniq "^4.3.0" - resolve "^1.5.0" - semver "^5.3.0" - uglify-js "^2.8.22" - when "^3.7.8" - acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" @@ -1386,13 +1385,6 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= - dependencies: - acorn "^4.0.4" - acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" @@ -1400,11 +1392,6 @@ acorn-globals@^4.1.0: dependencies: acorn "^5.0.0" -acorn@^4.0.4: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - acorn@^5.0.0, acorn@^5.3.0: version "5.5.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" @@ -1425,14 +1412,6 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.2.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -1494,12 +1473,12 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= +ansi-colors@1.1.0, ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== dependencies: - ansi-wrap "0.1.0" + ansi-wrap "^0.1.0" ansi-escapes@^3.0.0: version "3.1.0" @@ -1513,13 +1492,6 @@ ansi-gray@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1547,7 +1519,7 @@ ansi-styles@~1.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= -ansi-wrap@0.1.0: +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= @@ -1638,6 +1610,13 @@ app-builder-lib@~20.33.2: semver "^5.6.0" temp-file "^3.2.0" +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= + dependencies: + buffer-equal "^1.0.0" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -1696,14 +1675,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -1716,15 +1687,24 @@ arr-diff@^4.0.0: resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" arr-union@^3.1.0: version "3.1.0" @@ -1736,7 +1716,7 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= -array-each@^1.0.1: +array-each@^1.0.0, array-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= @@ -1756,16 +1736,35 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" array-slice@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + array-uniq@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1842,6 +1841,16 @@ async-done@^1.0.0: process-nextick-args "^1.0.7" stream-exhaust "^1.0.1" +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.1.tgz#14b7b73667b864c8f02b5b253fc9c6eddb777f3e" + integrity sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^1.0.7" + stream-exhaust "^1.0.1" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -1862,6 +1871,13 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= + dependencies: + async-done "^1.2.2" + async@1.x, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1971,11 +1987,6 @@ babel-core@^6.0.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -1998,18 +2009,10 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" - integrity sha512-O0W2qLoWu1QOoOGgxiR2JID4O6WSpxPiQanrkyi9SSlM0PJ60Ptzlck47lhtnr9YZO3zYOsxHwnyeWJ6AffoBQ== - dependencies: - babel-plugin-istanbul "^4.0.0" - babel-preset-jest "^21.2.0" - -babel-jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.2.0.tgz#14a9d6a3f4122dfea6069d37085adf26a53a4dba" - integrity sha1-FKnWo/QSLf6mBp03CFrfJqU6Tbo= +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== dependencies: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.2.0" @@ -2039,7 +2042,7 @@ babel-plugin-dynamic-import-node@^2.0.0: babel-plugin-syntax-dynamic-import "^6.18.0" object.assign "^4.1.0" -babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.6: +babel-plugin-istanbul@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== @@ -2049,11 +2052,6 @@ babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.6: istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" -babel-plugin-jest-hoist@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" - integrity sha512-yi5QuiVyyvhBUDLP4ButAnhYzkdrUwWDtvUJv71hjH3fclhnZg4HkDeqaitcR2dZZx/E67kGkRcPVjtVu+SJfQ== - babel-plugin-jest-hoist@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" @@ -2081,14 +2079,6 @@ babel-plugin-system-import-transformer@^3.1.0: dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" -babel-preset-jest@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" - integrity sha512-hm9cBnr2h3J7yXoTtAVV0zg+3vg0Q/gT2GYuzlreTU0EPkJRtlNgKJJ3tBKEn0+VjAi3JykV6xCJkuUYttEEfA== - dependencies: - babel-plugin-jest-hoist "^21.2.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - babel-preset-jest@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" @@ -2129,7 +2119,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -2144,7 +2134,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -2159,6 +2149,21 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -2320,7 +2325,7 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== @@ -2378,13 +2383,6 @@ browser-process-hrtime@^0.1.2: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= -browser-resolve@^1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - integrity sha1-j/CbCixCFxihBRwmCzLkj0QpOM4= - dependencies: - resolve "1.1.7" - browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" @@ -2515,6 +2513,11 @@ buffer-equal@0.0.1: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + buffer-fill@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-0.1.1.tgz#76d825c4d6e50e06b7a31eb520c04d08cc235071" @@ -2990,11 +2993,6 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= - clone@^1.0.0, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -3041,6 +3039,15 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -3172,7 +3179,7 @@ concat-stream@1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3216,11 +3223,6 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -3265,6 +3267,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + copy-to-clipboard@^3: version "3.0.8" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9" @@ -3338,15 +3348,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-class@^15.5.1: - version "15.6.3" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" - integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - object-assign "^4.1.1" - cross-env@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" @@ -3587,6 +3588,13 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + dependencies: + es5-ext "^0.10.9" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -3696,6 +3704,13 @@ deepmerge@~2.0.1: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" @@ -3703,12 +3718,10 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= define-properties@^1.1.2: version "1.1.2" @@ -3765,11 +3778,6 @@ depd@~1.1.1, depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= - des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -3978,6 +3986,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +each-props@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + earcut@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.3.tgz#ca579545f351941af7c3d0df49c9f7d34af99b0c" @@ -4168,13 +4184,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= - dependencies: - once "~1.3.0" - enhanced-resolve@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" @@ -4247,7 +4256,7 @@ enzyme@^3.3.0: raf "^3.4.0" rst-selector-parser "^2.2.3" -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== @@ -4281,11 +4290,29 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-iterator@^2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es6-promise-promise/-/es6-promise-promise-1.0.0.tgz#3a91f235fdd2b08c4492b5734dfd1f417289b994" @@ -4298,6 +4325,24 @@ es6-promise@^3.2.1: resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4320,18 +4365,6 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.6.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" - integrity sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - escodegen@^1.8.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" @@ -4511,29 +4544,17 @@ expect.js@~0.2.0: resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.2.0.tgz#1028533d2c1c363f74a6796ff57ec0520ded2be1" integrity sha1-EChTPSwcNj90pnlv9X7AUg3tK+E= -expect@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" - integrity sha512-orfQQqFRTX0jH7znRIGi8ZMR8kTNpXklTTz8+HGTpmTKZo3Occ6JNB5FXMb8cRuiiC/GyDqsr30zUa66ACYlYw== - dependencies: - ansi-styles "^3.2.0" - jest-diff "^21.2.1" - jest-get-type "^21.2.0" - jest-matcher-utils "^21.2.1" - jest-message-util "^21.2.1" - jest-regex-util "^21.2.0" - -expect@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.2.0.tgz#53a7e135e36fe27e75867b1178ff08aaacc2b0dd" - integrity sha1-U6fhNeNv4n51hnsReP8IqqzCsN0= +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== dependencies: ansi-styles "^3.2.0" - jest-diff "^23.2.0" + jest-diff "^23.6.0" jest-get-type "^22.1.0" - jest-matcher-utils "^23.2.0" - jest-message-util "^23.2.0" - jest-regex-util "^23.0.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" express@^4.16.2: version "4.16.3" @@ -4571,13 +4592,6 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= - dependencies: - kind-of "^1.1.0" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4667,7 +4681,7 @@ falafel@^2.1.0: isarray "0.0.1" object-keys "^1.0.6" -fancy-log@^1.1.0, fancy-log@^1.3.2: +fancy-log@1.3.2, fancy-log@^1.1.0, fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E= @@ -4720,7 +4734,7 @@ fbemitter@^2.0.0: dependencies: fbjs "^0.8.4" -fbjs@^0.8.0, fbjs@^0.8.4, fbjs@^0.8.9: +fbjs@^0.8.0, fbjs@^0.8.4: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" integrity sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s= @@ -4838,11 +4852,6 @@ find-cache-dir@^2.0.0: make-dir "^1.0.0" pkg-dir "^3.0.0" -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -4851,7 +4860,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -4886,11 +4895,6 @@ fined@^1.0.1: object.pick "^1.2.0" parse-filepath "^1.0.1" -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= - first-chunk-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" @@ -4908,7 +4912,7 @@ flatten@^1.0.2: resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= -flush-write-stream@^1.0.0: +flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== @@ -5066,6 +5070,14 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -5140,13 +5152,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= - dependencies: - globule "~0.1.0" - gaze@^1.0.0, gaze@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" @@ -5270,31 +5275,33 @@ glob-parent@^3.0.1, glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= dependencies: - gaze "^0.5.1" + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= +glob-watcher@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" + integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== dependencies: - find-index "^0.1.1" + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" @@ -5308,16 +5315,6 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -5340,15 +5337,6 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5400,15 +5388,6 @@ globule@^1.0.0: lodash "~4.17.4" minimatch "~3.0.2" -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - glogg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" @@ -5433,23 +5412,16 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg= - dependencies: - natives "^1.1.0" +graceful-fs@^4.0.0: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= - gray-matter@^3.0.8: version "3.1.1" resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-3.1.1.tgz#101f80d9e69eeca6765cdce437705b18f40876ac" @@ -5483,30 +5455,31 @@ gulp-batch@^1.0.5: async-done "^1.0.0" stream-array "^1.0.1" -gulp-less@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-3.5.0.tgz#8014f469ddfc6544d7dda50098def0371bbb4f78" - integrity sha512-FQLY7unaHdTOXG0jlwxeBQcWoPPrTMQZRA7HfYwSNi9IPVx5l7GJEN72mG4ri2yigp/f/VNGUAJnFMJHBmH3iw== - dependencies: - accord "^0.28.0" - less "2.6.x || ^2.7.1" - object-assign "^4.0.1" - plugin-error "^0.1.2" - replace-ext "^1.0.0" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-plumber@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.0.tgz#18ea03912c9ee483f8a5499973b5954cd90f6ad8" - integrity sha512-L/LJftsbKoHbVj6dN5pvMsyJn9jYI0wT0nMg3G6VZhDac4NesezecYTi8/48rHi+yEic3sUpw6jlSc7qNWh32A== +gulp-cli@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.0.1.tgz#7847e220cb3662f2be8a6d572bf14e17be5a994b" + integrity sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ== dependencies: - chalk "^1.1.3" + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" fancy-log "^1.3.2" - plugin-error "^0.1.2" - through2 "^2.0.3" + gulplog "^1.0.0" + interpret "^1.1.0" + isobject "^3.0.1" + liftoff "^2.5.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.0.1" + yargs "^7.1.0" -gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@^3.0.8: +gulp-util@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= @@ -5530,40 +5503,33 @@ gulp-util@^3.0.0, gulp-util@^3.0.7, gulp-util@^3.0.8: through2 "^2.0.0" vinyl "^0.5.0" -gulp-watch@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp-watch/-/gulp-watch-5.0.0.tgz#6fb03ab1735972e0d2866475b568555836dfd0eb" - integrity sha512-q+HLppxXd11z9ndqql4Z0sd5xOAesJjycl0PRaq6ImK7b1BqBRL37YvxEE8ngUdIfpfHa0O9OCoovoggcFpCaQ== +gulp-watch@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gulp-watch/-/gulp-watch-5.0.1.tgz#83d378752f5bfb46da023e73c17ed1da7066215d" + integrity sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog== dependencies: + ansi-colors "1.1.0" anymatch "^1.3.0" chokidar "^2.0.0" + fancy-log "1.3.2" glob-parent "^3.0.1" - gulp-util "^3.0.7" object-assign "^4.1.0" path-is-absolute "^1.0.1" + plugin-error "1.0.1" readable-stream "^2.2.2" slash "^1.0.0" vinyl "^2.1.0" vinyl-file "^2.0.0" -gulp@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= +gulp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.0.tgz#95766c601dade4a77ed3e7b2b6dc03881b596366" + integrity sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y= dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" + glob-watcher "^5.0.0" + gulp-cli "^2.0.0" + undertaker "^1.0.0" + vinyl-fs "^3.0.0" gulplog@^1.0.0: version "1.0.0" @@ -5596,11 +5562,6 @@ handlebars@^4.0.1, handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -5616,14 +5577,6 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -5844,7 +5797,7 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" integrity sha1-ZouTd26q5V696POtRkswekljYl4= -html-encoding-sniffer@^1.0.1, html-encoding-sniffer@^1.0.2: +html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== @@ -6022,11 +5975,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -6091,11 +6039,6 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= -indx@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" - integrity sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA= - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6104,11 +6047,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= - inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -6163,7 +6101,7 @@ inquirer@~3.3.0: strip-ansi "^4.0.0" through "^2.3.6" -interpret@^1.0.0, interpret@^1.1.0: +interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= @@ -6410,6 +6348,11 @@ is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -6553,11 +6496,16 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" -is-utf8@^0.2.0: +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6615,7 +6563,7 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^1.1.1, istanbul-api@^1.3.1: +istanbul-api@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" integrity sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g== @@ -6633,7 +6581,7 @@ istanbul-api@^1.1.1, istanbul-api@^1.3.1: mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: +istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" integrity sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A== @@ -6645,7 +6593,7 @@ istanbul-lib-hook@^1.2.0: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.4.2: +istanbul-lib-instrument@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" integrity sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ== @@ -6668,17 +6616,6 @@ istanbul-lib-report@^1.1.4: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" - integrity sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA== - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - istanbul-lib-source-maps@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" @@ -6717,59 +6654,17 @@ istanbul@^0.4.2: which "^1.1.1" wordwrap "^1.0.0" -jest-changed-files@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" - integrity sha512-+lCNP1IZLwN1NOIvBcV5zEL6GENK6TXrDj4UxWIeLvIsIDa+gf6J7hkqsW2qVVt/wvH65rVvcPwqXdps5eclTQ== - dependencies: - throat "^4.0.0" - -jest-changed-files@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.2.0.tgz#a145a6e4b66d0129fc7c99cee134dc937a643d9c" - integrity sha1-oUWm5LZtASn8fJnO4TTck3pkPZw= +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" + integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== dependencies: throat "^4.0.0" -jest-cli@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" - integrity sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - istanbul-api "^1.1.1" - istanbul-lib-coverage "^1.0.1" - istanbul-lib-instrument "^1.4.2" - istanbul-lib-source-maps "^1.1.0" - jest-changed-files "^21.2.0" - jest-config "^21.2.1" - jest-environment-jsdom "^21.2.1" - jest-haste-map "^21.2.0" - jest-message-util "^21.2.1" - jest-regex-util "^21.2.0" - jest-resolve-dependencies "^21.2.0" - jest-runner "^21.2.1" - jest-runtime "^21.2.1" - jest-snapshot "^21.2.1" - jest-util "^21.2.1" - micromatch "^2.3.11" - node-notifier "^5.0.2" - pify "^3.0.0" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - worker-farm "^1.3.1" - yargs "^9.0.0" - -jest-cli@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.2.0.tgz#3b543a3da5145dd8937931017282379fc696c45b" - integrity sha1-O1Q6PaUUXdiTeTEBcoI3n8aWxFs= +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -6782,22 +6677,22 @@ jest-cli@^23.2.0: istanbul-lib-coverage "^1.2.0" istanbul-lib-instrument "^1.10.1" istanbul-lib-source-maps "^1.2.4" - jest-changed-files "^23.2.0" - jest-config "^23.2.0" - jest-environment-jsdom "^23.2.0" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" jest-get-type "^22.1.0" - jest-haste-map "^23.2.0" - jest-message-util "^23.2.0" - jest-regex-util "^23.0.0" - jest-resolve-dependencies "^23.2.0" - jest-runner "^23.2.0" - jest-runtime "^23.2.0" - jest-snapshot "^23.2.0" - jest-util "^23.2.0" - jest-validate "^23.2.0" - jest-watcher "^23.2.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" jest-worker "^23.2.0" - micromatch "^3.1.10" + micromatch "^2.3.11" node-notifier "^5.2.1" prompts "^0.1.9" realpath-native "^1.0.0" @@ -6808,66 +6703,35 @@ jest-cli@^23.2.0: which "^1.2.12" yargs "^11.0.0" -jest-config@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" - integrity sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A== - dependencies: - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^21.2.1" - jest-environment-node "^21.2.1" - jest-get-type "^21.2.0" - jest-jasmine2 "^21.2.1" - jest-regex-util "^21.2.0" - jest-resolve "^21.2.0" - jest-util "^21.2.1" - jest-validate "^21.2.1" - pretty-format "^21.2.1" - -jest-config@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.2.0.tgz#d2fb556fd5a2a19c39eb56d139dcca5dad2a1c88" - integrity sha1-0vtVb9WioZw561bROdzKXa0qHIg= +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== dependencies: babel-core "^6.0.0" - babel-jest "^23.2.0" + babel-jest "^23.6.0" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^23.2.0" - jest-environment-node "^23.2.0" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" jest-get-type "^22.1.0" - jest-jasmine2 "^23.2.0" - jest-regex-util "^23.0.0" - jest-resolve "^23.2.0" - jest-util "^23.2.0" - jest-validate "^23.2.0" - pretty-format "^23.2.0" - -jest-diff@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" - integrity sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA== - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^21.2.0" - pretty-format "^21.2.1" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" -jest-diff@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.2.0.tgz#9f2cf4b51e12c791550200abc16b47130af1062a" - integrity sha1-nyz0tR4Sx5FVAgCrwWtHEwrxBio= +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^22.1.0" - pretty-format "^23.2.0" - -jest-docblock@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" - integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== + pretty-format "^23.6.0" jest-docblock@^23.2.0: version "23.2.0" @@ -6876,274 +6740,145 @@ jest-docblock@^23.2.0: dependencies: detect-newline "^2.1.0" -jest-each@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.2.0.tgz#a400f81c857083f50c4f53399b109f12023fb19d" - integrity sha1-pAD4HIVwg/UMT1M5mxCfEgI/sZ0= +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== dependencies: chalk "^2.0.1" - pretty-format "^23.2.0" - -jest-environment-jsdom@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" - integrity sha512-mecaeNh0eWmzNrUNMWARysc0E9R96UPBamNiOCYL28k7mksb1d0q6DD38WKP7ABffjnXyUWJPVaWRgUOivwXwg== - dependencies: - jest-mock "^21.2.0" - jest-util "^21.2.1" - jsdom "^9.12.0" + pretty-format "^23.6.0" -jest-environment-jsdom@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.2.0.tgz#3634603a08a975b0ca8a658320f56a54a8e04558" - integrity sha1-NjRgOgipdbDKimWDIPVqVKjgRVg= +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= dependencies: jest-mock "^23.2.0" - jest-util "^23.2.0" + jest-util "^23.4.0" jsdom "^11.5.1" -jest-environment-node@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" - integrity sha512-R211867wx9mVBVHzrjGRGTy5cd05K7eqzQl/WyZixR/VkJ4FayS8qkKXZyYnwZi6Rxo6WEV81cDbiUx/GfuLNw== - dependencies: - jest-mock "^21.2.0" - jest-util "^21.2.1" - -jest-environment-node@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.2.0.tgz#b6fe41372e382093bb6f3d9bdf6c1c4ec0a50f18" - integrity sha1-tv5BNy44IJO7bz2b32wcTsClDxg= +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= dependencies: jest-mock "^23.2.0" - jest-util "^23.2.0" - -jest-get-type@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" - integrity sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q== + jest-util "^23.4.0" jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== -jest-haste-map@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" - integrity sha512-5LhsY/loPH7wwOFRMs+PT4aIAORJ2qwgbpMFlbWbxfN0bk3ZCwxJ530vrbSiTstMkYLao6JwBkLhCJ5XbY7ZHw== - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - jest-docblock "^21.2.0" - micromatch "^2.3.11" - sane "^2.0.0" - worker-farm "^1.3.1" - -jest-haste-map@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.2.0.tgz#d10cbac007c695948c8ef1821a2b2ed2d4f2d4d8" - integrity sha1-0Qy6wAfGlZSMjvGCGisu0tTy1Ng= +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" + invariant "^2.2.4" jest-docblock "^23.2.0" jest-serializer "^23.0.1" jest-worker "^23.2.0" - micromatch "^3.1.10" + micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" - integrity sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A== - dependencies: - chalk "^2.0.1" - expect "^21.2.1" - graceful-fs "^4.1.11" - jest-diff "^21.2.1" - jest-matcher-utils "^21.2.1" - jest-message-util "^21.2.1" - jest-snapshot "^21.2.1" - p-cancelable "^0.3.0" - -jest-jasmine2@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.2.0.tgz#aa670cdb1e4d5f8ec774c94dda5e105fe33d8bb4" - integrity sha1-qmcM2x5NX47HdMlN2l4QX+M9i7Q= +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== dependencies: + babel-traverse "^6.0.0" chalk "^2.0.1" co "^4.6.0" - expect "^23.2.0" + expect "^23.6.0" is-generator-fn "^1.0.0" - jest-diff "^23.2.0" - jest-each "^23.2.0" - jest-matcher-utils "^23.2.0" - jest-message-util "^23.2.0" - jest-snapshot "^23.2.0" - jest-util "^23.2.0" - pretty-format "^23.2.0" - -jest-leak-detector@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz#c289d961dc638f14357d4ef96e0431ecc1aa377d" - integrity sha1-wonZYdxjjxQ1fU75bgQx7MGqN30= - dependencies: - pretty-format "^23.2.0" - -jest-matcher-utils@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" - integrity sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg== - dependencies: - chalk "^2.0.1" - jest-get-type "^21.2.0" - pretty-format "^21.2.1" - -jest-matcher-utils@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz#4d4981f23213e939e3cedf23dc34c747b5ae1913" - integrity sha1-TUmB8jIT6Tnjzt8j3DTHR7WuGRM= + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-message-util@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" - integrity sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ== - dependencies: - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - -jest-message-util@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.2.0.tgz#591e8148fff69cf89b0414809c721756ebefe744" - integrity sha1-WR6BSP/2nPibBBSAnHIXVuvv50Q= +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= dependencies: "@babel/code-frame" "^7.0.0-beta.35" chalk "^2.0.1" - micromatch "^3.1.10" + micromatch "^2.3.11" slash "^1.0.0" stack-utils "^1.0.1" -jest-mock@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" - integrity sha512-aZDfyVf0LEoABWiY6N0d+O963dUQSyUa4qgzurHR3TBDPen0YxKCJ6l2i7lQGh1tVdsuvdrCZ4qPj+A7PievCw== - jest-mock@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= -jest-regex-util@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" - integrity sha512-BKQ1F83EQy0d9Jen/mcVX7D+lUt2tthhK/2gDWRgLDJRNOdRgSp1iVqFxP8EN1ARuypvDflRfPzYT8fQnoBQFQ== - -jest-regex-util@^23.0.0: - version "23.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.0.0.tgz#dd5c1fde0c46f4371314cf10f7a751a23f4e8f76" - integrity sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y= - -jest-resolve-dependencies@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" - integrity sha512-ok8ybRFU5ScaAcfufIQrCbdNJSRZ85mkxJ1EhUp8Bhav1W1/jv/rl1Q6QoVQHObNxmKnbHVKrfLZbCbOsXQ+bQ== - dependencies: - jest-regex-util "^21.2.0" - -jest-resolve-dependencies@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.2.0.tgz#6df8d5709c6406639cd07f54bff074e01b5c0458" - integrity sha1-bfjVcJxkBmOc0H9Uv/B04BtcBFg= - dependencies: - jest-regex-util "^23.0.0" - jest-snapshot "^23.2.0" +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= -jest-resolve@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" - integrity sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw== +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" - is-builtin-module "^1.0.0" + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" -jest-resolve@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.2.0.tgz#a0790ad5a3b99002ab4dbfcbf8d9e2d6a69b3d99" - integrity sha1-oHkK1aO5kAKrTb/L+Nni1qabPZk= +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== dependencies: browser-resolve "^1.11.3" chalk "^2.0.1" realpath-native "^1.0.0" -jest-runner@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" - integrity sha512-Anb72BOQlHqF/zETqZ2K20dbYsnqW/nZO7jV8BYENl+3c44JhMrA8zd1lt52+N7ErnsQMd2HHKiVwN9GYSXmrg== - dependencies: - jest-config "^21.2.1" - jest-docblock "^21.2.0" - jest-haste-map "^21.2.0" - jest-jasmine2 "^21.2.1" - jest-message-util "^21.2.1" - jest-runtime "^21.2.1" - jest-util "^21.2.1" - pify "^3.0.0" - throat "^4.0.0" - worker-farm "^1.3.1" - -jest-runner@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.2.0.tgz#0d91967ea82f72b0c705910926086d2055ce75af" - integrity sha1-DZGWfqgvcrDHBZEJJghtIFXOda8= +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== dependencies: exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^23.2.0" + jest-config "^23.6.0" jest-docblock "^23.2.0" - jest-haste-map "^23.2.0" - jest-jasmine2 "^23.2.0" - jest-leak-detector "^23.2.0" - jest-message-util "^23.2.0" - jest-runtime "^23.2.0" - jest-util "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" jest-worker "^23.2.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" - integrity sha512-6omlpA3+NSE+rHwD0PQjNEjZeb2z+oRmuehMfM1tWQVum+E0WV3pFt26Am0DUfQkkPyTABvxITRjCUclYgSOsA== - dependencies: - babel-core "^6.0.0" - babel-jest "^21.2.0" - babel-plugin-istanbul "^4.0.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - graceful-fs "^4.1.11" - jest-config "^21.2.1" - jest-haste-map "^21.2.0" - jest-regex-util "^21.2.0" - jest-resolve "^21.2.0" - jest-util "^21.2.1" - json-stable-stringify "^1.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^9.0.0" - -jest-runtime@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.2.0.tgz#62dcb01766a1c4c64696dc090209e76ce1aadcbc" - integrity sha1-YtywF2ahxMZGltwJAgnnbOGq3Lw= +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.1.6" @@ -7152,15 +6887,15 @@ jest-runtime@^23.2.0: exit "^0.1.2" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^23.2.0" - jest-haste-map "^23.2.0" - jest-message-util "^23.2.0" - jest-regex-util "^23.0.0" - jest-resolve "^23.2.0" - jest-snapshot "^23.2.0" - jest-util "^23.2.0" - jest-validate "^23.2.0" - micromatch "^3.1.10" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" realpath-native "^1.0.0" slash "^1.0.0" strip-bom "3.0.0" @@ -7172,81 +6907,50 @@ jest-serializer@^23.0.1: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= -jest-snapshot@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" - integrity sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg== +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== dependencies: + babel-types "^6.0.0" chalk "^2.0.1" - jest-diff "^21.2.1" - jest-matcher-utils "^21.2.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^21.2.1" - -jest-snapshot@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.2.0.tgz#c7a3d017177bbad60c8a595869cf90a8782e6a7e" - integrity sha1-x6PQFxd7utYMillYac+QqHguan4= - dependencies: - chalk "^2.0.1" - jest-diff "^23.2.0" - jest-matcher-utils "^23.2.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^23.2.0" - -jest-util@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" - integrity sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g== - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - jest-message-util "^21.2.1" - jest-mock "^21.2.0" - jest-validate "^21.2.1" - mkdirp "^0.5.1" + pretty-format "^23.6.0" + semver "^5.5.0" -jest-util@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.2.0.tgz#62b770757696d96e094a04b8f1c373ca50a5ab2e" - integrity sha1-YrdwdXaW2W4JSgS48cNzylClqy4= +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= dependencies: callsites "^2.0.0" chalk "^2.0.1" graceful-fs "^4.1.11" is-ci "^1.0.10" - jest-message-util "^23.2.0" + jest-message-util "^23.4.0" mkdirp "^0.5.1" slash "^1.0.0" source-map "^0.6.0" -jest-validate@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" - integrity sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg== - dependencies: - chalk "^2.0.1" - jest-get-type "^21.2.0" - leven "^2.1.0" - pretty-format "^21.2.1" - -jest-validate@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.2.0.tgz#67c8b909e11af1701765238894c67ac3291b195e" - integrity sha1-Z8i5CeEa8XAXZSOIlMZ6wykbGV4= +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-watcher@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.2.0.tgz#678e852896e919e9d9a0eb4b8baf1ae279620ea9" - integrity sha1-Z46FKJbpGenZoOtLi68a4nliDqk= +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw= dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -7259,20 +6963,13 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" -jest@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" - integrity sha512-mXN0ppPvWYoIcC+R+ctKxAJ28xkt/Z5Js875padm4GbgUn6baeR5N4Ng6LjatIRpUQDZVJABT7Y4gucFjPryfw== - dependencies: - jest-cli "^21.2.1" - -jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-23.2.0.tgz#828bf31a096d45dcf06824d1ea03013af7bcfc20" - integrity sha1-govzGgltRdzwaCTR6gMBOve8/CA= +jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== dependencies: import-local "^1.0.0" - jest-cli "^23.2.0" + jest-cli "^23.6.0" js-base64@^2.1.8, js-base64@^2.1.9: version "2.4.3" @@ -7355,31 +7052,6 @@ jsdom@^11.5.1: ws "^4.0.0" xml-name-validator "^3.0.0" -jsdom@^9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" - integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= - dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" - array-equal "^1.0.0" - content-type-parser "^1.0.1" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.79.0" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.2" - webidl-conversions "^4.0.0" - whatwg-encoding "^1.0.1" - whatwg-url "^4.3.0" - xml-name-validator "^2.0.1" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -7415,7 +7087,7 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= @@ -7526,6 +7198,11 @@ jss@^9.3.3: symbol-observable "^1.1.0" warning "^3.0.0" +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + kdbush@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-2.0.1.tgz#90c6128e3001ac68c550d7c9e2f222c0269666f1" @@ -7546,11 +7223,6 @@ keycode@^2.1.9, keycode@^2.2.0: resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" integrity sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ= -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -7575,6 +7247,14 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -7613,25 +7293,18 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + left-pad@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== -"less@2.6.x || ^2.7.1": - version "2.7.3" - resolved "https://registry.yarnpkg.com/less/-/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b" - integrity sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ== - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - mime "^1.2.11" - mkdirp "^0.5.0" - promise "^7.1.1" - request "2.81.0" - source-map "^0.5.3" - leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -7661,7 +7334,7 @@ lie@3.1.1: dependencies: immediate "~3.0.5" -liftoff@^2.1.0: +liftoff@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= @@ -7686,16 +7359,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -7808,11 +7471,6 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= -lodash.clone@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= - lodash.clonedeep@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -7828,11 +7486,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - lodash.escape@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" @@ -7840,11 +7493,6 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -7884,26 +7532,11 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.4.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== - lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== -lodash.partialright@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" - integrity sha1-ATDYDoM2MmTUAHTzKbij56ihzEs= - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -7942,7 +7575,7 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" -lodash.uniq@^4.3.0, lodash.uniq@^4.5.0: +lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= @@ -7952,11 +7585,6 @@ lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lo resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= - loglevel@^1.4.1, loglevel@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" @@ -8009,11 +7637,6 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" @@ -8116,6 +7739,16 @@ mapbox-gl@0.47.0: tinyqueue "^1.1.0" vt-pbf "^3.0.1" +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + material-colors@^1.2.1: version "1.2.5" resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1" @@ -8261,7 +7894,7 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -8305,11 +7938,6 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^1.2.11: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -8345,21 +7973,6 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= - dependencies: - brace-expansion "^1.0.0" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimist@0.0.5: version "0.0.5" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" @@ -8482,11 +8095,6 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -moxios@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/moxios/-/moxios-0.4.0.tgz#fc0da2c65477d725ca6b9679d58370ed0c52f53b" - integrity sha1-/A2ixlR31yXKa5Z51YNw7QxS9Ts= - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -8504,6 +8112,11 @@ multipipe@^0.1.2: dependencies: duplexer2 "0.0.2" +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -8532,15 +8145,10 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -natives@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.3.tgz#44a579be64507ea2d6ed1ca04a9415915cf75558" - integrity sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g== - -natives@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" - integrity sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg== +natives@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== natural-compare@^1.4.0: version "1.4.0" @@ -8576,6 +8184,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" @@ -8625,13 +8238,6 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-json-db@^0.7.3: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-json-db/-/node-json-db-0.7.5.tgz#9906eb6c0df504bd667ae829550c9823ea4cce4e" - integrity sha512-BTx8Dlhdq3s/2S5z76qobs88bmfGJ0vypzOo8Ba/15IcXoPwukV2bzBvE9nJM3InazQmkaxNUJFwFZTAexcvDA== - dependencies: - mkdirp "0.5.x" - node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" @@ -8661,7 +8267,7 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-notifier@^5.0.2, node-notifier@^5.2.1: +node-notifier@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== @@ -8813,6 +8419,13 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +now-and-later@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" + integrity sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4= + dependencies: + once "^1.3.2" + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" @@ -8878,7 +8491,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -"nwmatcher@>= 1.3.9 < 2.0.0", nwmatcher@^1.4.3: +nwmatcher@^1.4.3: version "1.4.4" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== @@ -8954,7 +8567,7 @@ object.assign@^4.0.4, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.defaults@^1.1.0: +object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= @@ -9005,6 +8618,14 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.values@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" @@ -9029,13 +8650,6 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= - dependencies: - wrappy "1" - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -9068,19 +8682,12 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= + readable-stream "^2.0.1" os-browserify@^0.3.0: version "0.3.0" @@ -9139,11 +8746,6 @@ output-file-sync@^2.0.0: is-plain-obj "^1.1.0" mkdirp "^0.5.1" -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -9282,11 +8884,6 @@ parse5@4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= - parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -9379,13 +8976,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - pbf@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.1.0.tgz#f70004badcb281761eabb1e76c92f179f08189e9" @@ -9410,11 +9000,6 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -9465,16 +9050,15 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= +plugin-error@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" pn@^1.1.0: version "1.1.0" @@ -9807,18 +9391,10 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^21.2.1: - version "21.2.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" - integrity sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017" - integrity sha1-OwqqY8AYpTWDNzwcs6XZbMXoMBc= +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" @@ -9916,11 +9492,6 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.28" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" - integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== - public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" @@ -9949,6 +9520,15 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -9997,11 +9577,6 @@ qs@~6.3.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" integrity sha1-51vV9uJoEioqDgvaYwslUMFmUCw= -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= - qs@~6.5.1: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -10363,13 +9938,12 @@ react-transition-group@^2.5.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-visibility-sensor@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/react-visibility-sensor/-/react-visibility-sensor-3.11.0.tgz#2da089ccb18b33ec3539914b300b120684aff2e0" - integrity sha512-4ZLCYR50zGKH2WgsenuOaQTlCOkc69z882RaDGPpYAJqCY6ZXshzFhEuyv/LTPwoj6VBt8sSJRdvg0x+TeuyQA== +react-visibility-sensor@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/react-visibility-sensor/-/react-visibility-sensor-5.0.2.tgz#e360fff81572cb3a2a9fd680484447a9da09a55d" + integrity sha512-7+1lr7oQOO2vKr5u/uxoDGFWAAy7lsDy2aJU3Zy1/OymI+TRqOBk8m2L8YE1B0UyfCDWxVAWO+aifVGqNOvqeQ== dependencies: - create-react-class "^15.5.1" - prop-types "^15.5.4" + prop-types "^15.6.2" react-windowed-list@^2.0.0: version "2.0.0" @@ -10422,14 +9996,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -10439,16 +10005,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -10461,7 +10018,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": +readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= @@ -10741,7 +10298,24 @@ remeasure@^3.0.1: raf "^3.3.2" resize-observer-polyfill "^1.5.0" -remove-trailing-separator@^1.0.1: +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= @@ -10784,6 +10358,15 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" @@ -10800,7 +10383,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2, request@2.x, request@^2.45.0, request@^2.79.0, request@^2.81.0, request@^2.83.0: +request@2, request@2.x, request@^2.45.0, request@^2.81.0, request@^2.83.0: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" integrity sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg== @@ -10828,34 +10411,6 @@ request@2, request@2.x, request@^2.45.0, request@^2.79.0, request@^2.81.0, reque tunnel-agent "^0.6.0" uuid "^3.1.0" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - request@~2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" @@ -10945,6 +10500,13 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" + resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" @@ -10967,14 +10529,14 @@ resolve@1.1.7, resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.5, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.1.5, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.5.0: +resolve@^1.1.6, resolve@^1.1.7: version "1.7.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== @@ -11162,7 +10724,7 @@ sass-loader@^7.1.0: pify "^3.0.0" semver "^5.5.0" -sax@>=0.6.0, sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11217,16 +10779,18 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= - semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -11256,11 +10820,6 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= - serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" @@ -11384,11 +10943,6 @@ shuffle-seed@^1.1.6: dependencies: seedrandom "^2.4.2" -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -11536,7 +11090,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -11662,6 +11216,11 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" @@ -11749,11 +11308,6 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-consume@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" - integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg== - stream-each@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" @@ -11869,19 +11423,11 @@ strip-bom-string@^1.0.0: resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= -strip-bom@3.0.0, strip-bom@^3.0.0: +strip-bom@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -11954,6 +11500,14 @@ supports-color@~5.0.0: dependencies: has-flag "^2.0.0" +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -11977,7 +11531,7 @@ symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.1, symbol-tree@^3.2.2: +symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= @@ -12060,13 +11614,13 @@ throttleit@0.0.2: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" + through2 "~2.0.0" + xtend "~4.0.0" through2@^2.0.0, through2@^2.0.3, through2@~2.0.3: version "2.0.3" @@ -12084,18 +11638,19 @@ through2@~0.2.3: readable-stream "~1.1.9" xtend "~2.1.1" +through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + through@2, through@^2.3.6, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= - dependencies: - os-homedir "^1.0.0" - time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" @@ -12135,6 +11690,14 @@ tmpl@1.0.x: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -12180,6 +11743,13 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + toggle-selection@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" @@ -12197,14 +11767,6 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2. dependencies: punycode "^1.4.1" -tough-cookie@^2.3.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.2.tgz#aa9133154518b494efab98a58247bfc38818c00c" - integrity sha512-vahm+X8lSV/KjXziec8x5Vp0OTC9mq8EVCOApIsRAooeuMPSO8aT7PFACYkaL0yZ/3hVqw+8DzhCJwl8H2Ad6w== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -12212,11 +11774,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -12350,7 +11907,7 @@ uglify-js@3.3.x: commander "~2.15.0" source-map "~0.6.1" -uglify-js@^2.6, uglify-js@^2.8.22: +uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= @@ -12408,6 +11965,26 @@ underscore@~1.6.0: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.0.tgz#339da4646252d082dc378e708067299750e11b49" + integrity sha1-M52kZGJS0ILcN45wgGcpl1DhG0k= + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -12472,10 +12049,13 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + integrity sha1-WqADz76Uxf+GbE59ZouxxNuts2k= + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" unique-string@^1.0.0: version "1.0.0" @@ -12587,11 +12167,6 @@ use@^3.1.0: dependencies: kind-of "^6.0.2" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" @@ -12642,12 +12217,12 @@ v8-compile-cache@^2.0.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= +v8flags@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.1.tgz#42259a1461c08397e37fe1d4f1cfb59cad85a053" + integrity sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ== dependencies: - user-home "^1.1.1" + homedir-polyfill "^1.0.1" validate-npm-package-license@^3.0.1: version "3.0.3" @@ -12662,6 +12237,11 @@ value-equal@^0.4.0: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -12709,34 +12289,41 @@ vinyl-file@^2.0.0: strip-bom-stream "^2.0.0" vinyl "^1.1.0" -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== dependencies: - source-map "^0.5.1" + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" -vinyl@^0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" vinyl@^0.5.0: version "0.5.3" @@ -12756,7 +12343,7 @@ vinyl@^1.1.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vinyl@^2.1.0: +vinyl@^2.0.0, vinyl@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== @@ -12871,12 +12458,7 @@ webdriverio@^4.8.0: wdio-dot-reporter "~0.0.8" wgxpath "~1.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^4.0.0, webidl-conversions@^4.0.2: +webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== @@ -12982,14 +12564,6 @@ whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== -whatwg-url@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" - integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" @@ -12999,11 +12573,6 @@ whatwg-url@^6.4.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -when@^3.7.8: - version "3.7.8" - resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" - integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I= - whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" @@ -13060,7 +12629,7 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -worker-farm@^1.3.1, worker-farm@^1.5.2: +worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== @@ -13122,11 +12691,6 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -13155,7 +12719,7 @@ xregexp@4.0.0: resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -13201,13 +12765,6 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -13269,7 +12826,7 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^7.0.0: +yargs@^7.0.0, yargs@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= @@ -13288,25 +12845,6 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" -yargs@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From a751e63dc2e410e9b5a59550a3f89e9210dd3d2d Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Fri, 14 Dec 2018 21:26:29 +0100 Subject: [PATCH 10/61] Fix crypto worker --- src/react/Functions/Crypto/CryptoWorkerWrapper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/Functions/Crypto/CryptoWorkerWrapper.js b/src/react/Functions/Crypto/CryptoWorkerWrapper.js index 04ce0e3d..ba727a11 100644 --- a/src/react/Functions/Crypto/CryptoWorkerWrapper.js +++ b/src/react/Functions/Crypto/CryptoWorkerWrapper.js @@ -1,5 +1,5 @@ import store from "store"; -const CryptoWorker = require("react/WebWorkers/crypto.worker.js"); +const CryptoWorker = require("worker-loader!../../WebWorkers/crypto.worker.js"); /** * Decrypt data stored in a specific location From 3acef014db700ea9666d3b1f4c9fed523fbe12d5 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Fri, 14 Dec 2018 21:35:17 +0100 Subject: [PATCH 11/61] Fix event count after filter for queue --- src/react/Components/Queue/QueueManager.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/Components/Queue/QueueManager.jsx b/src/react/Components/Queue/QueueManager.jsx index 7167ab82..3ed67ed2 100644 --- a/src/react/Components/Queue/QueueManager.jsx +++ b/src/react/Components/Queue/QueueManager.jsx @@ -395,7 +395,7 @@ class QueueManager extends React.Component { // more payments can be loaded for this account if ( - paymentsNew.length === currentEventCount && + payments.length === currentEventCount && nextEventCount > 0 && totalEventCount < EVENT_TOTAL_LIMIT ) { From bb4aef7d2085834b7711257367b984147fa5c43e Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 15 Dec 2018 00:38:36 +0100 Subject: [PATCH 12/61] Implement image uploads for monetary accounts --- src/react/Actions/accounts.js | 53 +++++++++++++++++++++++++++ src/react/Components/AccountCard.jsx | 55 ++++++++++++++++++++-------- src/react/Locales/en.json | 3 ++ 3 files changed, 95 insertions(+), 16 deletions(-) diff --git a/src/react/Actions/accounts.js b/src/react/Actions/accounts.js index 7ee1aa70..2c0712ba 100644 --- a/src/react/Actions/accounts.js +++ b/src/react/Actions/accounts.js @@ -111,6 +111,59 @@ export function createAccount( }; } +export function accountsUpdateImage( + BunqJSClient, + userId, + accountId, + attachmentId, + accountType = "MonetaryAccountBank" +) { + const failedMessage = window.t("We received the following error while updating the image for account"); + const successMessage = window.t("Image updated successfully!"); + + return dispatch => { + dispatch(createAccountLoading()); + + // make the image public + BunqJSClient.api.avatar + .post(attachmentId) + .then(avatarUuid => { + const putRequest = { + avatar_uuid: avatarUuid + }; + + let apiPromise; + switch (accountType) { + case "MonetaryAccountSavings": + apiPromise = BunqJSClient.api.monetaryAccountSavings.put(userId, accountId, putRequest); + break; + case "MonetaryAccountJoint": + apiPromise = BunqJSClient.api.monetaryAccountJoint.put(userId, accountId, putRequest); + break; + case "MonetaryAccountBank": + default: + apiPromise = BunqJSClient.api.monetaryAccountBank.put(userId, accountId, putRequest); + break; + } + + apiPromise + .then(result => { + dispatch(openSnackbar(successMessage)); + dispatch(accountsUpdate(BunqJSClient, userId)); + dispatch(createAccountNotLoading()); + }) + .catch(error => { + dispatch(createAccountNotLoading()); + BunqErrorHandler(dispatch, error, failedMessage); + }); + }) + .catch(error => { + dispatch(createAccountNotLoading()); + BunqErrorHandler(dispatch, error, failedMessage); + }); + }; +} + export function accountsDeactivate(BunqJSClient, userId, accountId, reason, accountType = "MonetaryAccountBank") { const failedMessage = window.t("We received the following error while deactivating your account"); const successMessage = window.t("Account deactivated successfully!"); diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index aed1f382..2712af6c 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -1,4 +1,5 @@ import React from "react"; +import { connect } from "react-redux"; import { CopyToClipboard } from "react-copy-to-clipboard"; import List from "@material-ui/core/List"; import ListItem from "@material-ui/core/ListItem"; @@ -25,6 +26,8 @@ import AccountQRFullscreen from "./QR/AccountQRFullscreen"; import { formatMoney, formatIban } from "../Functions/Utils"; import { connectGetBudget } from "../Functions/ConnectGetPermissions"; +import { openSnackbar } from "../Actions/snackbar"; +import { accountsUpdateImage } from "../Actions/accounts"; const styles = { avatar: { @@ -48,17 +51,17 @@ class AccountCard extends React.Component { }; } - componentDidMount(){ - this.handleFileUpload("aa8aa19c-c4a1-45b4-8df1-15b32b228208") - } - copiedValue = type => callback => { this.props.openSnackbar(`Copied ${type} to your clipboard`); }; handleFileUpload = fileUUID => { + const { user, account } = this.props; this.toggleFileUploadDialog(); - console.log("File upload", fileUUID); + + if (fileUUID) { + this.props.accountsUpdateImage(user.id, account.id, fileUUID, account.accountType); + } }; toggleFileUploadDialog = () => { @@ -68,7 +71,7 @@ class AccountCard extends React.Component { }; render() { - const { account, hideBalance } = this.props; + const { account, hideBalance, shareInviteBankResponses } = this.props; let formattedBalance = account.balance ? account.balance.value : 0; if (this.props.shareInviteBankResponses.length > 0) { @@ -104,17 +107,25 @@ class AccountCard extends React.Component { - this.setState({ - displayUploadScreen: true - }) + style={ + shareInviteBankResponses.length > 0 + ? styles.avatar + : { ...styles.avatar, cursor: "pointer" } + } + onClick={ + shareInviteBankResponses.length > 0 + ? () => {} + : _ => + this.setState({ + displayUploadScreen: true + }) } > 0 ? {} : { cursor: "pointer" }} />
{ + return { + user: state.user.user + }; +}; + +const mapDispatchToProps = (dispatch, props) => { + const { BunqJSClient } = props; + return { + openSnackbar: message => dispatch(openSnackbar(message)), + accountsUpdateImage: (userId, accountId, attachmentId, accountType) => + dispatch(accountsUpdateImage(BunqJSClient, userId, accountId, attachmentId, accountType)) + }; }; -export default AccountCard; +export default connect( + mapStateToProps, + mapDispatchToProps +)(AccountCard); diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index e3b079d7..1ad917c4 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -215,6 +215,7 @@ "Failed to reject the share request": "Failed to reject the share request", "Failed to revoke the share request": "Failed to revoke the share request", "Failed to store the export file at ": "Failed to store the export file at ", + "Failed to upload image": "Failed to upload image", "Failed to validate the authentication tokens": "Failed to validate the authentication tokens", "Filter": "Filter", "Filter by amount": "Filter by amount", @@ -239,6 +240,7 @@ "IBAN": "IBAN", "IBAN name": "IBAN name", "IBAN number": "IBAN number", + "Image updated successfully!": "Image updated successfully!", "Import": "Import", "Import as new": "Import as new", "Import categories": "Import categories", @@ -581,6 +583,7 @@ "We received the following error while trying to accept your request response": "We received the following error while trying to accept your request response", "We received the following error while trying to cancel the request": "We received the following error while trying to cancel the request", "We received the following error while trying to cancel your request inquiry": "We received the following error while trying to cancel your request inquiry", + "We received the following error while updating the image for account": "We received the following error while updating the image for account", "We received the following error while updating your bunqme request": "We received the following error while updating your bunqme request", "We received the following error while updating your connect request": "We received the following error while updating your connect request", "Weekly": "Weekly", From 66cbbccc2c571bd06bf9e00e323ab3c83d7f89af Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 15 Dec 2018 14:14:01 +0100 Subject: [PATCH 13/61] Add image functionality to user profile page --- package.json | 2 +- src/react/Actions/accounts.js | 10 +-- src/react/Actions/user.js | 42 +++++++++++++ src/react/Components/AccountCard.jsx | 4 +- .../FileUpload/UploadFullscreen.jsx | 2 +- src/react/Locales/en.json | 3 +- src/react/Pages/Profile/Profile.jsx | 62 ++++++++++++++++++- yarn.lock | 8 +-- 8 files changed, 117 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 16c757cd..61000202 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@bunq-community/bunq-js-client": "^0.36.1", + "@bunq-community/bunq-js-client": "^0.36.2", "@bunq-community/bunqdesktop-templates": "^1.2.0", "@fortawesome/fontawesome-free": "^5.2.0", "@material-ui/core": "^3.5.1", diff --git a/src/react/Actions/accounts.js b/src/react/Actions/accounts.js index 2c0712ba..cf7870de 100644 --- a/src/react/Actions/accounts.js +++ b/src/react/Actions/accounts.js @@ -118,11 +118,11 @@ export function accountsUpdateImage( attachmentId, accountType = "MonetaryAccountBank" ) { - const failedMessage = window.t("We received the following error while updating the image for account"); + const failedMessage = window.t("We received the following error while updating the image for the monetary account"); const successMessage = window.t("Image updated successfully!"); return dispatch => { - dispatch(createAccountLoading()); + dispatch(accountsLoading()); // make the image public BunqJSClient.api.avatar @@ -150,15 +150,15 @@ export function accountsUpdateImage( .then(result => { dispatch(openSnackbar(successMessage)); dispatch(accountsUpdate(BunqJSClient, userId)); - dispatch(createAccountNotLoading()); + dispatch(accountsNotLoading()); }) .catch(error => { - dispatch(createAccountNotLoading()); + dispatch(accountsNotLoading()); BunqErrorHandler(dispatch, error, failedMessage); }); }) .catch(error => { - dispatch(createAccountNotLoading()); + dispatch(accountsNotLoading()); BunqErrorHandler(dispatch, error, failedMessage); }); }; diff --git a/src/react/Actions/user.js b/src/react/Actions/user.js index 5afd91ff..291cad10 100644 --- a/src/react/Actions/user.js +++ b/src/react/Actions/user.js @@ -1,5 +1,9 @@ import store from "store"; +import BunqErrorHandler from "../Functions/BunqErrorHandler"; + import { registrationClearUserInfo } from "./registration"; +import { openSnackbar } from "./snackbar"; +import { usersUpdate } from "./users"; const USER_ID_LOCATION = "BUNQDESKTOP_USER_ID"; @@ -24,3 +28,41 @@ export function userSetInfo(user, type) { }); }; } + +export function userUpdateImage(BunqJSClient, userId, attachmentId, userType = "UserPerson") { + const failedMessage = window.t("We received the following error while updating the image for your account"); + const successMessage = window.t("Image updated successfully!"); + + return dispatch => { + // make the image public + BunqJSClient.api.avatar + .post(attachmentId) + .then(avatarUuid => { + const putRequest = { + avatar_uuid: avatarUuid + }; + + let apiPromise; + switch (userType) { + case "UserPerson": + apiPromise = BunqJSClient.api.userPerson.put(userId, putRequest); + break; + case "UserCompany": + apiPromise = BunqJSClient.api.userPerson.put(userId, putRequest); + break; + } + + apiPromise + .then(result => { + dispatch(openSnackbar(successMessage)); + dispatch(usersUpdate(BunqJSClient, true)); + }) + .catch(error => { + BunqErrorHandler(dispatch, error, failedMessage); + }); + }) + .catch(error => { + BunqErrorHandler(dispatch, error, failedMessage); + }); + }; +} diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index 2712af6c..4055ca68 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -52,7 +52,9 @@ class AccountCard extends React.Component { } copiedValue = type => callback => { - this.props.openSnackbar(`Copied ${type} to your clipboard`); + if (type === "PHONE_NUMBER") type = "Phone number"; + if (type === "EMAIL") type = "Email"; + this.props.openSnackbar(window.t(`Copied ${type} to your clipboard`)); }; handleFileUpload = fileUUID => { diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx index f37df08b..b74c8be8 100644 --- a/src/react/Components/FileUpload/UploadFullscreen.jsx +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -95,7 +95,7 @@ class UploadFullscreen extends React.Component { render() { const { t } = this.props; - t("Failed to upload image") + t("Failed to upload image"); return ( { + const { user, userType } = this.props; + this.toggleFileUploadDialog(); + + if (fileUUID) { + this.props.userUpdateImage(user.id, fileUUID, userType); + } + }; + + toggleFileUploadDialog = () => { + this.setState({ + displayUploadScreen: !this.state.displayUploadScreen + }); + }; + updateSettings = data => { const { address_postal, address_main, public_nick_name } = data; @@ -156,7 +185,7 @@ class Profile extends React.Component { }; render() { - const { t, userType, userLoading } = this.props; + const { t, user, userType, userLoading } = this.props; const { totalBalance } = this.state; let content = null; @@ -242,7 +271,34 @@ class Profile extends React.Component { content = ( + + + + + + this.setState({ + displayUploadScreen: true + }) + } + > + + + + + + {this.state.normalizedUserInfo && ( { return { user: state.user.user, userType: state.user.user_type, - userType: state.user.user_type, userLoading: state.user.loading, accounts: state.accounts.accounts, accountsLoading: state.accounts.loading @@ -304,6 +359,7 @@ const mapDispatchToProps = (dispatch, ownProps) => { return { openSnackbar: message => dispatch(openSnackbar(message)), usersUpdate: updated => dispatch(usersUpdate(BunqJSClient, updated)), + userUpdateImage: (userId, attachmentId) => dispatch(userUpdateImage(BunqJSClient, userId, attachmentId)), BunqErrorHandler: (error, message) => BunqErrorHandler(dispatch, error, message) }; diff --git a/yarn.lock b/yarn.lock index d776441d..8c8f417d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -998,10 +998,10 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@bunq-community/bunq-js-client@^0.36.1": - version "0.36.1" - resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.36.1.tgz#c78c5474c01961c12cad622119c1ee5c9ac97ed0" - integrity sha512-/3vwu1ZN3kNpw2URxHqm7dTfeAFHvmxdth05ykI49W+p+sQ4YFiGSaPqO44VOpvGr4Is1x7NcVY6kpRmjtFTyw== +"@bunq-community/bunq-js-client@^0.36.2": + version "0.36.2" + resolved "https://registry.yarnpkg.com/@bunq-community/bunq-js-client/-/bunq-js-client-0.36.2.tgz#9338fc51ab5a108fa2058c8cf9428c4e78c30503" + integrity sha512-k45PfKk/tp1PrgCbmYdPgezJ4SlpmhGGP/BYem3Ar+DFhMpNjs6SaFBEtieZIbI8Z0MAbaTZk9dbW86jDYFDUw== dependencies: awaiting "^3.0.0" axios "^0.16.2" From 23c0cfe04345aa5315a0462a69eb9bd03c3d69a9 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 15 Dec 2018 14:23:16 +0100 Subject: [PATCH 14/61] Change upload screen behavior and disable button correctly --- src/react/Components/AccountCard.jsx | 1 - src/react/Components/FileUpload/UploadFullscreen.jsx | 4 ++++ src/react/Pages/Profile/Profile.jsx | 1 - 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index 4055ca68..b76ada25 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -59,7 +59,6 @@ class AccountCard extends React.Component { handleFileUpload = fileUUID => { const { user, account } = this.props; - this.toggleFileUploadDialog(); if (fileUUID) { this.props.accountsUpdateImage(user.id, account.id, fileUUID, account.accountType); diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx index b74c8be8..daf12f66 100644 --- a/src/react/Components/FileUpload/UploadFullscreen.jsx +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -59,6 +59,9 @@ class UploadFullscreen extends React.Component { startUpload = () => { const file = this.state.file; + // close the fullscreen page on upload + this.props.onClose(); + this.setState({ uploadingFile: true }); @@ -120,6 +123,7 @@ class UploadFullscreen extends React.Component { color="primary" style={styles.uploadButton} onClick={this.startUpload} + disabled={this.state.uploadingFile} > Upload diff --git a/src/react/Pages/Profile/Profile.jsx b/src/react/Pages/Profile/Profile.jsx index 867b3e64..98c6b914 100644 --- a/src/react/Pages/Profile/Profile.jsx +++ b/src/react/Pages/Profile/Profile.jsx @@ -130,7 +130,6 @@ class Profile extends React.Component { handleFileUpload = fileUUID => { const { user, userType } = this.props; - this.toggleFileUploadDialog(); if (fileUUID) { this.props.userUpdateImage(user.id, fileUUID, userType); From c9565be0b8805236736da2a7c63a7e00f263df37 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 15 Dec 2018 16:55:13 +0100 Subject: [PATCH 15/61] Improve styling and checks --- src/react/Components/AccountCard.jsx | 19 +++++++++++-------- src/react/Pages/AccountInfo.jsx | 2 +- src/react/Pages/NotFound.jsx | 1 - 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index b76ada25..d6769dc7 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -32,7 +32,8 @@ import { accountsUpdateImage } from "../Actions/accounts"; const styles = { avatar: { width: 60, - height: 60 + height: 60, + cursor: "default" }, secondaryIcon: { width: 26, @@ -72,11 +73,11 @@ class AccountCard extends React.Component { }; render() { - const { account, hideBalance, shareInviteBankResponses } = this.props; + const { account, hideBalance, filteredInviteResponses } = this.props; let formattedBalance = account.balance ? account.balance.value : 0; - if (this.props.shareInviteBankResponses.length > 0) { - const connectBudget = connectGetBudget(this.props.shareInviteBankResponses); + if (filteredInviteResponses.length > 0) { + const connectBudget = connectGetBudget(filteredInviteResponses); if (connectBudget) formattedBalance = connectBudget; } @@ -87,7 +88,7 @@ class AccountCard extends React.Component { ); - } else if (this.props.shareInviteBankResponses.length > 0) { + } else if (filteredInviteResponses.length > 0) { avatarSub = ( @@ -109,12 +110,12 @@ class AccountCard extends React.Component { 0 + filteredInviteResponses.length > 0 ? styles.avatar : { ...styles.avatar, cursor: "pointer" } } onClick={ - shareInviteBankResponses.length > 0 + filteredInviteResponses.length > 0 ? () => {} : _ => this.setState({ @@ -126,7 +127,9 @@ class AccountCard extends React.Component { BunqJSClient={this.props.BunqJSClient} height={60} imageUUID={account.avatar.image[0].attachment_public_uuid} - style={shareInviteBankResponses.length > 0 ? {} : { cursor: "pointer" }} + style={ + filteredInviteResponses.length > 0 ? { cursor: "default" } : { cursor: "pointer" } + } />
0 ? false : this.toggleSettingsDialog, toggleDeactivateDialog: filteredInviteResponses.length > 0 ? false : this.toggleDeactivateDialog }; diff --git a/src/react/Pages/NotFound.jsx b/src/react/Pages/NotFound.jsx index f025a8de..dde75922 100644 --- a/src/react/Pages/NotFound.jsx +++ b/src/react/Pages/NotFound.jsx @@ -1,7 +1,6 @@ import React from "react"; import Helmet from "react-helmet"; import { translate } from "react-i18next"; -import Typography from "@material-ui/core/Typography"; import TranslateTypography from "../Components/TranslationHelpers/Typography"; From d7fb51206866218f7aab0a08d30ae13ce599eefa Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 13:26:58 +0100 Subject: [PATCH 16/61] Implement experimental indexeddb storage alternative --- src/react/Actions/accounts.js | 6 +- src/react/Actions/bunq_me_tabs.js | 4 +- src/react/Actions/master_card_actions.js | 4 +- src/react/Actions/payments.js | 4 +- src/react/Actions/pending_payments.js | 4 +- src/react/Actions/request_inquiries.js | 4 +- src/react/Actions/request_inquiry_batches.js | 4 +- src/react/Actions/request_responses.js | 4 +- .../Actions/share_invite_bank_inquiries.js | 4 +- .../Actions/share_invite_bank_responses.js | 4 +- src/react/BunqDesktopClient.ts | 78 ++++++++++++++++++- .../AttachmentImage/AttachmentImage.jsx | 16 +--- .../Functions/Crypto/CryptoWorkerWrapper.js | 40 +++++++--- src/react/Reducers/accounts.js | 9 ++- src/react/Reducers/bunq_me_tabs.js | 9 ++- src/react/Reducers/contacts.js | 25 +++++- src/react/Reducers/master_card_actions.js | 10 ++- src/react/Reducers/options.js | 14 +--- src/react/Reducers/payments.js | 9 ++- src/react/Reducers/pending_payments.js | 35 +++------ src/react/Reducers/request_inquiries.js | 9 ++- src/react/Reducers/request_inquiry_batches.js | 9 ++- src/react/Reducers/request_responses.js | 9 ++- .../Reducers/share_invite_bank_inquiries.js | 9 ++- .../Reducers/share_invite_bank_responses.js | 9 ++- 25 files changed, 211 insertions(+), 121 deletions(-) diff --git a/src/react/Actions/accounts.js b/src/react/Actions/accounts.js index 7ee1aa70..1c688f30 100644 --- a/src/react/Actions/accounts.js +++ b/src/react/Actions/accounts.js @@ -1,7 +1,8 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { openSnackbar } from "./snackbar"; import MonetaryAccount from "../Models/MonetaryAccount"; +import { openSnackbar } from "./snackbar"; + export const STORED_ACCOUNTS = "BUNQDESKTOP_STORED_ACCOUNTS"; export function accountsSetInfo(accounts, BunqJSClient = false) { @@ -16,7 +17,8 @@ export function accountsSetInfo(accounts, BunqJSClient = false) { export function loadStoredAccounts(BunqJSClient) { return dispatch => { - BunqJSClient.Session.loadEncryptedData(STORED_ACCOUNTS) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_ACCOUNTS) .then(data => { if (data && data.items) { // turn plain objects back into MonetaryAccount objects diff --git a/src/react/Actions/bunq_me_tabs.js b/src/react/Actions/bunq_me_tabs.js index 03fe7243..ce1c89f3 100644 --- a/src/react/Actions/bunq_me_tabs.js +++ b/src/react/Actions/bunq_me_tabs.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import BunqMeTab from "../Models/BunqMeTab.ts"; export const STORED_BUNQ_ME_TABS = "BUNQDESKTOP_STORED_BUNQ_ME_TABS"; @@ -20,7 +19,8 @@ export function bunqMeTabsSetInfo(bunqMeTabs, account_id, resetOldItems = false, export function loadStoredBunqMeTabs(BunqJSClient) { return dispatch => { dispatch(bunqMeTabsLoading()); - storeDecryptString(STORED_BUNQ_ME_TABS, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_BUNQ_ME_TABS) .then(data => { if (data && data.items) { const bunqMeTabsNew = data.items.map(item => new BunqMeTab(item)); diff --git a/src/react/Actions/master_card_actions.js b/src/react/Actions/master_card_actions.js index 9ab9e553..948cb9b4 100644 --- a/src/react/Actions/master_card_actions.js +++ b/src/react/Actions/master_card_actions.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import MasterCardAction from "../Models/MasterCardAction"; export const STORED_MASTER_CARD_ACTIONS = "BUNQDESKTOP_STORED_MASTER_CARD_ACTIONS"; @@ -20,7 +19,8 @@ export function masterCardActionsSetInfo(masterCardActions, account_id, resetOld export function loadStoredMasterCardActions(BunqJSClient) { return dispatch => { dispatch(masterCardActionsLoading()); - storeDecryptString(STORED_MASTER_CARD_ACTIONS, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_MASTER_CARD_ACTIONS) .then(data => { if (data && data.items) { // turn plain objects into Model objects diff --git a/src/react/Actions/payments.js b/src/react/Actions/payments.js index 32f1b82d..d2ac50f0 100644 --- a/src/react/Actions/payments.js +++ b/src/react/Actions/payments.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { paymentApiFilter } from "../Functions/DataFilters"; import Payment from "../Models/Payment"; @@ -22,7 +21,8 @@ export function paymentsSetInfo(payments, account_id, resetOldItems = false, Bun export function loadStoredPayments(BunqJSClient) { return dispatch => { dispatch(paymentsLoading()); - storeDecryptString(STORED_PAYMENTS, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_PAYMENTS) .then(data => { if (data && data.items) { // turn plain objects into Model objects diff --git a/src/react/Actions/pending_payments.js b/src/react/Actions/pending_payments.js index 800266ad..0c52fbc5 100644 --- a/src/react/Actions/pending_payments.js +++ b/src/react/Actions/pending_payments.js @@ -1,10 +1,10 @@ -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const PENDING_PAYMENTS_LOCATION = "BUNQDESKTOP_STORED_PENDING_PAYMENTS"; export function loadPendingPayments(BunqJSClient) { return dispatch => { - storeDecryptString(PENDING_PAYMENTS_LOCATION, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(PENDING_PAYMENTS_LOCATION) .then(data => { if (data) { dispatch(pendingPaymentsSetPayments(false, data)); diff --git a/src/react/Actions/request_inquiries.js b/src/react/Actions/request_inquiries.js index c7b333b8..b1b7505e 100644 --- a/src/react/Actions/request_inquiries.js +++ b/src/react/Actions/request_inquiries.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import RequestInquiry from "../Models/RequestInquiry"; export const STORED_REQUEST_INQUIRIES = "BUNQDESKTOP_STORED_REQUEST_INQUIRIES"; @@ -20,7 +19,8 @@ export function requestInquiriesSetInfo(requestInquiries, account_id, resetOldIt export function loadStoredRequestInquiries(BunqJSClient) { return dispatch => { dispatch(requestInquiriesLoading()); - storeDecryptString(STORED_REQUEST_INQUIRIES, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_REQUEST_INQUIRIES) .then(data => { if (data && data.items) { const newRequestInquiries = data.items.map(item => new RequestInquiry(item)); diff --git a/src/react/Actions/request_inquiry_batches.js b/src/react/Actions/request_inquiry_batches.js index 3dbbc0e7..8034d62d 100644 --- a/src/react/Actions/request_inquiry_batches.js +++ b/src/react/Actions/request_inquiry_batches.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import RequestInquiryBatch from "../Models/RequestInquiryBatch"; export const STORED_REQUEST_INQUIRY_BATCHES = "BUNQDESKTOP_STORED_REQUEST_INQUIRY_BATCHES"; @@ -25,7 +24,8 @@ export function requestInquiryBatchesSetInfo( export function loadStoredrequestInquiryBatches(BunqJSClient) { return dispatch => { dispatch(requestInquiryBatchesLoading()); - storeDecryptString(STORED_REQUEST_INQUIRY_BATCHES, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_REQUEST_INQUIRY_BATCHES) .then(data => { if (data && data.items) { const requestInquiryBatchesNew = data.items.map(item => new RequestInquiryBatch(item)); diff --git a/src/react/Actions/request_responses.js b/src/react/Actions/request_responses.js index cc4e76fd..49058d9e 100644 --- a/src/react/Actions/request_responses.js +++ b/src/react/Actions/request_responses.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import RequestResponse from "../Models/RequestResponse"; export const STORED_REQUEST_RESPONSES = "BUNQDESKTOP_STORED_REQUEST_RESPONSES"; @@ -20,7 +19,8 @@ export function requestResponsesSetInfo(requestResponses, account_id, resetOldIt export function loadStoredRequestResponses(BunqJSClient) { return dispatch => { dispatch(requestResponsesLoading()); - storeDecryptString(STORED_REQUEST_RESPONSES, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_REQUEST_RESPONSES) .then(data => { if (data && data.items) { const newRequestResponses = data.items.map(item => new RequestResponse(item)); diff --git a/src/react/Actions/share_invite_bank_inquiries.js b/src/react/Actions/share_invite_bank_inquiries.js index e37a55bc..bfaeae54 100644 --- a/src/react/Actions/share_invite_bank_inquiries.js +++ b/src/react/Actions/share_invite_bank_inquiries.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const STORED_SHARE_INVITE_BANK_INQUIRIES = "BUNQDESKTOP_SHARE_INVITE_BANK_INQUIRIES"; @@ -17,7 +16,8 @@ export function shareInviteBankInquiriesSetInfo(share_invite_bank_inquiries, acc export function loadStoredShareInviteBankInquiries(BunqJSClient) { return dispatch => { dispatch(shareInviteBankInquiriesLoading()); - storeDecryptString(STORED_SHARE_INVITE_BANK_INQUIRIES, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_SHARE_INVITE_BANK_INQUIRIES) .then(data => { if (data && data.items) { dispatch(shareInviteBankInquiriesSetInfo(data.items, data.account_id)); diff --git a/src/react/Actions/share_invite_bank_responses.js b/src/react/Actions/share_invite_bank_responses.js index 9a64422e..cd603a69 100644 --- a/src/react/Actions/share_invite_bank_responses.js +++ b/src/react/Actions/share_invite_bank_responses.js @@ -1,5 +1,4 @@ import BunqErrorHandler from "../Functions/BunqErrorHandler"; -import { storeDecryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; export const STORED_SHARE_INVITE_BANK_RESPONSES = "BUNQDESKTOP_SHARE_INVITE_BANK_RESPONSES"; @@ -16,7 +15,8 @@ export function shareInviteBankResponsesSetInfo(share_invite_bank_responses, Bun export function loadStoredShareInviteBankResponses(BunqJSClient) { return dispatch => { dispatch(shareInviteBankResponsesLoading()); - storeDecryptString(STORED_SHARE_INVITE_BANK_RESPONSES, BunqJSClient.Session.encryptionKey) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeDecrypt(STORED_SHARE_INVITE_BANK_RESPONSES) .then(data => { if (data && data.items) { dispatch(shareInviteBankResponsesSetInfo(data.items)); diff --git a/src/react/BunqDesktopClient.ts b/src/react/BunqDesktopClient.ts index c85ed934..be3e8cdc 100644 --- a/src/react/BunqDesktopClient.ts +++ b/src/react/BunqDesktopClient.ts @@ -1,8 +1,14 @@ import BunqJSClient from "@bunq-community/bunq-js-client"; +import StorageInterface from "@bunq-community/bunq-js-client/dist/Interfaces/StorageInterface"; import awaiting from "awaiting"; -import { decryptString, derivePasswordKey, encryptString } from "./Functions/Crypto/Crypto"; import { Environment, StoredApiKey } from "./Types/Types"; +import { decryptString, derivePasswordKey, encryptString } from "./Functions/Crypto/Crypto"; +import { storeDecryptString, storeEncryptString } from "./Functions/Crypto/CryptoWorkerWrapper"; +import Logger from "./Functions/Logger"; +import localforage from "./ImportWrappers/localforage"; +import store from "store/dist/store.legacy"; + export const SALT_LOCATION = "BUNQDESKTOP_PASSWORD_SALT"; export const API_KEYS_LOCATION = "BUNQDESKTOP_API_KEYS"; export const API_KEY_LOCATION = "BUNQDESKTOP_API_KEY"; @@ -14,10 +20,43 @@ export const ENVIRONMENT_LOCATION = "BUNQDESKTOP_ENVIRONMENT"; const DEFAULT_PASSWORD = "SOME_DEFAULT_PASSWORD"; +class IndexedDbWrapper implements StorageInterface { + private _indexedDb: LocalForageDriver; + + constructor(config: LocalForageOptions) { + this._indexedDb = localforage.createInstance(config); + } + + public get = async (key: string): Promise => { + return this._indexedDb.getItem(key); + }; + public set = async (key: string, value: any): Promise => { + return this._indexedDb.setItem(key, value); + }; + public remove = async (key: string): Promise => { + return this._indexedDb.removeItem(key); + }; + public clear = async (): Promise => { + return this._indexedDb.clear(); + }; + + /** + * Does a remove action but swallows the promise and only outputs to logger + * Used in Redux actions for cleanup where the result isn't important + */ + public silentRemove = (key: string): void => { + this.remove(key) + .then(() => {}) + .catch(Logger.error); + }; +} + class BunqDesktopClient { public BunqJSClient: BunqJSClient; public Logger: any; - public Store: any; + public Store: StorageInterface; + public IndexedDb: IndexedDbWrapper; + public ImageIndexedDb: IndexedDbWrapper; private derived_password: string | false = false; private derived_password_salt: string | false = false; @@ -32,11 +71,29 @@ class BunqDesktopClient { private stored_api_keys: StoredApiKey[] = []; - constructor(BunqJSClient, Logger, Store) { + constructor(BunqJSClient, Logger, Store: StorageInterface) { this.BunqJSClient = BunqJSClient; this.Logger = Logger; this.Store = Store; + const basicConfig: LocalForageOptions = { + driver: localforage.INDEXEDDB, + name: "bunqDesktop", + version: 1.0 + }; + + // setup two references to the main indexedDb stores + this.IndexedDb = new IndexedDbWrapper({ + ...basicConfig, + storeName: "bunq_desktop_api_data", + description: "The main bunq-desktop-client data, not including session info" + }); + this.ImageIndexedDb = new IndexedDbWrapper({ + ...basicConfig, + storeName: "bunq_desktop_images", + description: "Image cache for bunq desktop in indexed db" + }); + // current session data if it exists this.device_name = this.getStoredValue(DEVICE_NAME_LOCATION, "My device"); this.encrypted_api_key = this.getStoredValue(API_KEY_LOCATION, false); @@ -415,6 +472,21 @@ class BunqDesktopClient { return decryptedApiKey; } + public async storeDecrypt(key: string, iv: any = false, type = "INDEXEDDB"): Promise { + return storeDecryptString(key, this.BunqJSClient.Session.encryptionKey, iv, type); + } + public async storeEncrypt(data: any, key: string, type = "INDEXEDDB"): Promise { + return storeEncryptString(data, key, this.BunqJSClient.Session.encryptionKey, type); + } + public storeRemove(key: string, type = "ALL"): void { + if (type === "INDEXEDDB" || type === "ALL") { + this.IndexedDb.silentRemove(key); + } + if (type === "LOCALSTORAGE" || type === "ALL") { + store.remove(key); + } + } + /** Getter functions **/ get hasStoredApiKey(): boolean { return !!this.getStoredValue(API_KEY_LOCATION, false); diff --git a/src/react/Components/AttachmentImage/AttachmentImage.jsx b/src/react/Components/AttachmentImage/AttachmentImage.jsx index 58974255..eea293be 100644 --- a/src/react/Components/AttachmentImage/AttachmentImage.jsx +++ b/src/react/Components/AttachmentImage/AttachmentImage.jsx @@ -1,5 +1,4 @@ import React from "react"; -import localforage from "../../ImportWrappers/localforage"; import Logger from "../../Functions/Logger"; class AttachmentImage extends React.PureComponent { @@ -44,15 +43,6 @@ class AttachmentImage extends React.PureComponent { return; } - // configure the localforage instance - localforage.config({ - driver: localforage.INDEXEDDB, - name: "bunqDesktop", - version: 1.0, - storeName: "bunq_desktop_images", - description: "Image cache for bunq desktop in indexed db" - }); - // set a timeout as a fallback incase loading the image takes too long this.timeout = setTimeout(() => { if (this.state.imageUrl === false) { @@ -70,8 +60,10 @@ class AttachmentImage extends React.PureComponent { }; loadImage = async () => { + const indexedDb = window.BunqDesktopClient.ImageIndexedDb; + const storageKey = `image_${this.props.imageUUID}`; - const base64UrlStored = await localforage.getItem(storageKey); + const base64UrlStored = await indexedDb.get(storageKey); if (base64UrlStored === null) { // no image, fallback to default while we load the image remotely if (this._isMounted) { @@ -94,7 +86,7 @@ class AttachmentImage extends React.PureComponent { } // store the full url in storage - await localforage.setItem(storageKey, base64Url); + await indexedDb.set(storageKey, base64Url); return true; } catch (ex) { diff --git a/src/react/Functions/Crypto/CryptoWorkerWrapper.js b/src/react/Functions/Crypto/CryptoWorkerWrapper.js index ba727a11..79737fde 100644 --- a/src/react/Functions/Crypto/CryptoWorkerWrapper.js +++ b/src/react/Functions/Crypto/CryptoWorkerWrapper.js @@ -6,19 +6,27 @@ const CryptoWorker = require("worker-loader!../../WebWorkers/crypto.worker.js"); * @param location * @param encryptionKey * @param iv + * @param type * @returns {Promise<*>} */ -export const storeDecryptString = async (location, encryptionKey, iv = false) => { - const storedData = store.get(location); +export const storeDecryptString = async (location, encryptionKey, iv = false, type = "LOCALSTORAGE") => { + let handler = store; + if (type === "INDEXEDDB") { + handler = window.BunqDesktopClient.IndexedDb; + } - let storedIv = iv; - if (iv === false) { - storedIv = store.get(`${location}_IV`); + const storedDataPromise = handler.get(location); + let storedIvPromise = iv; + if (!storedIvPromise) { + storedIvPromise = handler.get(`${location}_IV`); } + // wait for the promises to complete + const storedIv = await storedIvPromise; + const storedData = await storedDataPromise; + // return false if no data or IV was found - if (!storedIv) return false; - if (!storedData) return false; + if (!storedIv || !storedData) return false; const cryptoWorker = new CryptoWorker(); @@ -27,13 +35,13 @@ export const storeDecryptString = async (location, encryptionKey, iv = false) => type: "DECRYPT", encryptionKey: encryptionKey, data: storedData, - iv: storedIv + iv: storedIv, + tag: type }); return new Promise((resolve, reject) => { cryptoWorker.onmessage = e => { resolve(e.data); - cryptoWorker.terminate(); }; }); @@ -44,9 +52,15 @@ export const storeDecryptString = async (location, encryptionKey, iv = false) => * @param data * @param location * @param encryptionKey + * @param type * @returns {Promise} */ -export const storeEncryptString = async (data, location, encryptionKey) => { +export const storeEncryptString = async (data, location, encryptionKey, type = "LOCALSTORAGE") => { + let handler = store; + if (type === "INDEXEDDB") { + handler = window.BunqDesktopClient.IndexedDb; + } + // stringify the data const jsonData = JSON.stringify(data); @@ -64,8 +78,10 @@ export const storeEncryptString = async (data, location, encryptionKey) => { }); // store the key and iv details - store.set(location, encryptedDetails.encryptedString); - store.set(`${location}_IV`, encryptedDetails.iv); + const setDataPromise = handler.set(location, encryptedDetails.encryptedString); + const setIvPromise = handler.set(`${location}_IV`, encryptedDetails.iv); + await setDataPromise; + await setIvPromise; cryptoWorker.terminate(); }; diff --git a/src/react/Reducers/accounts.js b/src/react/Reducers/accounts.js index 966b155a..b3e83e13 100644 --- a/src/react/Reducers/accounts.js +++ b/src/react/Reducers/accounts.js @@ -3,6 +3,7 @@ import { ipcRenderer } from "electron"; import settings from "../ImportWrappers/electronSettings"; import { STORED_ACCOUNTS } from "../Actions/accounts"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { formatMoney } from "../Functions/Utils"; export const SELECTED_ACCOUNT_LOCAION = "BUNQDESKTOP_SELECTED_ACCOUNT"; @@ -26,7 +27,8 @@ export default (state = defaultState, action) => { case "ACCOUNTS_SET_INFO": // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - action.payload.BunqJSClient.Session.storeEncryptedData( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: action.payload.accounts }, @@ -115,8 +117,9 @@ export default (state = defaultState, action) => { case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(SELECTED_ACCOUNT_LOCAION); - store.remove(STORED_ACCOUNTS); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(SELECTED_ACCOUNT_LOCAION); + BunqDesktopClient.storeRemove(STORED_ACCOUNTS); ipcRenderer.send("set-tray-accounts", false); ipcRenderer.send("set-tray-balance", false); diff --git a/src/react/Reducers/bunq_me_tabs.js b/src/react/Reducers/bunq_me_tabs.js index cb147d93..095314a3 100644 --- a/src/react/Reducers/bunq_me_tabs.js +++ b/src/react/Reducers/bunq_me_tabs.js @@ -35,13 +35,13 @@ export default (state = defaultState, action) => { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: mergedBunqMeTabs, account_id: action.payload.account_id }, - STORED_BUNQ_ME_TABS, - action.payload.BunqJSClient.Session.encryptionKey + STORED_BUNQ_ME_TABS ) .then(() => {}) .catch(() => {}); @@ -81,7 +81,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_BUNQ_ME_TABS); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_BUNQ_ME_TABS); return { bunq_me_tabs: [], account_id: false, diff --git a/src/react/Reducers/contacts.js b/src/react/Reducers/contacts.js index c71aa07d..606661c7 100644 --- a/src/react/Reducers/contacts.js +++ b/src/react/Reducers/contacts.js @@ -1,4 +1,9 @@ import { STORED_CONTACTS } from "../Actions/contacts"; +import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; +import { STORED_ACCOUNTS } from "../Actions/accounts"; +import store from "store"; +import { ipcRenderer } from "electron"; +import { SELECTED_ACCOUNT_LOCAION } from "./accounts"; export const defaultState = { last_update: new Date().getTime(), @@ -53,7 +58,7 @@ export default function reducer(state = defaultState, action) { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - action.payload.BunqJSClient.Session.storeEncryptedData( + storeEncryptString( { items: state.contacts }, @@ -74,7 +79,8 @@ export default function reducer(state = defaultState, action) { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - action.payload.BunqJSClient.Session.storeEncryptedData( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: contacts2 }, @@ -110,7 +116,8 @@ export default function reducer(state = defaultState, action) { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - action.payload.BunqJSClient.Session.storeEncryptedData( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: newState.contacts }, @@ -134,6 +141,18 @@ export default function reducer(state = defaultState, action) { ...state, ...newState }; + case "REGISTRATION_CLEAR_PRIVATE_DATA": + case "REGISTRATION_LOG_OUT": + case "REGISTRATION_CLEAR_USER_INFO": + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_CONTACTS); + + return { + ...state, + last_update: new Date().getTime(), + contacts: {}, + loading: false + }; } return state; } diff --git a/src/react/Reducers/master_card_actions.js b/src/react/Reducers/master_card_actions.js index 5bfc7b02..2a5ff825 100644 --- a/src/react/Reducers/master_card_actions.js +++ b/src/react/Reducers/master_card_actions.js @@ -3,6 +3,7 @@ import MergeApiObjects from "../Functions/MergeApiObjects"; import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { STORED_MASTER_CARD_ACTIONS } from "../Actions/master_card_actions"; +import { STORED_BUNQ_ME_TABS } from "../Actions/bunq_me_tabs"; export const defaultState = { master_card_actions: [], @@ -35,13 +36,13 @@ export default (state = defaultState, action) => { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: mergedMasterCardActions, account_id: action.payload.account_id }, - STORED_MASTER_CARD_ACTIONS, - action.payload.BunqJSClient.Session.encryptionKey + STORED_MASTER_CARD_ACTIONS ) .then(() => {}) .catch(() => {}); @@ -81,7 +82,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_MASTER_CARD_ACTIONS); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_MASTER_CARD_ACTIONS); return { master_card_actions: [], account_id: false, diff --git a/src/react/Reducers/options.js b/src/react/Reducers/options.js index e400885a..217b4285 100644 --- a/src/react/Reducers/options.js +++ b/src/react/Reducers/options.js @@ -1,17 +1,7 @@ import store from "store"; -import localforage from "../ImportWrappers/localforage"; import { ipcRenderer } from "electron"; import settings from "../ImportWrappers/electronSettings"; -// configure the localforage instance -localforage.config({ - driver: localforage.INDEXEDDB, - name: "bunqDesktop", - version: 1.0, - storeName: "bunq_desktop_images", - description: "Image cache for bunqDesktop in IndexedDB" -}); - export const SYNC_ON_STARTUP_LOCATION = "BUNQDESKTOP_SYNC_ON_STARTUP"; export const THEME_LOCATION = "BUNQDESKTOP_THEME"; export const ANALYTICS_ENABLED = "ANALYTICS_ENABLED"; @@ -198,8 +188,10 @@ export default function reducer(state = defaultState, action) { // reset electron settings settings.deleteAll(); + const ImageIndexedDb = window.BunqDesktopClient.ImageIndexedDb; + // clear image cache and reload once that completes - localforage.clear().then(done => { + ImageIndexedDb.clear().then(done => { location.reload(); }); diff --git a/src/react/Reducers/payments.js b/src/react/Reducers/payments.js index b79b95b3..6bb954d0 100644 --- a/src/react/Reducers/payments.js +++ b/src/react/Reducers/payments.js @@ -31,13 +31,13 @@ export default (state = defaultState, action) => { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: mergedPayments, account_id: action.payload.account_id }, - STORED_PAYMENTS, - action.payload.BunqJSClient.Session.encryptionKey + STORED_PAYMENTS ) .then(() => {}) .catch(() => {}); @@ -77,7 +77,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_PAYMENTS); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_PAYMENTS); return { payments: [], account_id: false, diff --git a/src/react/Reducers/pending_payments.js b/src/react/Reducers/pending_payments.js index 0ebe0d30..1c1a6ede 100644 --- a/src/react/Reducers/pending_payments.js +++ b/src/react/Reducers/pending_payments.js @@ -16,11 +16,8 @@ export default (state = defaultState, action) => { const newSetPendingPayment = action.payload.pending_payments; if (action.payload.BunqJSClient) { - storeEncryptString( - newSetPendingPayment, - PENDING_PAYMENTS_LOCATION, - action.payload.BunqJSClient.Session.encryptionKey - ) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt(newSetPendingPayment, PENDING_PAYMENTS_LOCATION) .then(() => {}) .catch(() => {}); } @@ -42,11 +39,8 @@ export default (state = defaultState, action) => { }; if (action.payload.BunqJSClient) { - storeEncryptString( - pendingPayments, - PENDING_PAYMENTS_LOCATION, - action.payload.BunqJSClient.Session.encryptionKey - ) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt(pendingPayments, PENDING_PAYMENTS_LOCATION) .then(() => {}) .catch(() => {}); } @@ -71,11 +65,8 @@ export default (state = defaultState, action) => { }); if (action.payload.BunqJSClient) { - storeEncryptString( - pendingPayments, - PENDING_PAYMENTS_LOCATION, - action.payload.BunqJSClient.Session.encryptionKey - ) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt(pendingPayments, PENDING_PAYMENTS_LOCATION) .then(() => {}) .catch(() => {}); } @@ -98,11 +89,8 @@ export default (state = defaultState, action) => { }); if (action.payload.BunqJSClient) { - storeEncryptString( - pendingPayments, - PENDING_PAYMENTS_LOCATION, - action.payload.BunqJSClient.Session.encryptionKey - ) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt(pendingPayments, PENDING_PAYMENTS_LOCATION) .then(() => {}) .catch(() => {}); } @@ -121,11 +109,8 @@ export default (state = defaultState, action) => { } if (action.payload.BunqJSClient) { - storeEncryptString( - pendingPayments, - PENDING_PAYMENTS_LOCATION, - action.payload.BunqJSClient.Session.encryptionKey - ) + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt(pendingPayments, PENDING_PAYMENTS_LOCATION) .then(() => {}) .catch(() => {}); } diff --git a/src/react/Reducers/request_inquiries.js b/src/react/Reducers/request_inquiries.js index 9cb92e8b..4d5e8cb2 100644 --- a/src/react/Reducers/request_inquiries.js +++ b/src/react/Reducers/request_inquiries.js @@ -35,13 +35,13 @@ export default (state = defaultState, action) => { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: mergedRequestInquiries, account_id: action.payload.account_id }, - STORED_REQUEST_INQUIRIES, - action.payload.BunqJSClient.Session.encryptionKey + STORED_REQUEST_INQUIRIES ) .then(() => {}) .catch(() => {}); @@ -81,7 +81,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_REQUEST_INQUIRIES); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_REQUEST_INQUIRIES); return { request_inquiries: [], account_id: false, diff --git a/src/react/Reducers/request_inquiry_batches.js b/src/react/Reducers/request_inquiry_batches.js index 0c1d78e7..4a2e6883 100644 --- a/src/react/Reducers/request_inquiry_batches.js +++ b/src/react/Reducers/request_inquiry_batches.js @@ -35,13 +35,13 @@ export default (state = defaultState, action) => { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: mergedRequestBatches, account_id: action.payload.account_id }, - STORED_REQUEST_INQUIRY_BATCHES, - action.payload.BunqJSClient.Session.encryptionKey + STORED_REQUEST_INQUIRY_BATCHES ) .then(() => {}) .catch(() => {}); @@ -81,7 +81,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_REQUEST_INQUIRY_BATCHES); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_REQUEST_INQUIRY_BATCHES); return { request_inquiry_batches: [], account_id: false, diff --git a/src/react/Reducers/request_responses.js b/src/react/Reducers/request_responses.js index 725f1109..bae57e92 100644 --- a/src/react/Reducers/request_responses.js +++ b/src/react/Reducers/request_responses.js @@ -35,13 +35,13 @@ export default (state = defaultState, action) => { // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: mergedRequestResponses, account_id: action.payload.account_id }, - STORED_REQUEST_RESPONSES, - action.payload.BunqJSClient.Session.encryptionKey + STORED_REQUEST_RESPONSES ) .then(() => {}) .catch(() => {}); @@ -81,7 +81,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_REQUEST_RESPONSES); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_REQUEST_RESPONSES); return { request_responses: [], account_id: false, diff --git a/src/react/Reducers/share_invite_bank_inquiries.js b/src/react/Reducers/share_invite_bank_inquiries.js index c4a8a7e6..fbf25f66 100644 --- a/src/react/Reducers/share_invite_bank_inquiries.js +++ b/src/react/Reducers/share_invite_bank_inquiries.js @@ -13,13 +13,13 @@ export default (state = defaultState, action) => { case "SHARE_INVITE_INQUIRIES_SET_INFO": // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: action.payload.share_invite_bank_inquiries, account_id: action.payload.account_id }, - STORED_SHARE_INVITE_BANK_INQUIRIES, - action.payload.BunqJSClient.Session.encryptionKey + STORED_SHARE_INVITE_BANK_INQUIRIES ) .then(() => {}) .catch(() => {}); @@ -47,7 +47,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_SHARE_INVITE_BANK_INQUIRIES); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_SHARE_INVITE_BANK_INQUIRIES); return { ...defaultState }; diff --git a/src/react/Reducers/share_invite_bank_responses.js b/src/react/Reducers/share_invite_bank_responses.js index 7b731f66..ba65153a 100644 --- a/src/react/Reducers/share_invite_bank_responses.js +++ b/src/react/Reducers/share_invite_bank_responses.js @@ -12,12 +12,12 @@ export default (state = defaultState, action) => { case "SHARE_INVITE_RESPONSES_SET_INFO": // store the data if we have access to the bunqjsclient if (action.payload.BunqJSClient) { - storeEncryptString( + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeEncrypt( { items: action.payload.share_invite_bank_responses }, - STORED_SHARE_INVITE_BANK_RESPONSES, - action.payload.BunqJSClient.Session.encryptionKey + STORED_SHARE_INVITE_BANK_RESPONSES ) .then(() => {}) .catch(() => {}); @@ -44,7 +44,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(STORED_SHARE_INVITE_BANK_RESPONSES); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.storeRemove(STORED_SHARE_INVITE_BANK_RESPONSES); return { ...defaultState }; From 6e341f98582049dd912fd07b4186ab3351671c07 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 16:48:04 +0100 Subject: [PATCH 17/61] Re-use a single cryptoworker to improve startup performance --- .../Functions/Crypto/CryptoWorkerWrapper.js | 66 ++++++++++++------- src/react/WebWorkers/crypto.worker.js | 29 +++++--- 2 files changed, 64 insertions(+), 31 deletions(-) diff --git a/src/react/Functions/Crypto/CryptoWorkerWrapper.js b/src/react/Functions/Crypto/CryptoWorkerWrapper.js index 79737fde..475278f2 100644 --- a/src/react/Functions/Crypto/CryptoWorkerWrapper.js +++ b/src/react/Functions/Crypto/CryptoWorkerWrapper.js @@ -1,6 +1,48 @@ import store from "store"; const CryptoWorker = require("worker-loader!../../WebWorkers/crypto.worker.js"); +class CryptoWorkerQueue { + constructor() { + this.queue = {}; + + // setup a new cryptoWorker + this.worker = new CryptoWorker(); + this.worker.onmessage = this.onMessage; + } + + addTask = task => { + // random ID + const taskId = new Date().getTime() + (Math.random() + ""); + + return new Promise((resolve, reject) => { + // add this promise to the queue + this.queue[taskId] = { resolve, reject }; + + // post task to the cryptoWorker + this.worker.postMessage({ taskId, task }); + }); + }; + + onMessage = event => { + const taskId = event.data.taskId; + const promise = this.queue[taskId]; + + if (promise) { + if (event.data.error) { + promise.reject(event.data.error); + } else { + promise.resolve(event.data.data); + } + + delete this.queue[taskId]; + } + }; +} + +if (!window.cryptoWorkerQueue) { + window.cryptoWorkerQueue = new CryptoWorkerQueue(); +} + /** * Decrypt data stored in a specific location * @param location @@ -28,23 +70,13 @@ export const storeDecryptString = async (location, encryptionKey, iv = false, ty // return false if no data or IV was found if (!storedIv || !storedData) return false; - const cryptoWorker = new CryptoWorker(); - - // send message to the worker - cryptoWorker.postMessage({ + return window.cryptoWorkerQueue.addTask({ type: "DECRYPT", encryptionKey: encryptionKey, data: storedData, iv: storedIv, tag: type }); - - return new Promise((resolve, reject) => { - cryptoWorker.onmessage = e => { - resolve(e.data); - cryptoWorker.terminate(); - }; - }); }; /** @@ -63,25 +95,15 @@ export const storeEncryptString = async (data, location, encryptionKey, type = " // stringify the data const jsonData = JSON.stringify(data); - - const cryptoWorker = new CryptoWorker(); - - // send message to the worker - cryptoWorker.postMessage({ + const encryptedDetails = await window.cryptoWorkerQueue.addTask({ type: "ENCRYPT", encryptionKey: encryptionKey, data: jsonData }); - const encryptedDetails = await new Promise((resolve, reject) => { - cryptoWorker.onmessage = e => resolve(e.data); - }); - // store the key and iv details const setDataPromise = handler.set(location, encryptedDetails.encryptedString); const setIvPromise = handler.set(`${location}_IV`, encryptedDetails.iv); await setDataPromise; await setIvPromise; - - cryptoWorker.terminate(); }; diff --git a/src/react/WebWorkers/crypto.worker.js b/src/react/WebWorkers/crypto.worker.js index 317c0719..376513aa 100644 --- a/src/react/WebWorkers/crypto.worker.js +++ b/src/react/WebWorkers/crypto.worker.js @@ -1,33 +1,44 @@ import { decryptString, encryptString } from "../Functions/Crypto/Crypto.js"; -const defaultError = error => { +const defaultError = (error, taskId) => { console.error(error); - postMessage({ - error: error + error: error, + taskId: taskId }); }; onmessage = e => { - const { type, data, encryptionKey, iv = false } = e.data; + const taskId = e.data.taskId; + const { type, data, encryptionKey, iv = false } = e.data.task; if (type === "DECRYPT") { // decrypt the data with the given key and iv decryptString(data, encryptionKey, iv) .then(data => { try { - postMessage(JSON.parse(data)); + postMessage({ + data: JSON.parse(data), + taskId: taskId + }); } catch (error) { - defaultError(error); + defaultError(error, taskId); } }) - .catch(error => defaultError(error)); + .catch(error => defaultError(error, taskId)); } if (type === "ENCRYPT") { // encrypt the data with the given encryption key encryptString(data, encryptionKey) - .then(data => postMessage(data)) - .catch(error => defaultError(error)); + .then(data => { + postMessage({ + taskId: taskId, + data: data + }); + }) + .catch(error => { + defaultError(error, taskId); + }); } }; From 1a398f3d1fd2d9f723a7ff7bbb7ffc210855fa28 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 19:23:11 +0100 Subject: [PATCH 18/61] Remove verbose card status text (fixes #451) --- src/react/Functions/EventStatusTexts.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/react/Functions/EventStatusTexts.js b/src/react/Functions/EventStatusTexts.js index 60625c93..ad06f7da 100644 --- a/src/react/Functions/EventStatusTexts.js +++ b/src/react/Functions/EventStatusTexts.js @@ -177,19 +177,19 @@ export const cardOrderStatus = (cardInfo, t) => { switch (cardInfo.order_status) { case "VIRTUAL_DELIVERY": - return `${VIRTUAL_DELIVERY} (VIRTUAL_DELIVERY)`; + return `${VIRTUAL_DELIVERY}`; case "ACCEPTED_FOR_PRODUCTION": - return `${ACCEPTED_FOR_PRODUCTION} (ACCEPTED_FOR_PRODUCTION)`; + return `${ACCEPTED_FOR_PRODUCTION}`; case "NEW_CARD_REQUEST_RECEIVED": - return `${NEW_CARD_REQUEST_RECEIVED} (NEW_CARD_REQUEST_RECEIVED)`; + return `${NEW_CARD_REQUEST_RECEIVED}`; case "DELIVERED_TO_CUSTOMER": - return `${DELIVERED_TO_CUSTOMER} (DELIVERED_TO_CUSTOMER)`; + return `${DELIVERED_TO_CUSTOMER}`; case "CARD_UPDATE_REQUESTED": - return `${CARD_UPDATE_REQUESTED} (CARD_UPDATE_REQUESTED)`; + return `${CARD_UPDATE_REQUESTED}`; case "CARD_UPDATE_SENT": - return `${CARD_UPDATE_SENT} (CARD_UPDATE_SENT)`; + return `${CARD_UPDATE_SENT}`; case "CARD_UPDATE_ACCEPTED": - return `${CARD_UPDATE_ACCEPTED} (CARD_UPDATE_ACCEPTED)`; + return `${CARD_UPDATE_ACCEPTED}`; } return cardInfo.order_status; From b883b0f3e2ebe381f1040d6ddf6f4262d39e44a7 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 19:55:54 +0100 Subject: [PATCH 19/61] Reduce clutter on mastercard info page and unused imports --- src/react/Pages/MasterCardActionInfo.jsx | 36 +++++++------------ src/react/Pages/PaymentInfo.jsx | 3 -- src/react/Pages/RequestInquiryInfo.jsx | 3 -- .../RequestResponseInfo.jsx | 3 -- 4 files changed, 13 insertions(+), 32 deletions(-) diff --git a/src/react/Pages/MasterCardActionInfo.jsx b/src/react/Pages/MasterCardActionInfo.jsx index 9111cc4f..a432975d 100644 --- a/src/react/Pages/MasterCardActionInfo.jsx +++ b/src/react/Pages/MasterCardActionInfo.jsx @@ -12,14 +12,11 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import Divider from "@material-ui/core/Divider"; import CircularProgress from "@material-ui/core/CircularProgress"; -import Typography from "@material-ui/core/Typography"; import ArrowBackIcon from "@material-ui/icons/ArrowBack"; import HelpIcon from "@material-ui/icons/Help"; import BookmarkIcon from "@material-ui/icons/Bookmark"; import SaveIcon from "@material-ui/icons/Save"; -import ArrowUpIcon from "@material-ui/icons/ArrowUpward"; -import ArrowDownIcon from "@material-ui/icons/ArrowDownward"; import FilterIcon from "@material-ui/icons/FilterList"; import FilterCreationDialog from "../Components/FilterCreationDialog"; @@ -141,7 +138,8 @@ class MasterCardActionInfo extends React.Component { const settledText = t("Settled"); const openText = t("Open"); - const settlementStatusText = masterCardAction._settlement_status === "SETTLED" ? settledText : openText; + const isSettled = masterCardAction._settlement_status === "SETTLED"; + const settlementStatusText = isSettled ? settledText : openText; if (this.props.pdfSaveModeEnabled) { return ( @@ -226,27 +224,19 @@ class MasterCardActionInfo extends React.Component { - - - - - - - - - + {isSettled === false && ( + + + + + + + )} - - - - diff --git a/src/react/Pages/PaymentInfo.jsx b/src/react/Pages/PaymentInfo.jsx index aadcfeec..6629014c 100644 --- a/src/react/Pages/PaymentInfo.jsx +++ b/src/react/Pages/PaymentInfo.jsx @@ -11,10 +11,7 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import Divider from "@material-ui/core/Divider"; import CircularProgress from "@material-ui/core/CircularProgress"; -import Typography from "@material-ui/core/Typography"; -import ArrowUpIcon from "@material-ui/icons/ArrowUpward"; -import ArrowDownIcon from "@material-ui/icons/ArrowDownward"; import ArrowBackIcon from "@material-ui/icons/ArrowBack"; import SaveIcon from "@material-ui/icons/Save"; import HelpIcon from "@material-ui/icons/Help"; diff --git a/src/react/Pages/RequestInquiryInfo.jsx b/src/react/Pages/RequestInquiryInfo.jsx index 25959bbe..4eaa934e 100644 --- a/src/react/Pages/RequestInquiryInfo.jsx +++ b/src/react/Pages/RequestInquiryInfo.jsx @@ -14,14 +14,11 @@ import ListItemText from "@material-ui/core/ListItemText"; import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import Divider from "@material-ui/core/Divider"; import CircularProgress from "@material-ui/core/CircularProgress"; -import Typography from "@material-ui/core/Typography"; import CopyIcon from "@material-ui/icons/FileCopy"; import ArrowBackIcon from "@material-ui/icons/ArrowBack"; import HelpIcon from "@material-ui/icons/Help"; import SaveIcon from "@material-ui/icons/Save"; -import ArrowUpIcon from "@material-ui/icons/ArrowUpward"; -import ArrowDownIcon from "@material-ui/icons/ArrowDownward"; import FilterIcon from "@material-ui/icons/FilterList"; import FilterCreationDialog from "../Components/FilterCreationDialog"; diff --git a/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx b/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx index b961ca9e..a81557ee 100644 --- a/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx +++ b/src/react/Pages/RequestResponseInfo/RequestResponseInfo.jsx @@ -11,13 +11,10 @@ import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; import Divider from "@material-ui/core/Divider"; import CircularProgress from "@material-ui/core/CircularProgress"; -import Typography from "@material-ui/core/Typography"; import ArrowBackIcon from "@material-ui/icons/ArrowBack"; import HelpIcon from "@material-ui/icons/Help"; import SaveIcon from "@material-ui/icons/Save"; -import ArrowUpIcon from "@material-ui/icons/ArrowUpward"; -import ArrowDownIcon from "@material-ui/icons/ArrowDownward"; import FilterIcon from "@material-ui/icons/FilterList"; import FilterCreationDialog from "../../Components/FilterCreationDialog"; From 80339eaecc2d276a8f06f5e6e08e86fb182d8849 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 20:19:04 +0100 Subject: [PATCH 20/61] Remove IP address api call from login page (fixes #450) --- src/react/Pages/Login/Login.jsx | 43 ++------------------------- src/react/Pages/Login/SideOptions.jsx | 17 ----------- 2 files changed, 3 insertions(+), 57 deletions(-) diff --git a/src/react/Pages/Login/Login.jsx b/src/react/Pages/Login/Login.jsx index 25f5d1c0..3c313116 100644 --- a/src/react/Pages/Login/Login.jsx +++ b/src/react/Pages/Login/Login.jsx @@ -117,11 +117,6 @@ class Login extends React.Component { // enable wildcard mode on device registration wildcardMode: false, - // allowed ip addresses for the session - currentIp: false, - currentIpValid: true, - gettingCurrentIpLoading: false, - // apikey and device details apiKey: "", apiKeyValid: false, @@ -219,8 +214,8 @@ class Login extends React.Component { if (this.state.deviceNameValid && this.state.apiKeyValid) { // check if we use default ips or current ip + wildcard mode let permittedIps = []; - if (this.state.currentIp && this.state.wildcardMode) { - permittedIps = [this.state.currentIp, "*"]; + if (this.state.wildcardMode) { + permittedIps = ["*"]; } this.registrationLogin(this.state.apiKey, permittedIps); @@ -348,51 +343,22 @@ class Login extends React.Component { }; handleWildcardModeChange = (event, checked) => { this.setState({ wildcardMode: checked }); - - // if checked and no ips set, get the user's current IP address - if (checked && !this.state.currentIp && !this.state.gettingCurrentIpLoading) { - this.setState({ - gettingCurrentIpLoading: true - }); - - axios - .get("https://api.ipify.org?format=json") - .then(response => response.data.ip) - .then(ip => { - // set current IP and wildcard IP - this.setState({ - currentIp: ip, - gettingCurrentIpLoading: false - }); - }) - .catch(error => { - Logger.error(error); - this.setState({ - gettingCurrentIpLoading: false - }); - }); - } }; handleTabChange = (event, value) => { this.setState({ tabIndex: value }); }; validateInputs = (cb = () => {}) => { - const currentIp = this.state.currentIp; const apiKey = this.state.apiKey; const deviceName = this.state.deviceName; const apiKeyValid = apiKey !== false && apiKey.length === 64; - const deviceNameValid = deviceName !== false && deviceName.length >= 1 && deviceName.length <= 32; - const currentIpValid = currentIp === false || currentIp.split(".").length === 4; - this.setState( { apiKeyValid: apiKeyValid, - deviceNameValid: deviceNameValid, - currentIpValid: currentIpValid + deviceNameValid: deviceNameValid }, cb ); @@ -526,9 +492,6 @@ class Login extends React.Component { openOptions={this.state.openOptions} sandboxMode={this.state.sandboxMode} wildcardMode={this.state.wildcardMode} - currentIp={this.state.currentIp} - currentIpValid={this.state.currentIpValid} - gettingCurrentIpLoading={this.state.gettingCurrentIpLoading} apiKey={this.state.apiKey} apiKeyValid={this.state.apiKeyValid} createSandboxUser={this.createSandboxUser} diff --git a/src/react/Pages/Login/SideOptions.jsx b/src/react/Pages/Login/SideOptions.jsx index 28f8a34c..672e3ced 100644 --- a/src/react/Pages/Login/SideOptions.jsx +++ b/src/react/Pages/Login/SideOptions.jsx @@ -58,9 +58,6 @@ export default props => { apiKeyValid, sandboxMode, wildcardMode, - currentIp, - currentIpValid, - gettingCurrentIpLoading, buttonDisabled, sandboxButtonDisabled, setApiKeyClassname, @@ -126,20 +123,6 @@ export default props => { } /> - {wildcardMode && ( - - Current IP Address - - - )} - {sandboxMode ? ( Date: Sun, 16 Dec 2018 20:25:16 +0100 Subject: [PATCH 21/61] Remove _IV variation of encrypted storage when possible --- src/react/BunqDesktopClient.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/react/BunqDesktopClient.ts b/src/react/BunqDesktopClient.ts index be3e8cdc..918f2c7b 100644 --- a/src/react/BunqDesktopClient.ts +++ b/src/react/BunqDesktopClient.ts @@ -479,11 +479,14 @@ class BunqDesktopClient { return storeEncryptString(data, key, this.BunqJSClient.Session.encryptionKey, type); } public storeRemove(key: string, type = "ALL"): void { - if (type === "INDEXEDDB" || type === "ALL") { - this.IndexedDb.silentRemove(key); - } - if (type === "LOCALSTORAGE" || type === "ALL") { - store.remove(key); + if (type === "INDEXEDDB" || type === "ALL") this.IndexedDb.silentRemove(key); + if (type === "LOCALSTORAGE" || type === "ALL") store.remove(key); + + // backup, attempt to delete IV value when possible + if (!key.endsWith("_IV")) { + const ivKey = `${key}_IV`; + if (type === "INDEXEDDB" || type === "ALL") this.IndexedDb.silentRemove(ivKey); + if (type === "LOCALSTORAGE" || type === "ALL") store.remove(ivKey); } } From 5e498c5bd815bd645e19a64024891b61573e1290 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 20:41:40 +0100 Subject: [PATCH 22/61] Implement new store remove function --- src/react/Reducers/pending_payments.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/react/Reducers/pending_payments.js b/src/react/Reducers/pending_payments.js index 1c1a6ede..803ca2b6 100644 --- a/src/react/Reducers/pending_payments.js +++ b/src/react/Reducers/pending_payments.js @@ -125,7 +125,8 @@ export default (state = defaultState, action) => { case "REGISTRATION_LOG_OUT": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": - store.remove(PENDING_PAYMENTS_LOCATION); + const BunqDesktopClient = window.BunqDesktopClient; + BunqDesktopClient.removeStoredApiKey(PENDING_PAYMENTS_LOCATION); return { ...defaultState }; } return state; From 0ea2e6b9457a62954d70bfb8e2768a524121df67 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sun, 16 Dec 2018 23:00:55 +0100 Subject: [PATCH 23/61] Improve filter drawer spacing --- .../Components/CombinedList/CombinedList.jsx | 4 + .../FilterComponents/ClearFilter.jsx | 7 + .../FilterComponents/FilterDrawer.jsx | 341 ++++++++++-------- src/react/Functions/DataFilters.js | 8 + src/react/Functions/FilterDisabledChecker.js | 4 + src/react/Reducers/date_filter.js | 4 +- 6 files changed, 210 insertions(+), 158 deletions(-) diff --git a/src/react/Components/CombinedList/CombinedList.jsx b/src/react/Components/CombinedList/CombinedList.jsx index 8d8e053d..3777831a 100644 --- a/src/react/Components/CombinedList/CombinedList.jsx +++ b/src/react/Components/CombinedList/CombinedList.jsx @@ -176,6 +176,8 @@ class CombinedList extends React.Component { pageSize, selectedAccountIds, selectedCategories, + dateFromFilter, + dateToFilter, searchTerm, paymentType, bunqMeTabType, @@ -189,6 +191,8 @@ class CombinedList extends React.Component { // check if a filter is set const filterIsDisabled = FilterDisabledChecker({ + dateFromFilter, + dateToFilter, selectedAccountIds, selectedCategories, searchTerm, diff --git a/src/react/Components/FilterComponents/ClearFilter.jsx b/src/react/Components/FilterComponents/ClearFilter.jsx index 122117b9..6869bf2c 100644 --- a/src/react/Components/FilterComponents/ClearFilter.jsx +++ b/src/react/Components/FilterComponents/ClearFilter.jsx @@ -16,6 +16,8 @@ class ClearFilter extends React.Component { render() { const { + dateFromFilter, + dateToFilter, selectedAccountIds, selectedCategories, searchTerm, @@ -30,6 +32,8 @@ class ClearFilter extends React.Component { if ( FilterDisabledChecker({ + dateFromFilter, + dateToFilter, selectedAccountIds, selectedCategories, searchTerm, @@ -75,6 +79,9 @@ const mapStateToProps = state => { requestType: state.request_filter.type, requestVisibility: state.request_filter.visible, + dateFromFilter: state.date_filter.from_date, + dateToFilter: state.date_filter.to_date, + selectedCategories: state.category_filter.selected_categories, selectedAccountIds: state.account_id_filter.selected_account_ids, diff --git a/src/react/Components/FilterComponents/FilterDrawer.jsx b/src/react/Components/FilterComponents/FilterDrawer.jsx index b04cacba..3717bb5d 100644 --- a/src/react/Components/FilterComponents/FilterDrawer.jsx +++ b/src/react/Components/FilterComponents/FilterDrawer.jsx @@ -106,7 +106,9 @@ class FilterDrawer extends React.Component { this.state = { selectedDateFrom: null, selectedDateTo: null, - open: false + open: false, + + displayDateFilter: false }; } @@ -138,6 +140,9 @@ class FilterDrawer extends React.Component { this.props.toggleBunqMeTabFilterVisibility(); }; + toggleDateVisibilityChange = () => { + this.setState({ displayDateFilter: !this.state.displayDateFilter }); + }; handleDateFromChange = date => { this.props.setFromDateFilter(date); }; @@ -164,6 +169,9 @@ class FilterDrawer extends React.Component { } = this.props; const { sentPayment, receivedPayment } = theme.palette.common; + const displayDateFilters = + this.props.dateToFilter !== null || this.props.dateFromFilter !== null || this.state.displayDateFilter; + const drawerList = ( @@ -186,33 +194,35 @@ class FilterDrawer extends React.Component { - - - } - checkedIcon={} - value={"default"} - /> - } - checkedIcon={} - value={"received"} - /> - } - checkedIcon={} - value={"sent"} - /> - - + {paymentVisibility && ( + + + } + checkedIcon={} + value={"default"} + /> + } + checkedIcon={} + value={"received"} + /> + } + checkedIcon={} + value={"sent"} + /> + + + )} {/* filters for both request-responses and request-requests*/} @@ -226,33 +236,35 @@ class FilterDrawer extends React.Component { - - - } - checkedIcon={} - value={"default"} - /> - } - checkedIcon={} - value={"received"} - /> - } - checkedIcon={} - value={"sent"} - /> - - + {requestVisibility && ( + + + } + checkedIcon={} + value={"default"} + /> + } + checkedIcon={} + value={"received"} + /> + } + checkedIcon={} + value={"sent"} + /> + + + )} {/* filters bunq.me tabs */} @@ -266,108 +278,125 @@ class FilterDrawer extends React.Component { - - - } - checkedIcon={} - value={"default"} - /> - } - checkedIcon={ - - } - value={"active"} - /> - } - checkedIcon={ - - } - value={"cancelled"} - /> - } - checkedIcon={ - - } - value={"expired"} - /> - - + {bunqMeTabVisibility && ( + + + } + checkedIcon={} + value={"default"} + /> + } + checkedIcon={ + + } + value={"active"} + /> + } + checkedIcon={ + + } + value={"cancelled"} + /> + } + checkedIcon={ + + } + value={"expired"} + /> + + + )} - {t("Date range filter")} - - - - clear - - - ) - }} - /> - - - - - clear - - - ) - }} - /> - + + {t("Date range filter")} + + + {displayDateFilters ? : } + + + + + {displayDateFilters && ( + + + + + clear + + + ) + }} + /> + + + + + clear + + + ) + }} + /> + + + )} diff --git a/src/react/Functions/DataFilters.js b/src/react/Functions/DataFilters.js index 1257fdf0..de5f1393 100644 --- a/src/react/Functions/DataFilters.js +++ b/src/react/Functions/DataFilters.js @@ -502,6 +502,10 @@ export const shareInviteBankResponseFilter = options => shareInviteBankResponse return false; } + if (options.requestVisibility === false) { + return false; + } + // don't show share invites if amount filter is set if (options.amountFilterAmount !== "") return false; @@ -533,6 +537,10 @@ export const shareInviteBankInquiryFilter = options => shareInviteBankInquiry => return false; } + if (options.requestVisibility === false) { + return false; + } + // hide these if any type of filter is set if (options.searchTerm && options.searchTerm.length > 0) { return false; diff --git a/src/react/Functions/FilterDisabledChecker.js b/src/react/Functions/FilterDisabledChecker.js index 722aa632..776bca25 100644 --- a/src/react/Functions/FilterDisabledChecker.js +++ b/src/react/Functions/FilterDisabledChecker.js @@ -1,4 +1,6 @@ export default ({ + dateFromFilter = null, + dateToFilter = null, selectedAccountIds, selectedCategories, searchTerm, @@ -11,6 +13,8 @@ export default ({ amountFilterAmount }) => { return ( + dateFromFilter === null && + dateToFilter === null && selectedAccountIds.length <= 0 && selectedCategories.length <= 0 && searchTerm.length <= 0 && diff --git a/src/react/Reducers/date_filter.js b/src/react/Reducers/date_filter.js index 63ee175f..6e7b63e1 100644 --- a/src/react/Reducers/date_filter.js +++ b/src/react/Reducers/date_filter.js @@ -1,6 +1,6 @@ export const defaultState = { from_date: null, - to_date: new Date() + to_date: null }; export default function reducer(state = defaultState, action) { @@ -24,7 +24,7 @@ export default function reducer(state = defaultState, action) { case "DATE_FILTER_TO_CLEAR": return { ...state, - to_date: new Date() + to_date: null }; case "GENERAL_FILTER_RESET": From cac651cf6fe8ac65258bb3a7e9ebf89f3635992a Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Mon, 17 Dec 2018 22:04:43 +0100 Subject: [PATCH 24/61] Implement card filter and improve filter naming on other pages (fixes #419) --- src/react/Actions/cards.js | 4 +- src/react/Actions/filters.js | 30 +++ src/react/Actions/pending_payments.js | 1 - .../Components/CombinedList/CombinedList.jsx | 13 +- .../FilterComponents/AccountSelection.jsx | 15 +- .../FilterComponents/AmountFilter.jsx | 3 +- .../FilterComponents/CardSelection.jsx | 183 ++++++++++++++++++ .../FilterComponents/ClearFilter.jsx | 16 +- .../FilterComponents/FilterDrawer.jsx | 3 + src/react/Functions/DataFilters.js | 78 +++++++- src/react/Functions/FilterDisabledChecker.js | 12 +- src/react/Locales/en.json | 3 + src/react/Pages/Cards/CardListItem.jsx | 45 +++-- src/react/Pages/Cards/Cards.jsx | 5 +- src/react/Pages/Stats/Stats.jsx | 11 +- src/react/Reducers/card_id_filter.js | 47 +++++ src/react/Reducers/general_filter.js | 16 +- src/react/Reducers/index.js | 2 + src/react/Themes/DefaultTheme.jsx | 2 +- 19 files changed, 419 insertions(+), 70 deletions(-) create mode 100644 src/react/Components/FilterComponents/CardSelection.jsx create mode 100644 src/react/Reducers/card_id_filter.js diff --git a/src/react/Actions/cards.js b/src/react/Actions/cards.js index 2d392a49..3232ac1c 100644 --- a/src/react/Actions/cards.js +++ b/src/react/Actions/cards.js @@ -19,12 +19,12 @@ export function cardsSetCardOrder(cardOrder) { }; } -export function cardsUpdate(BunqJSClient, user_id) { +export function cardsUpdate(user_id) { const failedMessage = window.t("We failed to load the cards overview"); return dispatch => { dispatch(cardsLoading()); - BunqJSClient.api.card + window.BunqDesktopClient.BunqJSClient.api.card .list(user_id) .then(cards => { dispatch(cardsSetInfo(cards, user_id)); diff --git a/src/react/Actions/filters.js b/src/react/Actions/filters.js index f4ca3e84..a03ea624 100644 --- a/src/react/Actions/filters.js +++ b/src/react/Actions/filters.js @@ -165,6 +165,36 @@ export function clearAccountIdFilter() { }; } +export function addCardIdFilter(cardId) { + return { + type: "CARD_ID_FILTER_ADD", + payload: { + card_id: cardId + } + }; +} + +export function removeCardIdFilter(cardId) { + return { + type: "CARD_ID_FILTER_REMOVE", + payload: { + card_id: cardId + } + }; +} + +export function toggleCardIdFilter() { + return { + type: "CARD_ID_FILTER_TOGGLE" + }; +} + +export function clearCardIdFilter() { + return { + type: "CARD_ID_FILTER_CLEAR" + }; +} + export function setAmountFilterAmount(amount = null) { return { type: "AMOUNT_FILTER_SET_AMOUNT", diff --git a/src/react/Actions/pending_payments.js b/src/react/Actions/pending_payments.js index 0c52fbc5..5e766728 100644 --- a/src/react/Actions/pending_payments.js +++ b/src/react/Actions/pending_payments.js @@ -1,4 +1,3 @@ - export const PENDING_PAYMENTS_LOCATION = "BUNQDESKTOP_STORED_PENDING_PAYMENTS"; export function loadPendingPayments(BunqJSClient) { diff --git a/src/react/Components/CombinedList/CombinedList.jsx b/src/react/Components/CombinedList/CombinedList.jsx index 3777831a..ce7218cd 100644 --- a/src/react/Components/CombinedList/CombinedList.jsx +++ b/src/react/Components/CombinedList/CombinedList.jsx @@ -174,10 +174,11 @@ class CombinedList extends React.Component { t, page, pageSize, - selectedAccountIds, - selectedCategories, dateFromFilter, dateToFilter, + selectedCategories, + selectedAccountIds, + selectedCardIds, searchTerm, paymentType, bunqMeTabType, @@ -193,8 +194,9 @@ class CombinedList extends React.Component { const filterIsDisabled = FilterDisabledChecker({ dateFromFilter, dateToFilter, - selectedAccountIds, selectedCategories, + selectedAccountIds, + selectedCardIds, searchTerm, paymentType, bunqMeTabType, @@ -349,10 +351,11 @@ const mapStateToProps = state => { amountFilterType: state.amount_filter.type, selectedCategories: state.category_filter.selected_categories, - toggleCategoryFilter: state.category_filter.toggle, - + toggleCategoryIds: state.category_filter.toggle, selectedAccountIds: state.account_id_filter.selected_account_ids, toggleAccountIds: state.account_id_filter.toggle, + selectedCardIds: state.card_id_filter.selected_card_ids, + toggleCardIds: state.card_id_filter.toggle, categories: state.categories.categories, categoryConnections: state.categories.category_connections, diff --git a/src/react/Components/FilterComponents/AccountSelection.jsx b/src/react/Components/FilterComponents/AccountSelection.jsx index 67b5993e..1e873e30 100644 --- a/src/react/Components/FilterComponents/AccountSelection.jsx +++ b/src/react/Components/FilterComponents/AccountSelection.jsx @@ -45,6 +45,9 @@ class AccountSelection extends React.Component { addAccountId = accountId => event => { this.props.addAccountIdFilter(accountId); + if (this.props.accounts.length === this.props.selectedAccountIds.length) { + this.handleClose(event); + } }; removeAccountId = accountId => event => { this.props.removeAccountIdFilter(accountId); @@ -52,7 +55,7 @@ class AccountSelection extends React.Component { render() { const { anchorEl } = this.state; - const { accounts, selectedAccountIds } = this.props; + const { t, accounts, selectedAccountIds, toggleAccountIds } = this.props; const selectedAccountChipItems = selectedAccountIds.map((accountId, key) => { const account = accounts.find(account => account.id === accountId); @@ -114,16 +117,10 @@ class AccountSelection extends React.Component { - {this.props.toggleAccountIds ? ( - - ) : ( - - )} + {toggleAccountIds ? : } diff --git a/src/react/Components/FilterComponents/AmountFilter.jsx b/src/react/Components/FilterComponents/AmountFilter.jsx index 2a61c16c..0079fa66 100644 --- a/src/react/Components/FilterComponents/AmountFilter.jsx +++ b/src/react/Components/FilterComponents/AmountFilter.jsx @@ -55,8 +55,7 @@ const mapStateToProps = state => { const mapDispatchToProps = dispatch => { return { setAmountFilterAmount: amount => dispatch(setAmountFilterAmount(amount)), - setAmountFilterType: amount => dispatch(setAmountFilterType(amount)), - clearAmountFilter: () => dispatch(clearAmountFilter()) + setAmountFilterType: amount => dispatch(setAmountFilterType(amount)) }; }; diff --git a/src/react/Components/FilterComponents/CardSelection.jsx b/src/react/Components/FilterComponents/CardSelection.jsx new file mode 100644 index 00000000..c72dd805 --- /dev/null +++ b/src/react/Components/FilterComponents/CardSelection.jsx @@ -0,0 +1,183 @@ +import React from "react"; +import { connect } from "react-redux"; +import Chip from "@material-ui/core/Chip"; +import Avatar from "@material-ui/core/Avatar"; +import IconButton from "@material-ui/core/IconButton"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListSubheader from "@material-ui/core/ListSubheader"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; +import Menu from "@material-ui/core/Menu"; +import MenuItem from "@material-ui/core/MenuItem"; +import Tooltip from "@material-ui/core/Tooltip"; + +import AddIcon from "@material-ui/icons/Add"; +import FilterListIcon from "@material-ui/icons/FilterList"; + +import { cardsUpdate } from "../../Actions/cards"; +import { addCardIdFilter, removeCardIdFilter, toggleCardIdFilter } from "../../Actions/filters"; +import { getCardTypeImage } from "../../Pages/Cards/CardListItem"; + +const styles = { + listItem: { + display: "flex", + flexWrap: "wrap", + padding: "0 0 0 8px" + }, + chip: { + margin: 8 + }, + listItemIcon: { + display: "flex", + justifyContent: "center", + alignItems: "center", + width: 26, + height: 50 + }, + listItemImg: { + height: 40 + }, + chipImg: { + height: 40 + }, + subheaderTitle: { + height: 40 + } +}; + +class CardSelection extends React.Component { + constructor(props, context) { + super(props, context); + this.state = { + anchorEl: null + }; + } + + componentDidMount() { + if (this.props.cards.length === 0 && this.props.cardsLoading === false) { + this.props.cardsUpdate(this.props.user.id); + } + } + + handleClick = event => { + this.setState({ anchorEl: event.currentTarget }); + }; + handleClose = event => { + this.setState({ anchorEl: null }); + }; + + addCardId = cardId => event => { + this.props.addCardIdFilter(cardId); + if (this.props.cards.length === this.props.selectedCardIds.length + 1) { + this.handleClose(event); + } + }; + removeCardId = cardId => event => { + this.props.removeCardIdFilter(cardId); + }; + + render() { + const { anchorEl } = this.state; + const { t, cards, selectedCardIds, toggleCardIds } = this.props; + + const selectedCardChipItems = selectedCardIds.map((cardId, key) => { + let card = cards.find(card => card.CardDebit.id === cardId); + + // ensure card exists + if (!card) return null; + card = card.CardDebit; + const { cardImage, cardType } = getCardTypeImage(card.type); + + // display big chip or smaller icon + return ( + } + /> + ); + }); + + const cardMenuItems = Object.keys(cards) + .filter(cardIndex => { + const card = cards[cardIndex].CardDebit; + if (card && card.status !== "ACTIVE") { + return false; + } + return true; + }) + .map((cardIndex, key) => { + const card = cards[cardIndex].CardDebit; + + // don't display already selected items + if (selectedCardIds.includes(card.id)) { + return null; + } + const { cardImage, cardType } = getCardTypeImage(card.type); + + return ( + + + + + {card.second_line || cardType} + + ); + }); + + return ( + + + {t("Card filter")} + + + + + {toggleCardIds ? : } + + + + + + + + + {cardMenuItems} + + + {selectedCardChipItems} + + ); + } +} + +const mapStateToProps = state => { + return { + user: state.user.user, + + cards: state.cards.cards, + cardsLoading: state.cards.loading, + + selectedCardIds: state.card_id_filter.selected_card_ids, + toggleCardIds: state.card_id_filter.toggle + }; +}; + +const mapDispatchToProps = dispatch => { + return { + addCardIdFilter: cardId => dispatch(addCardIdFilter(cardId)), + removeCardIdFilter: index => dispatch(removeCardIdFilter(index)), + toggleCardIdFilter: () => dispatch(toggleCardIdFilter()), + + cardsUpdate: userId => dispatch(cardsUpdate(userId)) + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(CardSelection); diff --git a/src/react/Components/FilterComponents/ClearFilter.jsx b/src/react/Components/FilterComponents/ClearFilter.jsx index 6869bf2c..815d7c82 100644 --- a/src/react/Components/FilterComponents/ClearFilter.jsx +++ b/src/react/Components/FilterComponents/ClearFilter.jsx @@ -8,7 +8,7 @@ import FilterDisabledChecker from "../../Functions/FilterDisabledChecker"; import { resetFilters } from "../../Actions/filters"; -class ClearFilter extends React.Component { +class ClearFilter extends React.PureComponent { constructor(props, context) { super(props, context); this.state = {}; @@ -18,8 +18,9 @@ class ClearFilter extends React.Component { const { dateFromFilter, dateToFilter, - selectedAccountIds, selectedCategories, + selectedAccountIds, + selectedCardIds, searchTerm, paymentType, bunqMeTabType, @@ -34,8 +35,9 @@ class ClearFilter extends React.Component { FilterDisabledChecker({ dateFromFilter, dateToFilter, - selectedAccountIds, selectedCategories, + selectedAccountIds, + selectedCardIds, searchTerm, paymentType, bunqMeTabType, @@ -69,21 +71,21 @@ ClearFilter.defaultProps = { const mapStateToProps = state => { return { searchTerm: state.search_filter.search_term, - paymentType: state.payment_filter.type, paymentVisibility: state.payment_filter.visible, - bunqMeTabType: state.bunq_me_tab_filter.type, bunqMeTabVisibility: state.bunq_me_tab_filter.visible, - requestType: state.request_filter.type, requestVisibility: state.request_filter.visible, - dateFromFilter: state.date_filter.from_date, dateToFilter: state.date_filter.to_date, selectedCategories: state.category_filter.selected_categories, + toggleCategoryIds: state.category_filter.toggle, selectedAccountIds: state.account_id_filter.selected_account_ids, + toggleAccountIds: state.account_id_filter.toggle, + selectedCardIds: state.card_id_filter.selected_card_ids, + toggleCardIds: state.card_id_filter.toggle, amountFilterAmount: state.amount_filter.amount }; diff --git a/src/react/Components/FilterComponents/FilterDrawer.jsx b/src/react/Components/FilterComponents/FilterDrawer.jsx index 3717bb5d..190f85b0 100644 --- a/src/react/Components/FilterComponents/FilterDrawer.jsx +++ b/src/react/Components/FilterComponents/FilterDrawer.jsx @@ -45,6 +45,7 @@ import { import SearchFilter from "./SearchFilter"; import AccountSelection from "./AccountSelection"; +import CardSelection from "./CardSelection"; import CategorySelection from "./CategorySelection"; import AmountFilter from "./AmountFilter"; @@ -402,6 +403,8 @@ class FilterDrawer extends React.Component { + + diff --git a/src/react/Functions/DataFilters.js b/src/react/Functions/DataFilters.js index de5f1393..0f336a77 100644 --- a/src/react/Functions/DataFilters.js +++ b/src/react/Functions/DataFilters.js @@ -61,6 +61,10 @@ export const paymentFilter = options => payment => { } } + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + if (options.searchTerm && options.searchTerm.length > 0) { const searchMatches = [ payment.description.toLowerCase(), @@ -147,6 +151,10 @@ export const bunqMeTabsFilter = options => bunqMeTab => { // don't show bunqme requests if amount filter is set if (options.amountFilterAmount !== "") return false; + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + if (options.selectedCategories && options.categories && options.categoryConnections) { if (options.selectedCategories.length > 0) { const categories = CategoryHelper( @@ -262,16 +270,24 @@ export const masterCardActionFilter = options => masterCardAction => { } } - if (options.selectedAccountIds) { - if (options.selectedAccountIds.length > 0) { - // check if the payment is connected to a selected account - const foundIndex = options.selectedAccountIds.findIndex( - selectedAccountId => selectedAccountId === masterCardAction.monetary_account_id - ); + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + // check if the payment is connected to a selected account + const foundIndex = options.selectedCardIds.findIndex( + selectedCardId => selectedCardId === masterCardAction.card_id + ); - // if true only return true if account id is in the filter, else return false - return options.toggleAccountIds === false ? foundIndex > -1 : foundIndex === -1; - } + // if true only return true if account id is in the filter, else return false + return options.toggleCardIds === false ? foundIndex > -1 : foundIndex === -1; + } + + if (options.selectedAccountIds && options.selectedAccountIds.length > 0) { + // check if the payment is connected to a selected account + const foundIndex = options.selectedAccountIds.findIndex( + selectedAccountId => selectedAccountId === masterCardAction.monetary_account_id + ); + + // if true only return true if account id is in the filter, else return false + return options.toggleAccountIds === false ? foundIndex > -1 : foundIndex === -1; } return checkDateRange(options.dateFromFilter, options.dateToFilter, masterCardAction.MasterCardAction.created); @@ -318,6 +334,10 @@ export const requestResponseFilter = options => requestResponse => { if (!searchMatches) return false; } + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + if (options.amountFilterAmount !== "") { let amountValue = requestResponse.getAmount(); if (amountValue < 0) amountValue = amountValue * -1; @@ -419,6 +439,10 @@ export const requestInquiryFilter = options => requestInquiry => { } } + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + if (options.selectedCategories && options.categories && options.categoryConnections) { if (options.selectedCategories.length > 0) { const categories = CategoryHelper( @@ -481,6 +505,10 @@ export const requestInquiryBatchFilter = options => requestInquiryBatch => { // don't show requests if amount filter is set if (options.amountFilterAmount !== "") return false; + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + if (options.selectedAccountIds) { if (options.selectedAccountIds.length > 0) { // TODO check underlying request inquiry account ids @@ -521,6 +549,23 @@ export const shareInviteBankResponseFilter = options => shareInviteBankResponse ) { return false; } + + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + + if (options.selectedAccountIds && options.selectedAccountIds.length > 0) { + if (!shareInviteBankResponseInfo.monetary_account_id) return false; + + // check if the payment is connected to a selected account + const foundIndex = options.selectedAccountIds.findIndex( + selectedAccountId => selectedAccountId === shareInviteBankResponseInfo.monetary_account_id + ); + + // if true only return true if account id is in the filter, else return false + return options.toggleAccountIds === false ? foundIndex > -1 : foundIndex === -1; + } + if (options.bunqMeTabType !== "default" || options.paymentType !== "default" || options.requestType !== "default") { return false; } @@ -549,6 +594,10 @@ export const shareInviteBankInquiryFilter = options => shareInviteBankInquiry => // don't show share invites if amount filter is set if (options.amountFilterAmount !== "") return false; + if (options.selectedCardIds && options.selectedCardIds.length > 0) { + return false; + } + if ( options.selectedCategories && options.categories && @@ -557,6 +606,17 @@ export const shareInviteBankInquiryFilter = options => shareInviteBankInquiry => ) { return false; } + + if (options.selectedAccountIds && options.selectedAccountIds.length > 0) { + // check if the payment is connected to a selected account + const foundIndex = options.selectedAccountIds.findIndex( + selectedAccountId => selectedAccountId === shareInviteBankInquiryInfo.monetary_account_id + ); + + // if true only return true if account id is in the filter, else return false + return options.toggleAccountIds === false ? foundIndex > -1 : foundIndex === -1; + } + if (options.bunqMeTabType !== "default" || options.paymentType !== "default" || options.requestType !== "default") { return false; } diff --git a/src/react/Functions/FilterDisabledChecker.js b/src/react/Functions/FilterDisabledChecker.js index 776bca25..c767176c 100644 --- a/src/react/Functions/FilterDisabledChecker.js +++ b/src/react/Functions/FilterDisabledChecker.js @@ -1,8 +1,9 @@ -export default ({ +const FilterDisabledChecker = ({ dateFromFilter = null, dateToFilter = null, - selectedAccountIds, - selectedCategories, + selectedCategories = [], + selectedAccountIds = [], + selectedCardIds = [], searchTerm, paymentType, bunqMeTabType, @@ -15,8 +16,9 @@ export default ({ return ( dateFromFilter === null && dateToFilter === null && - selectedAccountIds.length <= 0 && selectedCategories.length <= 0 && + selectedAccountIds.length <= 0 && + selectedCardIds.length <= 0 && searchTerm.length <= 0 && paymentType === "default" && bunqMeTabType === "default" && @@ -27,3 +29,5 @@ export default ({ amountFilterAmount === "" ); }; + +export default FilterDisabledChecker; diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index eab6c302..a1889887 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -63,6 +63,7 @@ "Cancelled": "Cancelled", "Capslock active": "Capslock active", "Card": "Card", + "Card filter": "Card filter", "Card payment": "Card payment", "Card payments": "Card payments", "Card payments (Maestro or Mastercard)": "Card payments (Maestro or Mastercard)", @@ -98,8 +99,10 @@ "Clear filters": "Clear filters", "Click any button to reset the data, the counter only displays the amount of payments currently loaded into memory but resetting will also remove the data from storage": "Click any button to reset the data, the counter only displays the amount of payments currently loaded into memory but resetting will also remove the data from storage", "Click to exclude the selected accounts": "Click to exclude the selected accounts", + "Click to exclude the selected cards": "Click to exclude the selected cards", "Click to exclude the selected categories": "Click to exclude the selected categories", "Click to include the selected accounts": "Click to include the selected accounts", + "Click to include the selected cards": "Click to include the selected cards", "Click to include the selected categories": "Click to include the selected categories", "Click to view": "Click to view", "Client ID": "Client ID", diff --git a/src/react/Pages/Cards/CardListItem.jsx b/src/react/Pages/Cards/CardListItem.jsx index 2c85e4b6..ae4af2ef 100644 --- a/src/react/Pages/Cards/CardListItem.jsx +++ b/src/react/Pages/Cards/CardListItem.jsx @@ -10,6 +10,30 @@ const styles = { cardImage: {} }; +export const getCardTypeImage = type => { + let cardImage = null; + let cardType = null; + switch (type) { + case "MASTERCARD": + cardType = "MasterCard"; + cardImage = "images/bunq-mastercard.png"; + break; + case "MAESTRO": + cardType = "Maestro"; + cardImage = "images/bunq-maestro.png"; + break; + case "MAESTRO_MOBILE_NFC": + cardType = "Mobile NFC"; + cardImage = "images/bunq-nfc-mobile-card.png"; + break; + default: + cardType = "Unknown"; + cardImage = "images/bunq-maestro.png"; + break; + } + return { cardImage, cardType }; +}; + class CardListItem extends React.Component { constructor(props, context) { super(props, context); @@ -18,26 +42,7 @@ class CardListItem extends React.Component { render() { const card = this.props.card; - let cardImage = null; - let cardType = null; - switch (card.type) { - case "MASTERCARD": - cardType = "MasterCard"; - cardImage = "images/bunq-mastercard.png"; - break; - case "MAESTRO": - cardType = "Maestro"; - cardImage = "images/bunq-maestro.png"; - break; - case "MAESTRO_MOBILE_NFC": - cardType = "Mobile NFC"; - cardImage = "images/bunq-nfc-mobile-card.png"; - break; - default: - cardType = "Unknown"; - cardImage = "images/bunq-maestro.png"; - break; - } + const { cardImage, cardType } = getCardTypeImage(card.type); return [
diff --git a/src/react/Pages/Cards/Cards.jsx b/src/react/Pages/Cards/Cards.jsx index 987d77d6..43bd10fb 100644 --- a/src/react/Pages/Cards/Cards.jsx +++ b/src/react/Pages/Cards/Cards.jsx @@ -350,10 +350,9 @@ const mapStateToProps = state => { }; }; -const mapDispatchToProps = (dispatch, props) => { - const { BunqJSClient } = props; +const mapDispatchToProps = (dispatch) => { return { - cardsUpdate: userId => dispatch(cardsUpdate(BunqJSClient, userId)), + cardsUpdate: userId => dispatch(cardsUpdate(userId)), cardsSetCardOrder: cardOrder => dispatch(cardsSetCardOrder(cardOrder)) }; }; diff --git a/src/react/Pages/Stats/Stats.jsx b/src/react/Pages/Stats/Stats.jsx index abe28dfb..2c85939d 100644 --- a/src/react/Pages/Stats/Stats.jsx +++ b/src/react/Pages/Stats/Stats.jsx @@ -125,9 +125,11 @@ class Stats extends React.Component { amountFilterAmount: this.props.amountFilterAmount, amountFilterType: this.props.amountFilterType, selectedAccountIds: props.selectedAccountIds, - toggleAccountIds: props.toggleAccountIds, + toggleAccountIdFilter: props.toggleAccountIdFilter, selectedCategories: props.selectedCategories, - toggleCategoryFilter: props.toggleCategoryFilter, + toggleCategoryIds: props.toggleCategoryIds, + selectedCardIds: props.selectedCardIds, + toggleCardIds: props.toggleCardIds, categories: props.categories, categoryConnections: props.categoryConnections, displayRequestPayments: false, @@ -430,9 +432,10 @@ const mapStateToProps = state => { selectedAccountIds: state.account_id_filter.selected_account_ids, toggleAccountIds: state.account_id_filter.toggle, - selectedCategories: state.category_filter.selected_categories, - toggleCategoryFilter: state.category_filter.toggle, + toggleCategoryIds: state.category_filter.toggle, + selectedCardIds: state.card_id_filter.selected_card_ids, + toggleCardIds: state.card_id_filter.toggle, amountFilterAmount: state.amount_filter.amount, amountFilterType: state.amount_filter.type diff --git a/src/react/Reducers/card_id_filter.js b/src/react/Reducers/card_id_filter.js new file mode 100644 index 00000000..961d7335 --- /dev/null +++ b/src/react/Reducers/card_id_filter.js @@ -0,0 +1,47 @@ +export const defaultState = { + selected_card_ids: [], + toggle: false +}; + +export default function reducer(state = defaultState, action) { + switch (action.type) { + case "CARD_ID_FILTER_ADD": + const currentCardIds = [...state.selected_card_ids]; + + // prevent duplicates + if (!currentCardIds.includes(action.payload.card_id)) { + currentCardIds.push(action.payload.card_id); + } + + return { + ...state, + selected_card_ids: currentCardIds + }; + + case "CARD_ID_FILTER_REMOVE": + const currentCardIds2 = [...state.selected_card_ids]; + + const removeIndex = currentCardIds2.findIndex(cardId => cardId === action.payload.card_id); + if (removeIndex === -1) return state; + + currentCardIds2.splice(removeIndex, 1); + + return { + ...state, + selected_card_ids: currentCardIds2 + }; + + case "CARD_ID_FILTER_TOGGLE": + return { + ...state, + toggle: !state.toggle + }; + + case "CARD_ID_FILTER_CLEAR": + case "GENERAL_FILTER_RESET": + return { + ...defaultState + }; + } + return state; +} diff --git a/src/react/Reducers/general_filter.js b/src/react/Reducers/general_filter.js index f1b6a5df..e0de2859 100644 --- a/src/react/Reducers/general_filter.js +++ b/src/react/Reducers/general_filter.js @@ -20,11 +20,17 @@ export default function reducer(state = defaultState, action) { case "ACCOUNT_ID_FILTER_TOGGLE": case "ACCOUNT_ID_FILTER_REMOVE": case "ACCOUNT_ID_FILTER_ADD": + case "ACCOUNT_ID_FILTER_CLEAR": + + case "CARD_ID_FILTER_TOGGLE": + case "CARD_ID_FILTER_REMOVE": + case "CARD_ID_FILTER_ADD": + case "CARD_ID_FILTER_CLEAR": - case "CATEGORY_FILTER_CLEAR": - case "CATEGORY_FILTER_ADD_CATEGORY_ID": - case "CATEGORY_FILTER_REMOVE_CATEGORY_ID": case "CATEGORY_FILTER_TOGGLE_CATEGORY_ID": + case "CATEGORY_FILTER_REMOVE_CATEGORY_ID": + case "CATEGORY_FILTER_ADD_CATEGORY_ID": + case "CATEGORY_FILTER_CLEAR": case "BUNQ_ME_TAB_FILTER_SET_TYPE": case "BUNQ_ME_TAB_FILTER_TOGGLE_VISIBILITY": @@ -34,6 +40,10 @@ export default function reducer(state = defaultState, action) { case "REQUEST_FILTER_TOGGLE_VISIBILITY": case "REQUEST_FILTER_CLEAR": + case "REQUEST_FILTER_SET_TYPE": + case "REQUEST_FILTER_TOGGLE_VISIBILITY": + case "REQUEST_FILTER_CLEAR": + case "PAYMENT_FILTER_SET_TYPE": case "PAYMENT_FILTER_TOGGLE_VISIBILITY": case "PAYMENT_FILTER_CLEAR": diff --git a/src/react/Reducers/index.js b/src/react/Reducers/index.js index 784e0dc1..390656d7 100644 --- a/src/react/Reducers/index.js +++ b/src/react/Reducers/index.js @@ -12,6 +12,7 @@ import categories from "./categories"; import category_filter from "./category_filter"; import cards from "./cards"; import card_cvc2 from "./card_cvc2"; +import card_id_filter from "./card_id_filter"; import category_rules from "./category_rules.ts"; import contacts from "./contacts"; import date_filter from "./date_filter"; @@ -63,6 +64,7 @@ export default combineReducers({ category_filter, cards, card_cvc2, + card_id_filter, category_rules, contacts, date_filter, diff --git a/src/react/Themes/DefaultTheme.jsx b/src/react/Themes/DefaultTheme.jsx index 555ed8a2..9a0dafb4 100644 --- a/src/react/Themes/DefaultTheme.jsx +++ b/src/react/Themes/DefaultTheme.jsx @@ -30,7 +30,7 @@ export default { }, bunqMeTabs: { awaiting_payment: "#62ca04", - cancelled: "#a4a6a4", + cancelled: "#FF3333", expired: "#a4a6a4" } }, From 6a4038299e7f46b8e6b67eb90460cf91b603c9f2 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Mon, 17 Dec 2018 23:02:00 +0100 Subject: [PATCH 25/61] Fix minor bugs with logging and switching account --- src/react/Actions/registration.js | 1 + src/react/Functions/Logger.js | 42 +++++++++++++------------- src/react/Reducers/pending_payments.js | 2 +- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/react/Actions/registration.js b/src/react/Actions/registration.js index a04273dc..e6539da8 100644 --- a/src/react/Actions/registration.js +++ b/src/react/Actions/registration.js @@ -272,6 +272,7 @@ export function registrationResetToApiScreen(resetStoredApiKey = false) { export function registrationLogOut(resetStoredApiKey = true) { const BunqDesktopClient = window.BunqDesktopClient; return dispatch => { + BunqDesktopClient.clearPassword(); BunqDesktopClient.destroyApiSession(resetStoredApiKey).then(_ => { dispatch({ type: "REGISTRATION_LOG_OUT", diff --git a/src/react/Functions/Logger.js b/src/react/Functions/Logger.js index c1753d5a..e38a592b 100644 --- a/src/react/Functions/Logger.js +++ b/src/react/Functions/Logger.js @@ -3,32 +3,32 @@ const remote = require("electron").remote; const electronLog = remote ? remote.require("electron-log") : require("electron-log"); export default { - log: (...params) => { - console.log(...params); - electronLog.log(...params); + log: params => { + console.log(params); + electronLog.log(params); }, - error: (...params) => { - console.error(...params); - electronLog.error(...params); + error: params => { + console.error(params); + electronLog.error(params); }, - warn: (...params) => { - console.warn(...params); - electronLog.warn(...params); + warn: params => { + console.warn(params); + electronLog.warn(params); }, - info: (...params) => { - console.info(...params); - electronLog.info(...params); + info: params => { + console.info(params); + electronLog.info(params); }, - verbose: (...params) => { - console.debug(...params); - electronLog.verbose(...params); + verbose: params => { + console.debug(params); + electronLog.verbose(params); }, - debug: (...params) => { - console.debug(...params); - electronLog.debug(...params); + debug: params => { + console.debug(params); + electronLog.debug(params); }, - silly: (...params) => { - console.debug(...params); - electronLog.silly(...params); + silly: params => { + console.debug(params); + electronLog.silly(params); } }; diff --git a/src/react/Reducers/pending_payments.js b/src/react/Reducers/pending_payments.js index 803ca2b6..25a67536 100644 --- a/src/react/Reducers/pending_payments.js +++ b/src/react/Reducers/pending_payments.js @@ -126,7 +126,7 @@ export default (state = defaultState, action) => { case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_CLEAR_USER_INFO": const BunqDesktopClient = window.BunqDesktopClient; - BunqDesktopClient.removeStoredApiKey(PENDING_PAYMENTS_LOCATION); + BunqDesktopClient.storeRemove(PENDING_PAYMENTS_LOCATION); return { ...defaultState }; } return state; From caaff0132af26c583ac7c0c2bbfc01405973e6ff Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Mon, 17 Dec 2018 23:17:24 +0100 Subject: [PATCH 26/61] Store and re-use scroll position (fixes #398) --- .../Components/CombinedList/CombinedList.jsx | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/react/Components/CombinedList/CombinedList.jsx b/src/react/Components/CombinedList/CombinedList.jsx index ce7218cd..640a7b01 100644 --- a/src/react/Components/CombinedList/CombinedList.jsx +++ b/src/react/Components/CombinedList/CombinedList.jsx @@ -1,4 +1,5 @@ import React from "react"; +const sessionStore = require("store/storages/sessionStorage"); import { connect } from "react-redux"; import { translate } from "react-i18next"; import List from "@material-ui/core/List"; @@ -19,7 +20,6 @@ import { openSnackbar } from "../../Actions/snackbar"; import { bunqMeTabPut } from "../../Actions/bunq_me_tab"; import { nextPage, previousPage, setPage, setPageSize, firstPage } from "../../Actions/pagination"; -import { humanReadableDate } from "../../Functions/Utils"; import { paymentMapper, bunqMeTabsMapper, @@ -30,6 +30,7 @@ import { shareInviteBankInquiryMapper, shareInviteBankResponseMapper } from "./MapperFunctions"; +import { humanReadableDate } from "../../Functions/Utils"; import FilterDisabledChecker from "../../Functions/FilterDisabledChecker"; const styles = { @@ -56,6 +57,8 @@ const styles = { } }; +const STORED_SCROLL_POSITION = "STORED_SCROLL_POSITION"; + class CombinedList extends React.Component { constructor(props, context) { super(props, context); @@ -70,6 +73,11 @@ class CombinedList extends React.Component { this.loadEvents(); } + componentWillUnmount() { + // set current scroll position before leaving the page + sessionStore.write(STORED_SCROLL_POSITION, document.documentElement.scrollTop); + } + componentDidUpdate(prevProps) { const isLoading = this.props.queueLoading || @@ -102,6 +110,14 @@ class CombinedList extends React.Component { } } + useOldPosition = () => { + const storedScrollPosition = sessionStore.read(STORED_SCROLL_POSITION); + if (storedScrollPosition) { + document.documentElement.scrollTop = storedScrollPosition; + sessionStore.remove(STORED_SCROLL_POSITION); + } + } + loadEvents = () => { const settings = this.getSettings(); @@ -132,7 +148,7 @@ class CombinedList extends React.Component { this.setState({ totalEvents: this.state.totalEvents < events.length ? events.length : this.state.totalEvents, events: events - }); + }, this.useOldPosition); }; copiedValue = type => callback => { From 001a4e817c5967f0598d556709b2de5f6e73464f Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 18 Dec 2018 13:39:35 +0100 Subject: [PATCH 27/61] Check bunq API instead of remote address --- src/react/Components/Layout.jsx | 4 ++-- src/react/Components/NetworkStatusChecker.jsx | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/react/Components/Layout.jsx b/src/react/Components/Layout.jsx index 8564ebba..a5f0c9be 100644 --- a/src/react/Components/Layout.jsx +++ b/src/react/Components/Layout.jsx @@ -144,8 +144,8 @@ class Layout extends React.Component { this.checkLanguageChange(nextProps); if (nextProps.theme === "DefaultTheme") { - if (document.documentElement.style.backgroundColor !== "#ffffff") { - document.documentElement.style.backgroundColor = "#ffffff"; + if (document.documentElement.style.backgroundColor !== "#fafafa") { + document.documentElement.style.backgroundColor = "#fafafa"; } } else { if (document.documentElement.style.backgroundColor !== "#303030") { diff --git a/src/react/Components/NetworkStatusChecker.jsx b/src/react/Components/NetworkStatusChecker.jsx index 5a99abc6..0d03e787 100644 --- a/src/react/Components/NetworkStatusChecker.jsx +++ b/src/react/Components/NetworkStatusChecker.jsx @@ -51,11 +51,15 @@ class NetworkStatusChecker extends React.PureComponent { */ checkNetWorkStatus = () => { axios - .get("https://google.com") + .get("https://api.bunq.com/v1/user") .then(response => { this.props.applicationSetOnline(); }) .catch(error => { + if (error.toString() !== "Error: Network Error") { + this.props.applicationSetOnline(); + return; + } this.props.applicationSetOffline(); }); }; From 78909a1ccec8d004ff18bddf05267df338456832 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 18 Dec 2018 19:05:39 +0100 Subject: [PATCH 28/61] View and modify notification filters (fixes #420) --- config/Webpack/plugins.js | 2 +- src/react/Locales/en.json | 6 + src/react/Pages/Profile/BusinessInfo.jsx | 100 +++++++ .../Pages/Profile/NotificationFilters.jsx | 262 ++++++++++++++++++ src/react/Pages/Profile/Profile.jsx | 121 ++------ 5 files changed, 393 insertions(+), 98 deletions(-) create mode 100644 src/react/Pages/Profile/BusinessInfo.jsx create mode 100644 src/react/Pages/Profile/NotificationFilters.jsx diff --git a/config/Webpack/plugins.js b/config/Webpack/plugins.js index a79a208d..23d08f49 100644 --- a/config/Webpack/plugins.js +++ b/config/Webpack/plugins.js @@ -1,7 +1,7 @@ const webpack = require("webpack"); -const HardSourceWebpackPlugin = require("hard-source-webpack-plugin"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const HardSourceWebpackPlugin = require("hard-source-webpack-plugin"); const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; const packageInfo = require("../../package.json"); diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index a1889887..2c8b82bc 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -78,6 +78,7 @@ "Cards update sent": "Cards update sent", "Categories": "Categories", "Categories that will be added": "Categories that will be added", + "Category": "Category", "Category Editor": "Category Editor", "Category count": "Category count", "Category count history": "Category count history", @@ -155,6 +156,7 @@ "Delete": "Delete", "Delivered to customer": "Delivered to customer", "Delivered virtually": "Delivered virtually", + "Delivery method": "Delivery method", "Description": "Description", "Device Name": "Device Name", "Disabled": "Disabled", @@ -288,6 +290,7 @@ "Maximum allowed length is": "Maximum allowed length is", "Maximum events per type": "Maximum events per type", "Merchant reference": "Merchant reference", + "Method": "Method", "Minimize to tray": "Minimize to tray", "Minimum required length is": "Minimum required length is", "Minute": "Minute", @@ -320,6 +323,7 @@ "No stored keys found": "No stored keys found", "None": "None", "Not Found": "Not Found", + "Notification filters": "Notification filters", "Number of payments": "Number of payments", "Number of requests": "Number of requests", "OAuth": "OAuth", @@ -372,6 +376,7 @@ "Production key": "Production key", "Profile": "Profile", "Public nick name": "Public nick name", + "Push notifications": "Push notifications", "Queue is empty": "Queue is empty", "Reason": "Reason", "Received": "Received", @@ -531,6 +536,7 @@ "Use account balances": "Use account balances", "Use no password": "Use no password", "Use the native frame": "Use the native frame", + "Value": "Value", "Value rule with": "Value rule with", "Version": "Version", "View CVC Codes": "View CVC Codes", diff --git a/src/react/Pages/Profile/BusinessInfo.jsx b/src/react/Pages/Profile/BusinessInfo.jsx new file mode 100644 index 00000000..d2af266f --- /dev/null +++ b/src/react/Pages/Profile/BusinessInfo.jsx @@ -0,0 +1,100 @@ +import React from "react"; +import Grid from "@material-ui/core/Grid"; +import Paper from "@material-ui/core/Paper"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; + +import { formatMoney } from "../../Functions/Utils"; + +import TranslateTypography from "../../Components/TranslationHelpers/Typography"; + +const styles = { + paper: { + padding: 16, + marginTop: 16 + } +}; + +const BusinessInfo = ({ t, userType, totalBalance, ...props }) => { + if (userType !== "UserCompany") return null; + + const safeKeepingValue = totalBalance - 100000; + const hasSafeKeepingFee = safeKeepingValue > 0; + + let costsTable = null; + if (hasSafeKeepingFee) { + costsTable = ( + + + + {t("Days")} + {t("Estimated total cost")} + {t("Balance after payments")} + + + + {[1, 7, 30, 90, 365].map(days => { + // to keep track of the amount across the dates + let accountBalance = safeKeepingValue; + let totalPayment = 0; + + // go through the days to calculate historic change + for (let day = 0; day < days; day++) { + const thousands = accountBalance / 1000; + let nextPayment = (thousands * 2.4) / 100; + + // update balance + accountBalance = accountBalance - nextPayment; + totalPayment = totalPayment + nextPayment; + } + + return ( + + + {days} + + {formatMoney(totalPayment)} + {formatMoney(accountBalance)} + + ); + })} + +
+ ); + } + + return ( + + + + Safekeeping fee calculator + + + + + + + + {hasSafeKeepingFee ? ( + costsTable + ) : ( + No safekeeping fee + )} + + + + ); +}; + +export default BusinessInfo; diff --git a/src/react/Pages/Profile/NotificationFilters.jsx b/src/react/Pages/Profile/NotificationFilters.jsx new file mode 100644 index 00000000..fbd47eac --- /dev/null +++ b/src/react/Pages/Profile/NotificationFilters.jsx @@ -0,0 +1,262 @@ +import React from "react"; +import Grid from "@material-ui/core/Grid"; +import Button from "@material-ui/core/Button"; +import Typography from "@material-ui/core/Typography"; +import TextField from "@material-ui/core/TextField"; +import Paper from "@material-ui/core/Paper"; +import Table from "@material-ui/core/Table"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import IconButton from "@material-ui/core/IconButton"; +import Input from "@material-ui/core/Input"; +import InputLabel from "@material-ui/core/InputLabel"; +import MenuItem from "@material-ui/core/MenuItem"; +import FormControl from "@material-ui/core/FormControl"; +import Select from "@material-ui/core/Select"; +import Collapse from "@material-ui/core/Collapse"; + +import DeleteIcon from "@material-ui/icons/Delete"; + +const styles = { + paper: { + padding: 16, + marginTop: 16 + }, + fullwidth: { + width: "100%" + }, + rowCell: { + padding: "4px 0px" + }, + rowDeleteButtonCell: { + width: 20, + padding: "4px 8px" + }, + addButtonWrapper: { + display: "flex", + justifyContent: "center" + } +}; + +class NotificationFilters extends React.Component { + constructor(props, context) { + super(props, context); + this.state = { + loading: false, + showPushesMessages: false, + + newCallbackUrl: "", + newCallbackCategory: "MUTATION" + }; + } + + onChange = key => event => { + this.setState({ + [key]: event.target.value + }); + }; + + updateNotificationFilters = notificationsList => { + const { t, user, userType, BunqJSClient } = this.props; + + const errorMessage = t("We failed to update your user information"); + this.setState({ loading: true }); + + const userInfo = { + notification_filters: notificationsList + }; + + const apiHandler = userType === "UserPerson" ? BunqJSClient.api.userPerson : BunqJSClient.api.userCompany; + + apiHandler + .put(user.id, userInfo) + .then(response => { + this.setState({ loading: false }); + this.props.usersUpdate(true); + }) + .catch(error => { + this.setState({ loading: false }); + this.props.BunqErrorHandler(error, errorMessage); + }); + }; + + deleteNotification = index => event => { + const notificationFilters = [...this.props.user.notification_filters]; + notificationFilters.splice(index, 1); + + this.updateNotificationFilters(notificationFilters); + }; + + addNotification = event => { + const notificationFilters = [...this.props.user.notification_filters]; + notificationFilters.push({ + notification_delivery_method: "URL", + category: this.state.newCallbackCategory, + notification_target: this.state.newCallbackUrl + }); + + this.updateNotificationFilters(notificationFilters); + }; + + render() { + const { t, user } = this.props; + + if (!user.notification_filters) return null; + + const notificationFilterTable = ( + + + + {t("Category")} + {t("Method")} + {t("Value")} + {""} + + + + {user.notification_filters.map((notificationFilter, index) => { + if (notificationFilter.notification_delivery_method === "PUSH") return null; + return ( + + {notificationFilter.category} + + {notificationFilter.notification_delivery_method} + + + {notificationFilter.notification_target} + {/**/} + + + + + + + + ); + })} + +
+ ); + const pushNotificationFilterTable = ( + + + + {t("Category")} + {t("Delivery method")} + + + + {user.notification_filters + .filter(notificationFilter => notificationFilter.notification_delivery_method === "PUSH") + .sort((a, b) => (a.category < b.category ? -1 : 1)) + .map((notificationFilter, index) => { + return ( + + {notificationFilter.category} + {notificationFilter.notification_delivery_method} + + ); + })} + +
+ ); + + return ( + + + + + {t("Notification filters")} + + + + + + + + + + {t("Category")} + + + + + + + + + + + {notificationFilterTable} + + + + + + + + {t("Push notifications")} + + + + + + + {pushNotificationFilterTable} + + + + + + ); + } +} + +export default NotificationFilters; diff --git a/src/react/Pages/Profile/Profile.jsx b/src/react/Pages/Profile/Profile.jsx index 98c6b914..57071a9c 100644 --- a/src/react/Pages/Profile/Profile.jsx +++ b/src/react/Pages/Profile/Profile.jsx @@ -5,13 +5,7 @@ import Helmet from "react-helmet"; import Grid from "@material-ui/core/Grid"; import Paper from "@material-ui/core/Paper"; import Button from "@material-ui/core/Button"; -import TextField from "@material-ui/core/TextField"; import CircularProgress from "@material-ui/core/CircularProgress"; -import Table from "@material-ui/core/Table"; -import TableBody from "@material-ui/core/TableBody"; -import TableCell from "@material-ui/core/TableCell"; -import TableHead from "@material-ui/core/TableHead"; -import TableRow from "@material-ui/core/TableRow"; import ListItemText from "@material-ui/core/ListItemText"; import ListItem from "@material-ui/core/ListItem"; import List from "@material-ui/core/List"; @@ -19,17 +13,17 @@ import Avatar from "@material-ui/core/Avatar"; import ArrowBackIcon from "@material-ui/icons/ArrowBack"; -import TranslateTypography from "../../Components/TranslationHelpers/Typography"; -import ProfileDetailsForm from "./ProfileDetailsForm"; import UploadFullscreen from "../../Components/FileUpload/UploadFullscreen"; import LazyAttachmentImage from "../../Components/AttachmentImage/LazyAttachmentImage"; +import ProfileDetailsForm from "./ProfileDetailsForm"; +import NotificationFilters from "./NotificationFilters"; import { openSnackbar } from "../../Actions/snackbar"; import { userUpdateImage } from "../../Actions/user"; import { usersUpdate } from "../../Actions/users"; import BunqErrorHandler from "../../Functions/BunqErrorHandler"; -import { formatMoney } from "../../Functions/Utils"; +import BusinessInfo from "./BusinessInfo"; const styles = { title: { @@ -42,6 +36,9 @@ const styles = { padding: 16, marginTop: 16 }, + headerImageListItem: { + paddingLeft: 8 + }, list: { textAlign: "left" }, @@ -97,6 +94,12 @@ class Profile extends React.Component { } } + onChange = key => event => { + this.setState({ + [key]: event.target.value + }); + }; + calculateTotalBalance = () => { return this.props.accounts.reduce((total, account) => { return total + account.getBalance(); @@ -122,12 +125,6 @@ class Profile extends React.Component { return formattedAddress; }; - onChange = key => event => { - this.setState({ - [key]: event.target.value - }); - }; - handleFileUpload = fileUUID => { const { user, userType } = this.props; @@ -189,85 +186,6 @@ class Profile extends React.Component { let content = null; if (userLoading === false && this.state.loading === false) { - let businessInfo = null; - if (userType === "UserCompany") { - const safeKeepingValue = totalBalance - 100000; - const hasSafeKeepingFee = safeKeepingValue > 0; - - let costsTable = null; - if (hasSafeKeepingFee) { - costsTable = ( - - - - {t("Days")} - {t("Estimated total cost")} - {t("Balance after payments")} - - - - {[1, 7, 30, 90, 365].map(days => { - // to keep track of the amount across the dates - let accountBalance = safeKeepingValue; - let totalPayment = 0; - - // go through the days to calculate historic change - for (let day = 0; day < days; day++) { - const thousands = accountBalance / 1000; - let nextPayment = (thousands * 2.4) / 100; - - // update balance - accountBalance = accountBalance - nextPayment; - totalPayment = totalPayment + nextPayment; - } - - return ( - - - {days} - - {formatMoney(totalPayment)} - {formatMoney(accountBalance)} - - ); - })} - -
- ); - } - - businessInfo = ( - - - - - Safekeeping fee calculator - - - - - - - - - {hasSafeKeepingFee ? ( - costsTable - ) : ( - No safekeeping fee - )} - - - - ); - } - content = ( - + - + @@ -306,7 +224,16 @@ class Profile extends React.Component { )} - {businessInfo} + + + ); } else { From 10a8da1a243c9e9e1ec3bf3bb2b3f55aa867af79 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 29 Dec 2018 14:36:24 +0100 Subject: [PATCH 29/61] Merge logger into custom wrapper (fixes #462) --- src/react/Functions/Logger.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react/Functions/Logger.js b/src/react/Functions/Logger.js index e38a592b..d8965e6c 100644 --- a/src/react/Functions/Logger.js +++ b/src/react/Functions/Logger.js @@ -3,6 +3,7 @@ const remote = require("electron").remote; const electronLog = remote ? remote.require("electron-log") : require("electron-log"); export default { + ...electronLog, log: params => { console.log(params); electronLog.log(params); From 8e3d60d909ed52a17961f8b86a5f8cbb29ee985f Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 1 Jan 2019 18:27:08 +0100 Subject: [PATCH 30/61] Disable instead of hide schedule payments button in oauth mode --- src/react/Pages/Pay/Pay.jsx | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/react/Pages/Pay/Pay.jsx b/src/react/Pages/Pay/Pay.jsx index 480fc2a8..687cdd28 100644 --- a/src/react/Pages/Pay/Pay.jsx +++ b/src/react/Pages/Pay/Pay.jsx @@ -778,20 +778,19 @@ class Pay extends React.Component { - {limitedPermissions ? null : ( - - - } - label={t("Schedule payment")} - /> - - )} + + + } + label={t("Schedule payment")} + /> + Date: Tue, 1 Jan 2019 18:35:00 +0100 Subject: [PATCH 31/61] Add aliasses to the profile page (fixes #459) --- src/react/Components/AccountCard.jsx | 40 +++---------------------- src/react/Components/AliasList.jsx | 44 ++++++++++++++++++++++++++++ src/react/Locales/en.json | 4 +++ src/react/Pages/Profile/Profile.jsx | 12 +++++--- 4 files changed, 60 insertions(+), 40 deletions(-) create mode 100644 src/react/Components/AliasList.jsx diff --git a/src/react/Components/AccountCard.jsx b/src/react/Components/AccountCard.jsx index d6769dc7..8d681b1b 100644 --- a/src/react/Components/AccountCard.jsx +++ b/src/react/Components/AccountCard.jsx @@ -1,30 +1,24 @@ import React from "react"; import { connect } from "react-redux"; -import { CopyToClipboard } from "react-copy-to-clipboard"; import List from "@material-ui/core/List"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; -import ListItemIcon from "@material-ui/core/ListItemIcon"; import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import Paper from "@material-ui/core/Paper"; import IconButton from "@material-ui/core/IconButton"; import Avatar from "@material-ui/core/Avatar"; -import AccountBalanceIcon from "@material-ui/icons/AccountBalance"; -import PhoneIcon from "@material-ui/icons/Phone"; -import EmailIcon from "@material-ui/icons/Email"; -import PersonIcon from "@material-ui/icons/Person"; import DeleteIcon from "@material-ui/icons/Delete"; import EditIcon from "@material-ui/icons/Edit"; -import UrlIcon from "@material-ui/icons/Link"; import LinkIcon from "@material-ui/icons/Link"; import PeopleIcon from "@material-ui/icons/People"; import UploadFullscreen from "./FileUpload/UploadFullscreen"; import LazyAttachmentImage from "./AttachmentImage/LazyAttachmentImage"; import AccountQRFullscreen from "./QR/AccountQRFullscreen"; +import AliasList from "./AliasList"; -import { formatMoney, formatIban } from "../Functions/Utils"; +import { formatMoney } from "../Functions/Utils"; import { connectGetBudget } from "../Functions/ConnectGetPermissions"; import { openSnackbar } from "../Actions/snackbar"; import { accountsUpdateImage } from "../Actions/accounts"; @@ -158,34 +152,8 @@ class AccountCard extends React.Component { ) : null} - {account.alias.map(alias => { - let value = alias.value; - let icon = ; - switch (alias.type) { - case "EMAIL": - icon = ; - break; - case "PHONE_NUMBER": - icon = ; - break; - case "IBAN": - icon = ; - value = formatIban(alias.value); - break; - case "URL": - icon = ; - break; - } - - return ( - - {icon} - - - - - ); - })} + + ); diff --git a/src/react/Components/AliasList.jsx b/src/react/Components/AliasList.jsx new file mode 100644 index 00000000..056b43bf --- /dev/null +++ b/src/react/Components/AliasList.jsx @@ -0,0 +1,44 @@ +import React from "react"; +import { CopyToClipboard } from "react-copy-to-clipboard"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemText from "@material-ui/core/ListItemText"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; + +import AccountBalanceIcon from "@material-ui/icons/AccountBalance"; +import PhoneIcon from "@material-ui/icons/Phone"; +import EmailIcon from "@material-ui/icons/Email"; +import PersonIcon from "@material-ui/icons/Person"; +import UrlIcon from "@material-ui/icons/Link"; + +import { formatIban } from "../Functions/Utils"; + +export default ({ aliasses, copiedValue = () => {} }) => { + return aliasses.map(alias => { + let value = alias.value; + let icon = ; + switch (alias.type) { + case "EMAIL": + icon = ; + break; + case "PHONE_NUMBER": + icon = ; + break; + case "IBAN": + icon = ; + value = formatIban(alias.value); + break; + case "URL": + icon = ; + break; + } + + return ( + + {icon} + + + + + ); + }); +}; diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index 2c8b82bc..f4a0ac39 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -121,6 +121,10 @@ "Contacts": "Contacts", "Contains text": "Contains text", "Continue": "Continue", + "Copied Email to your clipboard": "Copied Email to your clipboard", + "Copied IBAN to your clipboard": "Copied IBAN to your clipboard", + "Copied Phone number to your clipboard": "Copied Phone number to your clipboard", + "Copied URL to your clipboard": "Copied URL to your clipboard", "Copied the value to your clipboard": "Copied the value to your clipboard", "Copied to your clipboard": "Copied to your clipboard", "Copy": "Copy", diff --git a/src/react/Pages/Profile/Profile.jsx b/src/react/Pages/Profile/Profile.jsx index 57071a9c..c7844435 100644 --- a/src/react/Pages/Profile/Profile.jsx +++ b/src/react/Pages/Profile/Profile.jsx @@ -6,9 +6,9 @@ import Grid from "@material-ui/core/Grid"; import Paper from "@material-ui/core/Paper"; import Button from "@material-ui/core/Button"; import CircularProgress from "@material-ui/core/CircularProgress"; -import ListItemText from "@material-ui/core/ListItemText"; -import ListItem from "@material-ui/core/ListItem"; import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemText from "@material-ui/core/ListItemText"; import Avatar from "@material-ui/core/Avatar"; import ArrowBackIcon from "@material-ui/icons/ArrowBack"; @@ -23,7 +23,9 @@ import { userUpdateImage } from "../../Actions/user"; import { usersUpdate } from "../../Actions/users"; import BunqErrorHandler from "../../Functions/BunqErrorHandler"; + import BusinessInfo from "./BusinessInfo"; +import AliasList from "../../Components/AliasList"; const styles = { title: { @@ -36,7 +38,7 @@ const styles = { padding: 16, marginTop: 16 }, - headerImageListItem: { + listItem: { paddingLeft: 8 }, list: { @@ -197,7 +199,7 @@ class Profile extends React.Component { - + @@ -214,6 +216,8 @@ class Profile extends React.Component { + + {this.state.normalizedUserInfo && ( From 85d1c84134f58ec2d130989710be07e6a8e3cf0b Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 1 Jan 2019 18:49:44 +0100 Subject: [PATCH 32/61] Change the state page default time frame --- src/react/Pages/Stats/Stats.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/Pages/Stats/Stats.jsx b/src/react/Pages/Stats/Stats.jsx index 2c85939d..ac4037f2 100644 --- a/src/react/Pages/Stats/Stats.jsx +++ b/src/react/Pages/Stats/Stats.jsx @@ -35,7 +35,7 @@ class Stats extends React.Component { constructor(props, context) { super(props, context); this.state = { - timescale: "daily", + timescale: "weekly", parsedData: false, // card payments split or combined under mastercardaction From 9e24a0d64f8f4197d663225363e7e40ad1237989 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 5 Jan 2019 14:48:39 +0100 Subject: [PATCH 33/61] Add AUR section to readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 401997ce..7c296e39 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,11 @@ You can directly search for 'bunqDesktop' in the Ubuntu store or use the snap c `choco install bunqdesktop` +#### [AUR](https://aur.archlinux.org/packages/bunq-desktop-bin/) +Replace the $AURHELPER section with your AUR helper command. + +`$AURHELPER -S bunq-desktop-bin` + ## Features - View all your accounts and payments - Send new payments to other users From 5c8f93d1dcf7ef34455d4ec98284c68ba97d7bbc Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Mon, 14 Jan 2019 14:44:42 +0100 Subject: [PATCH 34/61] Redirect to home after profile update (fixes #469) --- src/react/Pages/Profile/Profile.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/react/Pages/Profile/Profile.jsx b/src/react/Pages/Profile/Profile.jsx index c7844435..acbc19da 100644 --- a/src/react/Pages/Profile/Profile.jsx +++ b/src/react/Pages/Profile/Profile.jsx @@ -175,6 +175,7 @@ class Profile extends React.Component { .then(response => { this.setState({ loading: false }); this.props.usersUpdate(true); + this.props.history.push("/"); }) .catch(error => { this.setState({ loading: false }); From ccdbc49986a17c7e1a6390de81842547ef731ad0 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Mon, 14 Jan 2019 14:44:46 +0100 Subject: [PATCH 35/61] Fixed add money button --- src/react/Pages/Dashboard/Dashboard.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/Pages/Dashboard/Dashboard.jsx b/src/react/Pages/Dashboard/Dashboard.jsx index 59279e63..76520eb5 100644 --- a/src/react/Pages/Dashboard/Dashboard.jsx +++ b/src/react/Pages/Dashboard/Dashboard.jsx @@ -198,7 +198,7 @@ class Dashboard extends React.Component { - + )} From 892d7c03363c97307c4564ef8a83bb6d006431ce Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Thu, 24 Jan 2019 11:46:12 +0100 Subject: [PATCH 36/61] Better check for having more accounts and forced account update check --- src/react/Pages/AddAccount.jsx | 7 +++++-- src/react/Reducers/accounts.js | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/react/Pages/AddAccount.jsx b/src/react/Pages/AddAccount.jsx index ba0dea12..3ad0fc98 100644 --- a/src/react/Pages/AddAccount.jsx +++ b/src/react/Pages/AddAccount.jsx @@ -218,7 +218,9 @@ class AddAccount extends React.Component { @@ -227,7 +229,7 @@ class AddAccount extends React.Component { - {accountsAmount === 25 ? ( + {accountsAmount >= 25 ? ( Attention! @@ -248,6 +250,7 @@ const mapStateToProps = state => { return { accounts: state.accounts.accounts, accountsLoading: state.accounts.loading, + accountsCreateLoading: state.accounts.create_loading, user: state.user.user }; diff --git a/src/react/Reducers/accounts.js b/src/react/Reducers/accounts.js index b3e83e13..aae9758c 100644 --- a/src/react/Reducers/accounts.js +++ b/src/react/Reducers/accounts.js @@ -3,7 +3,6 @@ import { ipcRenderer } from "electron"; import settings from "../ImportWrappers/electronSettings"; import { STORED_ACCOUNTS } from "../Actions/accounts"; -import { storeEncryptString } from "../Functions/Crypto/CryptoWorkerWrapper"; import { formatMoney } from "../Functions/Utils"; export const SELECTED_ACCOUNT_LOCAION = "BUNQDESKTOP_SELECTED_ACCOUNT"; @@ -18,6 +17,7 @@ const excludedAccountIdsDefault = excludedAccountIdsStored !== undefined ? exclu export const defaultState = { accounts: [], loading: false, + create_loading: false, selected_account: selectedAccountDefault, excluded_account_ids: excludedAccountIdsDefault }; @@ -98,7 +98,6 @@ export default (state = defaultState, action) => { }; case "ACCOUNTS_IS_LOADING": - case "ACCOUNT_CREATE_IS_LOADING": case "ACCOUNT_STATUS_IS_LOADING": return { ...state, @@ -106,13 +105,23 @@ export default (state = defaultState, action) => { }; case "ACCOUNTS_IS_NOT_LOADING": - case "ACCOUNT_CREATE_IS_NOT_LOADING": case "ACCOUNT_STATUS_IS_NOT_LOADING": return { ...state, loading: false }; + case "ACCOUNT_CREATE_IS_LOADING": + return { + ...state, + create_loading: false + }; + case "ACCOUNT_CREATE_IS_NOT_LOADING": + return { + ...state, + create_loading: false + }; + case "ACCOUNTS_CLEAR": case "REGISTRATION_CLEAR_PRIVATE_DATA": case "REGISTRATION_LOG_OUT": @@ -127,7 +136,8 @@ export default (state = defaultState, action) => { ...state, accounts: [], selected_account: false, - loading: false + loading: false, + create_loading: false }; } return state; From 45627aeda59a9642f7c5954e79c67d59053b59a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Re=C3=BCel=20van=20der=20Steege?= Date: Fri, 22 Feb 2019 22:31:44 +0100 Subject: [PATCH 37/61] Fix application menu missing first menu on macOS. --- src/menu/darwin_menu_templates.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menu/darwin_menu_templates.js b/src/menu/darwin_menu_templates.js index f87f5079..52a2cf78 100644 --- a/src/menu/darwin_menu_templates.js +++ b/src/menu/darwin_menu_templates.js @@ -1,7 +1,7 @@ import { app } from "electron"; export default menus => { - if (process.platform !== "darwin") { + if (process.platform === "darwin") { menus.unshift({ label: app.getName(), submenu: [ From 78854c9799b289746413e8dde246a33276e4724c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Re=C3=BCel=20van=20der=20Steege?= Date: Sat, 23 Feb 2019 01:50:15 +0100 Subject: [PATCH 38/61] Update Dutch translation. --- src/react/Locales/nl.json | 339 +++++++++++++++++++------------------- 1 file changed, 170 insertions(+), 169 deletions(-) diff --git a/src/react/Locales/nl.json b/src/react/Locales/nl.json index fa786f8a..40841f40 100644 --- a/src/react/Locales/nl.json +++ b/src/react/Locales/nl.json @@ -1,33 +1,33 @@ { "A disabled button means the API key was stored with a different password so it can't be decrypted": "Een uitgeschakelde knop betekent dat de API-sleutel is opgeslagen met een ander wachtwoord waardoor deze niet kan worden ontsleuteld.", "API key": "API key", - "ATM Withdrawal": "Pinautomaat opname", + "ATM Withdrawal": "Geldautomaat opname", "Accept": "Accepteer", "Accept request": "Accepteer verzoek", "Accepted": "Geaccepteerd", "Accepted for production": "Geaccepteerd voor productie", - "Account Info": "Account informatie", - "Account created successfully!": "Account succesvol aangemaakt!", - "Account deactivated successfully!": "Account succesvol gedeactiveerd!", - "Account description": "Account beschrijving", - "Account filter": "Account filter", + "Account Info": "Rekening details", + "Account created successfully!": "Rekening succesvol aangemaakt", + "Account deactivated successfully!": "Rekening succesvol gedeactiveerd", + "Account description": "Rekening naam", + "Account filter": "Rekeningen", "Account holder": "Rekeninghouder", "Account number": "Rekeningnummer", - "Account settings updated successfully!": "Account instellingen succesvol geĆ¼pdatet", - "Accounts": "Accounts", + "Account settings updated successfully!": "Rekening succesvol bijgewerkt", + "Accounts": "Rekeningen", "Active": "Actief", "Add": "Toevoegen", - "Add a new category": "Voeg een nieuwe categorie toe", - "Add an account": "Account aanmaken", - "Add new category": "Voeg een nieuwe categorie toe", + "Add a new category": "Nieuwe categorie toevoegen", + "Add an account": "Nieuwe rekening toevoegen", + "Add new category": "Nieuwe categorie toevoegen", "Add target": "Doel toevoegen", - "Add to pending payments": "Voeg toe aan de pending payments", + "Add to pending payments": "Voeg toe aan openstaande betalingen", "Advanced options": "Geavanceerde opties", "Advanced settings": "Geavanceerde instellingen", - "Agree": "Accepteer", + "Agree": "Akkoord", "All payments": "Alle betalingen", - "Allow basic and anonymous Google Analytics tracking": "Sta eenvoudige en geanonimiseerde Google Analytics tracking toe", - "Allow bunqme? If the user doesn't own a bunq account a bunqme request will be sent instead": "bunq.me verzoek toestaan? Als de gebruiker geen account heeft word er een bunq.me verzoek verstuurd.", + "Allow basic and anonymous Google Analytics tracking": "Sta anonieme Google Analytics tracking toe", + "Allow bunqme? If the user doesn't own a bunq account a bunqme request will be sent instead": "bunq.me verzoek versturen indien de gebruiker geen bunq account heeft", "Amount": "Bedrag", "Anonymize": "Anonimiseer", "Apple Contacts": "Apple Contacten", @@ -39,60 +39,61 @@ "Apply rules": "Pas regels toe", "Are you absolutely sure": "Weet je dit zeker?", "Are you sure you wish to cancel this account?": "Weet je zeker dat je dit account wilt deactiveren?", - "Atleast": "Minstens", + "Atleast": "Minimaal", "Attempting to load your API key": "API key laden", "Attention!": "Let op!", "Authenticate": "Authenticeren", "Authorisation Status": "Autorisatiestatus", "Authorisation Type": "Autorisatie type", - "Automatically switch theme based on the time": "Wissel automatisch van thema afhankelijk van de tijd", + "Automatically switch theme based on the time": "Wissel thema op basis van tijd", "Available": "Beschikbaar", "Available merchants": "Beschikbare verkopers", "Back": "Terug", - "Background sync finished": "Achtergrondsynchronisatie voltooid", - "Background sync finished and loaded": "Achtergrondsynchronisatie voltooid", - "Background sync loaded": "Achtergrondsynchronisatie voltooid en heeft gevonden", + "Background sync finished": "Synchronisatie voltooid", + "Background sync finished and loaded": "Synchronisatie voltooid", + "Background sync loaded": "Synchronisatie laadde", "Balance": "Saldo", "Balance after payments": "Saldo na betalingen", "Budget": "Budget", "Business": "Bedrijf", "Cancel": "Annuleer", - "Cancel account": "Account annuleren", - "Cancel editing": "Bewerkingen annuleren", - "Cancel request": "Betaling annuleren", + "Cancel account": "Rekening beĆ«indigen", + "Cancel editing": "Bewerken annuleren", + "Cancel request": "Verzoek annuleren", "Cancelled": "Geannuleerd", "Capslock active": "Capslock actief", - "Card": "Kaart", - "Card payment": "Kaart betaling", - "Card payments": "Kaart betalingen", - "Card payments (Maestro or Mastercard)": "Kaartbetalingen (Maestro of Mastercard)", - "Card status": "Kaartstatus", - "Card update accepted": "Kaart aanpassing geaccepteerd", - "Card update requested": "Kaart aanpassing aangevraagd", - "Card update sent": "Kaart update verstuurd", - "Cards": "Kaarten", - "Cards status": "Kaart status", - "Cards update accepted": "Kaart update geaccepteerd", - "Cards update requested": "Kaart update aangevraagd", - "Cards update sent": "Kaart update verzonden", + "Card": "Pas", + "Card filter": "Passen", + "Card payment": "Pasbetaling", + "Card payments": "Pasbetalingen", + "Card payments (Maestro or Mastercard)": "Pasbetalingen (Maestro of Mastercard)", + "Card status": "Passtatus", + "Card update accepted": "Pas wijziging geaccepteerd", + "Card update requested": "Pas wijziging aangevraagd", + "Card update sent": "Pas wijziging verstuurd", + "Cards": "Passen", + "Cards status": "Pas status", + "Cards update accepted": "Pas wijziging geaccepteerd", + "Cards update requested": "Pas wijziging aangevraagd", + "Cards update sent": "Pas wijziging verstuurd", "Categories": "CategorieĆ«n", - "Categories that will be added": "CategorieĆ«n die zullen worden toegevoegd", + "Categories that will be added": "Selecteer categorieĆ«n die moeten worden toegewezen.", "Category Editor": "Categorie Editor", "Category count": "Aantal categorieĆ«n", "Category count history": "Aantal categorieĆ«n historie", - "Category filter": "Categorie filter", - "Category label": "Categorielabel", - "Category management": "Categorie management", - "Category priority": "Categorieprioriteit", + "Category filter": "CategorieĆ«n", + "Category label": "Label", + "Category management": "CategorieĆ«n", + "Category priority": "Prioriteit", "Category received": "Ontvangen per categorie", "Category rules": "Categorieregels", "Category sent": "Verzonden per categorie", "Category total": "Totaal per categorie", - "Category transaction history": "Transactiegeschiedenis per categorie", - "Change settings location": "Verander settings locatie", - "Changes were saved!": "Wijzigingen zijn opgeslagen!", + "Category transaction history": "Transacties per categorie", + "Change settings location": "Wijzig instellingen-pad", + "Changes were saved!": "Wijzigingen zijn bewaard", "City": "Stad", - "Clear": "Leegmaken", + "Clear": "Legen", "Clear all": "Verwijder alles", "Clear contacts": "Verwijder contacten", "Clear filters": "Filters wissen", @@ -123,11 +124,11 @@ "Counterparty IBAN": "Tegenpartij IBAN", "Counterparty name": "Tegenpartij naam", "Country": "Land", - "Create PDF": "Maak een PDF aan", + "Create PDF": "Maak PDF", "Create a filter for this event": "Maak een filter aan voor deze gebeurtenis", "Create a sandbox account": "Maak een sandbox-account aan", - "Create account": "Maak account aan", - "Create export": "CreĆ«ren export", + "Create account": "Maak rekening", + "Create export": "Maak export", "Create filter": "Maak een filter aan", "Create new bunqme request": "Maak een nieuw bunq.me-verzoek aan", "Create request": "Verzoek creĆ«ren", @@ -143,7 +144,7 @@ "Data options": "Data opties", "Date": "Datum", "Date created": "Datum aangemaakt", - "Date range filter": "Datumbereikfilter", + "Date range filter": "Datumbereik", "Date updated": "Datum bijgewerkt", "Days": "Dagen", "Deactivated": "Gedeactiveerd", @@ -160,25 +161,25 @@ "DisclaimerBunqDesktopExplanation": "bunqDesktop is een onofficieel, gratis en open-source project en is op geen enkele manier geassocieerd met of ondersteund door bunq!", "DisclaimerPasswordWarningPart1": "Om je gegevens veilig te houden, wordt alles gecodeerd met het wachtwoord dat je invoert. Als je dit wachtwoord bent vergeten, worden alle persoonlijke gegevens binnen bunqDesktop gereset en moet je opnieuw inloggen.", "DisclaimerPasswordWarningPart2": "Als je besluit een leeg wachtwoord te gebruiken, kan iedereen met de vereiste kennis je gegevens bekijken als ze toegang krijgen tot je apparaat!", - "Display inactive cards": "Inactieve kaarten weergeven", + "Display inactive cards": "Toon inactieve passen", "Display name": "Weergavenaam", - "Display user info in the tray menu": "Laat de gebruiks informatie zien in het vakmenu", + "Display user info in the tray menu": "Toon rekeningsaldo in systeemvak menu", "Don't show this again": "Verberg dit voortaan", "Draft a new payment instead of directly sending it?": "Een nieuwe betaling opstellen in plaats van deze rechtstreeks verzenden?", "Draft only": "Betaling klaarzetten", "Draft payment": "Betaling klaarzetten", "Draft payment successfully created!": "Betaling is succesvol klaargezet", - "Draft payments are NOT completed right away allowing you to review and confirm them in the official bunq app": "Draft betalingen worden NIET direct verzonden zodat je ze kunt bevestigen in de officiele bunq app", + "Draft payments are NOT completed right away allowing you to review and confirm them in the official bunq app": "Betalingen klaarzetten om in de bunq app te bevestigen", "Draft this payment": "Betaling klaarzetten", "EMAIL": "E-mail", - "Edit account settings": "Bewerk account instellingen", + "Edit account settings": "Bewerk rekening", "Edit key names": "Bewerk key labels", "Edit scheduled payment": "Bewerk geplande betaling", "Email": "E-mail", - "Email or phone number": "E-mail of telefoonnummer", - "Enable or disable this ruleset": "Schakel deze regelset in of uit", + "Email or phone number": "E-mailadres of telefoonnummer", + "Enable or disable this ruleset": "Regel inschakelen", "Enable sandbox mode?": "Gebruik sandbox mode?", - "Enable sticky menu": "Activeer sticky menu", + "Enable sticky menu": "Toon menu altijd", "Enable wildcard mode?": "Wildcard modus aanzetten?", "Enabled": "Ingeschakeld", "End": "Eind", @@ -191,7 +192,7 @@ "Estimated total cost": "Geschatte totale kosten", "Event count": "Aantal gebeurtenissen", "Event history count": "Aantal gebeurtenissen geschiedenis", - "Event transaction history": "Transactie hoeveelheid geschiedenis", + "Event transaction history": "Transacties per bron", "Event type": "Type evenement", "Events to load per account": "Items om te laden per account", "Events to load per type and account": "Items om te laden per type en account", @@ -199,14 +200,14 @@ "Existing Exports": "Bestaande exports", "Expires": "Vervalt", "Expiry date": "Vervaldatum", - "Export": "Exporteren", + "Export": "Exporteer", "Export categories": "Exporteer categorieĆ«n", "Export data": "Exportgegevens", "Export info": "Exporteer", - "Export rule collections": "Exporteer categorie regels", - "Export savings goal": "Exporteer savings goal", - "Export savings goals": "Exporteer savings goals", - "Export type": "Exporttype", + "Export rule collections": "Exporteer regels", + "Export savings goal": "Exporteer spaardoel", + "Export savings goals": "Exporteer spaardoelen", + "Export type": "Type", "Exports": "Exporteren", "Failed to accept the share request": "Het is niet gelukt om de share request te accepteren", "Failed to complete some of the selected payments": "Het is niet gelukt om alle geselecteerde betalingen te versturen", @@ -218,20 +219,20 @@ "Failed to validate the Google authentication tokens": "Het is niet gelukt om je Google authenticatie codes te valideren", "Failed to validate the authentication tokens": "Het is niet gelukt om de authenticatie codes te valideren", "Filter": "Filter", - "Filter by amount": "Filter op hoeveelheid", + "Filter by amount": "Filter op bedrag", "Filter by keyword": "Filter op trefwoord", "Finish editing": "Voltooi het bewerken", "Finished handling the selected payments": "De geselecteerde betalingen zijn successvol afgehandeld", "From": "Van", - "From date": "Van datum", + "From date": "Van", "Full access": "Volledige toegang", "Geolocation": "Geolocatie", - "Get started": "Beginnen", - "Goal amount": "Doel hoeveelheid", + "Get started": "Aan de slag", + "Goal amount": "Doelbedrag", "Google Contacts": "Google Contacts", - "Hide account balances": "Verberg account saldo", + "Hide account balances": "Verberg rekeningsaldo", "Hide contacts": "Verberg contacten", - "Hide inactive cards": "Verberg inactieve kaarten", + "Hide inactive cards": "Verberg inactieve passen", "Hide preview": "Voorbeeld verbergen", "Hour": "Uur", "Hourly": "Elk uur", @@ -244,15 +245,15 @@ "Import as new": "Importeer als nieuw", "Import categories": "Importeer categorieĆ«n", "Import contacts": "Importeer contacten", - "Import default categories": "Importeer de standaard categorieĆ«n", + "Import default categories": "Importeer standaard categorieĆ«n", "Import file": "Importeer bestand", "Import rule": "Regel importeren", - "Import rule collection": "Regelinzameling importeren", - "Import savings goal": "Importeer de savings goal", + "Import rule collection": "Regels importeren", + "Import savings goal": "Importeer spaardoel", "Installing this device": "Apparaat installeren", - "Invalid email given": "Ongeldig e-mailadres opgegeven", - "Invalid phone number given": "Ongeldig telefoon nummer opgegeven", - "Invalid phone number or email given": "Ongeldig telefoon nummer of email opgegeven", + "Invalid email given": "Ongeldig e-mailadres ingevuld", + "Invalid phone number given": "Ongeldig telefoonnummer ingevuld", + "Invalid phone number or email given": "Ongeldig telefoonnummer of e-mailadres ingevuld", "It is not possible to delete a Joint or Connect account using bunqDesktop": "Het is niet mogelijk om een Joint of Connect account te verwijderen via bunqDesktop", "It is not possible to send outgoing payments using a draft-only account": "Het is niet mogelijk om uitgaande betalingen te verzenden met een draft-only account", "It is not possible to send outgoing payments without draft mode when using a OAuth API key": "Het is niet mogelijk om uitgaande betalingen te verzenden zonder de Draft optie bij gebruik van een OAuth API verbinding", @@ -260,12 +261,12 @@ "Less than": "Minder dan", "Limit amount monthly": "Maandelijks limiet", "Load default categories": "Importeer de standaard categorieĆ«n", - "Load more events": "Meer events inladen", + "Load more events": "Meer gebeurtenissen laden", "Loading": "Laden", - "Loading cards": "Kaarten laden", + "Loading cards": "Passen laden", "Loading user accounts": "Accounts ophalen", "Log file": "Logbestand", - "Login": "Log in", + "Login": "Login", "Login with limited permissions using OAuth": "Login met gelimiteerde permissies via OAuth", "Logout": "Uitloggen", "Logout automatically": "Automatisch uitloggen", @@ -273,18 +274,18 @@ "Maestro payments": "Maestro betalingen", "Main address": "Hoofdadres", "Make draft payments": "Betalingen klaarzetten", - "Make payments": "Betalingen doen", + "Make payments": "Betalingen uitvoeren", "Manage categories": "Beheer categorieĆ«n", "Mandate identifier": "Machtigingsidentificatie", "MasterCard payments": "Mastercard betalingen", "Mastercard Info": "Mastercard-info", "Mastercard payments": "Mastercard betalingen", - "Match requirements": "Match vereisten", + "Match requirements": "Criteria vereisten", "Matches exactly": "Komt precies overeen", "Maximum allowed length is": "De maximale lengte is", "Maximum events per type": "Maximaal aantal events per type", - "Merchant reference": "Handelaar referentie", - "Minimize to tray": "Verkleinen naar systeemvak", + "Merchant reference": "Verkoper referentie", + "Minimize to tray": "Minimaliseer naar systeemvak", "Minimum required length is": "Minimale lengte is", "Minute": "Minuut", "Minutes": "Minuten", @@ -296,13 +297,13 @@ "More than": "Meer dan", "Name": "Naam", "Need help?": "Hulp nodig?", - "Network seems to be offline": "Netwerk lijkt offline te zijn", - "New": "nieuwe", + "Network seems to be offline": "Netwerkverbinding verbroken", + "New": "Nieuwe", "New Payment": "Nieuwe betaling", - "New card request received": "Nieuwe kaart verzoek ontvangen", + "New card request received": "Nieuwe pas verzoek ontvangen", "New custom export": "Nieuwe aangepaste export", "New export": "Nieuwe export", - "New savings goal": "Nieuw savings goal", + "New savings goal": "Nieuw spaardoel", "Next": "Volgende", "Next payment": "Volgende betaling", "No": "Nee", @@ -325,15 +326,15 @@ "Once": "Een keer", "Only a maximum value of": "Alleen een maximum waarde van", "Only a minimum value of": "Alleen een minimum waarde van", - "Only require 1 rule to match": "Slechts Ć©Ć©n regel nodig die overeenkomt", + "Only require 1 rule to match": "EĆ©n regel moet overeenkomen", "Open": "Open", - "Open a new bank account": "Open een nieuw bankrekening", - "Order status": "Bestelling status", + "Open a new bank account": "CreĆ«er een nieuwe rekening", + "Order status": "Bestellingstatus", "Original": "Origineel", - "Other": "anders", - "Others can make and view new transactions": "Anderen kunnen nieuwe transacties maken en bekijken", + "Other": "Anders", + "Others can make and view new transactions": "Anderen kunnen nieuwe betalingen uitvoeren en bekijken", "Others can prepare payments": "Anderen kunnen betalingen klaarzetten", - "Others can view new transactions": "Anderen kunnen nieuwe transacties bekijken", + "Others can view new transactions": "Anderen kunnen nieuwe betalingen bekijken", "Overwrite file": "Bestand overschrijven", "PHONE": "Telefoon", "PO box": "Postbus", @@ -344,23 +345,23 @@ "Password options": "Wachtwoord opties", "Pay": "Betaal", "Payment": "Betaling", - "Payment Info": "Betalings Info", - "Payment Type": "Betalings type", - "Payment or card payment": "Betaling of kaartbetaling", + "Payment Info": "Betalingsdetails", + "Payment Type": "Type", + "Payment or card payment": "Betaling of pasbetaling", "Payment sent successfully!": "Betaling is succesvol verstuurd!", "Payment was successfully scheduled!": "Betaling is succesvol ingepland!", - "Payment will be done": "Betaling wordt gedaan op ", + "Payment will be done": "Betaling wordt uitgevoerd", "Payments": "Betalingen", "Payments and requests": "Betalingen en verzoeken", "Payments sent successfully!": "Betalingen zijn succesvol verstuurd!", "Payments were successfully scheduled!": "Betalingen zijn succesvol ingepland!", "Pending": "In afwachting", - "Pending payments": "Afwachtende betalingen", + "Pending payments": "Bewaarde betalingen", "Personal": "Persoonlijk", "Phone": "Telefoon", "Phone numbers should contain no spaces and include the land code For example 316123456789": "Telefoonnummers mogen geen spaties bevatten en de landcode bevatten. Bijvoorbeeld +316123456789", "Pick a color": "Kies een kleur", - "Pick an icon": "Kies een pictogram", + "Pick an icon": "Kies een icoon", "Postal address": "Postadres", "Postal code": "Postcode", "Previous": "Vorige", @@ -368,81 +369,81 @@ "Production key": "Productie sleutel", "Profile": "Profiel", "Public nick name": "Publieke bijnaam", - "Queue is empty": "Wachtrij is leeg", + "Queue is empty": "Wachtrij leeg", "Reason": "Reden", "Received": "Ontvangen", "Received a request": "Verzoek ontvangen", "Received payment": "Ontvangen betaling", "Received payment with ": "Betaling ontvangen met ", "Received request": "Ontvangen verzoek", - "Receives money": "Ontvang geld", + "Receives money": "Ontvangen betalingen", "Refund": "Terugbetaling", - "Regex": "regex", - "Regional format": "Regionale formaat", + "Regex": "Regex", + "Regional format": "Regionaal formaat", "Registering our encryption keys": "Encryptiesleutels registreren", "Reject": "Afwijzen", "Released": "Uitgebracht", - "Remove": "Verwijderen", - "Remove keys": "Verwijder API keys", + "Remove": "Verwijder", + "Remove keys": "Verwijder keys", "Removing data from previous session": "Data verwijderen van vorige sessie", "Request": "Verzoek", "Request (sent and received)": "Verzoek (verzonden en ontvangen)", - "Request Info": "Verzoek informatie", + "Request Info": "Verzoek details", "Request Payment": "Betalingsverzoek", "Request has expired": "Verzoek is verlopen", - "Request response was successfully accepted!": "De request was succesvol geaccepteerd!", - "Request sent and pending": "Verzoek verstuurd", - "Request was cancelled": "Verzoek was geannuleerd", - "Request was cancelled successfully!": "Verzoek is succesvol geannuleerd!", - "Request was rejected successfully!": "Verzoek is succesvol afgewezen", - "Request was sent successfully!": "Verzoek is succesvol verstuurd!", - "Requested": "Aangevraagd", - "Requested amount": "Aangevraagde hoeveelheid", - "Requests": "verzoeken", + "Request response was successfully accepted!": "Verzoek succesvol geaccepteerd", + "Request sent and pending": "Verzoek verstuurd en in afwachting", + "Request was cancelled": "Verzoek geannuleerd", + "Request was cancelled successfully!": "Verzoek succesvol geannuleerd", + "Request was rejected successfully!": "Verzoek succesvol afgewezen", + "Request was sent successfully!": "Verzoek succesvol verstuurd", + "Requested": "Verzocht", + "Requested amount": "Betalingsverzoek", + "Requests": "Verzoeken", "Requests received": "Ontvangen verzoeken", "Requests sent": "Verstuurde verzoeken", - "Require all rules to match": "Vereis dat alle regels overeenkomen", + "Require all rules to match": "Alle regels moeten overeenkomen", "Required": "Verplicht", - "Reset all event data": "Reset all events", - "Reset bunqDesktop": "bunqDesktop resetten", + "Reset all event data": "Reset alle events", + "Reset bunqDesktop": "Opnieuw instellen", "Restart the application to start without Google Analytics!": "Start de app opnieuw om zonder Google Analytics verder te gaan!", "Restart the application to view these changes!": "Start de applicatie opnieuw om deze wijzigingen te bekijken!", "Return to dashboard": "Terug naar het dashboard", "Rule Dashboard": "Regel Dashboard", "Rule Editor": "Regeleditor", "Rules": "Regels", - "Ruleset title": "Regel ingestelde titel", - "Run background sync on startup": "Voer achtergrondsynchronisatie uit bij het opstarten", + "Ruleset title": "Titel", + "Run background sync on startup": "Voer synchronisatie uit bij het opstarten", "Safekeeping fee calculator": "Safekeeping fee calculator", "Sandbox key": "Sandbox API key", "Sandbox mode active": "Sandbox-modus actief", "Save": "Opslaan", - "Save payment for later": "Sla betaling op", - "Savings goal": "Besparingsdoel", - "Savings goals": "Besparingsdoelen", - "Scan the QR code with the bunq app to begin!": "Scan de QR code met de bunq app om te beginnen!", - "Schedule Payment": "Plan de betaling", + "Save payment for later": "Bewaar betaling voor later", + "Savings goal": "Spaardoel", + "Savings goals": "Spaardoelen", + "Scan the QR code with the bunq app to begin!": "Scan de QR-code met bunq app om te beginnen!", + "Schedule Payment": "Betaling inplannen", "Schedule expired": "Planning verlopen", - "Schedule payment": "Betaling plannen", + "Schedule payment": "Betaling inplannen", "Scheduled payments": "Geplande betalingen", - "Secondary account": "Secundair account", - "Select an account": "Selecteer een account", + "Secondary account": "Secundaire rekening", + "Select an account": "Selecteer een rekening", "Send": "Verstuur", "Send a Connect request": "Verstuur een Connect verzoek", "Send a notification on new events": "Toon een notificatie bij nieuwe gebeurtenissen", "Send payment": "Verstuur betaling", - "Send request": "Verzend verzoek", - "Sends money": "Verstuurd geld", + "Send request": "Verstuur verzoek", + "Sends money": "Uitgaande betalingen", "Sent": "Verstuurd", "Sent payment": "Verzonden betaling", "Sent payment with ": "Betaling verstuurd met ", "Sent request": "Verzoek verzonden", "Set API Key": "Stel API key in", - "Set a budget": "Stel een budget in", + "Set a budget": "Stel budget in", "Set a minimum age?": "Minimum leeftijd instellen?", "Set a new password": "Stel een nieuw wachtwoord in", "Set a redirect url for the user after the payment is completed?": "Stel een omleidings-URL in voor de gebruiker nadat de betaling is voltooid?", - "Set a time limit": "Stel een tijd limiet in", + "Set a time limit": "Stel tijdslimiet in", "Settings": "Instellingen", "Settled": "Verrekend", "Settlement Status": "Schikkingsstatus", @@ -462,29 +463,29 @@ "Something went wrong!": "Er is iets mis gegaan!", "Spent amount monthly": "Maandelijks uitgegeven bedrag", "Spent this month": "Deze maand doorgebracht", - "Split request": "Split request", - "Start amount": "Start hoeveelheid", - "Start amount can't be more than the goal amount": "Start hoeveelheid kan niet meer zijn dan het eind doel", - "Start date": "Start datum", + "Split request": "Split verzoek", + "Start amount": "Beginsaldo", + "Start amount can't be more than the goal amount": "Beginsaldo kan niet groter zijn dan het doelbedrag", + "Start date": "Begindatum", "Starts with": "Begint met", "Statistics": "Statistieken", "Stats": "Statistieken", "Status": "Status", "Stolen": "Gestolen", - "Store this payment in the pending payments list for later, it will NOT be sent to bunq": "Sla deze betaling lokaal op, deze zal NIET verstuurd worden naar bunq", + "Store this payment in the pending payments list for later, it will NOT be sent to bunq": "Bewaar de betaling op dit apparaat voor later en niet naar bunq versturen", "Stored API keys": "Opgeslagen API keys", - "Stored PDF file at": "PDF is opgeslagen op", - "Stored file at ": "Bestand opgeslagen op", + "Stored PDF file at": "PDF is opgeslagen als", + "Stored file at ": "Bestand opgeslagen als ", "Street": "Straat", "Sub type": "Subtype", - "Successfully authorized client!": "Succesvol ingelogd met OAuth!", + "Successfully authorized client!": "Succesvol ingelogd met OAuth", "Switch API keys": "Wissel van API key", "Switch user": "Wissel van gebruiker", "TRANSFER": "Eigen rekening", "Tap & Pay payments": "Tap & Pay betalingen", "Targets": "targets", "The": "De", - "The API key or IP you are currently on is not valid for the selected bunq environment": "De API key of IP adres die is mogelijk verkeerd voor deze bunq omgeving", + "The API key or IP you are currently on is not valid for the selected bunq environment": "De API key of het IP-adres is mogelijk verkeerd voor de geselecteerde bunq omgeving", "The API key you entered does not look valid": "De API-sleutel die je hebt ingevoerd, lijkt niet geldig", "The device name can't be longer than 32 characters": "De apparaatnaam mag niet langer zijn dan 32 tekens.", "The device name has to be atleast 1 character": "De apparaatnaam moet minimaal 1 teken zijn.", @@ -496,56 +497,56 @@ "The share request was successfully cancelled": "De share request is succesvol geannuleerd", "The share request was successfully revoked": "De share request is succesvol ingetrokken", "Theme": "Thema", - "This card is currently not active": "De kaart is momenteel niet actief", + "This card is currently not active": "De pas is momenteel niet actief", "This does not create new codes yet!": "Dit maakt nog geen nieuwe codes aan!", "This does not generate new codes yet!": "Dit levert nog geen nieuwe codes op!", "This target seems to be added already": "Dit doel lijkt al te zijn toegevoegd", - "Time limit": "Tijd limiet", + "Time limit": "Tijdslimiet", "Title": "Titel", "To": "Naar", - "To date": "Tot datum", + "To date": "Tot", "Today": "Vandaag", "Total": "Totaal", - "Total balance": "Totaal saldo", - "Total change": "Totale verandering", - "Total received amount": "Totaal ontvangen hoeveelheid", - "Total requested amount": "Totaal aangevraagd bedrag", - "Transaction amount": "Bedrag van de transactie", + "Total balance": "Totaalsaldo", + "Total change": "Totaal resultaat", + "Total received amount": "Totaal ontvangen bedrag", + "Total requested amount": "Totaal verzocht bedrag", + "Transaction amount": "Totaal per bron", "Transaction amount rule with": "Transactie hoeveelheid met", "Transfer": "Eigen rekening", "Transferred": "Overgedragen", "Type": "Type", "Until": "Tot", - "Update": "Vernieuwen", + "Update": "Bijwerken", "Update CVC Codes": "CVC-codes bijwerken", - "Update automatically in the background": "Check voor nieuwe gebeurtenissen automatisch in de achtergrond", - "Update category": "Update categorie", - "Updated": "GeĆ¼pdatet", + "Update automatically in the background": "Controleer in de achtergrond op nieuwe gebeurtenissen", + "Update category": "Categorie bijwerken", + "Updated": "Bijgewerkt", "Upload": "Uploaden", "Upload a new avatar": "Upload een nieuwe profielfoto", "Use a stored API key": "Gebruik een opgeslagen API key", - "Use account balances": "Gebruik totale account balans", + "Use account balances": "Gebruik totaal rekeningsaldo's", "Use no password": "Gebruik geen wachtwoord", "Use the native frame": "Gebruik het native frame", "Value rule with": "Waarde regel met", "Version": "Versie", "View CVC Codes": "CVC-codes bekijken", - "View account balance": "Bekijk account saldo", + "View account balance": "Bekijk rekeningsaldo", "View balance": "Bekijk saldo", "View debug information": "Bekijk debug informatie", - "View new events": "Bekijk nieuwe evenementen", - "View old events": "Bekijk oude evenementen", + "View new events": "Bekijk nieuwe gebeurtenissen", + "View old events": "Bekijk oude gebeurtenissen", "Waiting for authorization": "Wachten op autorisatie", "We couldn't validate the response given by bunq!": "Het is niet gelukt om de data van bunq te valideren!", "We failed to add a new note": "Het is niet gelukt om een nieuwe notitie toe te voegen", - "We failed to create a new session! Your IP might have changed or the API key is no longer valid": "Het is niet gelukt om een nieuwe sessie aan te maken! Het kan zijn dat je IP adres is gewijzigd of de API key is niet meer geldig", + "We failed to create a new session! Your IP might have changed or the API key is no longer valid": "Het is niet gelukt om een nieuwe sessie aan te maken! Het kan zijn dat je IP-adres is gewijzigd of de API key is niet meer geldig", "We failed to create the export for this monetary account": "Het is niet gelukt om een nieuwe export aan te maken voor dit account", "We failed to delete the note": "Het is niet gelukt om een de notitie te verwijderen", "We failed to install a new application": "Het is niet gelukt om deze applicatie te installeren", "We failed to load the CVC codes": "Het is niet gelukt om je CVC codes op te halen", "We failed to load the batched request inquiries for this monetary account": "Het is niet gelukt om de batch verzoeken op te halen voor dit account", - "We failed to load the bunqme requests for this monetary account": "Het is niet gelukt om de bunq.me requests op te halen voor dit account", - "We failed to load the cards overview": "Het is niet gelukt om je kaarten op te halen", + "We failed to load the bunqme requests for this monetary account": "Het is niet gelukt om de bunq.me verzoeken op te halen voor dit account", + "We failed to load the cards overview": "Het is niet gelukt om je passen op te halen", "We failed to load the contacts from the vCard file": "Het is niet gelukt om de contacten te importeren uit het vCard bestand", "We failed to load the contacts from your Google account": "Het is niet gelukt om de contacten van je Google account te importeren", "We failed to load the export content for this monetary account": "Het is niet gelukt om de content van deze export op te halen", @@ -595,7 +596,7 @@ "You cancelled the request": "Je hebt het verzoek geannuleerd", "You denied the": "Je heb het geweigerd", "You denied the request": "Je hebt de Request geweigerd", - "You don't have any cards": "Je hebt geen kaarten", + "You don't have any cards": "Je hebt geen passen", "You paid the request": "Je hebt het verzoek betaald", "You're logged in!": "Je bent ingelogd!", "Your password has been updated": "Je wachtwoord is aangepast", @@ -603,27 +604,27 @@ "Your personal API key": "Je persoonlijke API key", "Your request was accepted": "Je verzoek is geaccepteerd", "Your request was denied": "Je verzoek is geweigerd", - "Your source account does not have sufficient funds!": "Het account waarmee je wil betalen heeft niet genoeg saldo!", - "accepted": "aanvaard", + "Your source account does not have sufficient funds!": "Onvoldoende saldo op deze rekening", + "accepted": "geaccepteerd", "account": "account", "and": "en", - "and loaded": "en heeft gevonden", + "and loaded": "en laadde", "and more": "en meer", "bunq promo": "bunq promo", "bunqme": "bunq.me", - "bunqme Requests": "bunq.me Verzoeken", - "bunqme request": "bunq.me Aanvraag", + "bunqme Requests": "bunq.me verzoeken", + "bunqme request": "bunq.me verzoek", "bunqme request created successfully!": "bunq.me verzoek succesvol aangemaakt", "bunqme request status has been updated successfully!": "bunq.me verzoek is succesvol aangepast!", "contacts": "contacten", "day": "dag", "days": "dagen", "description": "beschrijving", - "events": "events", + "events": "gebeurtenissen", "every": "elke", "expired": "verlopen", "from": "van", - "has to be selected": "moeten geselecteerd zijn", + "has to be selected": "moet geselecteerd zijn", "hour": "uur", "hours": "uren", "is allowed": "is toegestaan", @@ -633,7 +634,7 @@ "months": "maanden", "new events": "nieuwe gebeurtenissen", "new events were found!": "nieuwe gebeurtenissen zijn gevonden!", - "once": "een keer", + "once": "Ć©Ć©n keer", "out of": "van de", "payment": "betaling", "payment accepted": "betaling geaccepteerd", @@ -643,7 +644,7 @@ "pending": "in afwachting", "rejected": "afgewezen", "request": "verzoek", - "requests in queue": "verzoeken in de wachtrij", + "requests in queue": "verzoeken in wachtrij", "revoked": "herroepen", "rules": "regels", "to": "naar", @@ -652,4 +653,4 @@ "weeks": "weken", "year": "jaar", "years": "jaren" -} \ No newline at end of file +} From 60956898824dc316ed44155b64e1099f35b39062 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Tue, 26 Feb 2019 10:15:32 +0100 Subject: [PATCH 39/61] Add Fossa section to the readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 7c296e39..ce6a8f25 100644 --- a/README.md +++ b/README.md @@ -108,3 +108,7 @@ contact us through one of the above. [![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/0)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/0)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/1)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/1)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/2)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/2)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/3)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/3)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/4)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/4)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/5)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/5)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/6)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/6)[![](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/images/7)](https://sourcerer.io/fame/crecket/bunqCommunity/bunqDesktop/links/7) +## License +Unless otherwise noted, the bunqDesktop source files are distributed under the MIT License found in the [LICENSE](https://github.com/bunqCommunity/bunqDesktop/blob/master/LICENSE) file. + +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FbunqCommunity%2FbunqDesktop.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FbunqCommunity%2FbunqDesktop?ref=badge_large) From 874d2bcf14dbe2e629031a071c9d251d4c2352fe Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Wed, 27 Feb 2019 19:58:49 +0100 Subject: [PATCH 40/61] Combine new electronlog system since its not spreadable --- src/react/Functions/Logger.js | 12 ++++++++++-- src/react/ImportWrappers/localforage.js | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/react/Functions/Logger.js b/src/react/Functions/Logger.js index d8965e6c..cf1d96cd 100644 --- a/src/react/Functions/Logger.js +++ b/src/react/Functions/Logger.js @@ -2,8 +2,7 @@ const remote = require("electron").remote; const electronLog = remote ? remote.require("electron-log") : require("electron-log"); -export default { - ...electronLog, +const Logger = { log: params => { console.log(params); electronLog.log(params); @@ -33,3 +32,12 @@ export default { electronLog.silly(params); } }; + +Logger.catchErrors = electronLog.catchErrors; +Logger.transports = electronLog.transports; +Logger.variables = electronLog.variables; +Logger.default = electronLog.default; +Logger.hooks = electronLog.hooks; +Logger.isDev = electronLog.isDev; + +export default Logger; diff --git a/src/react/ImportWrappers/localforage.js b/src/react/ImportWrappers/localforage.js index 131b631c..ac780eb3 100644 --- a/src/react/ImportWrappers/localforage.js +++ b/src/react/ImportWrappers/localforage.js @@ -1,4 +1,4 @@ -let exportObject; +let exportObject = {}; if (process.env.JEST) { exportObject = { From 5fee52b01d346fcdca9897ff2778cfb183540b76 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Wed, 27 Feb 2019 20:12:48 +0100 Subject: [PATCH 41/61] Add virtual card image (fixes #488) --- app/images/bunq-mastercard-virtual.svg | 182 ++++++++++++++++++++++++ src/react/Functions/EventStatusTexts.js | 3 + src/react/Pages/Cards/CardListItem.jsx | 4 + 3 files changed, 189 insertions(+) create mode 100644 app/images/bunq-mastercard-virtual.svg diff --git a/app/images/bunq-mastercard-virtual.svg b/app/images/bunq-mastercard-virtual.svg new file mode 100644 index 00000000..b24501f9 --- /dev/null +++ b/app/images/bunq-mastercard-virtual.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/react/Functions/EventStatusTexts.js b/src/react/Functions/EventStatusTexts.js index ad06f7da..c74a06e7 100644 --- a/src/react/Functions/EventStatusTexts.js +++ b/src/react/Functions/EventStatusTexts.js @@ -168,6 +168,7 @@ export const cardStatus = (cardInfo, t) => { export const cardOrderStatus = (cardInfo, t) => { const VIRTUAL_DELIVERY = t("Delivered virtually"); + const SENT_FOR_PRODUCTION = t("Sent for production"); const NEW_CARD_REQUEST_RECEIVED = t("New card request received"); const ACCEPTED_FOR_PRODUCTION = t("Accepted for production"); const DELIVERED_TO_CUSTOMER = t("Delivered to customer"); @@ -178,6 +179,8 @@ export const cardOrderStatus = (cardInfo, t) => { switch (cardInfo.order_status) { case "VIRTUAL_DELIVERY": return `${VIRTUAL_DELIVERY}`; + case "SENT_FOR_PRODUCTION": + return `${SENT_FOR_PRODUCTION}`; case "ACCEPTED_FOR_PRODUCTION": return `${ACCEPTED_FOR_PRODUCTION}`; case "NEW_CARD_REQUEST_RECEIVED": diff --git a/src/react/Pages/Cards/CardListItem.jsx b/src/react/Pages/Cards/CardListItem.jsx index ae4af2ef..a838d93a 100644 --- a/src/react/Pages/Cards/CardListItem.jsx +++ b/src/react/Pages/Cards/CardListItem.jsx @@ -18,6 +18,10 @@ export const getCardTypeImage = type => { cardType = "MasterCard"; cardImage = "images/bunq-mastercard.png"; break; + case "MASTERCARD_VIRTUAL": + cardType = "Virtual MasterCard"; + cardImage = "images/bunq-mastercard-virtual.svg"; + break; case "MAESTRO": cardType = "Maestro"; cardImage = "images/bunq-maestro.png"; From 59944a1bb2c518ccb3b939037d9662a6f4f7e505 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Wed, 27 Feb 2019 20:45:03 +0100 Subject: [PATCH 42/61] Add new translations, add support for italian and spanish locales --- package.json | 4 +++- src/react/Functions/Utils.js | 4 ++-- src/react/Locales/de.json | 17 +++++++++++++++++ src/react/Locales/en.json | 1 + src/react/Locales/es.json | 1 + src/react/Locales/it.json | 1 + src/react/Locales/nl.json | 18 +++++++++++++++++- src/react/Pages/Settings/Settings.jsx | 3 --- tasks/update_translations.js | 2 +- 9 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/react/Locales/es.json create mode 100644 src/react/Locales/it.json diff --git a/package.json b/package.json index 61000202..cde2643b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,9 @@ "supported_languages": [ "en", "de", - "nl" + "nl", + "it", + "es" ], "scripts": { "webpack": "cross-env NODE_ENV=production RELEASE_MODE=true webpack --progress --colors", diff --git a/src/react/Functions/Utils.js b/src/react/Functions/Utils.js index a8ca70ba..99215ae1 100644 --- a/src/react/Functions/Utils.js +++ b/src/react/Functions/Utils.js @@ -169,9 +169,9 @@ export const getPrettyLanguage = key => { case "de": return "Deutsch"; case "es": - return "EspaƱol"; + return "EspaƱol (Needs work)"; case "it": - return "Italiano"; + return "Italiano (Needs work)"; } return key; }; diff --git a/src/react/Locales/de.json b/src/react/Locales/de.json index 092c4adb..16c9ef07 100644 --- a/src/react/Locales/de.json +++ b/src/react/Locales/de.json @@ -63,6 +63,7 @@ "Cancelled": "Abgebrochen", "Capslock active": "Feststelltaste Aktiviert", "Card": "Karte", + "Card filter": "Kartenfilter", "Card payment": "Kartenzahlung", "Card payments": "Kartenzahlungen", "Card payments (Maestro or Mastercard)": "Kartenzahlungen (Maestro oder Mastercard)", @@ -77,6 +78,7 @@ "Cards update sent": "Kartenaktualisierung versendet", "Categories": "Kategorien", "Categories that will be added": "Kategorien, die hinzugefĆ¼gt werden", + "Category": "Kategorie", "Category Editor": "Kategorieneditor", "Category count": "Kategorien Anzahl", "Category count history": "Kategorie Anzahl Verlauf", @@ -98,8 +100,10 @@ "Clear filters": "Filter lƶschen", "Click any button to reset the data, the counter only displays the amount of payments currently loaded into memory but resetting will also remove the data from storage": "DrĆ¼cke auf einen Knopf um die Daten zurĆ¼ck zu setzen, der ZƤhler zeigt nur die Anzahl der Zahlungen an die gerade im RAM geladen sind. Das zurĆ¼cksetzen wird auch die Daten von der Festplatte lƶschen.", "Click to exclude the selected accounts": "Klicke um das Konto auszuschlieƟen", + "Click to exclude the selected cards": "Klicke um die ausgewƤhlten Kategorien auszuschlieƟen", "Click to exclude the selected categories": "Klicke um die ausgewƤhlten Kategorien auszuschlieƟen", "Click to include the selected accounts": "Klicke um das Konto auszuwƤhlen", + "Click to include the selected cards": "Klicke um die ausgewƤhlten Kategorien einzuschlieƟen", "Click to include the selected categories": "Klicke um die Kategorie auszuwƤhlen", "Click to view": "Klicke zum anzeigen", "Client ID": "Client-ID", @@ -117,6 +121,10 @@ "Contacts": "Kontakte", "Contains text": "EnthƤlt Text", "Continue": "Weiter", + "Copied Email to your clipboard": "Email in die Zwischenablage kopiert", + "Copied IBAN to your clipboard": "IBAN in die Zwischenablage kopiert", + "Copied Phone number to your clipboard": "Telefonnummer in die Zwischenablage kopiert", + "Copied URL to your clipboard": "URL in die Zwischenablage kopiert", "Copied the value to your clipboard": "Wert in Zwischenablage kopiert", "Copied to your clipboard": "In die Zwischenablage kopiert", "Copy": "Kopieren", @@ -152,6 +160,7 @@ "Delete": "Lƶschen", "Delivered to customer": "Zugestellt an Kunden", "Delivered virtually": "Virtuell zugestellt", + "Delivery method": "Liefermethode", "Description": "Beschreibung", "Device Name": "GerƤtename", "Disabled": "Behindert", @@ -216,6 +225,7 @@ "Failed to reject the share request": "Ablehnung der geteilten Anfrage fehlgeschlagen", "Failed to revoke the share request": "ZurĆ¼ckziehen der geteilten Anfrage fehlgeschlagen", "Failed to store the export file at ": "Fehler beim Speichern des Kontoauszugs unter ", + "Failed to upload image": "Fehler beim Hochladen des Bildes", "Failed to validate the authentication tokens": "Wir konnten die Authentifizierungs Token nicht Ć¼berprĆ¼fen", "Filter": "Filter", "Filter by amount": "Filtere nach Menge", @@ -240,6 +250,7 @@ "IBAN": "IBAN", "IBAN name": "IBAN-Name", "IBAN number": "IBAN-Nummer", + "Image updated successfully!": "Bild erfolgreich aktualisiert!", "Import": "Importieren", "Import as new": "Als neu importieren", "Import categories": "Kategorien importieren", @@ -284,6 +295,7 @@ "Maximum allowed length is": "Maximale erlaubte LƤnge ist", "Maximum events per type": "Maximale Ereignisse pro typ", "Merchant reference": "HƤndler Referenz", + "Method": "Zahlungsmethode", "Minimize to tray": "In Statusleiste minimieren", "Minimum required length is": "Minimale erforderliche LƤnge ist", "Minute": "Minute", @@ -316,6 +328,7 @@ "No stored keys found": "Es wurde kein gespeicherter SchlĆ¼ssel gefunden", "None": "Keine", "Not Found": "Nicht gefunden", + "Notification filters": "Benachrichtigungsfilter", "Number of payments": "Anzahl der Zahlungen", "Number of requests": "Anzahl der Anfragen", "OAuth": "OAuth", @@ -368,6 +381,7 @@ "Production key": "Produktions SchlĆ¼ssel", "Profile": "Profiel", "Public nick name": "Ɩffentlicher Nickname", + "Push notifications": "Push Benachrichtigungen", "Queue is empty": "Schlange ist leer", "Reason": "Grund", "Received": "Empfangen", @@ -528,6 +542,7 @@ "Use account balances": "Benutze Kontostand", "Use no password": "Verwende kein Passwort", "Use the native frame": "Fenster im nativen Rahmen anzeigen", + "Value": "Betrag", "Value rule with": "Wert Regel mit", "Version": "Version", "View CVC Codes": "CVC-Codes anzeigen", @@ -583,6 +598,8 @@ "We received the following error while trying to accept your request response": "Wir haben beim Versuch, deine Anfrage zu akzeptieren, folgenden Fehler erhalten", "We received the following error while trying to cancel the request": "Wir haben beim Versuch, die Anfrage abzubrechen, folgenden Fehler erhalten", "We received the following error while trying to cancel your request inquiry": "Wir haben beim Versuch, deine Anfrage abzubrechen, folgenden Fehler erhalten", + "We received the following error while updating the image for the monetary account": "Wir haben den folgenden Fehler beim Aktualisieren des Bildes fĆ¼r das Konto erhalten", + "We received the following error while updating the image for your account": "Wir haben den folgenden Fehler beim Aktualisieren des Bildes fĆ¼r das Konto erhalten", "We received the following error while updating your bunqme request": "Wir haben folgenden Fehler beim aktualisieren deiner bunq.me Anfrage erhalten", "We received the following error while updating your connect request": "Wir haben folgenden Fehler beim aktualisieren deiner Connect Anfrage erhalten", "Weekly": "Wƶchentlich", diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index f4a0ac39..c39bdc8d 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -447,6 +447,7 @@ "Send request": "Send request", "Sends money": "Sends money", "Sent": "Sent", + "Sent for production": "Sent for production", "Sent payment": "Sent payment", "Sent payment with ": "Sent payment with ", "Sent request": "Sent request", diff --git a/src/react/Locales/es.json b/src/react/Locales/es.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/react/Locales/es.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/react/Locales/it.json b/src/react/Locales/it.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/react/Locales/it.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/react/Locales/nl.json b/src/react/Locales/nl.json index 40841f40..06b9544b 100644 --- a/src/react/Locales/nl.json +++ b/src/react/Locales/nl.json @@ -78,6 +78,7 @@ "Cards update sent": "Pas wijziging verstuurd", "Categories": "CategorieĆ«n", "Categories that will be added": "Selecteer categorieĆ«n die moeten worden toegewezen.", + "Category": "Categorie", "Category Editor": "Categorie Editor", "Category count": "Aantal categorieĆ«n", "Category count history": "Aantal categorieĆ«n historie", @@ -99,8 +100,10 @@ "Clear filters": "Filters wissen", "Click any button to reset the data, the counter only displays the amount of payments currently loaded into memory but resetting will also remove the data from storage": "Klik op een knop om de gegevens opnieuw in te stellen, de teller geeft alleen het aantal betalingen weer dat momenteel in het geheugen is geladen, maar door te resetten worden de gegevens ook uit de opslag verwijderd", "Click to exclude the selected accounts": "Klik om de geselecteerde accounts uit te sluiten", + "Click to exclude the selected cards": "Klik om de geselecteerde passen uit te sluiten", "Click to exclude the selected categories": "Klik om de geselecteerde categorieĆ«n uit te sluiten", "Click to include the selected accounts": "Klik om de geselecteerde accounts te weergeven", + "Click to include the selected cards": "Klik om de geselecteerde passen te weergeven", "Click to include the selected categories": "Klik om de geselecteerde categorieĆ«n te weergeven", "Click to view": "Klik om te bekijken", "Client ID": "Client ID", @@ -118,6 +121,10 @@ "Contacts": "Contacten", "Contains text": "Bevat tekst", "Continue": "Doorgaan", + "Copied Email to your clipboard": "Email gekopieerd naar je klembord", + "Copied IBAN to your clipboard": "IBAN gekopieerd naar je klembord", + "Copied Phone number to your clipboard": "Telefoonnummer gekopieerd naar je klembord", + "Copied URL to your clipboard": "URL gekopieerd naar je klembord", "Copied the value to your clipboard": "Gekopieerd naar je plakbord", "Copied to your clipboard": "Gekopieerd naar je plakbord", "Copy": "Kopieer", @@ -153,6 +160,7 @@ "Delete": "Verwijder", "Delivered to customer": "Bezorgd aan klant", "Delivered virtually": "Online geleverd", + "Delivery method": "Verzendmethode", "Description": "Beschrijving", "Device Name": "Apparaatnaam", "Disabled": "invalide", @@ -216,6 +224,7 @@ "Failed to reject the share request": "Het is niet gelukt om de share request af te wijzen", "Failed to revoke the share request": "Het is niet gelukt om de share request te in te trekken", "Failed to store the export file at ": "Het is niet gelukt om het export bestand op te slaan ", + "Failed to upload image": "Het is niet gelukt om de afbeelding te uploaden", "Failed to validate the Google authentication tokens": "Het is niet gelukt om je Google authenticatie codes te valideren", "Failed to validate the authentication tokens": "Het is niet gelukt om de authenticatie codes te valideren", "Filter": "Filter", @@ -241,6 +250,7 @@ "IBAN": "IBAN", "IBAN name": "Naam ontvanger", "IBAN number": "IBAN", + "Image updated successfully!": "De afbeelding is succesvol geupdate!", "Import": "Importeren", "Import as new": "Importeer als nieuw", "Import categories": "Importeer categorieĆ«n", @@ -285,6 +295,7 @@ "Maximum allowed length is": "De maximale lengte is", "Maximum events per type": "Maximaal aantal events per type", "Merchant reference": "Verkoper referentie", + "Method": "Methode", "Minimize to tray": "Minimaliseer naar systeemvak", "Minimum required length is": "Minimale lengte is", "Minute": "Minuut", @@ -317,6 +328,7 @@ "No stored keys found": "Geen opgeslagen keys gevonden", "None": "Geen", "Not Found": "Niet gevonden", + "Notification filters": "Meldingen filters", "Number of payments": "Aantal betalingen", "Number of requests": "Aantal verzoeken", "OAuth": "OAuth", @@ -369,6 +381,7 @@ "Production key": "Productie sleutel", "Profile": "Profiel", "Public nick name": "Publieke bijnaam", + "Push notifications": "Pushberichten", "Queue is empty": "Wachtrij leeg", "Reason": "Reden", "Received": "Ontvangen", @@ -528,6 +541,7 @@ "Use account balances": "Gebruik totaal rekeningsaldo's", "Use no password": "Gebruik geen wachtwoord", "Use the native frame": "Gebruik het native frame", + "Value": "Waarde", "Value rule with": "Waarde regel met", "Version": "Versie", "View CVC Codes": "CVC-codes bekijken", @@ -583,6 +597,8 @@ "We received the following error while trying to accept your request response": "We hebben de volgende error ontvangen bij het accepteren van dit verzoek", "We received the following error while trying to cancel the request": "We hebben de volgende error ontvangen bij het annuleren van het verzoek", "We received the following error while trying to cancel your request inquiry": "We hebben de volgende error ontvangen bij het annuleren van dit verzoek", + "We received the following error while updating the image for the monetary account": "We hebben de volgende error ontvangen bij het updaten van de afbeelding voor dit account", + "We received the following error while updating the image for your account": "We hebben de volgende error ontvangen bij het updaten van de afbeelding voor je account", "We received the following error while updating your bunqme request": "We hebben de volgende error ontvangen bij het updaten van je bunq.me verzoek", "We received the following error while updating your connect request": "We hebben de volgende error ontvangen tijdens het updaten van het connect verzoek", "Weekly": "Wekelijks", @@ -653,4 +669,4 @@ "weeks": "weken", "year": "jaar", "years": "jaren" -} +} \ No newline at end of file diff --git a/src/react/Pages/Settings/Settings.jsx b/src/react/Pages/Settings/Settings.jsx index 1a2a4c82..f3c6a6be 100644 --- a/src/react/Pages/Settings/Settings.jsx +++ b/src/react/Pages/Settings/Settings.jsx @@ -701,15 +701,12 @@ const mapStateToProps = state => { const mapDispatchToProps = (dispatch, ownProps) => { const { BunqJSClient } = ownProps; return { - openSnackbar: message => dispatch(openSnackbar(message)), - // options and options_drawer handlers setSyncOnStartup: syncOnStartup => dispatch(setSyncOnStartup(syncOnStartup)), openSnackbar: message => dispatch(openSnackbar(message)), setAutomaticThemeChange: automaticThemeChange => dispatch(setAutomaticThemeChange(automaticThemeChange)), setTheme: theme => dispatch(setTheme(theme)), setLanguage: language => dispatch(setLanguage(language)), - setLanguage: language => dispatch(setLanguage(language)), setNativeFrame: useFrame => dispatch(setNativeFrame(useFrame)), setStickyMenu: userStickyMenu => dispatch(setStickyMenu(userStickyMenu)), setEventCountLimit: eventCountLimit => dispatch(setEventCountLimit(eventCountLimit)), diff --git a/tasks/update_translations.js b/tasks/update_translations.js index 6a8449d4..e799e7cb 100644 --- a/tasks/update_translations.js +++ b/tasks/update_translations.js @@ -45,7 +45,7 @@ const getCrowdinAPIData = async (update = true) => { // map key/value combos const keyedData = data.reduce((accumulator, translations) => { - accumulator[translations[0]] = { de: translations[1], nl: translations[2] }; + accumulator[translations[0]] = { de: translations[1], nl: translations[2], it: translations[3], es: translations[4] }; return accumulator; }, {}); From 833c2fb923482c31622d4926c43b652bef0bebaf Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Wed, 27 Feb 2019 21:14:13 +0100 Subject: [PATCH 43/61] Improve formatting on smaller screens for account list listem --- src/react/Components/AccountList/AccountListItem.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/react/Components/AccountList/AccountListItem.jsx b/src/react/Components/AccountList/AccountListItem.jsx index 4c341131..bacc510e 100644 --- a/src/react/Components/AccountList/AccountListItem.jsx +++ b/src/react/Components/AccountList/AccountListItem.jsx @@ -92,7 +92,9 @@ class AccountListItem extends React.Component { } // check if any of the selected account ids are for this account - let displayStyle = {}; + let displayStyle = { + height: 83 + }; let circularLeftPostion = 20; let accountIsSelected = false; if (selectedAccountIds.length !== 0) { @@ -105,7 +107,8 @@ class AccountListItem extends React.Component { circularLeftPostion = 16; displayStyle = { borderLeft: "4px solid #1da1f2", - paddingLeft: 20 + paddingLeft: 20, + height: 83 }; } } From e62a6da2db94ad89438f38a2979ffb4059647d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reu=CC=88el=20van=20der=20Steege?= Date: Fri, 1 Mar 2019 22:43:50 +0100 Subject: [PATCH 44/61] Fix avatar sub icon misalignment for selected account list items (fixes #478, #490). --- src/react/Components/AccountList/AccountListItem.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/react/Components/AccountList/AccountListItem.jsx b/src/react/Components/AccountList/AccountListItem.jsx index bacc510e..266bc3c8 100644 --- a/src/react/Components/AccountList/AccountListItem.jsx +++ b/src/react/Components/AccountList/AccountListItem.jsx @@ -28,9 +28,9 @@ const styles = { height: 60 }, avatarSub: { - position: "absolute", - left: 60, - bottom: 4 + minWidth: 26, + marginLeft: -23, + marginTop: 40 }, secondaryIcon: { width: 26, From 5290843ecb09838b04ed6689ea1a6cf54f1e358e Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 11:35:20 +0100 Subject: [PATCH 45/61] Increase generic 10k limit to 100k (fixes #489) --- src/react/Pages/AccountInfo.jsx | 4 ++-- src/react/Pages/AddAccount.jsx | 4 ++-- src/react/Pages/BunqMeTab/BunqMeTabForm.jsx | 2 +- src/react/Pages/Connect/Connect.jsx | 2 +- src/react/Pages/Pay/Pay.jsx | 2 +- src/react/Pages/RequestInquiry/RequestInquiry.jsx | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/react/Pages/AccountInfo.jsx b/src/react/Pages/AccountInfo.jsx index f5ecb91b..7aee43fb 100644 --- a/src/react/Pages/AccountInfo.jsx +++ b/src/react/Pages/AccountInfo.jsx @@ -236,10 +236,10 @@ class AccountInfo extends React.Component { let savingsGoalError = false; if (accountInfo.accountType === "MonetaryAccountSavings") { if (!settingsSavingsGoal) { - savingsGoalError = settingsSavingsGoal < 0.01 || settingsSavingsGoal > 10000; + savingsGoalError = settingsSavingsGoal < 0.01 || settingsSavingsGoal > 100000; } } - const limitErrorCondition = settingsDailyLimit < 0.01 || settingsDailyLimit > 10000; + const limitErrorCondition = settingsDailyLimit < 0.01 || settingsDailyLimit > 100000; const descriptionErrorCondition = settingsDescription.length < 1 || settingsDescription.length > 140; this.setState({ diff --git a/src/react/Pages/AddAccount.jsx b/src/react/Pages/AddAccount.jsx index 3ad0fc98..42766474 100644 --- a/src/react/Pages/AddAccount.jsx +++ b/src/react/Pages/AddAccount.jsx @@ -115,10 +115,10 @@ class AddAccount extends React.Component { let savingsGoalError = false; if (accountType === "MonetaryAccountSavings") { if (!savingsGoal) { - savingsGoalError = savingsGoal < 0.01 || savingsGoal > 10000; + savingsGoalError = savingsGoal < 0.01 || savingsGoal > 100000; } } - const limitErrorCondition = limit < 0.01 || limit > 10000; + const limitErrorCondition = limit < 0.01 || limit > 100000; const descriptionErrorCondition = description.length < 1 || description.length > 140; this.setState({ diff --git a/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx b/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx index d14c7a98..ef09aab9 100644 --- a/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx +++ b/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx @@ -104,7 +104,7 @@ class BunqMeTabForm extends React.Component { validateForm = () => { const { description, amount, setRedirectUrl, redirectUrl } = this.state; - const amountErrorCondition = amount < 0.01 || amount > 10000; + const amountErrorCondition = amount < 0.01 || amount > 100000; const descriptionErrorCondition = description.length > 140; const redurectUrlErrorCondition = setRedirectUrl === true && redirectUrl.length < 5; diff --git a/src/react/Pages/Connect/Connect.jsx b/src/react/Pages/Connect/Connect.jsx index c69ccca5..6d53b781 100644 --- a/src/react/Pages/Connect/Connect.jsx +++ b/src/react/Pages/Connect/Connect.jsx @@ -246,7 +246,7 @@ class Connect extends React.Component { validateForm = () => { const { budget, target, targets, targetType, timeLimit, setTimeLimit } = this.state; - const budgetErrorCondition = budget < 0.01 || budget > 10000; + const budgetErrorCondition = budget < 0.01 || budget > 100000; const timeLimitError = setTimeLimit === true && timeLimit === null; // check if the target is valid based onthe targetType diff --git a/src/react/Pages/Pay/Pay.jsx b/src/react/Pages/Pay/Pay.jsx index 687cdd28..0a998385 100644 --- a/src/react/Pages/Pay/Pay.jsx +++ b/src/react/Pages/Pay/Pay.jsx @@ -442,7 +442,7 @@ class Pay extends React.Component { amount !== "" && // enough funds or draft enabled (amount > accountBalance && sendDraftPayment === false && schedulePayment === false); - const amountErrorCondition = amount < 0.01 || amount > 10000; + const amountErrorCondition = amount < 0.01 || amount > 100000; const descriptionErrorCondition = description.length > 140; const ibanNameErrorCondition = ibanName.length < 1 || ibanName.length > 64; diff --git a/src/react/Pages/RequestInquiry/RequestInquiry.jsx b/src/react/Pages/RequestInquiry/RequestInquiry.jsx index a54234e1..faf302c0 100644 --- a/src/react/Pages/RequestInquiry/RequestInquiry.jsx +++ b/src/react/Pages/RequestInquiry/RequestInquiry.jsx @@ -301,7 +301,7 @@ class RequestInquiry extends React.Component { } = this.state; const minimumAgeInt = parseInt(minimumAge); - const amountErrorCondition = amount < 0.01 || amount > 10000; + const amountErrorCondition = amount < 0.01 || amount > 100000; const descriptionErrorCondition = description.length > 140; const minimumAgeErrorCondition = setMinimumAge === true && (minimumAgeInt < 12 || minimumAgeInt > 100); const redurectUrlErrorCondition = setRedirectUrl === true && redirectUrl.length < 5; From 46aca60086801aea487b9d8a756cf57f8d82d545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reu=CC=88el=20van=20der=20Steege?= Date: Sat, 2 Mar 2019 12:10:44 +0100 Subject: [PATCH 46/61] Use TranslateButton where possible or make button text translatable (fixes #493). --- .../Categories/CategorySelectorDialog.jsx | 4 ++-- .../Components/FileUpload/UploadFullscreen.jsx | 10 +++++----- .../Components/FilterComponents/ClearFilter.jsx | 2 +- src/react/Components/FilterCreationDialog.jsx | 6 +++--- .../Components/GeoLocation/GeoLocationView.jsx | 6 +++--- src/react/Components/MainDialog.jsx | 6 +++--- src/react/Pages/Dashboard/Dashboard.jsx | 2 +- src/react/Pages/Profile/NotificationFilters.jsx | 7 ++++--- src/react/Pages/Settings/Settings.jsx | 16 ++++++++-------- 9 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/react/Components/Categories/CategorySelectorDialog.jsx b/src/react/Components/Categories/CategorySelectorDialog.jsx index 2d7a0462..8dd0dad0 100644 --- a/src/react/Components/Categories/CategorySelectorDialog.jsx +++ b/src/react/Components/Categories/CategorySelectorDialog.jsx @@ -1,10 +1,10 @@ import React from "react"; import { translate } from "react-i18next"; -import Button from "@material-ui/core/Button"; import DialogContent from "@material-ui/core/DialogContent"; import DialogActions from "@material-ui/core/DialogActions"; import DialogTitle from "@material-ui/core/DialogTitle"; import Dialog from "@material-ui/core/Dialog"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; import CategorySelector from "./CategorySelector"; @@ -24,7 +24,7 @@ class CategorySelectorDialog extends React.Component { - + Ok
); diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx index daf12f66..20e5c01d 100644 --- a/src/react/Components/FileUpload/UploadFullscreen.jsx +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -4,7 +4,7 @@ import { translate } from "react-i18next"; import Dialog from "@material-ui/core/Dialog"; import Typography from "@material-ui/core/Typography"; import Slide from "@material-ui/core/Slide"; -import Button from "@material-ui/core/Button"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; import FilePicker from "./FilePicker"; @@ -108,9 +108,9 @@ class UploadFullscreen extends React.Component { onClose={this.props.onClose} TransitionComponent={Transition} > - +
@@ -118,7 +118,7 @@ class UploadFullscreen extends React.Component { {this.state.file && ( - + )}
diff --git a/src/react/Components/FilterComponents/ClearFilter.jsx b/src/react/Components/FilterComponents/ClearFilter.jsx index 815d7c82..1e6d4aff 100644 --- a/src/react/Components/FilterComponents/ClearFilter.jsx +++ b/src/react/Components/FilterComponents/ClearFilter.jsx @@ -53,7 +53,7 @@ class ClearFilter extends React.PureComponent { return this.props.bigButton ? ( ) : ( diff --git a/src/react/Components/FilterCreationDialog.jsx b/src/react/Components/FilterCreationDialog.jsx index eaf8597e..769e5c43 100644 --- a/src/react/Components/FilterCreationDialog.jsx +++ b/src/react/Components/FilterCreationDialog.jsx @@ -4,9 +4,9 @@ import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; import DialogActions from "@material-ui/core/DialogActions"; import List from "@material-ui/core/List"; -import Button from "@material-ui/core/Button"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; +import TranslateButton from "./TranslationHelpers/Button"; import NavLink from "./Routing/NavLink"; import { formatIban } from "../Functions/Utils"; @@ -86,9 +86,9 @@ export default props => { - + ); diff --git a/src/react/Components/GeoLocation/GeoLocationView.jsx b/src/react/Components/GeoLocation/GeoLocationView.jsx index 192fe525..4ea1e11c 100644 --- a/src/react/Components/GeoLocation/GeoLocationView.jsx +++ b/src/react/Components/GeoLocation/GeoLocationView.jsx @@ -1,8 +1,8 @@ import React from "react"; -import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import Slide from "@material-ui/core/Slide"; import GeoLocationMap from "./GeoLocationMap"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; const Transition = props => ; @@ -34,7 +34,7 @@ class GeoLocationView extends React.PureComponent {
- + ); } diff --git a/src/react/Components/MainDialog.jsx b/src/react/Components/MainDialog.jsx index a9cfe8e5..c9c81588 100644 --- a/src/react/Components/MainDialog.jsx +++ b/src/react/Components/MainDialog.jsx @@ -1,6 +1,5 @@ import React from "react"; import { connect } from "react-redux"; -import Button from "@material-ui/core/Button"; import Typography from "@material-ui/core/Typography"; import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; @@ -8,6 +7,7 @@ import DialogContentText from "@material-ui/core/DialogContentText"; import DialogTitle from "@material-ui/core/DialogTitle"; import Dialog from "@material-ui/core/Dialog"; import Slide from "@material-ui/core/Slide"; +import TranslateButton from "./TranslationHelpers/Button"; const Transition = props => ; @@ -35,9 +35,9 @@ class MainDialog extends React.Component { {modalTitle} {fixedModalText} - + ); diff --git a/src/react/Pages/Dashboard/Dashboard.jsx b/src/react/Pages/Dashboard/Dashboard.jsx index 76520eb5..69a9ea8f 100644 --- a/src/react/Pages/Dashboard/Dashboard.jsx +++ b/src/react/Pages/Dashboard/Dashboard.jsx @@ -174,7 +174,7 @@ class Dashboard extends React.Component { - + { diff --git a/src/react/Pages/Profile/NotificationFilters.jsx b/src/react/Pages/Profile/NotificationFilters.jsx index fbd47eac..370e99af 100644 --- a/src/react/Pages/Profile/NotificationFilters.jsx +++ b/src/react/Pages/Profile/NotificationFilters.jsx @@ -18,6 +18,7 @@ import Select from "@material-ui/core/Select"; import Collapse from "@material-ui/core/Collapse"; import DeleteIcon from "@material-ui/icons/Delete"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; const styles = { paper: { @@ -216,7 +217,7 @@ class NotificationFilters extends React.Component { - + @@ -244,7 +245,7 @@ class NotificationFilters extends React.Component { variant="outlined" onClick={() => this.setState({ showPushesMessages: !this.state.showPushesMessages })} > - {this.state.showPushesMessages ? "Hide" : "Show"} + {this.state.showPushesMessages ? t("Hide") : t("Show")} diff --git a/src/react/Pages/Settings/Settings.jsx b/src/react/Pages/Settings/Settings.jsx index f3c6a6be..87e146c2 100644 --- a/src/react/Pages/Settings/Settings.jsx +++ b/src/react/Pages/Settings/Settings.jsx @@ -568,44 +568,44 @@ class Settings extends React.Component { - + From 77d946c71facd45140c435fd4193cc2cf273adf4 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 12:13:11 +0100 Subject: [PATCH 47/61] Wrap texts in translation handler (fixes #493) --- src/react/Pages/Settings/Settings.jsx | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/react/Pages/Settings/Settings.jsx b/src/react/Pages/Settings/Settings.jsx index f3c6a6be..79dc901b 100644 --- a/src/react/Pages/Settings/Settings.jsx +++ b/src/react/Pages/Settings/Settings.jsx @@ -569,43 +569,43 @@ class Settings extends React.Component { @@ -618,14 +618,15 @@ class Settings extends React.Component { - Change settings location + {t("Change settings location")} - You are about to change the settings location to: + {t("You are about to change the settings location to")}: {this.state.importTargetLocation} - Would you like to import the settings file or overwrite the settings currently in - bunqDesktop? + {t( + "Would you like to import the settings file or overwrite the settings currently in bunqDesktop?" + )} From f08245b263c60d93b3dbbba8669eb6b0fe4cdbb0 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 12:13:30 +0100 Subject: [PATCH 48/61] Detect joint accounts more correctly (fixes #492) --- src/react/Components/AccountList/AccountList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/react/Components/AccountList/AccountList.jsx b/src/react/Components/AccountList/AccountList.jsx index 3c30a0d3..966a062b 100644 --- a/src/react/Components/AccountList/AccountList.jsx +++ b/src/react/Components/AccountList/AccountList.jsx @@ -237,7 +237,7 @@ class AccountList extends React.Component { BunqJSClient={this.props.BunqJSClient} denseMode={this.props.denseMode} account={account} - isJoint={account.accountType === "MonetaryAccountJoint"} + isJoint={!!account.all_co_owner} shareInviteBankResponses={filteredResponses} secondaryAction={secondaryAction} /> From e5a9f7214554a69a2ee51e88fd3bddc29af7fada Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 11:35:20 +0100 Subject: [PATCH 49/61] Increase generic 10k limit to 100k (fixes #489) --- src/react/Pages/AccountInfo.jsx | 4 ++-- src/react/Pages/AddAccount.jsx | 4 ++-- src/react/Pages/BunqMeTab/BunqMeTabForm.jsx | 2 +- src/react/Pages/Connect/Connect.jsx | 2 +- src/react/Pages/Pay/Pay.jsx | 2 +- src/react/Pages/RequestInquiry/RequestInquiry.jsx | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/react/Pages/AccountInfo.jsx b/src/react/Pages/AccountInfo.jsx index f5ecb91b..7aee43fb 100644 --- a/src/react/Pages/AccountInfo.jsx +++ b/src/react/Pages/AccountInfo.jsx @@ -236,10 +236,10 @@ class AccountInfo extends React.Component { let savingsGoalError = false; if (accountInfo.accountType === "MonetaryAccountSavings") { if (!settingsSavingsGoal) { - savingsGoalError = settingsSavingsGoal < 0.01 || settingsSavingsGoal > 10000; + savingsGoalError = settingsSavingsGoal < 0.01 || settingsSavingsGoal > 100000; } } - const limitErrorCondition = settingsDailyLimit < 0.01 || settingsDailyLimit > 10000; + const limitErrorCondition = settingsDailyLimit < 0.01 || settingsDailyLimit > 100000; const descriptionErrorCondition = settingsDescription.length < 1 || settingsDescription.length > 140; this.setState({ diff --git a/src/react/Pages/AddAccount.jsx b/src/react/Pages/AddAccount.jsx index 3ad0fc98..42766474 100644 --- a/src/react/Pages/AddAccount.jsx +++ b/src/react/Pages/AddAccount.jsx @@ -115,10 +115,10 @@ class AddAccount extends React.Component { let savingsGoalError = false; if (accountType === "MonetaryAccountSavings") { if (!savingsGoal) { - savingsGoalError = savingsGoal < 0.01 || savingsGoal > 10000; + savingsGoalError = savingsGoal < 0.01 || savingsGoal > 100000; } } - const limitErrorCondition = limit < 0.01 || limit > 10000; + const limitErrorCondition = limit < 0.01 || limit > 100000; const descriptionErrorCondition = description.length < 1 || description.length > 140; this.setState({ diff --git a/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx b/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx index d14c7a98..ef09aab9 100644 --- a/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx +++ b/src/react/Pages/BunqMeTab/BunqMeTabForm.jsx @@ -104,7 +104,7 @@ class BunqMeTabForm extends React.Component { validateForm = () => { const { description, amount, setRedirectUrl, redirectUrl } = this.state; - const amountErrorCondition = amount < 0.01 || amount > 10000; + const amountErrorCondition = amount < 0.01 || amount > 100000; const descriptionErrorCondition = description.length > 140; const redurectUrlErrorCondition = setRedirectUrl === true && redirectUrl.length < 5; diff --git a/src/react/Pages/Connect/Connect.jsx b/src/react/Pages/Connect/Connect.jsx index c69ccca5..6d53b781 100644 --- a/src/react/Pages/Connect/Connect.jsx +++ b/src/react/Pages/Connect/Connect.jsx @@ -246,7 +246,7 @@ class Connect extends React.Component { validateForm = () => { const { budget, target, targets, targetType, timeLimit, setTimeLimit } = this.state; - const budgetErrorCondition = budget < 0.01 || budget > 10000; + const budgetErrorCondition = budget < 0.01 || budget > 100000; const timeLimitError = setTimeLimit === true && timeLimit === null; // check if the target is valid based onthe targetType diff --git a/src/react/Pages/Pay/Pay.jsx b/src/react/Pages/Pay/Pay.jsx index 687cdd28..0a998385 100644 --- a/src/react/Pages/Pay/Pay.jsx +++ b/src/react/Pages/Pay/Pay.jsx @@ -442,7 +442,7 @@ class Pay extends React.Component { amount !== "" && // enough funds or draft enabled (amount > accountBalance && sendDraftPayment === false && schedulePayment === false); - const amountErrorCondition = amount < 0.01 || amount > 10000; + const amountErrorCondition = amount < 0.01 || amount > 100000; const descriptionErrorCondition = description.length > 140; const ibanNameErrorCondition = ibanName.length < 1 || ibanName.length > 64; diff --git a/src/react/Pages/RequestInquiry/RequestInquiry.jsx b/src/react/Pages/RequestInquiry/RequestInquiry.jsx index a54234e1..faf302c0 100644 --- a/src/react/Pages/RequestInquiry/RequestInquiry.jsx +++ b/src/react/Pages/RequestInquiry/RequestInquiry.jsx @@ -301,7 +301,7 @@ class RequestInquiry extends React.Component { } = this.state; const minimumAgeInt = parseInt(minimumAge); - const amountErrorCondition = amount < 0.01 || amount > 10000; + const amountErrorCondition = amount < 0.01 || amount > 100000; const descriptionErrorCondition = description.length > 140; const minimumAgeErrorCondition = setMinimumAge === true && (minimumAgeInt < 12 || minimumAgeInt > 100); const redurectUrlErrorCondition = setRedirectUrl === true && redirectUrl.length < 5; From a7521151f58f9c5d18c2d0e6616f086c7b5b66ee Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 12:14:37 +0100 Subject: [PATCH 50/61] Fix z index for subicon --- src/react/Components/AccountList/AccountListItem.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/react/Components/AccountList/AccountListItem.jsx b/src/react/Components/AccountList/AccountListItem.jsx index 266bc3c8..074381c3 100644 --- a/src/react/Components/AccountList/AccountListItem.jsx +++ b/src/react/Components/AccountList/AccountListItem.jsx @@ -30,7 +30,8 @@ const styles = { avatarSub: { minWidth: 26, marginLeft: -23, - marginTop: 40 + marginTop: 40, + zIndex: 10 }, secondaryIcon: { width: 26, From 2d73cf913d9a1488c8c727d418f1ee174dd33ccb Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 12:15:48 +0100 Subject: [PATCH 51/61] Add missing translations from settings page --- src/react/Locales/en.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index c39bdc8d..71bc0684 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -116,6 +116,7 @@ "Connect invite sent": "Connect invite sent", "Connect request was sent successfully!": "Connect request was sent successfully!", "Connect request was updated successfully!": "Connect request was updated successfully!", + "Connect requests": "Connect requests", "Connect your account": "Connect your account", "Contact": "Contact", "Contacts": "Contacts", @@ -393,6 +394,7 @@ "Regex": "Regex", "Regional format": "Regional format", "Registering our encryption keys": "Registering our encryption keys", + "Regular payments": "Regular payments", "Reject": "Reject", "Released": "Released", "Remove": "Remove", @@ -606,9 +608,11 @@ "Welcome": "Welcome", "When you login with an API key it will appear in this list": "When you login with an API key it will appear in this list.", "Why are you closing the account?": "Why are you closing the account?", + "Would you like to import the settings file or overwrite the settings currently in bunqDesktop?": "Would you like to import the settings file or overwrite the settings currently in bunqDesktop?", "Yearly": "Yearly", "Years": "Years", "Yes": "Yes", + "You are about to change the settings location to": "You are about to change the settings location to", "You cancelled the request": "You cancelled the request", "You denied the": "You denied the", "You denied the request": "You denied the request", @@ -626,6 +630,7 @@ "and": "and", "and loaded": "and loaded", "and more": "and more", + "bunq me Tabs": "bunq me Tabs", "bunq promo": "bunq promo", "bunqme": "bunq.me", "bunqme Requests": "bunq.me Requests", From 3d8cffd1a23a341c76aa9754705371137c9301a9 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 12:47:33 +0100 Subject: [PATCH 52/61] Run prettier reformat --- src/react/Components/CombinedList/CombinedList.jsx | 13 ++++++++----- src/react/Pages/Cards/Cards.jsx | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/react/Components/CombinedList/CombinedList.jsx b/src/react/Components/CombinedList/CombinedList.jsx index 640a7b01..de45e12b 100644 --- a/src/react/Components/CombinedList/CombinedList.jsx +++ b/src/react/Components/CombinedList/CombinedList.jsx @@ -116,7 +116,7 @@ class CombinedList extends React.Component { document.documentElement.scrollTop = storedScrollPosition; sessionStore.remove(STORED_SCROLL_POSITION); } - } + }; loadEvents = () => { const settings = this.getSettings(); @@ -145,10 +145,13 @@ class CombinedList extends React.Component { return new Date(b.filterDate) - new Date(a.filterDate); }); - this.setState({ - totalEvents: this.state.totalEvents < events.length ? events.length : this.state.totalEvents, - events: events - }, this.useOldPosition); + this.setState( + { + totalEvents: this.state.totalEvents < events.length ? events.length : this.state.totalEvents, + events: events + }, + this.useOldPosition + ); }; copiedValue = type => callback => { diff --git a/src/react/Pages/Cards/Cards.jsx b/src/react/Pages/Cards/Cards.jsx index 43bd10fb..6ea4aba5 100644 --- a/src/react/Pages/Cards/Cards.jsx +++ b/src/react/Pages/Cards/Cards.jsx @@ -350,7 +350,7 @@ const mapStateToProps = state => { }; }; -const mapDispatchToProps = (dispatch) => { +const mapDispatchToProps = dispatch => { return { cardsUpdate: userId => dispatch(cardsUpdate(userId)), cardsSetCardOrder: cardOrder => dispatch(cardsSetCardOrder(cardOrder)) From f3e593c28f0eb7d6257a1ef8cbce750806634cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reu=CC=88el=20van=20der=20Steege?= Date: Sat, 2 Mar 2019 12:10:44 +0100 Subject: [PATCH 53/61] Use TranslateButton where possible or make button text translatable (fixes #493). --- .../Components/Categories/CategorySelectorDialog.jsx | 4 ++-- src/react/Components/FileUpload/UploadFullscreen.jsx | 10 +++++----- src/react/Components/FilterComponents/ClearFilter.jsx | 2 +- src/react/Components/FilterCreationDialog.jsx | 6 +++--- src/react/Components/GeoLocation/GeoLocationView.jsx | 6 +++--- src/react/Components/MainDialog.jsx | 6 +++--- src/react/Pages/Dashboard/Dashboard.jsx | 2 +- src/react/Pages/Profile/NotificationFilters.jsx | 7 ++++--- 8 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/react/Components/Categories/CategorySelectorDialog.jsx b/src/react/Components/Categories/CategorySelectorDialog.jsx index 2d7a0462..8dd0dad0 100644 --- a/src/react/Components/Categories/CategorySelectorDialog.jsx +++ b/src/react/Components/Categories/CategorySelectorDialog.jsx @@ -1,10 +1,10 @@ import React from "react"; import { translate } from "react-i18next"; -import Button from "@material-ui/core/Button"; import DialogContent from "@material-ui/core/DialogContent"; import DialogActions from "@material-ui/core/DialogActions"; import DialogTitle from "@material-ui/core/DialogTitle"; import Dialog from "@material-ui/core/Dialog"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; import CategorySelector from "./CategorySelector"; @@ -24,7 +24,7 @@ class CategorySelectorDialog extends React.Component { - + Ok ); diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx index daf12f66..20e5c01d 100644 --- a/src/react/Components/FileUpload/UploadFullscreen.jsx +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -4,7 +4,7 @@ import { translate } from "react-i18next"; import Dialog from "@material-ui/core/Dialog"; import Typography from "@material-ui/core/Typography"; import Slide from "@material-ui/core/Slide"; -import Button from "@material-ui/core/Button"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; import FilePicker from "./FilePicker"; @@ -108,9 +108,9 @@ class UploadFullscreen extends React.Component { onClose={this.props.onClose} TransitionComponent={Transition} > - +
@@ -118,7 +118,7 @@ class UploadFullscreen extends React.Component { {this.state.file && ( - + )}
diff --git a/src/react/Components/FilterComponents/ClearFilter.jsx b/src/react/Components/FilterComponents/ClearFilter.jsx index 815d7c82..1e6d4aff 100644 --- a/src/react/Components/FilterComponents/ClearFilter.jsx +++ b/src/react/Components/FilterComponents/ClearFilter.jsx @@ -53,7 +53,7 @@ class ClearFilter extends React.PureComponent { return this.props.bigButton ? ( ) : ( diff --git a/src/react/Components/FilterCreationDialog.jsx b/src/react/Components/FilterCreationDialog.jsx index eaf8597e..769e5c43 100644 --- a/src/react/Components/FilterCreationDialog.jsx +++ b/src/react/Components/FilterCreationDialog.jsx @@ -4,9 +4,9 @@ import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; import DialogActions from "@material-ui/core/DialogActions"; import List from "@material-ui/core/List"; -import Button from "@material-ui/core/Button"; import ListItem from "@material-ui/core/ListItem"; import ListItemText from "@material-ui/core/ListItemText"; +import TranslateButton from "./TranslationHelpers/Button"; import NavLink from "./Routing/NavLink"; import { formatIban } from "../Functions/Utils"; @@ -86,9 +86,9 @@ export default props => { - + ); diff --git a/src/react/Components/GeoLocation/GeoLocationView.jsx b/src/react/Components/GeoLocation/GeoLocationView.jsx index 192fe525..4ea1e11c 100644 --- a/src/react/Components/GeoLocation/GeoLocationView.jsx +++ b/src/react/Components/GeoLocation/GeoLocationView.jsx @@ -1,8 +1,8 @@ import React from "react"; -import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import Slide from "@material-ui/core/Slide"; import GeoLocationMap from "./GeoLocationMap"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; const Transition = props => ; @@ -34,7 +34,7 @@ class GeoLocationView extends React.PureComponent {
- + ); } diff --git a/src/react/Components/MainDialog.jsx b/src/react/Components/MainDialog.jsx index a9cfe8e5..c9c81588 100644 --- a/src/react/Components/MainDialog.jsx +++ b/src/react/Components/MainDialog.jsx @@ -1,6 +1,5 @@ import React from "react"; import { connect } from "react-redux"; -import Button from "@material-ui/core/Button"; import Typography from "@material-ui/core/Typography"; import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; @@ -8,6 +7,7 @@ import DialogContentText from "@material-ui/core/DialogContentText"; import DialogTitle from "@material-ui/core/DialogTitle"; import Dialog from "@material-ui/core/Dialog"; import Slide from "@material-ui/core/Slide"; +import TranslateButton from "./TranslationHelpers/Button"; const Transition = props => ; @@ -35,9 +35,9 @@ class MainDialog extends React.Component { {modalTitle} {fixedModalText} - + ); diff --git a/src/react/Pages/Dashboard/Dashboard.jsx b/src/react/Pages/Dashboard/Dashboard.jsx index 76520eb5..69a9ea8f 100644 --- a/src/react/Pages/Dashboard/Dashboard.jsx +++ b/src/react/Pages/Dashboard/Dashboard.jsx @@ -174,7 +174,7 @@ class Dashboard extends React.Component { - + { diff --git a/src/react/Pages/Profile/NotificationFilters.jsx b/src/react/Pages/Profile/NotificationFilters.jsx index fbd47eac..370e99af 100644 --- a/src/react/Pages/Profile/NotificationFilters.jsx +++ b/src/react/Pages/Profile/NotificationFilters.jsx @@ -18,6 +18,7 @@ import Select from "@material-ui/core/Select"; import Collapse from "@material-ui/core/Collapse"; import DeleteIcon from "@material-ui/icons/Delete"; +import TranslateButton from "../../Components/TranslationHelpers/Button"; const styles = { paper: { @@ -216,7 +217,7 @@ class NotificationFilters extends React.Component { - + @@ -244,7 +245,7 @@ class NotificationFilters extends React.Component { variant="outlined" onClick={() => this.setState({ showPushesMessages: !this.state.showPushesMessages })} > - {this.state.showPushesMessages ? "Hide" : "Show"} + {this.state.showPushesMessages ? t("Hide") : t("Show")} From 24f9ce50d9c4db92966897a38bae52ca6cf3a3a3 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 13:10:20 +0100 Subject: [PATCH 54/61] Add translation and reformat --- src/react/Components/FileUpload/UploadFullscreen.jsx | 7 ++++++- src/react/Locales/en.json | 1 + src/react/Pages/Settings/Settings.jsx | 7 ++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/react/Components/FileUpload/UploadFullscreen.jsx b/src/react/Components/FileUpload/UploadFullscreen.jsx index 20e5c01d..eea4d608 100644 --- a/src/react/Components/FileUpload/UploadFullscreen.jsx +++ b/src/react/Components/FileUpload/UploadFullscreen.jsx @@ -108,7 +108,12 @@ class UploadFullscreen extends React.Component { onClose={this.props.onClose} TransitionComponent={Transition} > - + Close
diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index 71bc0684..d6e8bc07 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -56,6 +56,7 @@ "Balance after payments": "Balance after payments", "Budget": "Budget", "Business": "Business", + "CVC Code": "CVC Code", "Cancel": "Cancel", "Cancel account": "Cancel account", "Cancel editing": "Cancel editing", diff --git a/src/react/Pages/Settings/Settings.jsx b/src/react/Pages/Settings/Settings.jsx index 87e146c2..b30b7a46 100644 --- a/src/react/Pages/Settings/Settings.jsx +++ b/src/react/Pages/Settings/Settings.jsx @@ -568,7 +568,12 @@ class Settings extends React.Component { - + Reset all event data From fe2ee1fcd8661a4afb1b207dd6ac7d826e5b6049 Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 13:35:04 +0100 Subject: [PATCH 55/61] Add CVC generation and view functionality (fixes #131) --- src/react/Actions/card_cvc2.js | 38 +++++----- src/react/Locales/en.json | 1 + src/react/Pages/Cards/CardListItem.jsx | 16 +---- src/react/Pages/Cards/Cards.jsx | 13 ++-- src/react/Pages/Cards/CvcCodeListItem.jsx | 85 +++++++++++++++++++++++ 5 files changed, 113 insertions(+), 40 deletions(-) create mode 100644 src/react/Pages/Cards/CvcCodeListItem.jsx diff --git a/src/react/Actions/card_cvc2.js b/src/react/Actions/card_cvc2.js index 9b935e0d..a7a8cd9b 100644 --- a/src/react/Actions/card_cvc2.js +++ b/src/react/Actions/card_cvc2.js @@ -11,12 +11,12 @@ export function cardCvc2SetInfo(cvc2_codes, user_id, card_id) { }; } -export function cardUpdateCvc2Codes(BunqJSClient, user_id, card_id) { +export function cardUpdateCvc2Codes(user_id, card_id) { const failedMessage = window.t("We failed to load the CVC codes"); return dispatch => { dispatch(cardCvc2Loading()); - BunqJSClient.api.cardCvc2 + window.BunqDesktopClient.BunqJSClient.api.cardCvc2 .list(user_id, card_id) .then(cardsCvc2Codes => { // turn string dates into date objects @@ -40,25 +40,21 @@ export function cardUpdateCvc2Codes(BunqJSClient, user_id, card_id) { }; } -// export function cardGenerateCvc2(BunqJSClient, user_id, card_id) { -// return dispatch => { -// dispatch(cardCvc2Loading()); -// BunqJSClient.api.cardCvc2 -// .post(user_id, card_id) -// .then(cardsCvc2Codes => { -// console.log(cardsCvc2Codes); -// dispatch(cardCvc2NotLoading()); -// }) -// .catch(error => { -// dispatch(cardCvc2NotLoading()); -// BunqErrorHandler( -// dispatch, -// error, -// "We failed to generate a new CVC code" -// ); -// }); -// }; -// } +export function cardGenerateCvc2(user_id, card_id, type = "GENERATED") { + return dispatch => { + dispatch(cardCvc2Loading()); + window.BunqDesktopClient.BunqJSClient.api.cardCvc2 + .post(user_id, card_id, type) + .then(cardsCvc2Code => { + dispatch(cardCvc2SetInfo([cardsCvc2Code.CardGeneratedCvc2], user_id, card_id)); + dispatch(cardCvc2NotLoading()); + }) + .catch(error => { + dispatch(cardCvc2NotLoading()); + BunqErrorHandler(dispatch, error, "We failed to generate a new CVC code"); + }); + }; +} export function cardCvc2Loading() { return { type: "CARD_CVC2_IS_LOADING" }; diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index d6e8bc07..5e131a14 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -240,6 +240,7 @@ "Get started": "Get started", "Goal amount": "Goal amount", "Google Contacts": "Google Contacts", + "Hidden": "Hidden", "Hide account balances": "Hide account balances", "Hide contacts": "Hide contacts", "Hide inactive cards": "Hide inactive cards", diff --git a/src/react/Pages/Cards/CardListItem.jsx b/src/react/Pages/Cards/CardListItem.jsx index a838d93a..bb2ffb87 100644 --- a/src/react/Pages/Cards/CardListItem.jsx +++ b/src/react/Pages/Cards/CardListItem.jsx @@ -1,5 +1,4 @@ import React from "react"; -import { connect } from "react-redux"; const styles = { cardWrapper: {}, @@ -56,17 +55,4 @@ class CardListItem extends React.Component { } } -const mapStateToProps = state => { - return { - accounts: state.accounts - }; -}; - -const mapDispatchToProps = dispatch => { - return {}; -}; - -export default connect( - mapStateToProps, - mapDispatchToProps -)(CardListItem); +export default CardListItem; diff --git a/src/react/Pages/Cards/Cards.jsx b/src/react/Pages/Cards/Cards.jsx index 6ea4aba5..78a22e47 100644 --- a/src/react/Pages/Cards/Cards.jsx +++ b/src/react/Pages/Cards/Cards.jsx @@ -14,6 +14,7 @@ import Typography from "@material-ui/core/Typography"; import CircularProgress from "@material-ui/core/CircularProgress"; import CardListItem from "./CardListItem"; +import CvcCodeListItem from "./CvcCodeListItem"; import AccountListItem from "../../Components/AccountList/AccountListItem"; import TranslateTypography from "../../Components/TranslationHelpers/Typography"; @@ -303,18 +304,22 @@ class Cards extends React.Component { {connectedAccounts} + + - + + - + + diff --git a/src/react/Pages/Cards/CvcCodeListItem.jsx b/src/react/Pages/Cards/CvcCodeListItem.jsx new file mode 100644 index 00000000..5cf0ae9d --- /dev/null +++ b/src/react/Pages/Cards/CvcCodeListItem.jsx @@ -0,0 +1,85 @@ +import React from "react"; +import { connect } from "react-redux"; +import Divider from "@material-ui/core/Divider"; +import IconButton from "@material-ui/core/IconButton"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemText from "@material-ui/core/ListItemText"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; + +import RefreshIcon from "@material-ui/icons/Refresh"; +import VisibilityIcon from "@material-ui/icons/Visibility"; + +import { cardGenerateCvc2, cardUpdateCvc2Codes } from "../../Actions/card_cvc2"; + +class CvcCodeListItem extends React.Component { + constructor(props, context) { + super(props, context); + this.state = {}; + } + + updateCardCvc = () => { + const { card, user } = this.props; + + this.props.cardUpdateCvc2Codes(user.id, card.id); + }; + cardGenerateCvc2 = () => { + const { card, user } = this.props; + + this.props.cardGenerateCvc2(user.id, card.id); + }; + + render() { + const { t, card, user, cvcCodesCardId, cvcCodes, cvcCodesLoading } = this.props; + + const validCardTypes = ["MASTERCARD", "MASTERCARD_VIRTUAL"]; + if (!validCardTypes.includes(card.type)) return null; + + let cvcCode = t("Hidden"); + if (card.id === cvcCodesCardId && cvcCodes.length > 0) { + cvcCode = cvcCodes + .map(cvcCode => { + return cvcCode.cvc2; + }) + .join(", "); + } + + return ( + + + + + + + + + + + + + + + + ); + } +} + +const mapStateToProps = state => { + return { + user: state.user.user, + cvcCodes: state.card_cvc2.cvc2_codes, + cvcCodesCardId: state.card_cvc2.card_id, + cvcCodesLoading: state.card_cvc2.loading + }; +}; + +const mapDispatchToProps = dispatch => { + return { + cardUpdateCvc2Codes: (userId, cardId) => dispatch(cardUpdateCvc2Codes(userId, cardId)), + cardGenerateCvc2: (userId, cardId) => dispatch(cardGenerateCvc2(userId, cardId)) + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(CvcCodeListItem); From 31f3bbb8e70eb130f5a7e73a921a7be48df7847e Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 14:07:25 +0100 Subject: [PATCH 56/61] Display last 4 card digits --- src/react/Locales/en.json | 1 + src/react/Pages/Cards/Cards.jsx | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index 5e131a14..2c53cbc5 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -73,6 +73,7 @@ "Card update requested": "Card update requested", "Card update sent": "Card update sent", "Cards": "Cards", + "Cards number": "Cards number", "Cards status": "Cards status", "Cards update accepted": "Cards update accepted", "Cards update requested": "Cards update requested", diff --git a/src/react/Pages/Cards/Cards.jsx b/src/react/Pages/Cards/Cards.jsx index 78a22e47..814073bd 100644 --- a/src/react/Pages/Cards/Cards.jsx +++ b/src/react/Pages/Cards/Cards.jsx @@ -306,6 +306,14 @@ class Cards extends React.Component { + + + + + From ec4974baa60f9d8261b81c4f4d13de296b78d78e Mon Sep 17 00:00:00 2001 From: Gregory Goijaerts Date: Sat, 2 Mar 2019 21:19:12 +0100 Subject: [PATCH 57/61] Add account assignment functionality (fixes #475) --- package.json | 2 +- src/react/Actions/cards.js | 20 ++ .../AccountList/AccountListItem.jsx | 11 +- .../FormFields/AccountSelectorDialog.jsx | 3 +- src/react/Functions/BunqErrorHandler.js | 1 + src/react/Locales/en.json | 3 +- src/react/Pages/Cards/Cards.jsx | 180 +++++++++++++----- src/react/Pages/Cards/CvcCodeListItem.jsx | 10 +- src/react/Reducers/cards.js | 3 +- yarn.lock | 8 +- 10 files changed, 180 insertions(+), 61 deletions(-) diff --git a/package.json b/package.json index cde2643b..a9c333e4 100644 --- a/package.json +++ b/package.json @@ -162,7 +162,7 @@ "@babel/plugin-transform-runtime": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@bunq-community/bunq-js-client": "^0.36.2", + "@bunq-community/bunq-js-client": "^0.40.0", "@bunq-community/bunqdesktop-templates": "^1.2.0", "@fortawesome/fontawesome-free": "^5.2.0", "@material-ui/core": "^3.5.1", diff --git a/src/react/Actions/cards.js b/src/react/Actions/cards.js index 3232ac1c..7677eba6 100644 --- a/src/react/Actions/cards.js +++ b/src/react/Actions/cards.js @@ -37,6 +37,26 @@ export function cardsUpdate(user_id) { }; } +export function cardsAssignAccounts(user_id, card_id, assignemnts) { + const failedMessage = window.t("We failed to assign the accounts to this card"); + + console.log(user_id, card_id, assignemnts); + + return dispatch => { + dispatch(cardsLoading()); + window.BunqDesktopClient.BunqJSClient.api.card + .update(user_id, card_id, null, null, null, null, null, null, assignemnts) + .then(cards => { + dispatch(cardsUpdate(user_id)); + dispatch(cardsNotLoading()); + }) + .catch(error => { + dispatch(cardsNotLoading()); + BunqErrorHandler(dispatch, error, failedMessage); + }); + }; +} + export function cardsLoading() { return { type: "CARDS_IS_LOADING" }; } diff --git a/src/react/Components/AccountList/AccountListItem.jsx b/src/react/Components/AccountList/AccountListItem.jsx index 074381c3..40f8a065 100644 --- a/src/react/Components/AccountList/AccountListItem.jsx +++ b/src/react/Components/AccountList/AccountListItem.jsx @@ -119,11 +119,16 @@ class AccountListItem extends React.Component { ? e => this.props.removeAccountIdFilter(account.id) : e => this.props.addAccountIdFilter(account.id); - // allow overwrite by props - const onClickHandler = this.props.onClick ? e => this.props.onClick(user.id, account.id) : defaultClickHandler; + const listItemProps = {}; + if (this.props.clickable) { + listItemProps.button = true; + listItemProps.onClick = this.props.onClick + ? e => this.props.onClick(user.id, account.id) + : defaultClickHandler; + } return ( - + { // log to logger Logger.error(response ? response.data : error.message); + console.error(error); // check if a network error occured if (error.toString() === "Error: Network Error") { diff --git a/src/react/Locales/en.json b/src/react/Locales/en.json index 2c53cbc5..55b29ca8 100644 --- a/src/react/Locales/en.json +++ b/src/react/Locales/en.json @@ -65,6 +65,7 @@ "Capslock active": "Capslock active", "Card": "Card", "Card filter": "Card filter", + "Card number": "Card number", "Card payment": "Card payment", "Card payments": "Card payments", "Card payments (Maestro or Mastercard)": "Card payments (Maestro or Mastercard)", @@ -73,7 +74,6 @@ "Card update requested": "Card update requested", "Card update sent": "Card update sent", "Cards": "Cards", - "Cards number": "Cards number", "Cards status": "Cards status", "Cards update accepted": "Cards update accepted", "Cards update requested": "Cards update requested", @@ -558,6 +558,7 @@ "Waiting for authorization": "Waiting for authorization", "We couldn't validate the response given by bunq!": "We couldn't validate the response given by bunq!", "We failed to add a new note": "We failed to add a new note", + "We failed to assign the accounts to this card": "We failed to assign the accounts to this card", "We failed to create a new session! Your IP might have changed or the API key is no longer valid": "We failed to create a new session! Your IP might have changed or the API key is no longer valid", "We failed to create the export for this monetary account": "We failed to create the export for this monetary account", "We failed to delete the note": "We failed to delete the note", diff --git a/src/react/Pages/Cards/Cards.jsx b/src/react/Pages/Cards/Cards.jsx index 814073bd..a99109a8 100644 --- a/src/react/Pages/Cards/Cards.jsx +++ b/src/react/Pages/Cards/Cards.jsx @@ -5,21 +5,25 @@ import { translate } from "react-i18next"; import Grid from "@material-ui/core/Grid"; import Paper from "@material-ui/core/Paper"; import Button from "@material-ui/core/Button"; +import IconButton from "@material-ui/core/IconButton"; import Divider from "@material-ui/core/Divider"; import List from "@material-ui/core/List"; import ListItem from "@material-ui/core/ListItem"; -import ListSubheader from "@material-ui/core/ListSubheader"; import ListItemText from "@material-ui/core/ListItemText"; +import ListSubheader from "@material-ui/core/ListSubheader"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; import Typography from "@material-ui/core/Typography"; import CircularProgress from "@material-ui/core/CircularProgress"; +import DeleteIcon from "@material-ui/icons/Delete"; + import CardListItem from "./CardListItem"; import CvcCodeListItem from "./CvcCodeListItem"; -import AccountListItem from "../../Components/AccountList/AccountListItem"; import TranslateTypography from "../../Components/TranslationHelpers/Typography"; +import AccountSelectorDialog from "../../Components/FormFields/AccountSelectorDialog"; import { cardStatus, cardOrderStatus } from "../../Functions/EventStatusTexts"; -import { cardsUpdate, cardsSetCardOrder } from "../../Actions/cards"; +import { cardsUpdate, cardsSetCardOrder, cardsAssignAccounts } from "../../Actions/cards"; const styles = { gridContainer: { @@ -38,6 +42,9 @@ const styles = { top: 60, right: 8, zIndex: 2 + }, + assignmentSubHeader: { + lineHeight: "34px" } }; @@ -145,6 +152,52 @@ class Cards extends React.Component { }); }; + handleAccountChange = type => index => { + const filteredCards = this.getCardsList(); + const selectedCardIndex = this.state.selectedCardIndex; + const cardInfo = filteredCards[selectedCardIndex].CardDebit; + const selectedAccount = this.props.accounts[index]; + + let primaryAssignment = cardInfo.pin_code_assignment.find(assignment => { + return assignment.type === "PRIMARY"; + }); + let secondaryAssignment = cardInfo.pin_code_assignment.find(assignment => { + return assignment.type === "SECONDARY"; + }); + + let newCardAssignment = []; + if (type === "PRIMARY") { + primaryAssignment = { + type: "PRIMARY", + monetary_account_id: selectedAccount.id + }; + } else { + secondaryAssignment = { + type: "SECONDARY", + monetary_account_id: selectedAccount.id + }; + } + + // combine the list into a single assignment object + if (primaryAssignment) newCardAssignment.push(primaryAssignment); + if (secondaryAssignment) newCardAssignment.push(secondaryAssignment); + + this.props.cardsAssignAccounts(this.props.user.id, cardInfo.id, newCardAssignment); + }; + + handleSecondaryRemoval = event => { + const filteredCards = this.getCardsList(); + const selectedCardIndex = this.state.selectedCardIndex; + const cardInfo = filteredCards[selectedCardIndex].CardDebit; + + let primaryAssignment = cardInfo.pin_code_assignment.find(assignment => { + return assignment.type === "PRIMARY"; + }); + let newCardAssignment = [primaryAssignment]; + + this.props.cardsAssignAccounts(this.props.user.id, cardInfo.id, newCardAssignment); + }; + moveCardUp = e => { const index = this.state.selectedCardIndex; const cardsOrder = [...this.props.cardsOrder]; @@ -236,41 +289,69 @@ class Cards extends React.Component { const translateOffset = selectedCardIndex * 410; const carouselTranslate = "translateY(-" + translateOffset + "px)"; - // account connected to the currently selected card - const connectedAccounts = cardInfo.pin_code_assignment.map(assignment => { - // try to find the connected accoutn by ID - const currentAccount = this.props.accounts.find(account => account.id == assignment.monetary_account_id); - - let connectedText = ""; - switch (assignment.type) { - case "PRIMARY": - connectedText = t("Primary account"); - break; - case "SECONDARY": - connectedText = t("Secondary account"); - break; - } - - // return the accout item for this account - return ( - - {connectedText} - {!currentAccount ? null : ( - - )} - - ); - }); - let second_line = cardInfo.second_line; if (second_line.length === 0 && cardInfo.type === "MAESTRO_MOBILE_NFC") { second_line = "Apple Pay"; } + const primaryAssignment = cardInfo.pin_code_assignment.find(assignment => { + return assignment.type === "PRIMARY"; + }); + const secondaryAssignment = cardInfo.pin_code_assignment.find(assignment => { + return assignment.type === "SECONDARY"; + }); + + const primaryAccountIndex = + primaryAssignment !== undefined + ? this.props.accounts.findIndex(account => account.id == primaryAssignment.monetary_account_id) + : false; + const secondaryAccountIndex = + secondaryAssignment !== undefined + ? this.props.accounts.findIndex(account => account.id == secondaryAssignment.monetary_account_id) + : ""; + + const secondaryAssignmentSelection = secondaryAccountIndex !== "" && ( + + + + {t("Secondary account")} + + + + + + + + + + ); + + const lastDigitsComponent = cardInfo.primary_account_number_four_digit && ( + + + + + + + ); + const countryComponent = cardInfo.country && ( + + + + + + + ); + return (