diff options
68 files changed, 4060 insertions, 2361 deletions
diff --git a/appinfo/routes.php b/appinfo/routes.php index 658fa241..d7120e14 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -30,48 +30,80 @@ return [ ['name' => 'page#vote_public', 'url' => '/s/{token}', 'verb' => 'GET', 'postfix' => 'public'], ['name' => 'page#vote_public', 'url' => '/poll/{token}', 'verb' => 'GET', 'postfix' => 'oldpublic'], - ['name' => 'subscription#get', 'url' => '/subscription/get/{pollId}', 'verb' => 'GET'], - ['name' => 'subscription#set', 'url' => '/subscription/set/', 'verb' => 'POST'], + ['name' => 'subscription#get', 'url' => '/subscription/{pollId}', 'verb' => 'GET'], + ['name' => 'subscription#set', 'url' => '/subscription', 'verb' => 'POST'], - ['name' => 'comment#getByToken', 'url' => '/comments/get/s/{token}', 'verb' => 'GET'], - ['name' => 'comment#writeByToken', 'url' => '/comment/write/s/', 'verb' => 'POST'], - ['name' => 'comment#get', 'url' => '/comments/get/{pollId}', 'verb' => 'GET'], - ['name' => 'comment#write', 'url' => '/comment/write/', 'verb' => 'POST'], - ['name' => 'comment#delete', 'url' => '/comment/delete/', 'verb' => 'POST'], - ['name' => 'comment#deleteByToken', 'url' => '/comment/delete/s/', 'verb' => 'POST'], + ['name' => 'comment#getByToken', 'url' => '/comments/s/{token}', 'verb' => 'GET'], + ['name' => 'comment#get', 'url' => '/comments/{pollId}', 'verb' => 'GET'], + ['name' => 'comment#add', 'url' => '/comment/add', 'verb' => 'POST'], + ['name' => 'comment#delete', 'url' => '/comment/delete', 'verb' => 'POST'], ['name' => 'vote#getByToken', 'url' => '/votes/get/s/{token}', 'verb' => 'GET'], - ['name' => 'vote#setByToken', 'url' => '/vote/set/s/', 'verb' => 'POST'], + ['name' => 'vote#setByToken', 'url' => '/vote/set/s', 'verb' => 'POST'], ['name' => 'vote#get', 'url' => '/votes/get/{pollId}', 'verb' => 'GET'], - ['name' => 'vote#set', 'url' => '/vote/set/', 'verb' => 'POST'], - ['name' => 'vote#write', 'url' => '/vote/write/', 'verb' => 'POST'], - ['name' => 'vote#delete', 'url' => '/votes/delete/', 'verb' => 'POST'], + ['name' => 'vote#set', 'url' => '/vote/set', 'verb' => 'POST'], + // ['name' => 'vote#write', 'url' => '/vote/write/', 'verb' => 'POST'], + ['name' => 'vote#delete', 'url' => '/votes/delete', 'verb' => 'POST'], ['name' => 'option#get', 'url' => '/options/get/{pollId}', 'verb' => 'GET'], - ['name' => 'option#add', 'url' => '/option/add/', 'verb' => 'POST'], - ['name' => 'option#update', 'url' => '/option/update/', 'verb' => 'POST'], - ['name' => 'option#reorder', 'url' => '/option/reorder/', 'verb' => 'POST'], - ['name' => 'option#remove', 'url' => '/option/remove/', 'verb' => 'POST'], + ['name' => 'option#add', 'url' => '/option/add', 'verb' => 'POST'], + ['name' => 'option#update', 'url' => '/option/update', 'verb' => 'POST'], + ['name' => 'option#reorder', 'url' => '/option/reorder', 'verb' => 'POST'], + ['name' => 'option#remove', 'url' => '/option/remove', 'verb' => 'POST'], ['name' => 'option#getByToken', 'url' => '/options/get/s/{token}', 'verb' => 'GET'], - ['name' => 'poll#list', 'url' => '/polls/list/', 'verb' => 'GET'], - ['name' => 'poll#get', 'url' => '/polls/get/{pollId}', 'verb' => 'GET'], + ['name' => 'poll#get', 'url' => '/polls/get/{pollId}', 'verb' => 'GET', 'postfix' => 'auth'], + ['name' => 'poll#get', 'url' => '/polls/get/s/{token}', 'verb' => 'GET', 'postfix' => 'public'], + ['name' => 'poll#add', 'url' => '/polls/add', 'verb' => 'POST'], + ['name' => 'poll#update', 'url' => '/polls/update/{pollId}', 'verb' => 'PUT'], + + ['name' => 'poll#list', 'url' => '/polls/list', 'verb' => 'GET'], ['name' => 'poll#delete', 'url' => '/polls/delete/{pollId}', 'verb' => 'GET'], ['name' => 'poll#deletePermanently', 'url' => '/polls/delete/permanent/{pollId}', 'verb' => 'GET'], - ['name' => 'poll#write', 'url' => '/polls/write/', 'verb' => 'POST'], - ['name' => 'poll#clone', 'url' => '/polls/clone/{pollId}', 'verb' => 'get'], - ['name' => 'poll#getByToken', 'url' => '/polls/get/s/{token}', 'verb' => 'GET'], + ['name' => 'poll#clone', 'url' => '/polls/clone/{pollId}', 'verb' => 'GET'], + + ['name' => 'share#add', 'url' => '/share/add', 'verb' => 'POST'], + ['name' => 'share#delete', 'url' => '/share/delete', 'verb' => 'POST'], + ['name' => 'share#createPersonalShare', 'url' => '/share/create/s', 'verb' => 'POST'], - ['name' => 'share#getShares', 'url' => '/shares/get/{pollId}', 'verb' => 'GET'], - ['name' => 'share#write', 'url' => '/share/write/', 'verb' => 'POST'], - ['name' => 'share#createPersonalShare', 'url' => '/share/create/s/', 'verb' => 'POST'], - ['name' => 'share#remove', 'url' => '/share/remove/', 'verb' => 'POST'], - ['name' => 'share#get', 'url' => '/share/get/{token}', 'verb' => 'GET'], + // ['name' => 'share#getShares', 'url' => '/shares/get/{pollId}', 'verb' => 'GET'], + // ['name' => 'share#get', 'url' => '/share/get/{token}', 'verb' => 'GET'], ['name' => 'acl#getByToken', 'url' => '/acl/get/s/{token}', 'verb' => 'GET'], ['name' => 'acl#get', 'url' => '/acl/get/{id}', 'verb' => 'GET'], ['name' => 'system#get_site_users_and_groups', 'url' => '/siteusers/get', 'verb' => 'POST'], - ['name' => 'system#validate_public_username', 'url' => '/check/username', 'verb' => 'POST'] + ['name' => 'system#validate_public_username', 'url' => '/check/username', 'verb' => 'POST'], + + // REST-API calls + ['name' => 'poll_api#get', 'url' => '/api/v1.0/poll/{pollId}', 'verb' => 'GET'], + ['name' => 'poll_api#list', 'url' => '/api/v1.0/polls', 'verb' => 'GET'], + ['name' => 'poll_api#add', 'url' => '/api/v1.0/poll/add', 'verb' => 'POST'], + ['name' => 'poll_api#clone', 'url' => '/api/v1.0/poll/clone/{pollId}', 'verb' => 'POST'], + ['name' => 'poll_api#update', 'url' => '/api/v1.0/poll/{pollId}', 'verb' => 'PUT'], + ['name' => 'poll_api#delete', 'url' => '/api/v1.0/poll/{pollId}', 'verb' => 'DELETE'], + ['name' => 'poll_api#delete', 'url' => '/api/v1.0/poll/permanent/{pollId}', 'verb' => 'DELETE'], + ['name' => 'poll_api#enum', 'url' => '/api/v1.0/poll/enum', 'verb' => 'GET'], + + ['name' => 'option_api#list', 'url' => '/api/v1.0/poll/{pollId}/options', 'verb' => 'GET'], + ['name' => 'option_api#add', 'url' => '/api/v1.0/option', 'verb' => 'POST'], + ['name' => 'option_api#update', 'url' => '/api/v1.0/option', 'verb' => 'PUT'], + ['name' => 'option_api#delete', 'url' => '/api/v1.0/option/{optionId}', 'verb' => 'DELETE'], + + ['name' => 'comment_api#list', 'url' => '/api/v1.0/poll/{pollId}/comments', 'verb' => 'GET'], + ['name' => 'comment_api#add', 'url' => '/api/v1.0/comment', 'verb' => 'POST'], + ['name' => 'comment_api#delete', 'url' => '/api/v1.0/comment/{commentId}', 'verb' => 'DELETE'], + + ['name' => 'share_api#list', 'url' => '/api/v1.0/poll/{pollId}/shares', 'verb' => 'GET'], + ['name' => 'share_api#get', 'url' => '/api/v1.0/share/{token}', 'verb' => 'GET'], + ['name' => 'share_api#add', 'url' => '/api/v1.0/share', 'verb' => 'POST'], + ['name' => 'share_api#delete', 'url' => '/api/v1.0/share/{token}', 'verb' => 'DELETE'], + + ['name' => 'subscription_api#get', 'url' => '/api/v1.0/poll/{pollId}/subscription', 'verb' => 'GET'], + ['name' => 'subscription_api#subscribe', 'url' => '/api/v1.0/poll/{pollId}/subscription', 'verb' => 'PUT'], + ['name' => 'subscription_api#unsubscribe', 'url' => '/api/v1.0/poll/{pollId}/subscription', 'verb' => 'DELETE'], + + ['name' => 'vote_api#list', 'url' => '/api/v1.0/poll/{pollId}/votes', 'verb' => 'GET'], + ['name' => 'vote_api#set', 'url' => '/api/v1.0/vote', 'verb' => 'POST'], ] ]; diff --git a/docs/API_v1.0.md b/docs/API_v1.0.md new file mode 100644 index 00000000..2f1c3326 --- /dev/null +++ b/docs/API_v1.0.md @@ -0,0 +1,167 @@ + +# DRAFT + +This documentation and the API are not final and may contain issues and bugs! +Details may change! + +To act like a authenticated user, use username:password@ prefix in the URL +Parameters in the body override the URL-parameter + +Base URL for all calls: /index.php/apps/polls +Example calls: +* Gets all comments of poll no. 1 +`https://username:password@nextcloud.local/index.php/apps/polls/api/1.0/poll/1/comments` +```bash +`curl -u username:password -X GET https://nextcloud.local/index.php/apps/polls/api/1.0/poll/1/comments` +``` + +# Poll +| Method | Endpoint | Description | Return codes | +| --------- | ----------------------------------- | ---------------------------- | ------------------ | +| GET | /api/v1.0/polls | Get polls list as array | 200, 403, 404 | +| GET | /api/v1.0/poll/{pollId} | Get poll with {pollId} | 200, 403, 404 | +| POST | /api/v1.0/poll/add | Add new poll with payload | 201, 403, 404 | +| POST | /api/v1.0/poll/clone/{pollId} | Clone poll {pollId} | 201, 403, 404 | +| PUT | /api/v1.0/poll/{pollId} | Update poll | 200, 403, 404, 409 | +| DELETE | /api/v1.0/poll/{pollId} | Delete poll logical | 200, 403, 404 | +| DELETE | /api/v1.0/poll/permanent/{pollId} | Delete poll permanently | 200, 403, 404 | +| GET | /api/v1.0/poll/enum | Get valid enums | 200, 403, 404 | + +## Add poll + +```json +{ + "type": "datePoll", + "title": "Test" +} +``` + +## Update poll +```json +{ + "poll": { + "title": "Changed Title", + "description": "Updated description", + "expire": 0, + "deleted": 0, + "access": "hidden", + "anonymous": 1, + "allowMaybe": 1, + "showResults": "never", + "adminAccess": 1 + } +} +``` + +### Keys and values +| Key | Type | description | +| ------- | ------- | -------------------| +| expire | integer | unix timestamp | +| deleted | integer | unix timestamp | + + + +# Options +| Method | Endpoint | Description | Return codes | +| --------- | ----------------------------------- | ---------------------------- | ------------------ | +| GET | /api/v1.0/poll/{pollId}/options | Get options as array | 200, 403, 404 | +| POST | /api/v1.0/option | Add new option with Payload | 201, 403, 404, 409 | +| PUT | /api/v1.0/option | Update option with Payload | 200, 403, 404 | +| DELETE | /api/v1.0/option/{optionId} | Delete option | 200, 403, 404 | + +## add option +```json +{ + "pollId": 139, + "pollOptionText": "19-06-2020 17:00:00", + "timestamp": 0, +} +``` + +## Update option +```json +{ + "id": 17, + "pollId": 1, + "pollOptionText": "poll option", + "timestamp": 0, + "order": 1, + "confirmed": 1590762104 +}, +``` + +### Keys and values +| Key | Type | description | +| -------------- | ------- | ------------------------------------- | +| id | String | id overrides optionID if used | +| pollOptionText | String | poll text or date option in UTC | +| confirmed | Integer | unix timestamp | +| timestamp | Integer | unix timestamp for date option | +| order | Integer | position on option order for textpolls | + +* if timestamp is given in a date poll, the poll option text is ignored + +# Votes +| Method | Endpoint | Description | Return codes | +| --------- | ----------------------------------- | ---------------------------- | ------------------ | +| GET | /api/v1.0/poll/{pollId}/votes | Get votes | 200, 403, 404 | +| POST | /api/v1.0/vote | Set vote with Payload | 200, 403, 404 | + +## set vote +```json +{ + "pollId": 1, + "pollOptionText": "Saturn", + "setTo" :"yes" +} +``` + +# Comments +| Method | Endpoint | Description | Return codes | +| --------- | ----------------------------------- | ---------------------------- | ------------------ | +| GET | /api/v1.0/poll/{pollId}/comments | Get comments | 200, 403, 404 | +| POST | /api/v1.0/comment | Add new commen twith Payload | 201, 403, 404 | +| DELETE | /api/v1.0/comment/{commentId} | Delete comment | 200, 403, 404 | + +# Add comment +```json +{ + "pollId": 1, + "message": "Comment text" +} +``` + +# Shares +| Method | Endpoint | Description | Return codes | +| --------- | ----------------------------------- | ---------------------------- | ------------------ | +| GET | /api/v1.0/poll/{pollId}/shares | Get shares | 200, 403, 404 | +| GET | /api/v1.0/share/{token} | Get share by token | 200, 403, 404 | +| POST | /api/v1.0/share | Add new share with Payload | 201, 403, 404 | +| DELETE | /api/v1.0/share/{token} | Delete share | 200, 404, 409 | + +# Add share + +## public share +```json +{ + "type": "public", + "pollId": 1 +} +``` +## user share +tbd + +## email share +tbd + +## contact share +tbd + + + +# Subscription +| Method | Endpoint | Description | Return codes | +| --------- | ----------------------------------- | ---------------------------- | ------------------ | +| GET | /api/v1.0/poll/{pollId}/subscription | Get subscription status | 200, 403, 404 | +| PUT | /api/v1.0/poll/{pollId}/subscription | Subcribe | 201, 403 | +| DELETE | /api/v1.0/poll/{pollId}/subscription | unsubscribe | 200, 403 | diff --git a/l10n/br.js b/l10n/br.js new file mode 100644 index 00000000..38dade71 --- /dev/null +++ b/l10n/br.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "polls", + { + "Cancel" : "Arrest", + "OK" : "OK", + "Group" : "Stollad", + "Unknown user" : "Implijer dianv", + "Details" : "Munudoù", + "Configuration" : "Stumm", + "Shares" : "Rannañ", + "Expiration date" : "Deizad termen", + "Who are you?" : "Piv oc'h c'hwi ?", + "No" : "Nan", + "Yes" : "Ya" +}, +"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); diff --git a/l10n/br.json b/l10n/br.json new file mode 100644 index 00000000..c0aaa451 --- /dev/null +++ b/l10n/br.json @@ -0,0 +1,14 @@ +{ "translations": { + "Cancel" : "Arrest", + "OK" : "OK", + "Group" : "Stollad", + "Unknown user" : "Implijer dianv", + "Details" : "Munudoù", + "Configuration" : "Stumm", + "Shares" : "Rannañ", + "Expiration date" : "Deizad termen", + "Who are you?" : "Piv oc'h c'hwi ?", + "No" : "Nan", + "Yes" : "Ya" +},"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" +}
\ No newline at end of file @@ -126,7 +126,7 @@ OC.L10N.register( "Receive notification email on activity" : "Erhalte E-Mail Benachrichtigungen bei Aktivitäten", "Your personal link to this poll: %n" : "Ihr persönlicher Link zur Umfrage: %n", "Who are you?" : "Wer bist Du?", - "To participate, tell us how we can call you!" : "Um teilzunehmen, sage uns, wie wir Dich anrufen können!", + "To participate, tell us how we can call you!" : "Um teilzunehmen, sage uns wie wir Dich nennen dürfen!", "Enter your name" : "Gib Deinen Namen ein", "Please use at least 3 characters for your name." : "Bitte mindestens 3 Zeichen für den Namen verwenden.", "This name is not valid, i.e. because it is already in use." : "Dieser Name ist nicht gültig, möglicherweise ist er bereits in Verwendung.", diff --git a/l10n/de.json b/l10n/de.json index da45d508..3113a485 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -124,7 +124,7 @@ "Receive notification email on activity" : "Erhalte E-Mail Benachrichtigungen bei Aktivitäten", "Your personal link to this poll: %n" : "Ihr persönlicher Link zur Umfrage: %n", "Who are you?" : "Wer bist Du?", - "To participate, tell us how we can call you!" : "Um teilzunehmen, sage uns, wie wir Dich anrufen können!", + "To participate, tell us how we can call you!" : "Um teilzunehmen, sage uns wie wir Dich nennen dürfen!", "Enter your name" : "Gib Deinen Namen ein", "Please use at least 3 characters for your name." : "Bitte mindestens 3 Zeichen für den Namen verwenden.", "This name is not valid, i.e. because it is already in use." : "Dieser Name ist nicht gültig, möglicherweise ist er bereits in Verwendung.", diff --git a/l10n/de_DE.js b/l10n/de_DE.js index 7692a879..3c9cd14b 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -126,7 +126,7 @@ OC.L10N.register( "Receive notification email on activity" : "Erhalte E-Mail Benachrichtigungen bei Aktivitäten", "Your personal link to this poll: %n" : "Ihr persönlicher Link zur Umfrage: %n", "Who are you?" : "Wer sind Sie?", - "To participate, tell us how we can call you!" : "Um teilzunehmen, sagen Sie uns, wie wir Sie anrufen können!", + "To participate, tell us how we can call you!" : "Um teilzunehmen, sagen Sie uns wie wir Sie nennen können!", "Enter your name" : "Geben Sie Ihren Namen ein", "Please use at least 3 characters for your name." : "Bitte mindestens 3 Zeichen für den Namen verwenden.", "This name is not valid, i.e. because it is already in use." : "Dieser Name ist nicht gültig, möglicherweise ist er bereits in Verwendung.", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index 09918efa..92121a41 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -124,7 +124,7 @@ "Receive notification email on activity" : "Erhalte E-Mail Benachrichtigungen bei Aktivitäten", "Your personal link to this poll: %n" : "Ihr persönlicher Link zur Umfrage: %n", "Who are you?" : "Wer sind Sie?", - "To participate, tell us how we can call you!" : "Um teilzunehmen, sagen Sie uns, wie wir Sie anrufen können!", + "To participate, tell us how we can call you!" : "Um teilzunehmen, sagen Sie uns wie wir Sie nennen können!", "Enter your name" : "Geben Sie Ihren Namen ein", "Please use at least 3 characters for your name." : "Bitte mindestens 3 Zeichen für den Namen verwenden.", "This name is not valid, i.e. because it is already in use." : "Dieser Name ist nicht gültig, möglicherweise ist er bereits in Verwendung.", @@ -32,8 +32,8 @@ OC.L10N.register( "OK" : "OK", "Week" : "Semana", "Shift all date options" : "Cambiar todas las opciones de fechas", - "Decrease unit" : "Unidad de disminución", - "Increase unit" : "Unidad de incremento", + "Decrease unit" : "Disminuir unidad", + "Increase unit" : "Incrementar unidad", "Shift" : "Cambiar", "No Participants until now" : "No hay participantes hasta ahora", "_%n Participant_::_%n Participants_" : ["%n participante","%n participantes"], diff --git a/l10n/es.json b/l10n/es.json index 13bd9327..e1439f7a 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -30,8 +30,8 @@ "OK" : "OK", "Week" : "Semana", "Shift all date options" : "Cambiar todas las opciones de fechas", - "Decrease unit" : "Unidad de disminución", - "Increase unit" : "Unidad de incremento", + "Decrease unit" : "Disminuir unidad", + "Increase unit" : "Incrementar unidad", "Shift" : "Cambiar", "No Participants until now" : "No hay participantes hasta ahora", "_%n Participant_::_%n Participants_" : ["%n participante","%n participantes"], @@ -38,6 +38,10 @@ OC.L10N.register( "No Participants until now" : "Nog geen deelnemers", "_%n Participant_::_%n Participants_" : ["%n deelnemer","%n deelnemers"], "started this poll on %n. " : " startte deze peiling op %n. ", + "This poll expired on {dateString}. The confirmed options are marked below." : "Deze poll is vervallen op [dateString]. De bevestigde keuzes zijn hieronder aangeduid.", + "This poll expired on {dateString}, but there are no confirmed options until now." : "Deze poll is vervallen op [dateString], maar er zijn geen bevestigde keuzes tot nu toe.", + "You can confirm your favorites now in the options tab in the sidebar." : "Je kan je voorkeuren bevestigen in de instellingen tab in de zijbalk.", + "You can place your vote until {dateString}." : "Je kunt nu stemmen tot [dateString]. ", "The names of other participants are hidden, as this is an anonymous poll. " : "Namen van andere stemmers zijn verborgen, dit is een anonieme peiling.", "Results are hidden. " : "Resultaten zijn verborgen.", "They will be revealed after the poll is expired. " : "Deze zullen bekend gemaakt worden nadat de peiling afgelopen is.", @@ -103,6 +107,8 @@ OC.L10N.register( "Available Options" : "Beschikbare opties", "Delete option" : "Verwijder optie", "Clone option" : "Klonen optie", + "Unconfirm option" : "Keuze ongedaan maken", + "Confirm option" : "Keuze bevestigen", "There are no vote options specified." : "Er zijn geen keuzemogelijkheden opgegeven.", "Add a new text option" : "Voeg een nieuwe tekst optie toe", "Enter option text" : "Voer een optietekst in", @@ -119,7 +125,12 @@ OC.L10N.register( "Error while adding share" : "Fout bij toevoegen deellink", "Receive notification email on activity" : "Ontvang email melding bij activiteit", "Your personal link to this poll: %n" : "Je persoonlijke link naar deze peiling: %n", + "Who are you?" : "Wie ben je?", + "To participate, tell us how we can call you!" : "OM deel te nemen, geef aan hoe we je moeten noemen.", "Enter your name" : "Geef je naam op", + "Please use at least 3 characters for your name." : "Gebruik aub. minstens 3 tekens voor je naam.", + "This name is not valid, i.e. because it is already in use." : "Deze naam is niet geldig, want deze is reeds in gebruik.", + "OK, we will call you {username}." : "OK, we zullen je {username} noemen.", "You have an account? Log in here." : "heb je een account? Log dan hier in.", "Please use at least 3 characters for your username!" : "Gebruik minimaal 3 tekens voor je gebruikersnaam!", "This username can not be chosen." : "Deze gebruikersnaam kan niet worden gekozen.", @@ -148,6 +159,11 @@ OC.L10N.register( "Deleted" : "Verwijderd", "There are no vote options, add some in the options section of the right sidebar." : "Er zijn geen keuzesopties, voeg een paar toe in de opties sectie in de rechter zijbalk.", "There are no vote options. Maybe the owner did not provide some until now." : "Er zijn geen peilingsopties. Misschien heeft de eigenaar nog geen opties toegevoegd.", + "Switch to mobile view" : "Omschakelen naar mobiel beeld", + "Switch to desktop view" : "Omschakelen naar bureau beeld", + "Date order" : "Datum volgorde", + "Original order" : "Originele volgorde", + "Ranked order" : "Gerangschikte volgorde", "Minute" : "Minuut", "Hour" : "Uur", "Day" : "Dag", diff --git a/l10n/nl.json b/l10n/nl.json index c672b3ba..652d5e2c 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -36,6 +36,10 @@ "No Participants until now" : "Nog geen deelnemers", "_%n Participant_::_%n Participants_" : ["%n deelnemer","%n deelnemers"], "started this poll on %n. " : " startte deze peiling op %n. ", + "This poll expired on {dateString}. The confirmed options are marked below." : "Deze poll is vervallen op [dateString]. De bevestigde keuzes zijn hieronder aangeduid.", + "This poll expired on {dateString}, but there are no confirmed options until now." : "Deze poll is vervallen op [dateString], maar er zijn geen bevestigde keuzes tot nu toe.", + "You can confirm your favorites now in the options tab in the sidebar." : "Je kan je voorkeuren bevestigen in de instellingen tab in de zijbalk.", + "You can place your vote until {dateString}." : "Je kunt nu stemmen tot [dateString]. ", "The names of other participants are hidden, as this is an anonymous poll. " : "Namen van andere stemmers zijn verborgen, dit is een anonieme peiling.", "Results are hidden. " : "Resultaten zijn verborgen.", "They will be revealed after the poll is expired. " : "Deze zullen bekend gemaakt worden nadat de peiling afgelopen is.", @@ -101,6 +105,8 @@ "Available Options" : "Beschikbare opties", "Delete option" : "Verwijder optie", "Clone option" : "Klonen optie", + "Unconfirm option" : "Keuze ongedaan maken", + "Confirm option" : "Keuze bevestigen", "There are no vote options specified." : "Er zijn geen keuzemogelijkheden opgegeven.", "Add a new text option" : "Voeg een nieuwe tekst optie toe", "Enter option text" : "Voer een optietekst in", @@ -117,7 +123,12 @@ "Error while adding share" : "Fout bij toevoegen deellink", "Receive notification email on activity" : "Ontvang email melding bij activiteit", "Your personal link to this poll: %n" : "Je persoonlijke link naar deze peiling: %n", + "Who are you?" : "Wie ben je?", + "To participate, tell us how we can call you!" : "OM deel te nemen, geef aan hoe we je moeten noemen.", "Enter your name" : "Geef je naam op", + "Please use at least 3 characters for your name." : "Gebruik aub. minstens 3 tekens voor je naam.", + "This name is not valid, i.e. because it is already in use." : "Deze naam is niet geldig, want deze is reeds in gebruik.", + "OK, we will call you {username}." : "OK, we zullen je {username} noemen.", "You have an account? Log in here." : "heb je een account? Log dan hier in.", "Please use at least 3 characters for your username!" : "Gebruik minimaal 3 tekens voor je gebruikersnaam!", "This username can not be chosen." : "Deze gebruikersnaam kan niet worden gekozen.", @@ -146,6 +157,11 @@ "Deleted" : "Verwijderd", "There are no vote options, add some in the options section of the right sidebar." : "Er zijn geen keuzesopties, voeg een paar toe in de opties sectie in de rechter zijbalk.", "There are no vote options. Maybe the owner did not provide some until now." : "Er zijn geen peilingsopties. Misschien heeft de eigenaar nog geen opties toegevoegd.", + "Switch to mobile view" : "Omschakelen naar mobiel beeld", + "Switch to desktop view" : "Omschakelen naar bureau beeld", + "Date order" : "Datum volgorde", + "Original order" : "Originele volgorde", + "Ranked order" : "Gerangschikte volgorde", "Minute" : "Minuut", "Hour" : "Uur", "Day" : "Dag", diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js index c13527f3..2657472c 100644 --- a/l10n/pt_BR.js +++ b/l10n/pt_BR.js @@ -125,7 +125,12 @@ OC.L10N.register( "Error while adding share" : "Erro ao adicionar compartilhamento", "Receive notification email on activity" : "Receber e-mail notificando atividade", "Your personal link to this poll: %n" : "Seu link pessoal para esta enquete: %n", + "Who are you?" : "Quem é você?", + "To participate, tell us how we can call you!" : "Para participar, diga-nos como podemos chamá-lo!", "Enter your name" : "Digite seu nome", + "Please use at least 3 characters for your name." : "Use pelo menos 3 caracteres para o nome.", + "This name is not valid, i.e. because it is already in use." : "Este nome é inválido pois já está em uso.", + "OK, we will call you {username}." : "OK, chamaremos você de {username}.", "You have an account? Log in here." : "Já tem uma conta? Logue-se aqui.", "Please use at least 3 characters for your username!" : "Use pelo menos 3 caracteres para o seu nome de usuário!", "This username can not be chosen." : "Este nome de usuário não pode ser escolhido.", diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json index a05f4324..49076981 100644 --- a/l10n/pt_BR.json +++ b/l10n/pt_BR.json @@ -123,7 +123,12 @@ "Error while adding share" : "Erro ao adicionar compartilhamento", "Receive notification email on activity" : "Receber e-mail notificando atividade", "Your personal link to this poll: %n" : "Seu link pessoal para esta enquete: %n", + "Who are you?" : "Quem é você?", + "To participate, tell us how we can call you!" : "Para participar, diga-nos como podemos chamá-lo!", "Enter your name" : "Digite seu nome", + "Please use at least 3 characters for your name." : "Use pelo menos 3 caracteres para o nome.", + "This name is not valid, i.e. because it is already in use." : "Este nome é inválido pois já está em uso.", + "OK, we will call you {username}." : "OK, chamaremos você de {username}.", "You have an account? Log in here." : "Já tem uma conta? Logue-se aqui.", "Please use at least 3 characters for your username!" : "Use pelo menos 3 caracteres para o seu nome de usuário!", "This username can not be chosen." : "Este nome de usuário não pode ser escolhido.", @@ -11,6 +11,7 @@ OC.L10N.register( "Delete comment" : "Șterge comentariu", "Title" : "Titlu", "Apply" : "Aplică", + "Access" : "Acces", "Owner" : "Proprietar", "never" : "niciodată", "Details" : "Detalii", @@ -23,6 +24,7 @@ OC.L10N.register( "Yes" : "a", "Deleted" : "Șters", "Day" : "Zi", - "Month" : "Luna" + "Month" : "Luna", + "Access denied" : "Acces interzis" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/l10n/ro.json b/l10n/ro.json index f94ed7fb..3e5039bf 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -9,6 +9,7 @@ "Delete comment" : "Șterge comentariu", "Title" : "Titlu", "Apply" : "Aplică", + "Access" : "Acces", "Owner" : "Proprietar", "never" : "niciodată", "Details" : "Detalii", @@ -21,6 +22,7 @@ "Yes" : "a", "Deleted" : "Șters", "Day" : "Zi", - "Month" : "Luna" + "Month" : "Luna", + "Access denied" : "Acces interzis" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" }
\ No newline at end of file @@ -32,10 +32,15 @@ OC.L10N.register( "OK" : "OK", "Week" : "На неделе", "Shift all date options" : "Сдвиг дат", + "Decrease unit" : "Шаг уменьшения", + "Increase unit" : "Шаг увеличения", "Shift" : "Сдвиг", "No Participants until now" : "Пока нет ни одного участника", "_%n Participant_::_%n Participants_" : ["%n участник","%n участников","%n участников","%n участников"], "started this poll on %n. " : "открыл это голосование %n.", + "This poll expired on {dateString}. The confirmed options are marked below." : "Этот опрос завершён {dateString}. Подтверждённые варианты приведены ниже.", + "This poll expired on {dateString}, but there are no confirmed options until now." : "Этот опрос завершён {dateString}, но подтверждённые варианты отсутствуют.", + "You can place your vote until {dateString}." : "Вы можете проголосовать до {dateString}.", "The names of other participants are hidden, as this is an anonymous poll. " : "Это анонимный опрос, имена его участников скрыты.", "Results are hidden. " : "Результаты скрыты.", "They will be revealed after the poll is expired. " : "Они будут показаны после завершения голосования.", @@ -52,17 +57,17 @@ OC.L10N.register( "Title" : "Название", "Enter Title" : "Введите заголовок", "Poll type" : "Тип опроса", - "Date poll" : "Дата проведения опроса", - "Text poll" : "Текстовый опрос", + "Date poll" : "Выбор даты", + "Text poll" : "Выбор текстовых вариантов", "Apply" : "Применить", "Poll \"%n\" added" : "Добавлен опрос «%n»", "Error while creating Poll \"%n\"" : "Не удалось создать опрос «%n»", "Add new Poll" : "Добавить опрос", - "Relevant" : "Актуальный", + "Relevant" : "Актуальные", "My polls" : "Мои опросы", "Public polls" : "Открытые опросы", "All polls" : "Все опросы", - "Expired polls" : "Истекшие опросы", + "Expired polls" : "Завершённые опросы", "Deleted polls" : "Удалённые опросы", "Clone poll" : "Скопировать опрос", "Delete poll" : "Удалить опрос", @@ -71,7 +76,7 @@ OC.L10N.register( "Access" : "Доступ", "Owner" : "Владелец", "Created" : "Создано", - "Expires" : "Задать дату окончания", + "Expires" : "Завершение", "No description provided" : "Описание отсуствует", "Visible to other users" : "Видимый другим пользователям", "Hidden to other users" : "Скрывать от других пользователей", @@ -88,10 +93,10 @@ OC.L10N.register( "Allow admins to edit this poll" : "Администраторы могут редактировать этот опрос", "Allow \"maybe\" vote" : "Разрешить вариант «может быть»", "Anonymous poll" : "Анонимный опрос", - "Result display" : "Показать результаты", - "Always show results" : "Всегда показывать результаты", - "Hide results until poll is expired" : "Спрятать результаты до завершения голосования", - "Never show results" : "Никогда не показывать результаты", + "Result display" : "Показ результатов", + "Always show results" : "Всегда показывать", + "Hide results until poll is expired" : "Скрывать до завершения голосования", + "Never show results" : "Никогда не показывать", "Expiration date" : "Дата окончания", "Writing poll" : "Запись опроса", "Update poll" : "Обновить опрос", @@ -101,7 +106,10 @@ OC.L10N.register( "Available Options" : "Доступные варианты", "Delete option" : "Удалить вариант", "Clone option" : "Копировать вариант", - "Add a new text option" : "Добавление текстового варианта", + "Unconfirm option" : "Неподтверждённый вариант", + "Confirm option" : "Подтверждённый вариант", + "There are no vote options specified." : "Варианты не заданы.", + "Add a new text option" : "Добавить текстовый вариант", "Enter option text" : "Введите описание варианта", "Invitations" : "Приглашения", "Invited users will get informed immediately via email!" : "Приглашения немедленно рассылаются по электронной почте.", @@ -116,7 +124,12 @@ OC.L10N.register( "Error while adding share" : "Не удалось опубликовать опрос", "Receive notification email on activity" : "Получать уведомления при изменении", "Your personal link to this poll: %n" : "Ваша личная ссылка на этот опрос: %n", + "Who are you?" : "Представьтесь:", + "To participate, tell us how we can call you!" : "Укажите своё имя, которое будет использоваться в опросах.", "Enter your name" : "Введите своё имя", + "Please use at least 3 characters for your name." : "Имя не может быть короче трёх символов.", + "This name is not valid, i.e. because it is already in use." : "Это имя не может быть использовано, возможно оно уже занято.", + "OK, we will call you {username}." : "Ваше имя: {username}.", "You have an account? Log in here." : "Войдите в систему, если у вас уже есть учётная запись.", "Please use at least 3 characters for your username!" : "Имя не может быть короче трёх символов.", "This username can not be chosen." : "Это имя нельзя использовать.", @@ -132,16 +145,21 @@ OC.L10N.register( "Relevant polls" : "Актуальные опросы", "Hidden polls" : "Скрытые опросы", "My deleted polls" : "Мои удаленные опросы", - "Participated by me" : "Я принимал участие", + "Participated by me" : "В которых я принял участие", "Your polls (where you are the owner)." : "Ваши опросы (где вы владелец)", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without expired polls." : "Все опросы, за исключением завершённых, которые вы организовывали, в которых участвовали или в которые были приглашены.", "A complete list with all public polls on this site, regardless who is the owner." : "Полный список всех открытых опросов на этом сайте, независимо от того, кто является владельцем.", + "All hidden polls, to which you have access." : "Все скрытые опросы, к которым у вас есть доступ.", "The trash bin." : "Это просто корзина.", "All polls, where you placed a vote." : "Все опросы, где вы проголосовали.", "Polls which reached their expiry date." : "Опросы, срок действия которых истек.", "All polls, where you have access to." : "Все опросы, где у вас есть доступ.", "Toggle Sidebar" : "Скрыть или показать боковую панель", "Deleted" : "Удалено", + "There are no vote options, add some in the options section of the right sidebar." : "Варианты голосования не указаны, используйте правую боковую панель для из создания.", "There are no vote options. Maybe the owner did not provide some until now." : "Пока нет ни одного варианта для голосования, возможно, организатор опроса их ещё не добавил.", + "Switch to mobile view" : "Режим просмотра для мобильных устройств", + "Switch to desktop view" : "Режим просмотра для ПК", "Minute" : "Минута", "Hour" : "Час", "Day" : "День", diff --git a/l10n/ru.json b/l10n/ru.json index 2595cf35..8a88f598 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -30,10 +30,15 @@ "OK" : "OK", "Week" : "На неделе", "Shift all date options" : "Сдвиг дат", + "Decrease unit" : "Шаг уменьшения", + "Increase unit" : "Шаг увеличения", "Shift" : "Сдвиг", "No Participants until now" : "Пока нет ни одного участника", "_%n Participant_::_%n Participants_" : ["%n участник","%n участников","%n участников","%n участников"], "started this poll on %n. " : "открыл это голосование %n.", + "This poll expired on {dateString}. The confirmed options are marked below." : "Этот опрос завершён {dateString}. Подтверждённые варианты приведены ниже.", + "This poll expired on {dateString}, but there are no confirmed options until now." : "Этот опрос завершён {dateString}, но подтверждённые варианты отсутствуют.", + "You can place your vote until {dateString}." : "Вы можете проголосовать до {dateString}.", "The names of other participants are hidden, as this is an anonymous poll. " : "Это анонимный опрос, имена его участников скрыты.", "Results are hidden. " : "Результаты скрыты.", "They will be revealed after the poll is expired. " : "Они будут показаны после завершения голосования.", @@ -50,17 +55,17 @@ "Title" : "Название", "Enter Title" : "Введите заголовок", "Poll type" : "Тип опроса", - "Date poll" : "Дата проведения опроса", - "Text poll" : "Текстовый опрос", + "Date poll" : "Выбор даты", + "Text poll" : "Выбор текстовых вариантов", "Apply" : "Применить", "Poll \"%n\" added" : "Добавлен опрос «%n»", "Error while creating Poll \"%n\"" : "Не удалось создать опрос «%n»", "Add new Poll" : "Добавить опрос", - "Relevant" : "Актуальный", + "Relevant" : "Актуальные", "My polls" : "Мои опросы", "Public polls" : "Открытые опросы", "All polls" : "Все опросы", - "Expired polls" : "Истекшие опросы", + "Expired polls" : "Завершённые опросы", "Deleted polls" : "Удалённые опросы", "Clone poll" : "Скопировать опрос", "Delete poll" : "Удалить опрос", @@ -69,7 +74,7 @@ "Access" : "Доступ", "Owner" : "Владелец", "Created" : "Создано", - "Expires" : "Задать дату окончания", + "Expires" : "Завершение", "No description provided" : "Описание отсуствует", "Visible to other users" : "Видимый другим пользователям", "Hidden to other users" : "Скрывать от других пользователей", @@ -86,10 +91,10 @@ "Allow admins to edit this poll" : "Администраторы могут редактировать этот опрос", "Allow \"maybe\" vote" : "Разрешить вариант «может быть»", "Anonymous poll" : "Анонимный опрос", - "Result display" : "Показать результаты", - "Always show results" : "Всегда показывать результаты", - "Hide results until poll is expired" : "Спрятать результаты до завершения голосования", - "Never show results" : "Никогда не показывать результаты", + "Result display" : "Показ результатов", + "Always show results" : "Всегда показывать", + "Hide results until poll is expired" : "Скрывать до завершения голосования", + "Never show results" : "Никогда не показывать", "Expiration date" : "Дата окончания", "Writing poll" : "Запись опроса", "Update poll" : "Обновить опрос", @@ -99,7 +104,10 @@ "Available Options" : "Доступные варианты", "Delete option" : "Удалить вариант", "Clone option" : "Копировать вариант", - "Add a new text option" : "Добавление текстового варианта", + "Unconfirm option" : "Неподтверждённый вариант", + "Confirm option" : "Подтверждённый вариант", + "There are no vote options specified." : "Варианты не заданы.", + "Add a new text option" : "Добавить текстовый вариант", "Enter option text" : "Введите описание варианта", "Invitations" : "Приглашения", "Invited users will get informed immediately via email!" : "Приглашения немедленно рассылаются по электронной почте.", @@ -114,7 +122,12 @@ "Error while adding share" : "Не удалось опубликовать опрос", "Receive notification email on activity" : "Получать уведомления при изменении", "Your personal link to this poll: %n" : "Ваша личная ссылка на этот опрос: %n", + "Who are you?" : "Представьтесь:", + "To participate, tell us how we can call you!" : "Укажите своё имя, которое будет использоваться в опросах.", "Enter your name" : "Введите своё имя", + "Please use at least 3 characters for your name." : "Имя не может быть короче трёх символов.", + "This name is not valid, i.e. because it is already in use." : "Это имя не может быть использовано, возможно оно уже занято.", + "OK, we will call you {username}." : "Ваше имя: {username}.", "You have an account? Log in here." : "Войдите в систему, если у вас уже есть учётная запись.", "Please use at least 3 characters for your username!" : "Имя не может быть короче трёх символов.", "This username can not be chosen." : "Это имя нельзя использовать.", @@ -130,16 +143,21 @@ "Relevant polls" : "Актуальные опросы", "Hidden polls" : "Скрытые опросы", "My deleted polls" : "Мои удаленные опросы", - "Participated by me" : "Я принимал участие", + "Participated by me" : "В которых я принял участие", "Your polls (where you are the owner)." : "Ваши опросы (где вы владелец)", + "All polls which are relevant or important to you, because you are a participant or the owner or you are invited to. Without expired polls." : "Все опросы, за исключением завершённых, которые вы организовывали, в которых участвовали или в которые были приглашены.", "A complete list with all public polls on this site, regardless who is the owner." : "Полный список всех открытых опросов на этом сайте, независимо от того, кто является владельцем.", + "All hidden polls, to which you have access." : "Все скрытые опросы, к которым у вас есть доступ.", "The trash bin." : "Это просто корзина.", "All polls, where you placed a vote." : "Все опросы, где вы проголосовали.", "Polls which reached their expiry date." : "Опросы, срок действия которых истек.", "All polls, where you have access to." : "Все опросы, где у вас есть доступ.", "Toggle Sidebar" : "Скрыть или показать боковую панель", "Deleted" : "Удалено", + "There are no vote options, add some in the options section of the right sidebar." : "Варианты голосования не указаны, используйте правую боковую панель для из создания.", "There are no vote options. Maybe the owner did not provide some until now." : "Пока нет ни одного варианта для голосования, возможно, организатор опроса их ещё не добавил.", + "Switch to mobile view" : "Режим просмотра для мобильных устройств", + "Switch to desktop view" : "Режим просмотра для ПК", "Minute" : "Минута", "Hour" : "Час", "Day" : "День", @@ -126,10 +126,10 @@ OC.L10N.register( "Receive notification email on activity" : "İşlem yapıldığında e-posta bildirimi gönderilsin", "Your personal link to this poll: %n" : "Bu anketin size özel bağlantısı: %n", "Who are you?" : "Siz kimsiniz?", - "To participate, tell us how we can call you!" : "Katılmak için bize size nasıl hitap edebileceğimizi söyleyiniz!", + "To participate, tell us how we can call you!" : "Katılmak için size nasıl hitap edeceğimizi söyleyin!", "Enter your name" : "Adınızı yazın", - "Please use at least 3 characters for your name." : "Lütfen isminiz için en az 3 harf giriniz.", - "This name is not valid, i.e. because it is already in use." : "Bu isim geçerli değildir, örnek: zaten kullanımda olan.", + "Please use at least 3 characters for your name." : "Lütfen adınız için en az 3 karakter yazın.", + "This name is not valid, i.e. because it is already in use." : "Bu ad geçersiz. Zaten kullanılıyor olabilir.", "OK, we will call you {username}." : "Tamam, size {username} olarak hitap edeceğiz.", "You have an account? Log in here." : "Zaten bir hesabınız varsa buradan oturum açın.", "Please use at least 3 characters for your username!" : "Lütfen kullanıcı adınız için en az 3 karakter yazın!", diff --git a/l10n/tr.json b/l10n/tr.json index 37030552..7ddd2eb7 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -124,10 +124,10 @@ "Receive notification email on activity" : "İşlem yapıldığında e-posta bildirimi gönderilsin", "Your personal link to this poll: %n" : "Bu anketin size özel bağlantısı: %n", "Who are you?" : "Siz kimsiniz?", - "To participate, tell us how we can call you!" : "Katılmak için bize size nasıl hitap edebileceğimizi söyleyiniz!", + "To participate, tell us how we can call you!" : "Katılmak için size nasıl hitap edeceğimizi söyleyin!", "Enter your name" : "Adınızı yazın", - "Please use at least 3 characters for your name." : "Lütfen isminiz için en az 3 harf giriniz.", - "This name is not valid, i.e. because it is already in use." : "Bu isim geçerli değildir, örnek: zaten kullanımda olan.", + "Please use at least 3 characters for your name." : "Lütfen adınız için en az 3 karakter yazın.", + "This name is not valid, i.e. because it is already in use." : "Bu ad geçersiz. Zaten kullanılıyor olabilir.", "OK, we will call you {username}." : "Tamam, size {username} olarak hitap edeceğiz.", "You have an account? Log in here." : "Zaten bir hesabınız varsa buradan oturum açın.", "Please use at least 3 characters for your username!" : "Lütfen kullanıcı adınız için en az 3 karakter yazın!", diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 309c8f40..53922944 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -23,20 +23,6 @@ namespace OCA\Polls\AppInfo; -// use OCA\Polls\Controller\PageController; -// use OCA\Polls\Controller\ApiController; -// use OCA\Polls\Controller\CommentController; -// use OCA\Polls\Controller\PollController; -// use OCA\Polls\Controller\NotificationController; -// use OCA\Polls\Controller\OptionController; -// use OCA\Polls\Controller\VoteController; -// use OCA\Polls\Controller\ShareController; -// use OCA\Polls\Db\CommentMapper; -// use OCA\Polls\Db\OptionMapper; -// use OCA\Polls\Db\PollMapper; -// use OCA\Polls\Db\NotificationMapper; -// use OCA\Polls\Db\VoteMapper; -// use OCA\Polls\Db\ShareMapper; use OCP\AppFramework\App; use OCP\IContainer; diff --git a/lib/Controller/CommentApiController.php b/lib/Controller/CommentApiController.php new file mode 100644 index 00000000..6cc56bba --- /dev/null +++ b/lib/Controller/CommentApiController.php @@ -0,0 +1,120 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Controller; + +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; + +use OCP\IRequest; +use \OCP\IURLGenerator; +use OCP\AppFramework\ApiController; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; + +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCA\Polls\Service\CommentService; + + + +class CommentApiController extends ApiController { + + private $commentService; + /** + * CommentApiController constructor. + * @param string $appName + * @param IRequest $request + * @param CommentService $commentService + */ + + public function __construct( + string $appName, + IRequest $request, + CommentService $commentService + ) { + parent::__construct($appName, + $request, + 'POST, GET, DELETE', + 'Authorization, Content-Type, Accept', + 1728000); + $this->commentService = $commentService; + } + + /** + * get + * Read all comments of a poll based on the poll id and return list as array + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $pollId + * @return DataResponse + */ + public function list($pollId) { + try { + return new DataResponse(['comments' => $this->commentService->list($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll with id ' . $pollId . ' not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * Write a new comment to the db and returns the new comment as array + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param int $pollId + * @param string $message + * @return DataResponse + */ + public function add($pollId, $message) { + try { + return new DataResponse(['comment' => $this->commentService->add($pollId, $message)], Http::STATUS_CREATED); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll with id ' . $pollId . ' not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * Delete Comment + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param int $commentId + * @return DataResponse + */ + public function delete($commentId) { + try { + return new DataResponse(['comment' => $this->commentService->delete($commentId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Comment id ' . $commentId . ' does not exist'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + +} diff --git a/lib/Controller/CommentController.php b/lib/Controller/CommentController.php index 082bbbb3..6f240f05 100644 --- a/lib/Controller/CommentController.php +++ b/lib/Controller/CommentController.php @@ -26,68 +26,38 @@ namespace OCA\Polls\Controller; use Exception; use OCP\AppFramework\Db\DoesNotExistException; - use OCP\IRequest; use OCP\ILogger; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCP\IGroupManager; +use OCA\Polls\Exceptions\NotAuthorizedException; -use OCA\Polls\Db\Poll; -use OCA\Polls\Db\PollMapper; -use OCA\Polls\Db\Comment; -use OCA\Polls\Db\CommentMapper; -use OCA\Polls\Service\AnonymizeService; -use OCA\Polls\Model\Acl; +use OCA\Polls\Service\CommentService; class CommentController extends Controller { - private $userId; - private $mapper; - private $logger; - - private $groupManager; - private $pollMapper; - private $anonymizer; - private $acl; + private $commentService; /** * CommentController constructor. * @param string $appName - * @param $UserId - * @param CommentMapper $mapper - * @param IGroupManager $groupManager - * @param PollMapper $pollMapper - * @param AnonymizeService $anonymizer - * @param Acl $acl + * @param IRequest $request + * @param CommentService $commentService */ public function __construct( string $appName, - $userId, IRequest $request, - ILogger $logger, - CommentMapper $mapper, - IGroupManager $groupManager, - PollMapper $pollMapper, - AnonymizeService $anonymizer, - Acl $acl + CommentService $commentService ) { parent::__construct($appName, $request); - $this->userId = $userId; - $this->mapper = $mapper; - $this->logger = $logger; - $this->groupManager = $groupManager; - $this->pollMapper = $pollMapper; - $this->anonymizer = $anonymizer; - $this->acl = $acl; + $this->commentService = $commentService; } - /** * get * Read all comments of a poll based on the poll id and return list as array @@ -96,166 +66,56 @@ class CommentController extends Controller { * @param integer $pollId * @return DataResponse */ - public function get($pollId) { - - try { - if (!$this->acl->getFoundByToken()) { - $this->acl->setPollId($pollId); - } - - if (!$this->acl->getAllowSeeUsernames()) { - $this->anonymizer->set($pollId, $this->acl->getUserId()); - return new DataResponse((array) $this->anonymizer->getComments(), Http::STATUS_OK); - } else { - return new DataResponse((array) $this->mapper->findByPoll($pollId), Http::STATUS_OK); - } - - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } - - } - - /** - * getByToken - * Read all comments of a poll based on a share token and return list as array - * @NoAdminRequired - * @NoCSRFRequired - * @PublicPage - * @param string $token - * @return DataResponse - */ - public function getByToken($token) { - - try { - $this->acl->setToken($token); - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } - - return $this->get($this->acl->getPollId()); - + public function list($pollId) { + return new DataResponse($this->commentService->list($pollId), Http::STATUS_OK); } + // /** + // * Read all comments of a poll based on a share token and return list as array + // * @NoAdminRequired + // * @NoCSRFRequired + // * @PublicPage + // * @param string $token + // * @return DataResponse + // */ + // public function getByToken($token) { + // return new DataResponse($this->commentService->get(0, $token), Http::STATUS_OK); + // } + // /** * Write a new comment to the db and returns the new comment as array * @NoAdminRequired - * @NoCSRFRequired + * @PublicPage * @param int $pollId - * @param string $userId * @param string $message - * @return DataResponse - */ - public function write($pollId, $userId, $message) { - if (!\OC::$server->getUserSession()->isLoggedIn() && !$this->acl->getFoundByToken()) { - $this->logger->alert('not allowed ' . json_encode(\OC::$server->getUserSession()->isLoggedIn())); - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - if (!$this->acl->getFoundByToken()) { - $this->acl->setPollId($pollId); - } - - if ($this->acl->getAllowComment()) { - $comment = new Comment(); - $comment->setPollId($pollId); - $comment->setUserId($userId); - $comment->setComment($message); - $comment->setDt(date('Y-m-d H:i:s')); - - - try { - $comment = $this->mapper->insert($comment); - } catch (\Exception $e) { - $this->logger->alert('conflict ' . json_encode($e)); - return new DataResponse($e, Http::STATUS_CONFLICT); - } - } else { - $this->logger->alert('unauthorized '); - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - return new DataResponse($comment, Http::STATUS_OK); - - } - - /** - * writeByToken - * @NoAdminRequired - * @PublicPage - * @NoCSRFRequired - * @param Array $option - * @param string $setTo * @param string $token * @return DataResponse */ - public function writeByToken($token, $message) { - + public function add($pollId, $message, $token) { try { - $this->acl->setToken($token); - return $this->write($this->acl->getPollId(), $this->acl->getUserId(), $message); - - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + return new DataResponse($this->commentService->add($pollId, $message, $token), Http::STATUS_OK); + } catch (Exception $e) { + return new DataResponse($e, Http::STATUS_UNAUTHORIZED); } - - } - /** - * delete * Delete Comment - * @NoCSRFRequired - * @NoAdminRequired - * @param int $pollId - * @param string $message - * @return DataResponse - */ - public function delete($comment) { - if (!\OC::$server->getUserSession()->isLoggedIn() && !$this->acl->getFoundByToken()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - if (!$this->acl->getFoundByToken()) { - $this->acl->setPollId($comment['pollId']); - } - - try { - if ($comment['userId'] === $this->acl->getUserId()) { - $comment = $this->mapper->find($comment['id']); - $comment = $this->mapper->delete($comment); - } - } catch (\Exception $e) { - return new DataResponse($e, Http::STATUS_CONFLICT); - } - - return new DataResponse(['comment' => $comment], Http::STATUS_OK); - - } - - /** - * writeByToken * @NoAdminRequired * @PublicPage - * @NoCSRFRequired - * @param Array $option - * @param string $setTo + * @param int $commentId * @param string $token * @return DataResponse */ - public function deleteByToken($token, $comment) { - + public function delete($commentId, $token) { try { - $this->acl->setToken($token); - return $this->delete($comment); - + return new DataResponse($this->commentService->delete($commentId, $token), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse($e, Http::STATUS_FORBIDDEN); } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + return new DataResponse($e, Http::STATUS_OK); } - - } } diff --git a/lib/Controller/OptionApiController.php b/lib/Controller/OptionApiController.php new file mode 100644 index 00000000..e3396a3e --- /dev/null +++ b/lib/Controller/OptionApiController.php @@ -0,0 +1,144 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Controller; + +use Exception; +use Doctrine\DBAL\Exception\UniqueConstraintViolationException; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCP\IRequest; +use OCP\AppFramework\ApiController; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; + + +use OCA\Polls\Service\OptionService; + +class OptionApiController extends ApiController { + + private $optionService; + + /** + * OptionApiController constructor. + * @param string $appName + * @param IRequest $request + * @param OptionService $optionService + */ + + public function __construct( + string $appName, + IRequest $request, + OptionService $optionService + ) { + parent::__construct($appName, + $request, + 'POST, PUT, GET, DELETE', + 'Authorization, Content-Type, Accept', + 1728000); + $this->optionService = $optionService; + } + + /** + * Get all options of given poll + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $pollId + * @return DataResponse + */ + public function list($pollId) { + try { + return new DataResponse(['options' => $this->optionService->list($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll with id ' . $pollId . ' not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + + /** + * Add a new Option to poll + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $pollId + * @param string $pollOptionText + * @param integer $timestamp + * @return DataResponse + */ + public function add($pollId, $pollOptionText = '', $timestamp = 0) { + $option = [ + 'pollId' => $pollId, + 'pollOptionText' => $pollOptionText, + 'timestamp' => $timestamp + ]; + + try { + return new DataResponse(['option' => $this->optionService->add($option)], Http::STATUS_CREATED); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll with id ' . $pollId . ' not found'], Http::STATUS_NOT_FOUND); + } catch (UniqueConstraintViolationException $e) { + return new DataResponse(['error' => 'Option exists'], Http::STATUS_CONFLICT); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + + /** + * Update poll option + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param array $option + * @return DataResponse + */ + public function update($option) { + try { + return new DataResponse(['option' => $this->optionService->update($option)], Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * Remove a single option + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $optionId + * @return DataResponse + */ + public function delete($optionId) { + try { + return new DataResponse(['option' => $this->optionService->delete($optionId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Option does not exist'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } +} diff --git a/lib/Controller/OptionController.php b/lib/Controller/OptionController.php index 0c20b768..0ec24092 100644 --- a/lib/Controller/OptionController.php +++ b/lib/Controller/OptionController.php @@ -24,98 +24,34 @@ namespace OCA\Polls\Controller; use Exception; -use OCP\AppFramework\Db\DoesNotExistException; use OCP\IRequest; -use OCP\ILogger; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCP\IGroupManager; -use OCP\Security\ISecureRandom; +use OCA\Polls\Exceptions\NotAuthorizedException; -use OCA\Polls\Db\Poll; -use OCA\Polls\Db\PollMapper; -use OCA\Polls\Db\Option; -use OCA\Polls\Db\OptionMapper; -use OCA\Polls\Service\LogService; -use OCA\Polls\Model\Acl; +use OCA\Polls\Service\OptionService; class OptionController extends Controller { - private $userId; - private $optionMapper; - private $options; - private $option; - private $groupManager; - private $pollMapper; - private $logger; - private $logService; - private $acl; + private $optionService; /** * OptionController constructor. * @param string $appName - * @param $UserId * @param IRequest $request - * @param ILogger $logger - * @param OptionMapper $optionMapper - * @param IGroupManager $groupManager - * @param PollMapper $pollMapper - * @param LogService $logService - * @param Acl $acl + * @param OptionService $optionService */ public function __construct( string $appName, - $UserId, IRequest $request, - OptionMapper $optionMapper, - Option $option, - IGroupManager $groupManager, - PollMapper $pollMapper, - ILogger $logger, - LogService $logService, - Acl $acl + OptionService $optionService ) { parent::__construct($appName, $request); - $this->userId = $UserId; - $this->optionMapper = $optionMapper; - $this->option = $option; - $this->groupManager = $groupManager; - $this->pollMapper = $pollMapper; - $this->logger = $logger; - $this->logService = $logService; - $this->acl = $acl; - } - - /** - * Set properties from option array - * @NoAdminRequired - * @param integer $pollId - * @return array Array of Option objects - */ - private function set($option) { - - $this->option->setPollId($option['pollId']); - $this->option->setPollOptionText(trim(htmlspecialchars($option['pollOptionText']))); - $this->option->setTimestamp($option['timestamp']); - - if ($option['timestamp']) { - $this->option->setOrder($option['timestamp']); - } else { - $this->option->setOrder($option['order']); - } - - if ($option['confirmed']) { - // do not update confirmation date, if option is already confirmed - if (!$this->option->getConfirmed()) { - $this->option->setConfirmed(time()); - } - } else { - $this->option->setConfirmed(0); - } + $this->optionService = $optionService; } /** @@ -123,22 +59,10 @@ class OptionController extends Controller { * @NoAdminRequired * @NoCSRFRequired * @param integer $pollId - * @return array Array of Option objects + * @return DataResponse */ - public function get($pollId) { - - try { - - if (!$this->acl->getFoundByToken()) { - $this->acl->setPollId($pollId); - } - - $this->options = $this->optionMapper->findByPoll($pollId); - - return new DataResponse($this->options, Http::STATUS_OK); - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } + public function list($pollId) { + return new DataResponse($this->optionService->list($pollId), Http::STATUS_OK); } @@ -152,64 +76,29 @@ class OptionController extends Controller { * @return DataResponse */ public function getByToken($token) { - - try { - $this->acl->setToken($token); - // return $this->get($this->acl->getPollId()); - $this->options = $this->optionMapper->findByPoll($this->acl->getPollId()); - return new DataResponse($this->options, Http::STATUS_OK); - - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } + return new DataResponse($this->optionService->list(0, $token), Http::STATUS_OK); } /** * Add a new Option to poll * @NoAdminRequired * @NoCSRFRequired - * @param Option $option + * @param array $option * @return DataResponse */ public function add($option) { - - if (!$this->acl->setPollId($option['pollId'])->getAllowEdit()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - try { - $this->option = new Option(); - $this->set($option); - $this->optionMapper->insert($this->option); - $this->logService->setLog($option['pollId'], 'addOption'); - return new DataResponse($this->option, Http::STATUS_OK); - } catch (Exception $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } + return new DataResponse($this->optionService->add($option), Http::STATUS_OK); } /** * Update poll option * @NoAdminRequired * @NoCSRFRequired - * @param Option $option + * @param array $option * @return DataResponse */ public function update($option) { - - if (!$this->acl->setPollId($option['pollId'])->getAllowEdit()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - try { - $this->option = $this->optionMapper->find($option['id']); - $this->set($option); - $this->optionMapper->update($this->option); - $this->logService->setLog($option['pollId'], 'updateOption'); - return new DataResponse($this->option, Http::STATUS_OK); - } catch (Exception $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } + return new DataResponse($this->optionService->update($option), Http::STATUS_OK); } /** @@ -220,49 +109,18 @@ class OptionController extends Controller { * @return DataResponse */ public function remove($option) { - try { - - if (!$this->acl->setPollId($option['pollId'])->getAllowEdit()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - $this->optionMapper->remove($option['id']); - $this->logService->setLog($option['pollId'], 'deleteOption'); - - return new DataResponse(array( - 'action' => 'deleted', - 'optionId' => $option['id'] - ), Http::STATUS_OK); - - } catch (Exception $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } - + return new DataResponse($this->optionService->delete($option['id']), Http::STATUS_OK); } /** * Set order by order of the given array * @NoAdminRequired * @NoCSRFRequired + * @param integer $pollId * @param Array $options * @return DataResponse */ public function reorder($pollId, $options) { - $i = 0; - - if (!$this->acl->setPollId($pollId)->getAllowEdit()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - foreach ($options as $option) { - $this->option = $this->optionMapper->find($option['id']); - if ($pollId === intval($this->option->getPollId())) { - $this->option->setOrder(++$i); - $this->optionMapper->update($this->option); - } - } - - return $this->get($pollId); - + return new DataResponse($this->optionService->reorder($pollId, $options), Http::STATUS_OK); } } diff --git a/lib/Controller/PollApiController.php b/lib/Controller/PollApiController.php new file mode 100644 index 00000000..3c8acc9d --- /dev/null +++ b/lib/Controller/PollApiController.php @@ -0,0 +1,215 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + namespace OCA\Polls\Controller; + + use Exception; + use OCP\AppFramework\Db\DoesNotExistException; + use OCA\Polls\Exceptions\EmptyTitleException; + use OCA\Polls\Exceptions\InvalidAccessException; + use OCA\Polls\Exceptions\InvalidShowResultsException; + use OCA\Polls\Exceptions\InvalidPollTypeException; + use OCA\Polls\Exceptions\NotAuthorizedException; + + use OCP\IRequest; + use OCP\ILogger; + use OCP\AppFramework\ApiController; + use OCP\AppFramework\Http; + use OCP\AppFramework\Http\DataResponse; + + use OCA\Polls\Service\PollService; + + class PollApiController extends ApiController { + + private $logger; + private $pollService; + + /** + * PollController constructor. + * @param string $appName + * @param $userId + * @param IRequest $request + * @param ILogger $logger + * @param PollService $pollService + */ + + public function __construct( + string $appName, + IRequest $request, + ILogger $logger, + PollService $pollService + ) { + parent::__construct($appName, $request); + $this->logger = $logger; + $this->pollService = $pollService; + } + + + /** + * list + * @NoAdminRequired + * @NoCSRFRequired + * @CORS + * @return DataResponse + */ + + public function list() { + try { + return new DataResponse(['polls' => $this->pollService->list()], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + + /** + * get + * @NoAdminRequired + * @NoCSRFRequired + * @param integer $pollId + * @return array + */ + public function get($pollId) { + try { + return new DataResponse(['poll' => $this->pollService->get($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * write + * @NoAdminRequired + * @NoCSRFRequired + * @param Array $poll + * @return DataResponse + */ + + public function add($type, $title) { + try { + return new DataResponse(['poll' => $this->pollService->add($type, $title)], Http::STATUS_CREATED); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidPollTypeException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (EmptyTitleException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * write + * @NoAdminRequired + * @NoCSRFRequired + * @param Array $poll + * @return DataResponse + */ + + public function update($pollId, $poll) { + try { + return new DataResponse(['poll' => $this->pollService->update($pollId, $poll)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidAccessException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidShowResultsException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (EmptyTitleException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * delete + * @NoAdminRequired + * @NoCSRFRequired + * @param Array $poll + * @return DataResponse + */ + + public function delete($pollId) { + try { + return new DataResponse(['poll' => $this->pollService->delete($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * deletePermanently + * @NoAdminRequired + * @NoCSRFRequired + * @param Array $poll + * @return DataResponse + */ + + public function deletePermanently($pollId) { + try { + return new DataResponse(['poll' => $this->pollService->deletePermanently($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + + } + + /** + * clone + * @NoAdminRequired + * @NoCSRFRequired + * @param integer $pollId + * @return DataResponse + */ + public function clone($pollId) { + try { + return new DataResponse(['poll' => $this->pollService->clone($pollId)], Http::STATUS_CREATED); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * enum + * @NoAdminRequired + * @NoCSRFRequired + * @param Array $poll + * @return DataResponse + */ + + public function enum() { + return new DataResponse($this->pollService->getValidEnum(), Http::STATUS_OK); + } + + +} diff --git a/lib/Controller/PollController.php b/lib/Controller/PollController.php index b3494c4c..27f9c4be 100644 --- a/lib/Controller/PollController.php +++ b/lib/Controller/PollController.php @@ -23,107 +23,70 @@ namespace OCA\Polls\Controller; - use Exception; - use OCP\AppFramework\Db\DoesNotExistException; - - use OCP\IRequest; - use OCP\ILogger; - use OCP\IL10N; - use OCP\AppFramework\Controller; - use OCP\AppFramework\Http; - use OCP\AppFramework\Http\DataResponse; - - use OCP\IGroupManager; - use OCP\IUser; - use OCP\IUserManager; - use OCP\Security\ISecureRandom; - - use OCA\Polls\Db\Comment; - use OCA\Polls\Db\CommentMapper; - use OCA\Polls\Db\Poll; - use OCA\Polls\Db\PollMapper; - use OCA\Polls\Db\Option; - use OCA\Polls\Db\OptionMapper; - use OCA\Polls\Db\Share; - use OCA\Polls\Db\ShareMapper; - use OCA\Polls\Db\Vote; - use OCA\Polls\Db\VoteMapper; - use OCA\Polls\Service\LogService; - use OCA\Polls\Service\MailService; - use OCA\Polls\Service\AnonymizeService; - use OCA\Polls\Model\Acl; - - class PollController extends Controller { - - private $userId; - private $commentMapper; - private $pollMapper; - private $optionMapper; - private $shareMapper; - private $voteMapper; - private $trans; - private $logger; - private $groupManager; - private $userManager; - private $poll; - private $logService; - private $mailService; - private $anonymizer; - private $acl; +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\EmptyTitleException; +use OCA\Polls\Exceptions\InvalidAccessException; +use OCA\Polls\Exceptions\InvalidShowResultsException; +use OCA\Polls\Exceptions\InvalidPollTypeException; +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCP\IRequest; +use OCP\ILogger; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; + +use OCA\Polls\Service\PollService; +use OCA\Polls\Service\CommentService; +use OCA\Polls\Service\OptionService; +use OCA\Polls\Service\ShareService; +use OCA\Polls\Service\VoteService; +use OCA\Polls\Model\Acl; + +class PollController extends Controller { + + private $logger; + private $pollService; + private $commentService; + private $optionService; + private $shareService; + private $voteService; + private $acl; /** - * CommentController constructor. + * PollController constructor. * @param string $appName - * @param $userId * @param IRequest $request * @param ILogger $logger - * @param IL10N $trans - * @param OptionMapper $optionMapper - * @param PollMapper $pollMapper - * @param IGroupManager $groupManager - * @param IUserManager $userManager - * @param LogService $logService - * @param MailService $mailService - * @param AnonymizeService $anonymizer - * @param Acl $acl - */ + * @param PollService $pollService + * @param CommentService $commentService + * @param OptionService $optionService + * @param ShareService $shareService + * @param VoteService $voteService + * @param Acl $acl + */ public function __construct( - string $appName, - $userId, + string $appName, IRequest $request, ILogger $logger, - IL10N $trans, - CommentMapper $commentMapper, - OptionMapper $optionMapper, - PollMapper $pollMapper, - ShareMapper $shareMapper, - VoteMapper $voteMapper, - Poll $poll, - IGroupManager $groupManager, - IUserManager $userManager, - LogService $logService, - MailService $mailService, - AnonymizeService $anonymizer, - Acl $acl - ) { + PollService $pollService, + CommentService $commentService, + OptionService $optionService, + ShareService $shareService, + VoteService $voteService, + Acl $acl + ) { parent::__construct($appName, $request); - $this->userId = $userId; - $this->trans = $trans; - $this->commentMapper = $commentMapper; - $this->pollMapper = $pollMapper; - $this->optionMapper = $optionMapper; - $this->shareMapper = $shareMapper; - $this->voteMapper = $voteMapper; - $this->logger = $logger; - $this->groupManager = $groupManager; - $this->userManager = $userManager; - $this->poll = $poll; - $this->logService = $logService; - $this->mailService = $mailService; - $this->anonymizer = $anonymizer; - $this->acl = $acl; - } + $this->logger = $logger; + $this->pollService = $pollService; + $this->commentService = $commentService; + $this->optionService = $optionService; + $this->shareService = $shareService; + $this->voteService = $voteService; + $this->acl = $acl; + } /** @@ -134,29 +97,13 @@ */ public function list() { - if (\OC::$server->getUserSession()->isLoggedIn()) { - $pollList = []; - - try { - - $polls = $this->pollMapper->findAll(); - // TODO: Not the elegant way. Improvement neccessary - foreach ($polls as $poll) { - $combinedPoll = (object) array_merge( - (array) json_decode(json_encode($poll)), (array) json_decode(json_encode($this->acl->setPollId($poll->getId())))); - if ($combinedPoll->allowView) { - $pollList[] = $combinedPoll; - } - } - - return new DataResponse($pollList, Http::STATUS_OK); - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } - } else { - return new DataResponse([], Http::STATUS_OK); + try { + return new DataResponse($this->pollService->list(), Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } - } @@ -164,77 +111,61 @@ * get * @NoAdminRequired * @NoCSRFRequired + * @PublicPage * @param integer $pollId * @return array */ - public function get($pollId) { - - try { - if (!$this->acl->getFoundByToken()) { - $this->acl->setPollId($pollId); - } - - $this->poll = $this->pollMapper->find($pollId); - - if (!$this->acl->getAllowView()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - $options = $this->optionMapper->findByPoll($pollId); - - if ($this->acl->getAllowEdit()) { - $shares = $this->shareMapper->findByPoll($pollId); + public function get($pollId, $token) { + try { + if ($token) { + $poll = $this->pollService->getByToken($token); + $acl = $this->acl->setToken($token); } else { - $shares = []; + $poll = $this->pollService->get($pollId); + $acl = $this->acl->setPollId($pollId); } - if ($this->acl->getAllowSeeUsernames()) { - $comments = $this->commentMapper->findByPoll($pollId); - - if ($this->acl->getAllowSeeResults()) { - $votes = $this->voteMapper->findByPoll($pollId); - } else { - $votes = $this->voteMapper->findByPollAndUser($pollId, $this->acl->getUserId()); - } - } else { - $this->anonymizer->set($pollId, $this->acl->getUserId()); - $comments = $this->anonymizer->getComments(); - $votes = $this->anonymizer->getVotes(); + // $this->poll = $this->pollService->get($pollId, $token); + // return new DataResponse($this->pollService->get($pollId, $token), Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } - } + try { + $comments = $this->commentService->list($this->acl->getPollId(), $token); + } catch (Exception $e) { + $comments = []; + } - return new DataResponse([ - 'acl' => $this->acl, - 'comments' => $comments, - 'options' => $options, - 'poll' => $this->poll, - 'shares' => $shares, - 'votes' => $votes - ], Http::STATUS_OK); + try { + $options = $this->optionService->list($this->acl->getPollId(), $token); + } catch (Exception $e) { + $options = []; + } - } catch (DoesNotExistException $e) { - $this->logger->info('Poll ' . $pollId . ' not found!', ['app' => 'polls']); - return new DataResponse(null, Http::STATUS_NOT_FOUND); - } - } + try { + $votes = $this->voteService->list($this->acl->getPollId(), $token); + } catch (Exception $e) { + $votes = []; + } - /** - * getByToken - * Read all options of a poll based on a share token and return list as array - * @NoAdminRequired - * @PublicPage - * @NoCSRFRequired - * @param string $token - * @return DataResponse - */ - public function getByToken($token) { try { - return $this->get($this->acl->setToken($token)->getPollId()); - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + $shares = $this->shareService->list($this->acl->getPollId()); + } catch (Exception $e) { + $shares = []; } - } + return new DataResponse([ + 'acl' => $acl, + 'poll' => $poll, + 'comments' => $comments, + 'options' => $options, + 'shares' => $shares, + 'votes' => $votes + ], Http::STATUS_OK); + } /** * delete @@ -245,29 +176,12 @@ */ public function delete($pollId) { - try { - // Find existing poll - $this->poll = $this->pollMapper->find($pollId); - $this->acl->setPollId($this->poll->getId()); - - if (!$this->acl->getAllowEdit()) { - $this->logger->alert('Unauthorized delete attempt from user ' . $this->userId); - return new DataResponse(['message' => 'Unauthorized write attempt.'], Http::STATUS_UNAUTHORIZED); - } - - if ($this->poll->getDeleted()) { - $this->poll->setDeleted(0); - } else { - $this->poll->setDeleted(time()); - } - - $this->pollMapper->update($this->poll); - $this->logService->setLog($this->poll->getId(), 'deletePoll'); - return new DataResponse(['deleted' => $pollId], Http::STATUS_OK); - - } catch (Exception $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + return new DataResponse($this->pollService->delete($pollId), Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } } @@ -280,27 +194,34 @@ */ public function deletePermanently($pollId) { - try { - // Find existing poll - $this->poll = $this->pollMapper->find($pollId); - $this->acl->setPollId($this->poll->getId()); - - if (!$this->acl->getAllowEdit()) { - $this->logger->alert('Unauthorized delete attempt from user ' . $this->userId); - return new DataResponse(['message' => 'Unauthorized write attempt.'], Http::STATUS_UNAUTHORIZED); - } + return new DataResponse($this->pollService->deletePermanently($pollId), Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } - if (!$this->poll->getDeleted()) { - $this->logger->alert('user ' . $this->userId . ' trying to permanently delete active poll'); - return new DataResponse(['message' => 'Permanent deletion of active poll.'], Http::STATUS_CONFLICT); - } - $this->pollMapper->delete($this->poll); - return new DataResponse([], Http::STATUS_OK); + /** + * add + * @NoAdminRequired + * @NoCSRFRequired + * @param string $type + * @param string $title + * @return DataResponse + */ - } catch (Exception $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + public function add($type, $title) { + try { + return new DataResponse($this->pollService->add($type, $title), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidPollTypeException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (EmptyTitleException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } } @@ -308,55 +229,24 @@ * write * @NoAdminRequired * @NoCSRFRequired - * @param Array $poll + * @param integer $pollId + * @param array $poll * @return DataResponse */ - public function write($poll) { - + public function update($pollId, $poll) { try { - // Find existing poll - $this->poll = $this->pollMapper->find($poll['id']); - $this->acl->setPollId($this->poll->getId()); - if (!$this->acl->getAllowEdit()) { - $this->logger->alert('Unauthorized write attempt from user ' . $this->userId); - return new DataResponse(['message' => 'Unauthorized write attempt.'], Http::STATUS_UNAUTHORIZED); - } - - } catch (Exception $e) { - $this->poll = new Poll(); - - $this->poll->setType($poll['type']); - $this->poll->setOwner($this->userId); - $this->poll->setCreated(time()); - } finally { - $this->poll->setTitle($poll['title']); - $this->poll->setDescription($poll['description']); - $this->poll->setAccess($poll['access']); - $this->poll->setExpire($poll['expire']); - $this->poll->setAnonymous(intval($poll['anonymous'])); - $this->poll->setFullAnonymous(0); - $this->poll->setAllowMaybe(intval($poll['allowMaybe'])); - $this->poll->setVoteLimit(intval($poll['voteLimit'])); - $this->poll->setSettings(''); - $this->poll->setOptions(''); - $this->poll->setShowResults($poll['showResults']); - $this->poll->setDeleted($poll['deleted']); - $this->poll->setAdminAccess($poll['adminAccess']); - - if ($this->poll->getId() > 0) { - $this->pollMapper->update($this->poll); - $this->logService->setLog($this->poll->getId(), 'updatePoll'); - } else { - $this->pollMapper->insert($this->poll); - $this->logService->setLog($this->poll->getId(), 'addPoll'); - } - return $this->get($this->poll->getId()); - // $this->acl->setPollId($this->poll->getId()); - // return new DataResponse([ - // 'poll' => $this->poll, - // 'acl' => $this->acl - // ], Http::STATUS_OK); + return new DataResponse($this->pollService->update($pollId, $poll), Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidAccessException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidShowResultsException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (EmptyTitleException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } } @@ -368,40 +258,13 @@ * @return DataResponse */ public function clone($pollId) { - $this->poll = $this->pollMapper->find($pollId); - - $clonePoll = new Poll(); - $clonePoll->setOwner($this->userId); - $clonePoll->setCreated(time()); - $clonePoll->setTitle('Clone of ' . $this->poll->getTitle()); - $clonePoll->setDeleted(0); - - $clonePoll->setType($this->poll->getType()); - $clonePoll->setDescription($this->poll->getDescription()); - $clonePoll->setAccess($this->poll->getAccess()); - $clonePoll->setExpire($this->poll->getExpire()); - $clonePoll->setAnonymous(intval($this->poll->getAnonymous())); - $clonePoll->setFullAnonymous(0); - $clonePoll->setAllowMaybe(intval($this->poll->getAllowMaybe())); - $clonePoll->setVoteLimit(intval($this->poll->getVoteLimit())); - $clonePoll->setSettings(''); - $clonePoll->setOptions(''); - $clonePoll->setShowResults($this->poll->getShowResults()); - $clonePoll->setAdminAccess($this->poll->getAdminAccess()); - - $this->pollMapper->insert($clonePoll); - $this->logService->setLog($clonePoll->getId(), 'addPoll'); - - foreach ($this->optionMapper->findByPoll($pollId) as $option) { - $newOption = new Option(); - $newOption->setPollId($clonePoll->getId()); - $newOption->setPollOptionText($option->getPollOptionText()); - $newOption->setTimestamp($option->getTimestamp()); - - $this->optionMapper->insert($newOption); + try { + return new DataResponse($this->pollService->clone($pollId), Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Poll not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } - return new DataResponse(['pollId' => $clonePoll->getId()], Http::STATUS_OK); - } } diff --git a/lib/Controller/ShareApiController.php b/lib/Controller/ShareApiController.php new file mode 100644 index 00000000..cceb7aa6 --- /dev/null +++ b/lib/Controller/ShareApiController.php @@ -0,0 +1,141 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Controller; + +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; +use OCA\Polls\Exceptions\InvalidUsername; + + +use OCP\IRequest; +use OCP\AppFramework\ApiController; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; + +use OCA\Polls\Service\ShareService; + +class ShareApiController extends ApiController { + + private $shareService; + + /** + * ShareController constructor. + * @param string $appName + * @param string $userId + * @param IRequest $request + * @param ShareService $shareService + */ + public function __construct( + string $appName, + IRequest $request, + ShareService $shareService + ) { + parent::__construct($appName, + $request, + 'POST, PUT, GET, DELETE', + 'Authorization, Content-Type, Accept', + 1728000); + $this->shareService = $shareService; + } + + /** + * list + * Read all shares of a poll based on the poll id and return list as array + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $pollId + * @return DataResponse + */ + public function list($pollId) { + try { + return new DataResponse(['shares' => $this->shareService->list($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'No shares for poll with id ' . $pollId . ' not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * get share by token + * Get pollId by token + * @NoAdminRequired + * @NoCSRFRequired + * @CORS + * @param string $token + * @return DataResponse + */ + public function get($token) { + try { + return new DataResponse(['share' => $this->shareService->get($token)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Token ' . $token . ' not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * Write a new share to the db and returns the new share as array + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param int $pollId + * @param string $type + * @param string $userId + * @param string $userEmail + * @return DataResponse + */ + public function add($pollId, $type, $userId = '', $userEmail = '') { + try { + return new DataResponse(['share' => $this->shareService->add($pollId, $type, $userId, $userEmail)], Http::STATUS_CREATED); + } catch (\Exception $e) { + return new DataResponse(['error' => $e], Http::STATUS_CONFLICT); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + + } + + /** + * delete share + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param string $token + * @return DataResponse + */ + + public function delete($token) { + try { + return new DataResponse(['share' => $this->shareService->remove($token)], Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (Exception $e) { + return new DataResponse($e, Http::STATUS_NOT_FOUND); + } + } +} diff --git a/lib/Controller/ShareController.php b/lib/Controller/ShareController.php index 99746a78..aa80cc3d 100644 --- a/lib/Controller/ShareController.php +++ b/lib/Controller/ShareController.php @@ -25,6 +25,8 @@ namespace OCA\Polls\Controller; use Exception; use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; +use OCA\Polls\Exceptions\InvalidUsername; use OCP\IRequest; @@ -33,105 +35,36 @@ use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCP\Security\ISecureRandom; -use OCA\Polls\Db\Poll; use OCA\Polls\Model\Acl; -use OCA\Polls\Db\PollMapper; -use OCA\Polls\Db\Share; -use OCA\Polls\Db\ShareMapper; -use OCA\Polls\Service\MailService; -// TODO: Change to Service -use OCA\Polls\Controller\SystemController; +use OCA\Polls\Service\ShareService; class ShareController extends Controller { private $logger; - private $acl; - private $mapper; + private $shareService; private $userId; - private $pollMapper; - private $systemController; - private $mailService; - /** * ShareController constructor. * @param string $appName * @param string $userId * @param IRequest $request * @param ILogger $logger - * @param ShareMapper $mapper - * @param PollMapper $pollMapper - * @param SystemController $systemController - * @param MailService $mailService - * @param Acl $acl + * @param ShareService $shareService */ public function __construct( string $appName, $userId, IRequest $request, ILogger $logger, - ShareMapper $mapper, - PollMapper $pollMapper, - SystemController $systemController, - MailService $mailService, - Acl $acl + ShareService $shareService ) { parent::__construct($appName, $request); $this->logger = $logger; $this->userId = $userId; - $this->mapper = $mapper; - $this->pollMapper = $pollMapper; - $this->systemController = $systemController; - $this->mailService = $mailService; - $this->acl = $acl; - } - - /** - * getByToken - * Get pollId by token - * @NoAdminRequired - * @NoCSRFRequired - * @PublicPage - * @param string $token - * @return DataResponse - */ - public function get($token) { - try { - $share = $this->mapper->findByToken($token); - return new DataResponse($share, Http::STATUS_OK); - - } catch (DoesNotExistException $e) { - return new DataResponse(null, Http::STATUS_NOT_FOUND); - } - } - - /** - * get - * Read all shares of a poll based on the poll id and return list as array - * @NoAdminRequired - * @NoCSRFRequired - * @param integer $pollId - * @return DataResponse - */ - public function getShares($pollId) { - if ($this->acl->setPollId($pollId)->getAllowEdit()) { - try { - $shares = $this->mapper->findByPoll($pollId); - return new DataResponse((array) $shares, Http::STATUS_OK); - - } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); - } - - } else { - $this->logger->alert('no access'); - - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - + $this->shareService = $shareService; } /** @@ -139,36 +72,20 @@ class ShareController extends Controller { * @NoAdminRequired * @NoCSRFRequired * @param int $pollId - * @param string $message + * @param Array $share * @return DataResponse */ - public function write($pollId, $share) { - $this->acl->setPollId($pollId); - if (!$this->acl->getAllowEdit()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - - $newShare = new Share(); - $newShare->setType($share['type']); - $newShare->setPollId($share['pollId']); - $newShare->setUserId($share['userId']); - $newShare->setUserEmail(isset($share['userEmail']) ? $share['userEmail'] : ''); - $newShare->setToken(\OC::$server->getSecureRandom()->generate( - 16, - ISecureRandom::CHAR_DIGITS . - ISecureRandom::CHAR_LOWER . - ISecureRandom::CHAR_UPPER - )); - + public function add($pollId, $share) { try { - $newShare = $this->mapper->insert($newShare); - $sendResult = $this->mailService->sendInvitationMail($newShare->getToken()); - - return new DataResponse([ - 'share' => $newShare, - 'sendResult' => $sendResult - ], Http::STATUS_OK); - + $return = $this->shareService->write( + $pollId, + $share['type'], + $share['userId'], + isset($share['userEmail']) ? $share['userEmail'] : '' + ); + return new DataResponse($return, Http::STATUS_CREATED); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (\Exception $e) { return new DataResponse($e, Http::STATUS_CONFLICT); } @@ -181,50 +98,18 @@ class ShareController extends Controller { * @NoAdminRequired * @PublicPage * @NoCSRFRequired - * @param int $pollId - * @param string $message + * @param string $token + * @param string $userName * @return DataResponse */ public function createPersonalShare($token, $userName) { try { - $publicShare = $this->mapper->findByToken($token); - - // Return of validatePublicUsername is a DataResponse - $checkUsername = $this->systemController->validatePublicUsername($publicShare->getPollId(), $userName, $token); - - // if status is not 200, return DataResponse from validatePublicUsername - if ($checkUsername->getStatus() !== 200) { - return $checkUsername; - } - - if ($publicShare->getType() === 'public') { - - $userShare = new Share(); - $userShare->setToken(\OC::$server->getSecureRandom()->generate( - 16, - ISecureRandom::CHAR_DIGITS . - ISecureRandom::CHAR_LOWER . - ISecureRandom::CHAR_UPPER - )); - $userShare->setType('external'); - $userShare->setPollId($publicShare->getPollId()); - $userShare->setUserId($userName); - $userShare->setUserEmail(''); - $userShare = $this->mapper->insert($userShare); - return new DataResponse($userShare, Http::STATUS_OK); - - } elseif ($publicShare->getType() === 'email') { - - $publicShare->setType('external'); - $publicShare->setUserId($userName); - $this->mapper->update($publicShare); - return new DataResponse($publicShare, Http::STATUS_OK); - - } else { - return new DataResponse(['message'=> 'Wrong share type: ' . $publicShare->getType()], Http::STATUS_FORBIDDEN); - } - + return new DataResponse($this->shareService->createPersonalShare($token, $userName), Http::STATUS_CREATED); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } catch (InvalidUsername $e) { + return new DataResponse(['error' => $userName . ' is not valid'], Http::STATUS_CONFLICT); } catch (DoesNotExistException $e) { // return forbidden in all not catched error cases return new DataResponse($e, Http::STATUS_FORBIDDEN); @@ -240,19 +125,14 @@ class ShareController extends Controller { * @return DataResponse */ - public function remove($share) { + public function delete($share) { try { - if ($this->acl->setPollId($share['pollId'])->getAllowEdit()) { - $this->mapper->remove($share['id']); - - return new DataResponse(array( - 'action' => 'deleted', - 'shareId' => $share['id'] - ), Http::STATUS_OK); - } else { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - + return new DataResponse(array( + 'action' => 'deleted', + 'shareId' => $this->shareService->remove($share['token'])->getId() + ), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (Exception $e) { return new DataResponse($e, Http::STATUS_NOT_FOUND); } diff --git a/lib/Controller/SubscriptionApiController.php b/lib/Controller/SubscriptionApiController.php new file mode 100644 index 00000000..3a23d403 --- /dev/null +++ b/lib/Controller/SubscriptionApiController.php @@ -0,0 +1,118 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Controller; + +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCP\IRequest; +use OCP\ILogger; + +use OCP\AppFramework\ApiController; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; + +use OCA\Polls\Service\SubscriptionService; + +class SubscriptionApiController extends ApiController { + + private $userId; + private $subscriptionService; + private $logger; + + /** + * SubscriptionController constructor. + * @param string $appName + * @param $UserId + * @param SubscriptionService $subscriptionService + * @param IRequest $request + * @param ILogger $logger + */ + + public function __construct( + string $appName, + $userId, + SubscriptionService $subscriptionService, + IRequest $request, + ILogger $logger + + ) { + parent::__construct($appName, + $request, + 'PUT, GET, DELETE', + 'Authorization, Content-Type, Accept', + 1728000); + $this->userId = $userId; + $this->subscriptionService = $subscriptionService; + $this->logger = $logger; + } + + /** + * @NoAdminRequired + * CORS + * @NoCSRFRequired + * @param integer $pollId + * @return DataResponse + */ + public function get($pollId) { + try { + $this->subscriptionService->get($pollId); + return new DataResponse(['status' => 'Subscribed to poll ' . $pollId], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['status' => 'Not subscribed to poll ' . $pollId], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $pollId + */ + public function subscribe($pollId) { + try { + $this->subscriptionService->set($pollId, true); + return new DataResponse(['status' => 'Subscribed to poll ' . $pollId], Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + /** + * @NoAdminRequired + * @CORS + * @NoCSRFRequired + * @param integer $pollId + */ + public function unsubscribe($pollId) { + try { + $this->subscriptionService->set($pollId, false); + return new DataResponse(['status' => 'Unsubscribed from poll ' . $pollId], Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } +} diff --git a/lib/Controller/SubscriptionController.php b/lib/Controller/SubscriptionController.php index 8a5bf445..e90f4a66 100644 --- a/lib/Controller/SubscriptionController.php +++ b/lib/Controller/SubscriptionController.php @@ -25,29 +25,27 @@ namespace OCA\Polls\Controller; use Exception; use OCP\AppFramework\Db\DoesNotExistException; -use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCA\Polls\Exceptions\NotAuthorizedException; use OCP\IRequest; use OCP\ILogger; - use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCA\Polls\Db\Subscription; -use OCA\Polls\Db\SubscriptionMapper; +use OCA\Polls\Service\SubscriptionService; class SubscriptionController extends Controller { private $userId; - private $mapper; + private $subscriptionService; private $logger; /** * SubscriptionController constructor. * @param string $appName * @param $UserId - * @param SubscriptionMapper $mapper + * @param SubscriptionService $subscriptionService * @param IRequest $request * @param ILogger $logger */ @@ -55,14 +53,14 @@ class SubscriptionController extends Controller { public function __construct( string $appName, $userId, - SubscriptionMapper $mapper, + SubscriptionService $subscriptionService, IRequest $request, ILogger $logger ) { parent::__construct($appName, $request); $this->userId = $userId; - $this->mapper = $mapper; + $this->subscriptionService = $subscriptionService; $this->logger = $logger; } @@ -73,19 +71,13 @@ class SubscriptionController extends Controller { * @return DataResponse */ public function get($pollId) { - - if (!\OC::$server->getUserSession()->isLoggedIn()) { - return new DataResponse(null, Http::STATUS_UNAUTHORIZED); - } - try { - $this->mapper->findByUserAndPoll($pollId, $this->userId); - } catch (MultipleObjectsReturnedException $e) { - // should not happen, but who knows + return new DataResponse($this->subscriptionService->get($pollId), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (DoesNotExistException $e) { - return new DataResponse(null, Http::STATUS_NOT_FOUND); + return new DataResponse(['status' => 'Not subscribed'], Http::STATUS_NOT_FOUND); } - return new DataResponse(null, Http::STATUS_OK); } /** @@ -94,15 +86,10 @@ class SubscriptionController extends Controller { * @param integer $pollId */ public function set($pollId, $subscribed) { - if ($subscribed) { - $subscription = new Subscription(); - $subscription->setPollId($pollId); - $subscription->setUserId($this->userId); - $this->mapper->insert($subscription); - return true; - } else { - $this->mapper->unsubscribe($pollId, $this->userId); - return false; + try { + return new DataResponse($this->subscriptionService->set($pollId, $subscribed), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } } } diff --git a/lib/Controller/SystemController.php b/lib/Controller/SystemController.php index 9c8326cf..d4c15963 100644 --- a/lib/Controller/SystemController.php +++ b/lib/Controller/SystemController.php @@ -148,8 +148,9 @@ class SystemController extends Controller { } if ($getUsers) { - foreach ($this->userManager->searchDisplayName($query) as $user) { - if (!in_array($user->getUID(), $skipUsers)) { + $users = $this->userManager->searchDisplayName($query); + foreach ($users as $user) { + if (!in_array($user->getUID(), $skipUsers) && $user->isEnabled()) { $list[] = [ 'id' => $user->getUID(), 'user' => $user->getUID(), diff --git a/lib/Controller/VoteApiController.php b/lib/Controller/VoteApiController.php new file mode 100644 index 00000000..21d7762d --- /dev/null +++ b/lib/Controller/VoteApiController.php @@ -0,0 +1,105 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Controller; + +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCP\IRequest; +use OCP\ILogger; +use OCP\AppFramework\ApiController; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; + +use OCA\Polls\Service\VoteService; + +class VoteApiController extends ApiController { + + private $logger; + private $voteService; + + /** + * VoteController constructor. + * @param string $appName + * @param IRequest $request + * @param ILogger $logger + * @param VoteService $voteService + */ + public function __construct( + string $appName, + IRequest $request, + ILogger $logger, + VoteService $voteService + ) { + parent::__construct($appName, + $request, + 'PUT, GET, DELETE', + 'Authorization, Content-Type, Accept', + 1728000); + $this->voteService = $voteService; + $this->logger = $logger; + } + + /** + * Get all votes of given poll + * Read all votes of a poll based on the poll id and return list as array + * @NoAdminRequired + * @NoCSRFRequired + * @CORS + * @param integer $pollId + * @return DataResponse + */ + public function list($pollId) { + try { + return new DataResponse(['votes' => $this->voteService->list($pollId)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'No votes'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + } + + /** + * set + * @NoAdminRequired + * @NoCSRFRequired + * @CORS + * @param integer $pollId + * @param Array $option + * @param string $userId + * @param string $setTo + * @return DataResponse + */ + public function set($pollId, $pollOptionText, $setTo) { + try { + return new DataResponse(['vote' => $this->voteService->set($pollId, $pollOptionText, $setTo)], Http::STATUS_OK); + } catch (DoesNotExistException $e) { + return new DataResponse(['error' => 'Option not found'], Http::STATUS_NOT_FOUND); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); + } + + } +} diff --git a/lib/Controller/VoteController.php b/lib/Controller/VoteController.php index ad8936bd..f666c004 100644 --- a/lib/Controller/VoteController.php +++ b/lib/Controller/VoteController.php @@ -23,77 +23,41 @@ namespace OCA\Polls\Controller; -use Exception; +// use Exception; use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; - -use OCP\IRequest; use OCP\ILogger; +use OCP\IRequest; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCP\IGroupManager; +use OCA\Polls\Service\VoteService; -use OCA\Polls\Db\Poll; -use OCA\Polls\Db\PollMapper; -use OCA\Polls\Db\Vote; -use OCA\Polls\Db\VoteMapper; -use OCA\Polls\Db\Share; -use OCA\Polls\Db\ShareMapper; -use OCA\Polls\Service\AnonymizeService; -use OCA\Polls\Service\LogService; -use OCA\Polls\Model\Acl; class VoteController extends Controller { - private $userId; + private $voteService; private $logger; - private $mapper; - private $groupManager; - private $pollMapper; - private $shareMapper; - private $anonymizer; - private $logService; - private $acl; /** * VoteController constructor. * @param string $appName - * @param $userId * @param IRequest $request * @param ILogger $logger - * @param VoteMapper $mapper - * @param IGroupManager $groupManager - * @param PollMapper $pollMapper - * @param ShareMapper $shareMapper - * @param AnonymizeService $anonymizer - * @param LogService $logService - * @param Acl $acl + * @param VoteService $voteService + */ public function __construct( string $appName, - $UserId, - IRequest $request, ILogger $logger, - VoteMapper $mapper, - IGroupManager $groupManager, - PollMapper $pollMapper, - ShareMapper $shareMapper, - AnonymizeService $anonymizer, - LogService $logService, - Acl $acl + IRequest $request, + VoteService $voteService ) { parent::__construct($appName, $request); - $this->userId = $UserId; - $this->mapper = $mapper; $this->logger = $logger; - $this->groupManager = $groupManager; - $this->pollMapper = $pollMapper; - $this->shareMapper = $shareMapper; - $this->anonymizer = $anonymizer; - $this->logService = $logService; - $this->acl = $acl; + $this->voteService = $voteService; } /** @@ -105,26 +69,13 @@ class VoteController extends Controller { * @return DataResponse */ public function get($pollId) { - try { - - if (!$this->acl->getFoundByToken()) { - $this->acl->setPollId($pollId); - } - - if (!$this->acl->getAllowSeeResults()) { - return new DataResponse((array) $this->mapper->findByPollAndUser($pollId, $this->acl->getUserId()), Http::STATUS_OK); - } elseif (!$this->acl->getAllowSeeUsernames()) { - $this->anonymizer->set($pollId, $this->acl->getUserId()); - return new DataResponse((array) $this->anonymizer->getVotes(), Http::STATUS_OK); - } else { - return new DataResponse((array) $this->mapper->findByPoll($pollId), Http::STATUS_OK); - } - + return new DataResponse($this->voteService->list($pollId), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + return new DataResponse(['error' => 'No votes'], Http::STATUS_NOT_FOUND); } - } /** @@ -137,28 +88,13 @@ class VoteController extends Controller { * @param string $setTo * @return DataResponse */ - public function set($pollId, $option, $userId, $setTo) { - + public function set($pollId, $option, $setTo) { try { - $vote = $this->mapper->findSingleVote($pollId, $option['pollOptionText'], $userId); - $vote->setVoteAnswer($setTo); - $this->mapper->update($vote); - + return new DataResponse($this->voteService->set($pollId, $option['pollOptionText'], $setTo), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (DoesNotExistException $e) { - // Vote does not exist, insert as new Vote - $vote = new Vote(); - - $vote->setPollId($pollId); - $vote->setUserId($userId); - $vote->setVoteOptionText($option['pollOptionText']); - $vote->setVoteOptionId($option['id']); - $vote->setVoteAnswer($setTo); - - $this->mapper->insert($vote); - - } finally { - $this->logService->setLog($vote->getPollId(), 'setVote', $vote->getUserId()); - return new DataResponse($vote, Http::STATUS_OK); + return new DataResponse(['error' => 'Option not found'], Http::STATUS_NOT_FOUND); } } @@ -172,27 +108,13 @@ class VoteController extends Controller { * @param integer $pollId * @return DataResponse */ - public function delete($voteId = 0, $userId = '', $pollId = 0) { - $this->logger->alert('Deleting vote no. ' . $voteId); - + public function delete($userId, $pollId) { try { - if ($voteId) { - $vote = $this->mapper->delete($voteId); - $this->logger->alert('Deleting vote no. ' . $voteId); - return new DataResponse(null, Http::STATUS_OK); - } elseif ($pollId && $userId) { - $votes = $this->mapper->deleteByPollAndUser($pollId, $userId); - $this->logger->alert('Deleting votes from ' . $userId . ' in poll ' . $pollId); - return new DataResponse(null, Http::STATUS_OK); - } elseif ($pollId) { - $votes = $this->mapper->deleteByPoll($pollId); - $this->logger->alert('Deleting all votes in poll ' . $pollId); - return new DataResponse(null, Http::STATUS_OK); - } else { - return DataResponse(null, Http::STATUS_NOT_FOUND); - } + return new DataResponse($this->voteService->delete($pollId, $userId), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (DoesNotExistException $e) { - return DataResponse(null, Http::STATUS_NOT_FOUND); + return new DataResponse(['error' => ''], Http::STATUS_NOT_FOUND); } } @@ -212,13 +134,13 @@ class VoteController extends Controller { */ public function setByToken($option, $setTo, $token) { try { - $this->acl->setToken($token); + return new DataResponse($this->voteService->set(0, $option['pollOptionText'], $setTo, $token), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + return new DataResponse(['error' => 'Option not found'], Http::STATUS_NOT_FOUND); } - return $this->set($this->acl->getPollId(), $option, $this->acl->getUserId(), $setTo); - } /** @@ -231,15 +153,14 @@ class VoteController extends Controller { * @return DataResponse */ public function getByToken($token) { - try { - $this->acl->setToken($token); + return new DataResponse($this->voteService->list(null, $token), Http::STATUS_OK); + } catch (NotAuthorizedException $e) { + return new DataResponse(['error' => $e->getMessage()], $e->getStatus()); } catch (DoesNotExistException $e) { - return new DataResponse($e, Http::STATUS_NOT_FOUND); + return new DataResponse(['error' => 'No votes'], Http::STATUS_NOT_FOUND); } - return $this->get($this->acl->getPollId()); - } } diff --git a/lib/Db/OptionMapper.php b/lib/Db/OptionMapper.php index 07f024d9..3044c90c 100644 --- a/lib/Db/OptionMapper.php +++ b/lib/Db/OptionMapper.php @@ -76,6 +76,28 @@ class OptionMapper extends QBMapper { } /** + * @param int $pollId + * @throws \OCP\AppFramework\Db\DoesNotExistException if not found + * @return array + */ + + public function findByPollAndText($pollId, $pollOptionText) { + $qb = $this->db->getQueryBuilder(); + + $qb->select('*') + ->from($this->getTableName()) + ->where( + $qb->expr()->eq('poll_id', $qb->createNamedParameter($pollId, IQueryBuilder::PARAM_INT)) + ) + ->andWhere( + $qb->expr()->eq('poll_option_text', $qb->createNamedParameter($pollOptionText, IQueryBuilder::PARAM_STR)) + ) + ->orderBy('order', 'ASC'); + + return $this->findEntity($qb); + } + + /** * @param int $optionId */ public function remove($optionId) { diff --git a/lib/Db/Poll.php b/lib/Db/Poll.php index 55b12fa2..8fa2d056 100644 --- a/lib/Db/Poll.php +++ b/lib/Db/Poll.php @@ -135,6 +135,20 @@ class Poll extends Entity implements JsonSerializable { ]; } + public function deserializeArray($array) { + $this->setTitle(isset($array['title']) ? $array['title'] : $this->getTitle()); + $this->setDescription(isset($array['description']) ? $array['description'] : $this->getDescription()); + $this->setAccess(isset($array['access']) ? $array['access'] : $this->getAccess()); + $this->setExpire(isset($array['expire']) ? $array['expire'] : $this->getExpire()); + $this->setAnonymous(isset($array['anonymous']) ? $array['anonymous'] : $this->getAnonymous()); + $this->setAllowMaybe(isset($array['allowMaybe']) ? $array['allowMaybe'] : $this->getAllowMaybe()); + $this->setVoteLimit(isset($array['voteLimit']) ? $array['voteLimit'] : $this->getVoteLimit()); + $this->setShowResults(isset($array['showResults']) ? $array['showResults'] : $this->getShowResults()); + $this->setDeleted(isset($array['deleted']) ? $array['deleted'] : $this->getDeleted()); + $this->setAdminAccess(isset($array['adminAccess']) ? $array['adminAccess'] : $this->getAdminAccess()); + return $this; + } + private function getDisplayName() { if (\OC::$server->getUserManager()->get($this->owner) instanceof IUser) { diff --git a/lib/Db/ShareMapper.php b/lib/Db/ShareMapper.php index 7de17583..3a4408f3 100644 --- a/lib/Db/ShareMapper.php +++ b/lib/Db/ShareMapper.php @@ -31,7 +31,7 @@ use OCP\AppFramework\Db\QBMapper; class ShareMapper extends QBMapper { /** - * CommentMapper constructor. + * ShareMapper constructor. * @param IDBConnection $db */ public function __construct(IDBConnection $db) { diff --git a/lib/Exceptions/EmptyTitleException.php b/lib/Exceptions/EmptyTitleException.php new file mode 100644 index 00000000..acfc4c57 --- /dev/null +++ b/lib/Exceptions/EmptyTitleException.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class EmptyTitleException extends \Exception { + /** + * EmptyTitleException Constructor + * @param string $e exception message + */ + public function __construct($message = 'Poll title must not be empty') { + parent::__construct($message); + } + public function getStatus() { + return Http::STATUS_CONFLICT; + } + +} diff --git a/lib/Exceptions/InvalidAccessException.php b/lib/Exceptions/InvalidAccessException.php new file mode 100644 index 00000000..c5bfd69a --- /dev/null +++ b/lib/Exceptions/InvalidAccessException.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class InvalidAccessException extends \Exception { + /** + * InvalidAccessException Constructor + * @param string $e exception message + */ + public function __construct($message = 'Invalid access value') { + parent::__construct($message); + } + public function getStatus() { + return Http::STATUS_CONFLICT; + } + +} diff --git a/lib/Exceptions/InvalidPollTypeException.php b/lib/Exceptions/InvalidPollTypeException.php new file mode 100644 index 00000000..bef690f3 --- /dev/null +++ b/lib/Exceptions/InvalidPollTypeException.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class InvalidPollTypeException extends \Exception { + /** + * InvalidPollTypeException Constructor + * @param string $e exception message + */ + public function __construct($message = 'Invalid pollType value') { + parent::__construct($message); + } + public function getStatus() { + return Http::STATUS_CONFLICT; + } + +} diff --git a/lib/Exceptions/InvalidShowResultsException.php b/lib/Exceptions/InvalidShowResultsException.php new file mode 100644 index 00000000..67b18a49 --- /dev/null +++ b/lib/Exceptions/InvalidShowResultsException.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class InvalidShowResultsException extends \Exception { + /** + * InvalidShowResultsException Constructor + * @param string $e exception message + */ + public function __construct($message = 'Invalid showResults value') { + parent::__construct($message); + } + public function getStatus() { + return Http::STATUS_CONFLICT; + } + +} diff --git a/lib/Exceptions/InvalidUsername.php b/lib/Exceptions/InvalidUsername.php new file mode 100644 index 00000000..b75c8ea0 --- /dev/null +++ b/lib/Exceptions/InvalidUsername.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class InvalidUsername extends \Exception { + /** + * InvalidUsername Constructor + * @param string $e exception message + */ + public function __construct($e = 'Invalid username') { + parent::__construct($e); + } + public function getStatus() { + return Http::STATUS_CONFLICT; + } + +} diff --git a/lib/Exceptions/NotAuthorizedException.php b/lib/Exceptions/NotAuthorizedException.php new file mode 100644 index 00000000..9486790f --- /dev/null +++ b/lib/Exceptions/NotAuthorizedException.php @@ -0,0 +1,40 @@ +<?php +/** + * @copyright Copyright (c) 2020 René Gieling <github@dartcafe.de> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Exceptions; + +use OCP\AppFramework\Http; + +class NotAuthorizedException extends \Exception { + /** + * NotAuthorizedException Constructor + * @param string $e exception message + */ + public function __construct($e = 'Unauthorized') { + parent::__construct($e); + } + public function getStatus() { + return Http::STATUS_FORBIDDEN; + } + +} diff --git a/lib/Model/Acl.php b/lib/Model/Acl.php index 2c42980a..ebc998f2 100644 --- a/lib/Model/Acl.php +++ b/lib/Model/Acl.php @@ -136,6 +136,37 @@ class Acl implements JsonSerializable { } } + + /** + * @NoAdminRequired + * @return boolean + */ + public function setPollIdOrToken($pollId = 0, $token = '') { + + if ($token) { + $this->setToken($token); + } elseif ($pollId) { + $this->setPollId($pollId); + } + + return $this; + } + + /** + * @NoAdminRequired + * @return boolean + */ + public function checkAuthorize($pollId = 0, $token = '') { + + if ($token) { + $this->setToken($token); + } elseif ($pollId) { + $this->setPollId($pollId); + } + + return ($this->userId && $this->poll->getId()); + } + /** * @NoAdminRequired * @return string @@ -372,12 +403,14 @@ class Acl implements JsonSerializable { * @return string */ public function setToken(string $token): Acl { + $this->logger->debug('Share PollId' . $token); try { $this->token = $token; $share = $this->shareMapper->findByToken($token); $this->foundByToken = true; $this->setPollId($share->getPollId()); + $this->logger->debug('Share PollId' . $share->getPollId()); if (($share->getType() === 'group' || $share->getType() === 'user') && !\OC::$server->getUserSession()->isLoggedIn()) { // User must be logged in for shareType user and group diff --git a/lib/Service/CommentService.php b/lib/Service/CommentService.php new file mode 100644 index 00000000..a1cd7131 --- /dev/null +++ b/lib/Service/CommentService.php @@ -0,0 +1,144 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Service; + +use \Exception; +use OCP\ILogger; + +use OCA\Polls\Exceptions\NotAuthorizedException; +use OCA\Polls\Db\Comment; +use OCA\Polls\Db\CommentMapper; +use OCA\Polls\Model\Acl; +use OCA\Polls\Service\AnonymizeService; + + + +class CommentService { + + private $comment; + private $commentMapper; + private $logger; + private $anonymizer; + private $acl; + + /** + * CommentService constructor. + * @param ILogger $logger + * @param CommentMapper $commentMapper + * @param Comment $comment + * @param AnonymizeService $anonymizer + * @param Acl $acl + */ + + public function __construct( + ILogger $logger, + CommentMapper $commentMapper, + Comment $comment, + AnonymizeService $anonymizer, + Acl $acl + ) { + $this->commentMapper = $commentMapper; + $this->comment = $comment; + $this->logger = $logger; + $this->anonymizer = $anonymizer; + $this->acl = $acl; + } + + /** + * get + * Read all comments of a poll based on the poll id and return list as array + * @NoAdminRequired + * @param integer $pollId + * @param string $token + * @return Array + */ + public function list($pollId = 0, $token = '') { + + if (!$this->acl->setPollIdOrToken($pollId, $token)->getAllowView()) { + throw new NotAuthorizedException; + } + + if (!$this->acl->getAllowSeeUsernames()) { + $this->anonymizer->set($this->acl->getPollId(), $this->acl->getUserId()); + return $this->anonymizer->getComments(); + } else { + return $this->commentMapper->findByPoll($this->acl->getPollId()); + } + } + + /** + * Write a new comment to the db and returns the new comment as array + * @NoAdminRequired + * @param string $message + * @param int $pollId + * @param string $token + * @return Comment + */ + public function add($pollId = 0, $message, $token = '') { + + if (!$this->acl->setPollIdOrToken($pollId, $token)->getAllowComment()) { + throw new NotAuthorizedException; + } + + try { + if ($this->acl->getAllowComment()) { + $this->comment = new Comment(); + $this->comment->setPollId($this->acl->getPollId()); + $this->comment->setUserId($this->acl->getUserId()); + $this->comment->setComment($message); + $this->comment->setDt(date('Y-m-d H:i:s')); + $this->comment = $this->commentMapper->insert($this->comment); + return $this->comment; + } else { + throw new NotAuthorizedException; + } + + } catch (\Exception $e) { + $this->logger->alert('Error writing comment for pollId ' . $pollId . ': '. $e); + throw new NotAuthorizedException($e); + } + + } + + /** + * delete + * Delete Comment + * @NoAdminRequired + * @param int $commentId + * @param string $token + * @return Comment + */ + public function delete($commentId, $token = '') { + $this->comment = $this->commentMapper->find($commentId); + + if ($this->acl->setPollIdOrToken($this->comment->getPollId(), $token)->getUserId() !== $this->acl->getUserId()) { + throw new NotAuthorizedException; + } + + $this->commentMapper->delete($this->comment); + return $this->comment; + + } + +} diff --git a/lib/Service/MailService.php b/lib/Service/MailService.php index e95f8784..915632f6 100644 --- a/lib/Service/MailService.php +++ b/lib/Service/MailService.php @@ -352,7 +352,7 @@ class MailService { foreach ($log as $logItem) { if ($logItem->getPollId() === $subscription->getPollId()) { - if ($poll->getAnonymous()) { + if ($poll->getAnonymous() || $poll->getShowResults() !== "always") { $displayUser = "A user"; } elseif ($this->userManager->get($logItem->getUserId()) instanceof IUser) { $displayUser = $this->userManager->get($logItem->getUserId())->getDisplayName(); diff --git a/lib/Service/OptionService.php b/lib/Service/OptionService.php new file mode 100644 index 00000000..0afe4b8c --- /dev/null +++ b/lib/Service/OptionService.php @@ -0,0 +1,216 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Service; + +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCA\Polls\Db\Option; +use OCA\Polls\Db\OptionMapper; +use OCA\Polls\Service\LogService; +use OCA\Polls\Model\Acl; + +class OptionService { + + private $optionMapper; + private $option; + private $logService; + private $acl; + + /** + * OptionController constructor. + * @param OptionMapper $optionMapper + * @param Option $option + * @param LogService $logService + * @param Acl $acl + */ + + public function __construct( + OptionMapper $optionMapper, + Option $option, + LogService $logService, + Acl $acl + ) { + $this->optionMapper = $optionMapper; + $this->option = $option; + $this->logService = $logService; + $this->acl = $acl; + } + + /** + * Set properties from option array + * @NoAdminRequired + * @param Array $option + */ + private function set($option) { + + $this->option->setPollId($option['pollId']); + $this->option->setPollOptionText(trim(htmlspecialchars($option['pollOptionText']))); + $this->option->setTimestamp($option['timestamp']); + + if ($option['timestamp']) { + $this->option->setOrder($option['timestamp']); + } else { + $this->option->setOrder($option['order']); + } + + if ($option['confirmed']) { + // do not update confirmation date, if option is already confirmed + if (!$this->option->getConfirmed()) { + $this->option->setConfirmed(time()); + } + } else { + $this->option->setConfirmed(0); + } + } + + /** + * Get all options of given poll + * @NoAdminRequired + * @param integer $pollId + * @param string $token + * @return array Array of Option objects + */ + public function list($pollId = 0, $token = '') { + + if (!$this->acl->setPollIdOrToken($pollId, $token)->getAllowView()) { + throw new NotAuthorizedException; + } + + return $this->optionMapper->findByPoll($pollId); + + } + + + /** + * Add a new Option to poll + * @NoAdminRequired + * @param Array $option + * @return Option + */ + public function add($option) { + + if (!$this->acl->setPollId($option['pollId'])->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $this->option = new Option(); + $this->set($option); + $this->optionMapper->insert($this->option); + $this->logService->setLog($option['pollId'], 'addOption'); + + return $this->option; + } + + /** + * Remove a single option + * @NoAdminRequired + * @param Option $option + * @return array Array of Option objects + */ + public function delete($optionId) { + $this->option = $this->optionMapper->find($optionId); + + if (!$this->acl->setPollId($this->option->getPollId())->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $this->optionMapper->delete($this->option); + + return $this->option; + + } + + /** + * Update poll option + * @NoAdminRequired + * @param array $option + * @return Option + */ + public function update($option) { + if (!$this->acl->setPollId($option['pollId'])->getAllowEdit()) { + throw new NotAuthorizedException; + } + + try { + $this->option = $this->optionMapper->find($option['id']); + $this->set($option); + $this->optionMapper->update($this->option); + $this->logService->setLog($option['pollId'], 'updateOption'); + + return $this->option; + } catch (Exception $e) { + return new DoesNotExistException($e); + } + + } + + /** + * Set order by order of the given array + * @NoAdminRequired + * @param array $options + * @return array Array of Option objects + */ + public function reorder($pollId, $options) { + + if (!$this->acl->setPollId($pollId)->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $i = 0; + foreach ($options as $option) { + $this->option = $this->optionMapper->find($option['id']); + if ($pollId === intval($this->option->getPollId())) { + $this->option->setOrder(++$i); + $this->optionMapper->update($this->option); + } + } + + return $this->optionMapper->findByPoll($pollId); + + } + + /** + * Set order by order of the given array + * @NoAdminRequired + * @param integer $fromPollId + * @param integer $toPollId + * @return array Array of Option objects + */ + public function clone($fromPollId, $toPollId) { + + if (!$this->acl->setPollId($fromPollId)->getAllowView()) { + throw new NotAuthorizedException; + } + + foreach ($this->optionMapper->findByPoll($fromPollId) as $option) { + $option->setPollId($toPollId); + $this->optionMapper->insert($option); + } + + return $this->optionMapper->findByPoll($toPollId); + + } +} diff --git a/lib/Service/PollService.php b/lib/Service/PollService.php new file mode 100644 index 00000000..d23c8595 --- /dev/null +++ b/lib/Service/PollService.php @@ -0,0 +1,308 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + namespace OCA\Polls\Service; + + use Exception; + use OCP\AppFramework\Db\DoesNotExistException; + use OCA\Polls\Exceptions\EmptyTitleException; + use OCA\Polls\Exceptions\InvalidAccessException; + use OCA\Polls\Exceptions\InvalidShowResultsException; + use OCA\Polls\Exceptions\InvalidPollTypeException; + use OCA\Polls\Exceptions\NotAuthorizedException; + + use OCP\ILogger; + + use OCA\Polls\Db\PollMapper; + use OCA\Polls\Db\Poll; + use OCA\Polls\Service\LogService; + use OCA\Polls\Model\Acl; + + class PollService { + + private $logger; + private $pollMapper; + private $poll; + private $logService; + private $acl; + + /** + * PollController constructor. + * @param ILogger $logger + * @param PollMapper $pollMapper + * @param Poll $poll + * @param LogService $logService + * @param Acl $acl + */ + + public function __construct( + ILogger $logger, + PollMapper $pollMapper, + Poll $poll, + LogService $logService, + Acl $acl + ) { + $this->logger = $logger; + $this->pollMapper = $pollMapper; + $this->poll = $poll; + $this->logService = $logService; + $this->acl = $acl; + } + + + /** + * list + * @NoAdminRequired + * @return array + */ + + public function list() { + if (!\OC::$server->getUserSession()->isLoggedIn()) { + throw new NotAuthorizedException; + } + + $pollList = []; + + $polls = $this->pollMapper->findAll(); + // TODO: Not the elegant way. Improvement neccessary + foreach ($polls as $poll) { + $combinedPoll = (object) array_merge( + (array) json_decode(json_encode($poll)), (array) json_decode(json_encode($this->acl->setPollId($poll->getId())))); + if ($combinedPoll->allowView) { + $pollList[] = $combinedPoll; + } + } + + return $pollList; + } + + /** + * get + * @NoAdminRequired + * @param integer $pollId + * @return array + */ + public function get($pollId) { + + if (!$this->acl->setPollId($pollId)->getAllowView()) { + throw new NotAuthorizedException; + } + + return $this->pollMapper->find($pollId); + + } + + /** + * get + * @NoAdminRequired + * @param integer $pollId + * @return array + */ + public function getByToken($token) { + + if (!$this->acl->setToken($token)->getAllowView()) { + throw new NotAuthorizedException; + } + + return $this->pollMapper->find($this->acl->getPollId()); + + } + + /** + * delete + * @NoAdminRequired + * @NoCSRFRequired + * @param integer $pollId + * @return Poll + */ + + public function delete($pollId) { + $this->poll = $this->pollMapper->find($pollId); + + if (!$this->acl->setPollId($pollId)->getAllowEdit()) { + throw new NotAuthorizedException; + } + + if ($this->poll->getDeleted()) { + $this->poll->setDeleted(0); + } else { + $this->poll->setDeleted(time()); + } + + $this->poll = $this->pollMapper->update($this->poll); + $this->logService->setLog($this->poll->getId(), 'deletePoll'); + + return $this->poll; + } + + /** + * deletePermanently + * @NoAdminRequired + * @NoCSRFRequired + * @param integer $pollId + * @return Poll + */ + + public function deletePermanently($pollId) { + $this->poll = $this->pollMapper->find($pollId); + + if (!$this->acl->setPollId($pollId)->getAllowEdit() || !$this->poll->getDeleted()) { + throw new NotAuthorizedException; + } + + return $this->pollMapper->delete($this->poll); + } + + /** + * write + * @NoAdminRequired + * @NoCSRFRequired + * @param string $type + * @param string $title + * @return Poll + */ + + public function add($type, $title) { + if (!\OC::$server->getUserSession()->isLoggedIn()) { + throw new NotAuthorizedException; + } + + // Validate valuess + if (!in_array($type, $this->getValidPollType())) { + throw new InvalidPollTypeException('Invalid poll type'); + } + + if (!$title) { + throw new EmptyTitleException('Title must not be empty'); + } + + $this->poll = new Poll(); + $this->poll->setType($type); + $this->poll->setCreated(time()); + $this->poll->setOwner(\OC::$server->getUserSession()->getUser()->getUID()); + $this->poll->setTitle($title); + $this->poll->setDescription(''); + $this->poll->setAccess('hidden'); + $this->poll->setExpire(0); + $this->poll->setAnonymous(0); + $this->poll->setFullAnonymous(0); + $this->poll->setAllowMaybe(0); + $this->poll->setVoteLimit(0); + $this->poll->setSettings(''); + $this->poll->setOptions(''); + $this->poll->setShowResults('always'); + $this->poll->setDeleted(0); + $this->poll->setAdminAccess(0); + $this->poll = $this->pollMapper->insert($this->poll); + + $this->logService->setLog($this->poll->getId(), 'addPoll'); + + return $this->poll; + } + + /** + * update + * @NoAdminRequired + * @NoCSRFRequired + * @param Array $poll + * @return Poll + */ + + public function update($pollId, $poll) { + + $this->poll = $this->pollMapper->find($pollId); + + if (!$this->acl->setPollId($this->poll->getId())->getAllowEdit()) { + throw new NotAuthorizedException; + } + + // Validate valuess + if (isset($poll['showResults']) && !in_array($poll['showResults'], $this->getValidShowResults())) { + throw new InvalidShowResultsException('Invalid value for prop showResults'); + } + + if (isset($poll['access']) && !in_array($poll['access'], $this->getValidAccess())) { + throw new InvalidAccessException('Invalid value for prop access '. $poll['access']); + } + + if (isset($poll['title']) && !$poll['title']) { + throw new EmptyTitleException('Title must not be empty'); + } + $this->poll->deserializeArray($poll); + + $this->pollMapper->update($this->poll); + $this->logService->setLog($this->poll->getId(), 'updatePoll'); + + return $this->poll; + } + + /** + * clone + * @NoAdminRequired + * @NoCSRFRequired + * @param integer $pollId + * @return Poll + */ + public function clone($pollId) { + + if (!$this->acl->setPollId($this->poll->getId())->getAllowView()) { + throw new NotAuthorizedException; + } + + $this->poll = $this->pollMapper->find($pollId); + + $this->poll->setCreated(time()); + $this->poll->setOwner(\OC::$server->getUserSession()->getUser()->getUID()); + $this->poll->setTitle('Clone of ' . $this->poll->getTitle()); + $this->poll->setDeleted(0); + $this->poll->setId(0); + + $this->poll = $this->pollMapper->insert($this->poll); + $this->logService->setLog($this->poll->getId(), 'addPoll'); + + $this->optionService->clone($pollId, $this->poll->getId()); + + return $this->poll; + + } + + public function getValidEnum() { + return [ + 'pollType' => $this->getValidPollType(), + 'access' => $this->getValidAccess(), + 'showResults' => $this->getValidShowResults() + ]; + } + + private function getValidPollType() { + return ['datePoll', 'textPoll']; + } + + private function getValidAccess() { + return ['hidden', 'public']; + } + + private function getValidShowResults() { + return ['always', 'expired', 'never']; + } +} diff --git a/lib/Service/ShareService.php b/lib/Service/ShareService.php new file mode 100644 index 00000000..a7cf144b --- /dev/null +++ b/lib/Service/ShareService.php @@ -0,0 +1,226 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Service; + +use Exception; + +use OCP\Security\ISecureRandom; + +use OCA\Polls\Exceptions\NotAuthorizedException; +use OCA\Polls\Exceptions\InvalidUsername; + +use OCA\Polls\Db\Share; +use OCA\Polls\Db\ShareMapper; +use OCA\Polls\Service\MailService; +use OCA\Polls\Model\Acl; +use OCA\Polls\Controller\SystemController; + +class ShareService { + + private $shareMapper; + private $share; + private $systemController; + private $mailService; + private $acl; + + /** + * ShareController constructor. + * @param ShareMapper $shareMapper + * @param Share $share + * @param SystemController $systemController + * @param MailService $mailService + * @param Acl $acl + */ + public function __construct( + ShareMapper $shareMapper, + Share $share, + SystemController $systemController, + MailService $mailService, + Acl $acl + ) { + $this->shareMapper = $shareMapper; + $this->share = $share; + $this->systemController = $systemController; + $this->mailService = $mailService; + $this->acl = $acl; + } + + /** + * get + * Read all shares of a poll based on the poll id and return list as array + * @NoAdminRequired + * @param integer $pollId + * @return array + */ + public function list($pollId) { + if (!$this->acl->setPollId($pollId)->getAllowEdit()) { + throw new NotAuthorizedException; + } + + return $this->shareMapper->findByPoll($pollId); + + } + + /** + * getByToken + * Get pollId by token + * @NoAdminRequired + * @param string $token + * @return Share + */ + public function get($token) { + return $this->shareMapper->findByToken($token); + } + + /** + * Write a new share to the db and returns the new share as array + * @NoAdminRequired + * @depricated + * @param int $pollId + * @param string $share + * @return array + */ + // TODO: Replace with $this->add and separate sending invitations + public function write($pollId, $type, $userId, $userEmail = '') { + + if (!$this->acl->setPollId($pollId)->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $this->share = new Share(); + $this->share->setType($type); + $this->share->setPollId($pollId); + $this->share->setUserId($userId); + $this->share->setUserEmail($userEmail); + $this->share->setToken(\OC::$server->getSecureRandom()->generate( + 16, + ISecureRandom::CHAR_DIGITS . + ISecureRandom::CHAR_LOWER . + ISecureRandom::CHAR_UPPER + )); + + $this->share = $this->shareMapper->insert($this->share); + $sendResult = $this->mailService->sendInvitationMail($this->share->getToken()); + + return [ + 'share' => $this->share, + 'sendResult' => $sendResult + ]; + } + + /** + * Write a new share to the db and returns the new share as array + * @NoAdminRequired + * @param int $pollId + * @param string $share + * @return array + */ + public function add($pollId, $type, $userId, $userEmail = '') { + + if (!$this->acl->setPollId($pollId)->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $this->share = new Share(); + $this->share->setType($type); + $this->share->setPollId($pollId); + $this->share->setUserId($userId); + $this->share->setUserEmail($userEmail); + $this->share->setToken(\OC::$server->getSecureRandom()->generate( + 16, + ISecureRandom::CHAR_DIGITS . + ISecureRandom::CHAR_LOWER . + ISecureRandom::CHAR_UPPER + )); + + return $this->shareMapper->insert($this->share); + + } + + /** + * createPersonalShare + * Write a new share to the db and returns the new share as array + * @NoAdminRequired + * @param string $token + * @param string $userName + * @return Share + */ + public function createPersonalShare($token, $userName) { + $publicShare = $this->shareMapper->findByToken($token); + + // Return of validatePublicUsername is a DataResponse + $checkUsername = $this->systemController->validatePublicUsername($publicShare->getPollId(), $userName, $token); + + // if status is not 200, return DataResponse from validatePublicUsername + if ($checkUsername->getStatus() !== 200) { + throw new InvalidUsername; + } + + if ($publicShare->getType() === 'public') { + + + $this->share = new Share(); + $this->share->setToken(\OC::$server->getSecureRandom()->generate( + 16, + ISecureRandom::CHAR_DIGITS . + ISecureRandom::CHAR_LOWER . + ISecureRandom::CHAR_UPPER + )); + $this->share->setType('external'); + $this->share->setPollId($publicShare->getPollId()); + $this->share->setUserId($userName); + $this->share->setUserEmail(''); + return $this->shareMapper->insert($this->share); + + } elseif ($publicShare->getType() === 'email') { + + $publicShare->setType('external'); + $publicShare->setUserId($userName); + return $this->shareMapper->update($publicShare); + + } else { + throw new NotAuthorizedException; + } + } + + /** + * remove + * remove share + * @NoAdminRequired + * @param string $token + * @return Share + */ + + public function remove($token) { + $this->share = $this->shareMapper->findByToken($token); + if (!$this->acl->setPollId($this->share->getPollId())->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $this->shareMapper->delete($this->share); + + return $this->share; + + } +} diff --git a/lib/Service/SubscriptionService.php b/lib/Service/SubscriptionService.php new file mode 100644 index 00000000..f378e476 --- /dev/null +++ b/lib/Service/SubscriptionService.php @@ -0,0 +1,131 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Service; + +use Exception; +use OCA\Polls\Exceptions\NotAuthorizedException; +use OCP\AppFramework\Db\MultipleObjectsReturnedException; +use OCP\AppFramework\Db\DoesNotExistException; +use OCP\ILogger; + +use OCA\Polls\Db\Subscription; +use OCA\Polls\Db\SubscriptionMapper; +use OCA\Polls\Model\Acl; + +class SubscriptionService { + + private $acl; + private $subscriptionMapper; + private $logger; + + /** + * SubscriptionController constructor. + * @param SubscriptionMapper $subscriptionMapper + * @param ILogger $logger + * @param Acl $acl + */ + + public function __construct( + SubscriptionMapper $subscriptionMapper, + ILogger $logger, + Acl $acl + ) { + $this->subscriptionMapper = $subscriptionMapper; + $this->acl = $acl; + $this->logger = $logger; + } + + /** + * @NoAdminRequired + * @param integer $pollId + * @return array + */ + public function get($pollId) { + if (!$this->acl->setPollId($pollId)->getAllowView()) { + throw new NotAuthorizedException; + } + try { + return $this->subscriptionMapper->findByUserAndPoll($pollId, $this->acl->getUserId()); + } catch (MultipleObjectsReturnedException $e) { + // subscription should be unique. If duplicates are found resubscribe + // duplicates are removed in $this->set() + return $this->set($pollId, true); + } + + } + + /** + * @NoAdminRequired + * @param integer $pollId + * @return array + */ + public function set($pollId, $subscribed) { + if (!$this->acl->setPollId($pollId)->getAllowView()) { + throw new NotAuthorizedException; + } + try { + $subscription = $this->subscriptionMapper->findByUserAndPoll($pollId, $this->acl->getUserId()); + if (!$subscribed) { + $this->subscriptionMapper->delete($subscription); + return ['status' => 'Unsubscribed from poll ' . $pollId]; + } else { + // subscription already exists, just return the existing subscription + return ['status' => 'Subscribed to poll ' . $pollId]; + } + + } catch (DoesNotExistException $e){ + + if ($subscribed) { + $subscription = new Subscription(); + $subscription->setPollId($pollId); + $subscription->setUserId($this->acl->getUserId()); + + $this->subscriptionMapper->insert($subscription); + return ['status' => 'Subscribed to poll ' . $pollId]; + } else { + // subscription is not found, just approve the unsubscription + return ['status' => 'Unsubscribed from poll ' . $pollId]; + } + + } catch (MultipleObjectsReturnedException $e) { + // Duplicates should not exist but if found, fix it + // unsubscribe from all and resubscribe, if requested + $this->logger->debug('Multiple subscription (dulpicates) found'); + $this->subscriptionMapper->unsubscribe($pollId, $this->acl->getUserId()); + $this->logger->debug('Unsubscribed all for user ' . $this->acl->getUserId() . 'in poll' . $pollId); + if ($subscribed) { + $subscription = new Subscription(); + $subscription->setPollId($pollId); + $subscription->setUserId($this->acl->getUserId()); + $this->subscriptionMapper->insert($subscription); + $this->logger->debug('Added new subscription'); + return $subscription; + } else { + return ['status' => 'Unsubscribed from poll ' . $pollId]; + } + + } + + } +} diff --git a/lib/Service/VoteService.php b/lib/Service/VoteService.php new file mode 100644 index 00000000..4df01c70 --- /dev/null +++ b/lib/Service/VoteService.php @@ -0,0 +1,151 @@ +<?php +/** + * @copyright Copyright (c) 2017 Vinzenz Rosenkranz <vinzenz.rosenkranz@gmail.com> + * + * @author René Gieling <github@dartcafe.de> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Polls\Service; + +use Exception; +use OCP\AppFramework\Db\DoesNotExistException; +use OCA\Polls\Exceptions\NotAuthorizedException; + +use OCA\Polls\Db\Vote; +use OCA\Polls\Db\VoteMapper; +use OCA\Polls\Db\OptionMapper; +use OCA\Polls\Service\AnonymizeService; +use OCA\Polls\Service\LogService; +use OCA\Polls\Model\Acl; + +class VoteService { + + private $voteMapper; + private $vote; + private $optionMapper; + private $anonymizer; + private $logService; + private $acl; + + /** + * VoteController constructor. + * @param VoteMapper $voteMapper + * @param Vote $vote + * @param OptionMapper $optionMapper + * @param AnonymizeService $anonymizer + * @param LogService $logService + * @param Acl $acl + */ + public function __construct( + VoteMapper $voteMapper, + Vote $vote, + OptionMapper $optionMapper, + AnonymizeService $anonymizer, + LogService $logService, + Acl $acl + ) { + $this->voteMapper = $voteMapper; + $this->vote = $vote; + $this->optionMapper = $optionMapper; + $this->anonymizer = $anonymizer; + $this->logService = $logService; + $this->acl = $acl; + } + + /** + * Get all votes of given poll + * Read all votes of a poll based on the poll id and return list as array + * @NoAdminRequired + * @param integer $pollId + * @param string $token + * @return Vote + */ + public function list($pollId = 0, $token = '') { + if (!$this->acl->setPollIdOrToken($pollId, $token)->getAllowView()) { + throw new NotAuthorizedException; + } + + if (!$this->acl->getAllowSeeResults()) { + return $this->voteMapper->findByPollAndUser($this->acl->getpollId(), $this->acl->getUserId()); + } elseif (!$this->acl->getAllowSeeUsernames()) { + $this->anonymizer->set($this->acl->getpollId(), $this->acl->getUserId()); + return $this->anonymizer->getVotes(); + } else { + return $this->voteMapper->findByPoll($this->acl->getpollId()); + } + } + + /** + * set + * @NoAdminRequired + * @param integer $pollId + * @param Array $option + * @param string $setTo + * @param string $token + * @return Vote + */ + public function set($pollId = 0, $pollOptionText, $setTo, $token = '') { + + if (!$this->acl->setPollIdOrToken($pollId, $token)->getAllowVote()) { + throw new NotAuthorizedException; + } + + $option = $this->optionMapper->findByPollAndText($this->acl->getpollId(), $pollOptionText); + + try { + $this->vote = $this->voteMapper->findSingleVote($this->acl->getpollId(), $option->getPollOptionText(), $this->acl->getUserId()); + $this->vote->setVoteAnswer($setTo); + $this->voteMapper->update($this->vote); + + } catch (DoesNotExistException $e) { + // Vote does not exist, insert as new Vote + $this->vote = new Vote(); + + $this->vote->setPollId($this->acl->getpollId()); + $this->vote->setUserId($this->acl->getUserId()); + $this->vote->setVoteOptionText($option->getPollOptionText()); + $this->vote->setVoteOptionId($option->getId()); + $this->vote->setVoteAnswer($setTo); + $this->voteMapper->insert($this->vote); + + } finally { + $this->logService->setLog($this->vote->getPollId(), 'setVote', $this->vote->getUserId()); + return $this->vote; + } + } + + /** + * delete + * @NoAdminRequired + * @NoCSRFRequired + * @param integer $voteId + * @param string $userId + * @param integer $pollId + * @return Vote + */ + public function delete($pollId, $userId) { + + if (!$this->acl->setPollId($pollId)->getAllowEdit()) { + throw new NotAuthorizedException; + } + + $votes = $this->voteMapper->deleteByPollAndUser($pollId, $userId); + } + +} diff --git a/package-lock.json b/package-lock.json index 05e51541..22151867 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,9 +29,9 @@ } }, "@babel/compat-data": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", - "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.3.tgz", + "integrity": "sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg==", "requires": { "browserslist": "^4.12.0", "invariant": "^2.2.4", @@ -39,18 +39,18 @@ } }, "@babel/core": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", - "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.3.tgz", + "integrity": "sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.2", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", "@babel/helper-module-transforms": "^7.10.1", "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.2", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.2", + "@babel/parser": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -62,40 +62,40 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-split-export-declaration": { @@ -107,57 +107,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -197,16 +197,16 @@ }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -214,25 +214,25 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", - "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz", + "integrity": "sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-explode-assignable-expression": "^7.10.3", + "@babel/types": "^7.10.3" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -240,9 +240,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.1.tgz", - "integrity": "sha512-YuF8IrgSmX/+MV2plPkjEnzlC2wf+gaok8ehMNN0jodF3/sejZauExqpEVGbJua62oaWoNYIXwz4RmAsVcGyHw==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", "requires": { "@babel/compat-data": "^7.10.1", "browserslist": "^4.12.0", @@ -275,77 +275,77 @@ } }, "@babel/helper-define-map": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", - "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz", + "integrity": "sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ==", "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/helper-function-name": "^7.10.3", + "@babel/types": "^7.10.3", "lodash": "^4.17.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -353,49 +353,49 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", - "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz", + "integrity": "sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw==", "requires": { - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-split-export-declaration": { @@ -407,57 +407,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -496,24 +496,24 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", - "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz", + "integrity": "sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -732,52 +732,52 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", - "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz", + "integrity": "sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", "@babel/helper-wrap-function": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/template": "^7.10.3", + "@babel/traverse": "^7.10.3", + "@babel/types": "^7.10.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-split-export-declaration": { @@ -789,57 +789,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -954,40 +954,40 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-split-export-declaration": { @@ -999,57 +999,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1080,40 +1080,40 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", - "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.2", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-split-export-declaration": { @@ -1125,57 +1125,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", - "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", - "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1211,19 +1211,19 @@ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", - "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz", + "integrity": "sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/helper-remap-async-to-generator": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", + "@babel/helper-remap-async-to-generator": "^7.10.3", "@babel/plugin-syntax-async-generators": "^7.8.0" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1237,75 +1237,75 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.1.tgz", - "integrity": "sha512-bwhdehBJZt84HuPUcP1HaTLuc/EywVS8rc3FgsEPDcivg+DCW+SHuLHVkYOmcBA1ZfI+Z/oZjQc/+bPmIO7uAA==", - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz", + "integrity": "sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ==", + "requires": { + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-member-expression-to-functions": "^7.10.3", + "@babel/helper-optimise-call-expression": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/helper-replace-supers": "^7.10.1", "@babel/helper-split-export-declaration": "^7.10.1" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-replace-supers": { "version": "7.10.1", @@ -1327,57 +1327,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1407,9 +1407,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1423,9 +1423,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1439,9 +1439,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1455,26 +1455,26 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", - "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz", + "integrity": "sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-transform-parameters": "^7.10.1" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1488,25 +1488,25 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", - "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz", + "integrity": "sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng==", "requires": { - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1520,75 +1520,75 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.1.tgz", - "integrity": "sha512-bwhdehBJZt84HuPUcP1HaTLuc/EywVS8rc3FgsEPDcivg+DCW+SHuLHVkYOmcBA1ZfI+Z/oZjQc/+bPmIO7uAA==", - "requires": { - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-member-expression-to-functions": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz", + "integrity": "sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ==", + "requires": { + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-member-expression-to-functions": "^7.10.3", + "@babel/helper-optimise-call-expression": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/helper-replace-supers": "^7.10.1", "@babel/helper-split-export-declaration": "^7.10.1" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-replace-supers": { "version": "7.10.1", @@ -1610,57 +1610,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1690,9 +1690,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1713,9 +1713,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1752,9 +1752,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1791,9 +1791,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1814,9 +1814,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1831,9 +1831,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1846,9 +1846,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -1862,84 +1862,84 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-transform-classes": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", - "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz", + "integrity": "sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-define-map": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", - "@babel/helper-optimise-call-expression": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-define-map": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", + "@babel/helper-optimise-call-expression": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", "@babel/helper-replace-supers": "^7.10.1", "@babel/helper-split-export-declaration": "^7.10.1", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-replace-supers": { "version": "7.10.1", @@ -1961,57 +1961,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2032,17 +2032,17 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", - "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz", + "integrity": "sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2055,9 +2055,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2071,9 +2071,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2086,9 +2086,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2102,9 +2102,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2117,9 +2117,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2133,72 +2133,72 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2214,9 +2214,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2229,9 +2229,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2246,9 +2246,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2264,27 +2264,27 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", - "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz", + "integrity": "sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A==", "requires": { - "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-hoist-variables": "^7.10.3", "@babel/helper-module-transforms": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.3", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2298,16 +2298,16 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz", + "integrity": "sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.8.3" } @@ -2321,9 +2321,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2337,62 +2337,62 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", "requires": { - "@babel/highlight": "^7.10.1" + "@babel/highlight": "^7.10.3" } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.3.tgz", + "integrity": "sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA==", "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", - "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz", + "integrity": "sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw==", "requires": { - "@babel/helper-get-function-arity": "^7.10.1", - "@babel/template": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/helper-get-function-arity": "^7.10.3", + "@babel/template": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", - "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz", + "integrity": "sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", - "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz", + "integrity": "sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-replace-supers": { "version": "7.10.1", @@ -2414,57 +2414,57 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.3.tgz", + "integrity": "sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA==" }, "@babel/template": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", - "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.3.tgz", + "integrity": "sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1" + "@babel/code-frame": "^7.10.3", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3" } }, "@babel/traverse": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", - "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.3.tgz", + "integrity": "sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug==", "requires": { - "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", - "@babel/helper-function-name": "^7.10.1", + "@babel/code-frame": "^7.10.3", + "@babel/generator": "^7.10.3", + "@babel/helper-function-name": "^7.10.3", "@babel/helper-split-export-declaration": "^7.10.1", - "@babel/parser": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/parser": "^7.10.3", + "@babel/types": "^7.10.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2494,29 +2494,29 @@ }, "dependencies": { "@babel/helper-get-function-arity": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", - "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz", + "integrity": "sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg==", "requires": { - "@babel/types": "^7.10.1" + "@babel/types": "^7.10.3" } }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2532,16 +2532,16 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", - "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz", + "integrity": "sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw==", "requires": { "regenerator-transform": "^0.14.2" } @@ -2555,9 +2555,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2570,9 +2570,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2585,9 +2585,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2601,25 +2601,25 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", - "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz", + "integrity": "sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA==", "requires": { "@babel/helper-annotate-as-pure": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1" + "@babel/helper-plugin-utils": "^7.10.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2632,9 +2632,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2657,9 +2657,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, @@ -2673,30 +2673,30 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" } } }, "@babel/preset-env": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.1.tgz", - "integrity": "sha512-bGWNfjfXRLnqbN2T4lB3pMfoic8dkRrmHpVZamSFHzGy5xklyHTobZ28TVUD2grhE5WDnu67tBj8oslIhkiOMQ==", - "requires": { - "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.1", - "@babel/helper-module-imports": "^7.10.1", - "@babel/helper-plugin-utils": "^7.10.1", - "@babel/plugin-proposal-async-generator-functions": "^7.10.1", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.3.tgz", + "integrity": "sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg==", + "requires": { + "@babel/compat-data": "^7.10.3", + "@babel/helper-compilation-targets": "^7.10.2", + "@babel/helper-module-imports": "^7.10.3", + "@babel/helper-plugin-utils": "^7.10.3", + "@babel/plugin-proposal-async-generator-functions": "^7.10.3", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-dynamic-import": "^7.10.1", "@babel/plugin-proposal-json-strings": "^7.10.1", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", "@babel/plugin-proposal-numeric-separator": "^7.10.1", - "@babel/plugin-proposal-object-rest-spread": "^7.10.1", + "@babel/plugin-proposal-object-rest-spread": "^7.10.3", "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", - "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.3", "@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", "@babel/plugin-syntax-async-generators": "^7.8.0", @@ -2713,8 +2713,8 @@ "@babel/plugin-transform-async-to-generator": "^7.10.1", "@babel/plugin-transform-block-scoped-functions": "^7.10.1", "@babel/plugin-transform-block-scoping": "^7.10.1", - "@babel/plugin-transform-classes": "^7.10.1", - "@babel/plugin-transform-computed-properties": "^7.10.1", + "@babel/plugin-transform-classes": "^7.10.3", + "@babel/plugin-transform-computed-properties": "^7.10.3", "@babel/plugin-transform-destructuring": "^7.10.1", "@babel/plugin-transform-dotall-regex": "^7.10.1", "@babel/plugin-transform-duplicate-keys": "^7.10.1", @@ -2725,24 +2725,24 @@ "@babel/plugin-transform-member-expression-literals": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.10.1", "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@babel/plugin-transform-modules-systemjs": "^7.10.1", + "@babel/plugin-transform-modules-systemjs": "^7.10.3", "@babel/plugin-transform-modules-umd": "^7.10.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.3", "@babel/plugin-transform-new-target": "^7.10.1", "@babel/plugin-transform-object-super": "^7.10.1", "@babel/plugin-transform-parameters": "^7.10.1", "@babel/plugin-transform-property-literals": "^7.10.1", - "@babel/plugin-transform-regenerator": "^7.10.1", + "@babel/plugin-transform-regenerator": "^7.10.3", "@babel/plugin-transform-reserved-words": "^7.10.1", "@babel/plugin-transform-shorthand-properties": "^7.10.1", "@babel/plugin-transform-spread": "^7.10.1", "@babel/plugin-transform-sticky-regex": "^7.10.1", - "@babel/plugin-transform-template-literals": "^7.10.1", + "@babel/plugin-transform-template-literals": "^7.10.3", "@babel/plugin-transform-typeof-symbol": "^7.10.1", "@babel/plugin-transform-unicode-escapes": "^7.10.1", "@babel/plugin-transform-unicode-regex": "^7.10.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.3", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -2750,22 +2750,30 @@ "semver": "^5.5.0" }, "dependencies": { + "@babel/helper-module-imports": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz", + "integrity": "sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w==", + "requires": { + "@babel/types": "^7.10.3" + } + }, "@babel/helper-plugin-utils": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", - "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz", + "integrity": "sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g==" }, "@babel/helper-validator-identifier": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", - "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==" }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.3.tgz", + "integrity": "sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA==", "requires": { - "@babel/helper-validator-identifier": "^7.10.1", + "@babel/helper-validator-identifier": "^7.10.3", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -2794,9 +2802,9 @@ } }, "@babel/runtime": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.1.tgz", - "integrity": "sha512-nQbbCbQc9u/rpg1XCxoMYQTbSMVZjCDxErQ1ClCn9Pvcmv1lGads19ep0a2VsEiIJeHqjZley6EQGEC3Yo1xMA==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.3.tgz", + "integrity": "sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -3612,20 +3620,26 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "version": "9.8.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.1.tgz", + "integrity": "sha512-zDw9+mkCdWZHloBIGrOgMq1tTUed4qy6ZgNAe2Ze2xERZA7CyTgW5Bw3XZbwSeJe8lfDHZIkw8Hwd/6hI3p0NQ==", "dev": true, "requires": { "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001061", - "chalk": "^2.4.2", + "caniuse-lite": "^1.0.30001084", + "kleur": "^4.0.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.30", + "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" }, "dependencies": { + "caniuse-lite": { + "version": "1.0.30001084", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001084.tgz", + "integrity": "sha512-ftdc5oGmhEbLUuMZ/Qp3mOpzfZLCxPYKcvGv6v2dJJ+8EdqcvZRbAGOiLmkM/PV1QGta/uwBs8/nCl6sokDW6w==", + "dev": true + }, "postcss": { "version": "7.0.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", @@ -5073,9 +5087,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.3.0.tgz", - "integrity": "sha512-dJMVXwfU5PT1cj2Nv2VPPrKahKTGdX+5Dh0Q3YuKt+Y2UhdL2YbzsVaBMyG9HC0tBismlv/r1+eZqs6SMIV38Q==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.3.1.tgz", + "integrity": "sha512-cQC/xj9bhWUcyi/RuMbRtC3I0eW8MH0jhRELSvpKYkWep3C6YZ2OkvcvJVUeO6gcunABmzptbXBuDoXsjHmfTA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5620,66 +5634,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "execall": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", @@ -5827,9 +5781,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", - "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6724,15 +6678,6 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -7215,9 +7160,9 @@ "dev": true }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "invariant": { @@ -7423,12 +7368,6 @@ "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", @@ -7629,6 +7568,12 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, + "kleur": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.0.1.tgz", + "integrity": "sha512-Qs6SqCLm63rd0kNVh+wO4XsWLU6kgfwwaPYsLiClWf0Tewkzsa6MvB21bespb8cz+ANS+2t3So1ge3gintzhlw==", + "dev": true + }, "known-css-properties": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", @@ -7840,15 +7785,6 @@ "semver": "^5.6.0" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -7924,17 +7860,6 @@ "unist-util-visit": "^2.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -8118,12 +8043,6 @@ "mime-db": "1.44.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -8289,9 +8208,9 @@ } }, "moment": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz", - "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==" + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" }, "move-concurrently": { "version": "1.0.1", @@ -8566,23 +8485,6 @@ "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", "dev": true }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -8753,24 +8655,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -9425,9 +9309,9 @@ } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" }, "regenerate-unicode-properties": { "version": "8.2.0", @@ -10364,12 +10248,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -10392,16 +10270,16 @@ "dev": true }, "stylelint": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.0.tgz", - "integrity": "sha512-55gG2pNjVr183JJM/tlr3KAua6vTVX7Ho/lgKKuCIWszTZ1gmrXjX4Wok53SI8wRYFPbwKAcJGULQ77OJxTcNw==", + "version": "13.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.1.tgz", + "integrity": "sha512-XyvKyNE7eyrqkuZ85Citd/Uv3ljGiuYHC6UiztTR6sWS9rza8j3UeQv/eGcQS9NZz/imiC4GKdk1EVL3wst5vw==", "dev": true, "requires": { "@stylelint/postcss-css-in-js": "^0.37.1", "@stylelint/postcss-markdown": "^0.36.1", "autoprefixer": "^9.8.0", "balanced-match": "^1.0.0", - "chalk": "^4.0.0", + "chalk": "^4.1.0", "cosmiconfig": "^6.0.0", "debug": "^4.1.1", "execall": "^2.0.0", @@ -10899,9 +10777,9 @@ } }, "stylelint-scss": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.17.2.tgz", - "integrity": "sha512-e0dmxqsofy/HZj4urcGSJw4S6yHDJxiQdT20/1ciCsd5lomisa7YM4+Qtt1EG4hsqEG1dbEeF855tec1UyqcSA==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.18.0.tgz", + "integrity": "sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA==", "dev": true, "requires": { "lodash": "^4.17.15", @@ -11653,9 +11531,9 @@ } }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { @@ -11789,9 +11667,9 @@ "dev": true }, "vue-loader": { - "version": "15.9.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.2.tgz", - "integrity": "sha512-oXBubaY//CYEISBlHX+c2YPJbmOH68xXPXjFv4MAgPqQvUsnjrBAjCJi8HXZ/r/yfn0tPL5VZj1Zcp8mJPI8VA==", + "version": "15.9.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz", + "integrity": "sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA==", "dev": true, "requires": { "@vue/component-compiler-utils": "^3.1.0", @@ -12023,35 +11901,24 @@ } }, "webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -12065,142 +11932,12 @@ "which": "^1.2.9" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -12216,17 +11953,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -12237,9 +11963,9 @@ } }, "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "which": { @@ -12250,58 +11976,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, diff --git a/package.json b/package.json index 01a45620..f8116ba3 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@nextcloud/vue": "^2.0.0", "core-js": "^3.6.5", "lodash": "^4.17.15", - "moment": "^2.26.0", + "moment": "^2.27.0", "v-click-outside": "^3.0.0", "vue": "^2.6.11", "vue-clipboard2": "^0.3.1", @@ -61,14 +61,14 @@ "node": ">=10.0.0" }, "devDependencies": { - "@babel/core": "^7.10.2", - "@babel/preset-env": "^7.10.1", + "@babel/core": "^7.10.3", + "@babel/preset-env": "^7.10.3", "@nextcloud/eslint-plugin": "^1.4.0", "babel-eslint": "^10.0.3", "babel-loader": "^8.0.6", "cross-env": "^7.0.0", "css-loader": "^3.6.0", - "eslint": "^7.3.0", + "eslint": "^7.3.1", "eslint-config-standard": "^14.1.0", "eslint-loader": "^4.0.2", "eslint-plugin-import": "^2.21.2", @@ -79,15 +79,15 @@ "file-loader": "^6.0.0", "node-sass": "^4.14.1", "sass-loader": "^8.0.2", - "stylelint": "^13.6.0", + "stylelint": "^13.6.1", "stylelint-config-recommended-scss": "^4.2.0", - "stylelint-scss": "^3.17.2", + "stylelint-scss": "^3.18.0", "terser-webpack-plugin": "^3.0.6", - "vue-loader": "^15.9.2", + "vue-loader": "^15.9.3", "vue-style-loader": "^4.1.2", "vue-template-compiler": "^2.6.11", "webpack": "^4.43.0", - "webpack-cli": "^3.3.11", + "webpack-cli": "^3.3.12", "webpack-merge": "^4.1.5" } } diff --git a/src/js/components/Comments/Comments.vue b/src/js/components/Comments/Comments.vue index 369734db..18ced5a4 100644 --- a/src/js/components/Comments/Comments.vue +++ b/src/js/components/Comments/Comments.vue @@ -94,10 +94,12 @@ export default { methods: { deleteComment(comment) { - this.$store.dispatch({ type: 'poll/comments/delete', comment: comment }) + this.$store + .dispatch({ type: 'poll/comments/delete', comment: comment }) .then(() => { OC.Notification.showTemporary(t('polls', 'Comment deleted'), { type: 'success' }) - }, (error) => { + }) + .catch((error) => { OC.Notification.showTemporary(t('polls', 'Error while deleting the comment'), { type: 'error' }) console.error(error.response) }) diff --git a/src/js/components/Create/CreateDlg.vue b/src/js/components/Create/CreateDlg.vue index 10c387fd..5cd03f30 100644 --- a/src/js/components/Create/CreateDlg.vue +++ b/src/js/components/Create/CreateDlg.vue @@ -62,7 +62,7 @@ </template> <script> -import { mapState, mapMutations, mapActions } from 'vuex' +import { mapState } from 'vuex' import { emit } from '@nextcloud/event-bus' import ConfigBox from '../Base/ConfigBox' @@ -92,14 +92,6 @@ export default { }, methods: { - ...mapMutations({ - setPollProperty: 'poll/setProperty', - }), - - ...mapActions({ - resetPoll: 'poll/reset', - }), - cancel() { this.title = '' this.type = 'datePoll' @@ -107,19 +99,15 @@ export default { }, confirm() { - this.resetPoll() - this.setPollProperty({ id: 0 }) - this.setPollProperty({ title: this.title }) - this.setPollProperty({ type: this.type }) - this.$store.dispatch('poll/write') - .then(() => { + this.$store.dispatch('poll/add', { title: this.title, type: this.type }) + .then((response) => { emit('update-polls') this.cancel() - OC.Notification.showTemporary(t('polls', 'Poll "%n" added', 1, this.poll.title), { type: 'success' }) - this.$router.push({ name: 'vote', params: { id: this.poll.id } }) + OC.Notification.showTemporary(t('polls', 'Poll "%n" added', 1, response.data.id), { type: 'success' }) + this.$router.push({ name: 'vote', params: { id: response.data.id } }) }) .catch(() => { - OC.Notification.showTemporary(t('polls', 'Error while creating Poll "%n"', 1, this.poll.title), { type: 'error' }) + OC.Notification.showTemporary(t('polls', 'Error while creating Poll "%n"', 1, this.title), { type: 'error' }) }) }, diff --git a/src/js/components/Navigation/Navigation.vue b/src/js/components/Navigation/Navigation.vue index a7a88fd2..3934a52a 100644 --- a/src/js/components/Navigation/Navigation.vue +++ b/src/js/components/Navigation/Navigation.vue @@ -140,26 +140,32 @@ export default { clonePoll(pollId) { this.$store - .dispatch('polls/clone', { pollId: pollId }) + .dispatch('poll/clone', { pollId: pollId }) .then((response) => { emit('update-polls') this.$router.push({ name: 'vote', params: { id: response.pollId } }) }) + .error(() => { + OC.Notification.showTemporary(t('polls', 'Error cloning poll.'), { type: 'error' }) + }) }, switchDeleted(pollId) { this.$store - .dispatch('polls/switchDeleted', { pollId: pollId }) - .then((response) => { + .dispatch('poll/switchDeleted', { pollId: pollId }) + .then(() => { emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) + }) }, deletePermanently(pollId) { this.$store - .dispatch('polls/delete', { pollId: pollId }) - .then((response) => { + .dispatch('poll/delete', { pollId: pollId }) + .then(() => { // if we permanently delete current selected poll, // reload deleted polls route if (this.$route.params.id && this.$route.params.id === pollId) { @@ -167,6 +173,9 @@ export default { } emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) + }) }, }, diff --git a/src/js/components/PollList/PollItem.vue b/src/js/components/PollList/PollItem.vue index b5627e1b..88fe996c 100644 --- a/src/js/components/PollList/PollItem.vue +++ b/src/js/components/PollList/PollItem.vue @@ -183,8 +183,9 @@ export default { methods: { loadPoll() { - this.$store.dispatch({ type: 'poll/load', pollId: this.poll.id }) - .then((response) => { + this.$store + .dispatch({ type: 'poll/get', pollId: this.poll.id }) + .then(() => { emit('toggle-sidebar', { open: true }) }) .catch((error) => { @@ -203,26 +204,38 @@ export default { }, switchDeleted() { - this.$store.dispatch('polls/switchDeleted', { pollId: this.poll.id }) - .then((response) => { + this.$store + .dispatch('poll/switchDeleted', { pollId: this.poll.id }) + .then(() => { emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) + }) this.hideMenu() }, deletePermanently() { - this.$store.dispatch('polls/delete', { pollId: this.poll.id }) - .then((response) => { + this.$store + .dispatch('poll/delete', { pollId: this.poll.id }) + .then(() => { emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) + }) this.hideMenu() }, clonePoll() { - this.$store.dispatch('polls/clone', { pollId: this.poll.id }) - .then((response) => { + this.$store + .dispatch('poll/clone', { pollId: this.poll.id }) + .then(() => { emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error cloning poll.'), { type: 'error' }) + }) this.hideMenu() }, }, diff --git a/src/js/components/SideBar/SideBarTabConfiguration.vue b/src/js/components/SideBar/SideBarTabConfiguration.vue index 324988a1..8ca279dc 100644 --- a/src/js/components/SideBar/SideBarTabConfiguration.vue +++ b/src/js/components/SideBar/SideBarTabConfiguration.vue @@ -275,7 +275,7 @@ export default { writeValue(e) { this.$store.commit('poll/setProperty', e) this.writingPoll = true - this.writePoll() + this.updatePoll() }, switchDeleted() { @@ -290,31 +290,32 @@ export default { deletePermanently() { if (!this.poll.deleted) return - this.$store.dispatch('polls/delete', { pollId: this.poll.id }) - .then((response) => { + this.$store + .dispatch('poll/delete', { pollId: this.poll.id }) + .then(() => { emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) + }) }, - writePoll() { + updatePoll() { if (this.titleEmpty) { OC.Notification.showTemporary(t('polls', 'Title must not be empty!'), { type: 'success' }) } else { - this.$store.dispatch('poll/write') - .then(() => { - OC.Notification.showTemporary(t('polls', '%n successfully saved', 1, this.poll.title), { type: 'success' }) + this.$store.dispatch('poll/update') + .then((response) => { + OC.Notification.showTemporary(t('polls', '%n successfully saved', 1, response.data.title), { type: 'success' }) emit('update-polls') }) + .catch(() => { + OC.Notification.showTemporary(t('polls', 'Error writing poll'), { type: 'error' }) + }) this.writingPoll = false } }, - write() { - if (this.acl.allowEdit) { - this.writePoll() - } - - }, }, } </script> diff --git a/src/js/components/SideBar/SideBarTabShare.vue b/src/js/components/SideBar/SideBarTabShare.vue index 12ba4314..095a1ecf 100644 --- a/src/js/components/SideBar/SideBarTabShare.vue +++ b/src/js/components/SideBar/SideBarTabShare.vue @@ -150,20 +150,21 @@ export default { .then((response) => { this.users = response.data.siteusers this.isLoading = false - }, (error) => { + }) + .catch((error) => { console.error(error.response) }) }, copyLink(payload) { - this.$copyText(window.location.origin + payload.url).then( - function() { + this + .$copyText(window.location.origin + payload.url) + .then(() => { OC.Notification.showTemporary(t('polls', 'Link copied to clipboard'), { type: 'success' }) - }, - function() { + }) + .catch(() => { OC.Notification.showTemporary(t('polls', 'Error while copying link to clipboard'), { type: 'error' }) - } - ) + }) }, shareUrl(share) { diff --git a/src/js/components/VoteTable/VoteHeaderPublic.vue b/src/js/components/VoteTable/VoteHeaderPublic.vue index 50afa011..2d2f56f0 100644 --- a/src/js/components/VoteTable/VoteHeaderPublic.vue +++ b/src/js/components/VoteTable/VoteHeaderPublic.vue @@ -189,7 +189,7 @@ export default { this.$store.dispatch('poll/shares/addPersonal', { token: this.$route.params.token, userName: this.userName }) .then((response) => { if (this.$route.params.token === response.token) { - this.$store.dispatch({ type: 'poll/load', pollId: this.$route.params.id, token: this.$route.params.token }) + this.$store.dispatch({ type: 'poll/get', pollId: this.$route.params.id, token: this.$route.params.token }) } else { this.token = response.token this.redirecting = true diff --git a/src/js/store/modules/poll.js b/src/js/store/modules/poll.js index 17cfd7a9..653a55c4 100644 --- a/src/js/store/modules/poll.js +++ b/src/js/store/modules/poll.js @@ -126,12 +126,12 @@ const actions = { context.commit('reset') }, - load(context, payload) { - let endPoint = 'apps/polls/polls/get/' + get(context, payload) { + let endPoint = 'apps/polls/polls/get' if (payload.token) { - endPoint = endPoint.concat('s/', payload.token) + endPoint = endPoint.concat('/s/', payload.token) } else if (payload.pollId) { - endPoint = endPoint.concat(payload.pollId) + endPoint = endPoint.concat('/', payload.pollId) } else { context.commit('reset') context.commit('acl/reset') @@ -159,18 +159,67 @@ const actions = { }) }, - write(context) { - const endPoint = 'apps/polls/polls/write/' - return axios.post(generateUrl(endPoint), { poll: state }) + add(context, payload) { + const endPoint = 'apps/polls/polls/add' + return axios.post(generateUrl(endPoint), { title: payload.title, type: payload.type }) .then((response) => { - context.commit('set', response.data) - return response.data.poll - }, (error) => { - console.error('Error writing poll:', { error: error.response }, { state: state }) + return response + }) + .catch((error) => { + console.error('Error adding poll:', { error: error.response }, { state: state }) throw error }) }, + + clone(context, payload) { + const endPoint = 'apps/polls/polls/clone' + return axios.get(generateUrl(endPoint.concat('/', payload.pollId))) + .then((response) => { + return response.data + }) + .catch((error) => { + console.error('Error cloning poll', { error: error.response }, { payload: payload }) + }) + + }, + + update(context) { + const endPoint = 'apps/polls/polls/update' + return axios.put(generateUrl(endPoint.concat('/', state.id)), { poll: state }) + .then((response) => { + context.commit('set', { poll: response.data }) + return response + }) + .catch((error) => { + console.error('Error updating poll:', { error: error.response }, { poll: state }) + throw error + }) + + }, + + switchDeleted(context, payload) { + const endPoint = 'apps/polls/polls/delete' + return axios.get(generateUrl(endPoint.concat('/', payload.pollId))) + .then((response) => { + return response + }) + .catch((error) => { + console.error('Error deleting poll', { error: error.response }, { payload: payload }) + }) + }, + + delete(context, payload) { + const endPoint = 'apps/polls/polls/delete' + return axios.get(generateUrl(endPoint.concat('/permanent/', payload.pollId))) + .then((response) => { + return response + }) + .catch((error) => { + console.error('Error deleting poll', { error: error.response }, { payload: payload }) + }) + }, + } export default { namespaced, state, mutations, getters, actions, modules } diff --git a/src/js/store/modules/polls.js b/src/js/store/modules/polls.js index f32ca08a..e52a4c00 100644 --- a/src/js/store/modules/polls.js +++ b/src/js/store/modules/polls.js @@ -71,52 +71,17 @@ const getters = { const actions = { load(context) { - const endPoint = 'apps/polls/polls/list/' + const endPoint = 'apps/polls/polls/list' return axios.get(generateUrl(endPoint)) .then((response) => { context.commit('set', { list: response.data }) - }, (error) => { + }) + .catch((error) => { OC.Notification.showTemporary(t('polls', 'Error loading polls'), { type: 'error' }) console.error('Error loading polls', { error: error.response }) }) }, - - switchDeleted(context, payload) { - const endPoint = 'apps/polls/polls/delete/' - return axios.get(generateUrl(endPoint + payload.pollId)) - .then((response) => { - return response - }, (error) => { - OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) - console.error('Error deleting poll', { error: error.response }, { payload: payload }) - }) - }, - - delete(context, payload) { - const endPoint = 'apps/polls/polls/delete/permanent/' - return axios.get(generateUrl(endPoint + payload.pollId)) - .then((response) => { - OC.Notification.showTemporary(t('polls', 'Deleted poll permanently.'), { type: 'success' }) - return response - }, (error) => { - OC.Notification.showTemporary(t('polls', 'Error deleting poll.'), { type: 'error' }) - console.error('Error deleting poll', { error: error.response }, { payload: payload }) - }) - }, - - clone(context, payload) { - const endPoint = 'apps/polls/polls/clone/' - return axios.get(generateUrl(endPoint + payload.pollId)) - .then((response) => { - return response.data - }, (error) => { - OC.Notification.showTemporary(t('polls', 'Error cloning poll.'), { type: 'error' }) - console.error('Error cloning poll', { error: error.response }, { payload: payload }) - }) - - }, - } export default { namespaced, state, mutations, getters, actions } diff --git a/src/js/store/modules/subModules/comments.js b/src/js/store/modules/subModules/comments.js index b49c42d8..739acc40 100644 --- a/src/js/store/modules/subModules/comments.js +++ b/src/js/store/modules/subModules/comments.js @@ -63,42 +63,34 @@ const getters = { const actions = { add(context, payload) { - let endPoint = 'apps/polls/comment/write/' - - if (context.rootState.poll.acl.foundByToken) { - endPoint = endPoint.concat('s/') - } - + const endPoint = 'apps/polls/comment/add' return axios.post(generateUrl(endPoint), { + message: payload.message, pollId: context.rootState.poll.id, token: context.rootState.poll.acl.token, - message: payload.message, - userId: context.rootState.poll.acl.userId, }) .then((response) => { context.commit('add', response.data) return response.data - }, (error) => { + }) + .catch((error) => { console.error('Error writing comment', { error: error.response }, { payload: payload }) throw error }) }, delete(context, payload) { - let endPoint = 'apps/polls/comment/delete/' - - if (context.rootState.poll.acl.foundByToken) { - endPoint = endPoint.concat('s/') - } - + const endPoint = 'apps/polls/comment/delete' + context.commit('delete', { comment: payload.comment }) return axios.post(generateUrl(endPoint), { token: context.rootState.poll.acl.token, - comment: payload.comment, + commentId: payload.comment.id, }) .then((response) => { context.commit('delete', { comment: response.data.comment }) return response.data - }, (error) => { + }) + .catch((error) => { console.error('Error deleting comment', { error: error.response }, { payload: payload }) throw error }) diff --git a/src/js/store/modules/subModules/options.js b/src/js/store/modules/subModules/options.js index e102d98d..d152c3d3 100644 --- a/src/js/store/modules/subModules/options.js +++ b/src/js/store/modules/subModules/options.js @@ -105,26 +105,15 @@ const actions = { return axios.post(generateUrl(endPoint), { pollId: context.rootState.poll.id, options: payload }) .then((response) => { context.commit('set', { options: response.data }) - }, (error) => { - console.error('Error reordering option', { error: error.response }, { payload: payload }) - throw error }) - }, - - update(context, payload) { - const endPoint = 'apps/polls/option/update' - - return axios.post(generateUrl(endPoint), { option: payload.option }) - .then((response) => { - context.commit('setItem', { option: response.data }) - }, (error) => { - console.error('Error updating option', { error: error.response }, { payload: payload }) + .catch((error) => { + console.error('Error reordering option', { error: error.response }, { payload: payload }) throw error }) }, add(context, payload) { - const endPoint = 'apps/polls/option/add/' + const endPoint = 'apps/polls/option/add' const option = {} option.id = 0 @@ -148,19 +137,34 @@ const actions = { return axios.post(generateUrl(endPoint), { option: option }) .then((response) => { context.commit('setItem', { option: response.data }) - }, (error) => { - console.error('Error adding option', { error: error.response }, { payload: payload }) + }) + .catch((error) => { + console.error('Error adding option', { error: error.response }, { payload: option }) + throw error + }) + }, + + update(context, payload) { + const endPoint = 'apps/polls/option/update' + + return axios.post(generateUrl(endPoint), { option: payload.option }) + .then((response) => { + context.commit('setItem', { option: response.data }) + }) + .catch((error) => { + console.error('Error updating option', { error: error.response }, { payload: payload }) throw error }) }, delete(context, payload) { - const endPoint = 'apps/polls/option/remove/' + const endPoint = 'apps/polls/option/remove' return axios.post(generateUrl(endPoint), { option: payload.option }) .then(() => { context.commit('delete', { option: payload.option }) - }, (error) => { + }) + .catch((error) => { console.error('Error removing option', { error: error.response }, { payload: payload }) throw error }) diff --git a/src/js/store/modules/subModules/shares.js b/src/js/store/modules/subModules/shares.js index 644e836f..e235b7f0 100644 --- a/src/js/store/modules/subModules/shares.js +++ b/src/js/store/modules/subModules/shares.js @@ -74,7 +74,7 @@ const getters = { const actions = { add(context, payload) { - const endPoint = 'apps/polls/share/write/' + const endPoint = 'apps/polls/share/add' payload.share.pollId = context.rootState.poll.id return axios.post(generateUrl(endPoint), { pollId: context.rootState.poll.id, share: payload.share }) .then((response) => { @@ -107,30 +107,33 @@ const actions = { OC.Notification.showTemporary(t('polls', 'Error sending invitation mail to %n.', 1, errorList.join(', ')), { type: 'error' }) } return response.data - }, (error) => { + }) + .catch((error) => { console.error('Error writing share', { error: error.response }, { payload: payload }) throw error }) }, delete(context, payload) { - const endPoint = 'apps/polls/share/remove/' + const endPoint = 'apps/polls/share/delete' return axios.post(generateUrl(endPoint), { share: payload.share }) .then(() => { context.commit('delete', { share: payload.share }) - }, (error) => { + }) + .catch((error) => { console.error('Error removing share', { error: error.response }, { payload: payload }) throw error }) }, addPersonal(context, payload) { - const endPoint = 'apps/polls/share/create/s/' + const endPoint = 'apps/polls/share/create/s' return axios.post(generateUrl(endPoint), { token: payload.token, userName: payload.userName }) .then((response) => { return { token: response.data.token } - }, (error) => { + }) + .catch((error) => { console.error('Error writing share', { error: error.response }, { payload: payload }) throw error }) diff --git a/src/js/store/modules/subModules/votes.js b/src/js/store/modules/subModules/votes.js index 591a585a..06da10cd 100644 --- a/src/js/store/modules/subModules/votes.js +++ b/src/js/store/modules/subModules/votes.js @@ -115,7 +115,7 @@ const getters = { const actions = { delete(context, payload) { - const endPoint = 'apps/polls/votes/delete/' + const endPoint = 'apps/polls/votes/delete' return axios.post(generateUrl(endPoint), { pollId: context.rootState.poll.id, voteId: 0, @@ -124,19 +124,19 @@ const actions = { .then(() => { context.commit('deleteVotes', payload) OC.Notification.showTemporary(t('polls', 'User {userId} removed', payload), { type: 'success' }) - }, (error) => { + }) + .catch((error) => { console.error('Error deleting votes', { error: error.response }, { payload: payload }) throw error }) }, set(context, payload) { - let endPoint = 'apps/polls/vote/set/' + let endPoint = 'apps/polls/vote/set' if (context.rootState.poll.acl.foundByToken) { - endPoint = endPoint.concat('s/') + endPoint = endPoint.concat('/s') } - return axios.post(generateUrl(endPoint), { pollId: context.rootState.poll.id, token: context.rootState.poll.acl.token, @@ -147,7 +147,8 @@ const actions = { .then((response) => { context.commit('setItem', { option: payload.option, pollId: context.rootState.poll.id, vote: response.data }) return response.data - }, (error) => { + }) + .catch((error) => { console.error('Error setting vote', { error: error.response }, { payload: payload }) throw error }) diff --git a/src/js/store/modules/subscription.js b/src/js/store/modules/subscription.js index 3b7da8a0..02861a45 100644 --- a/src/js/store/modules/subscription.js +++ b/src/js/store/modules/subscription.js @@ -41,8 +41,11 @@ const mutations = { } const actions = { + getSubscription(context, payload) { - axios.get(generateUrl('apps/polls/subscription/get/' + payload.pollId)) + const endPoint = 'apps/polls/subscription' + + return axios.get(generateUrl(endPoint.concat('/', payload.pollId))) .then(() => { context.commit('setSubscription', true) }) @@ -52,9 +55,11 @@ const actions = { }, writeSubscriptionPromise(context, payload) { - return axios.post(generateUrl('apps/polls/subscription/set/'), { pollId: payload.pollId, subscribed: state.subscribed }) + const endPoint = 'apps/polls/subscription' + return axios.post(generateUrl(endPoint), { pollId: payload.pollId, subscribed: state.subscribed }) .then(() => { - }, (error) => { + }) + .catch((error) => { console.error(error.response) }) }, diff --git a/src/js/views/Vote.vue b/src/js/views/Vote.vue index ed0d57cb..ee87aa3a 100644 --- a/src/js/views/Vote.vue +++ b/src/js/views/Vote.vue @@ -201,14 +201,11 @@ export default { loadPoll() { this.isLoading = true - this.$store.dispatch({ type: 'poll/load', pollId: this.$route.params.id, token: this.$route.params.token }) + this.$store + .dispatch({ type: 'poll/get', pollId: this.$route.params.id, token: this.$route.params.token }) .then((response) => { - if (response.status === 200) { - this.isLoading = false - window.document.title = this.windowTitle - } else { - this.$router.replace({ name: 'notfound' }) - } + this.isLoading = false + window.document.title = this.windowTitle }) .catch((error) => { console.error(error) |