-
+
{{ $t('Add to my calendar') }}
@@ -247,7 +253,7 @@
import { EVENT_PERSON_PARTICIPATION, FETCH_EVENT, JOIN_EVENT, LEAVE_EVENT } from '@/graphql/event';
import { Component, Prop } from 'vue-property-decorator';
import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
-import { EventStatus, EventVisibility, IEvent, IParticipant, ParticipantRole } from '@/types/event.model';
+import { EventModel, EventStatus, EventVisibility, IEvent, IParticipant, ParticipantRole } from '@/types/event.model';
import { IPerson, Person } from '@/types/actor';
import { GRAPHQL_API_ENDPOINT } from '@/api/_entrypoint';
import DateCalendarIcon from '@/components/Event/DateCalendarIcon.vue';
@@ -264,6 +270,8 @@ import ParticipationButton from '@/components/Event/ParticipationButton.vue';
import { GraphQLError } from 'graphql';
import { RouteName } from '@/router';
import { Address } from '@/types/address.model';
+import CommentTree from '@/components/Comment/CommentTree.vue';
+import 'intersection-observer';
@Component({
components: {
@@ -275,6 +283,7 @@ import { Address } from '@/types/address.model';
ReportModal,
IdentityPicker,
ParticipationButton,
+ CommentTree,
// tslint:disable:space-in-parens
'map-leaflet': () => import(/* webpackChunkName: "map" */ '@/components/Map.vue'),
// tslint:enable
@@ -328,7 +337,7 @@ import { Address } from '@/types/address.model';
export default class Event extends EventMixin {
@Prop({ type: String, required: true }) uuid!: string;
- event!: IEvent;
+ event: IEvent = new EventModel();
currentActor!: IPerson;
identity: IPerson = new Person();
participations: IParticipant[] = [];
@@ -338,6 +347,8 @@ export default class Event extends EventMixin {
EventVisibility = EventVisibility;
EventStatus = EventStatus;
RouteName = RouteName;
+ observer!: IntersectionObserver;
+ loadComments: boolean = false;
get eventTitle() {
if (!this.event) return undefined;
@@ -351,10 +362,24 @@ export default class Event extends EventMixin {
mounted() {
this.identity = this.currentActor;
+ if (this.$route.hash.includes('#comment-')) {
+ this.loadComments = true;
+ }
+
+ this.observer = new IntersectionObserver((entries) => {
+ for (const entry of entries) {
+ if (entry) {
+ this.loadComments = entry.isIntersecting || this.loadComments;
+ }
+ }
+ }, {
+ rootMargin: '-50px 0px -50px',
+ });
+ this.observer.observe(this.$refs.commentsObserver as Element);
this.$watch('eventDescription', function (eventDescription) {
if (!eventDescription) return;
- const eventDescriptionElement = this.$refs['eventDescriptionElement'] as HTMLElement;
+ const eventDescriptionElement = this.$refs.eventDescriptionElement as HTMLElement;
eventDescriptionElement.addEventListener('click', ($event) => {
// TODO: Find the right type for target
@@ -404,8 +429,8 @@ export default class Event extends EventMixin {
mutation: CREATE_REPORT,
variables: {
eventId: this.event.id,
- reporterActorId: this.currentActor.id,
- reportedActorId: this.event.organizerActor.id,
+ reporterId: this.currentActor.id,
+ reportedId: this.event.organizerActor.id,
content,
},
});
@@ -845,19 +870,24 @@ export default class Event extends EventMixin {
}
h3.title {
- font-size: 3rem;
- font-weight: 300;
+ font-weight: 300;
}
.description {
- padding-top: 10px;
- min-height: 40rem;
+ padding: 10px 0;
+ min-height: 7rem;
+
+ &.exists {
+ min-height: 40rem;
+ }
@media screen and (min-width: 1216px) {
background-repeat: no-repeat;
background-size: 600px;
background-position: 95% 101%;
- background-image: url('../../assets/texting.svg');
+ &.exists {
+ background-image: url('../../assets/texting.svg');
+ }
}
border-top: solid 1px #111;
border-bottom: solid 1px #111;
@@ -906,8 +936,17 @@ export default class Event extends EventMixin {
}
}
+ .comments {
+ margin: 1rem auto 2rem;
+
+ a h3#comments {
+ margin-bottom: 5px;
+ }
+ }
+
.share {
- border-bottom: solid 1px #111;
+ border-bottom: solid 1px $primary;
+ border-top: solid 1px $primary;
.diaspora span svg {
height: 2rem;
@@ -917,7 +956,7 @@ export default class Event extends EventMixin {
.columns {
& > * {
- padding: 10rem 0;
+ padding: 2rem 0;
}
h3 {
@@ -957,7 +996,7 @@ export default class Event extends EventMixin {
}
img {
- max-width: 400px;
+ max-width: 250px;
}
&::before {
@@ -965,7 +1004,6 @@ export default class Event extends EventMixin {
background: #B3B3B2;
position: absolute;
bottom: 25%;
- left: 0;
height: 40%;
width: 1px;
}
diff --git a/js/src/views/Moderation/Report.vue b/js/src/views/Moderation/Report.vue
index 0b10c3376..a3404e4e9 100644
--- a/js/src/views/Moderation/Report.vue
+++ b/js/src/views/Moderation/Report.vue
@@ -4,68 +4,81 @@
- Mark as resolved
- Reopen
- Close
+ {{ $t('Mark as resolved') }}
+ {{ $t('Reopen') }}
+ {{ $t('Close') }}
-
-
-
-
-
-
- Compte signalé |
-
-
- @{{ report.reported.preferredUsername }}
-
- |
-
-
- Signalé par |
-
-
- @{{ report.reporter.preferredUsername }}
-
- |
-
-
- Signalé |
- {{ report.insertedAt | formatDateTimeString }} |
-
-
- Mis à jour |
- {{ report.updatedAt | formatDateTimeString }} |
-
-
- Statut |
-
- Ouvert
- Fermé
- Résolu
- Inconnu
- |
-
-
-
-
-
-
-
-
-
{{ report.content }}
-
Pas de commentaire
-
-
+
+
+
+
+ {{ $t('Reported identity') }} |
+
+
+ @{{ report.reported.preferredUsername }}
+
+ |
+
+
+ {{ $t('Reported by') }} |
+
+
+ @{{ report.reporter.preferredUsername }}
+
+ |
+
+
+ {{ $t('Reported')}} |
+ {{ report.insertedAt | formatDateTimeString }} |
+
+
+ {{ $t('Updated') }} |
+ {{ report.updatedAt | formatDateTimeString }} |
+
+
+ {{ $t('Status') }} |
+
+ {{ $t('Open') }}
+ {{ $t('Closed') }}
+ {{ $t('Resolved') }}
+ {{ $t('Unknown') }}
+ |
+
+
+ {{ $t('Event') }} |
+
+ {{ report.event.title }}
+
+ {{ $t('Edit') }}
+ {{ $t('Delete') }}
+
+ |
+
+
+
-
+
+
+
{{ $t('No comment') }}
+
+
+
{{ report.event.title }}
@@ -75,28 +88,50 @@
type="is-primary"
:to="{ name: RouteName.EDIT_EVENT, params: {eventId: report.event.uuid } }"
icon-left="pencil"
- size="is-small">Edit
+ size="is-small">{{ $t('Edit') }}
Delete
+ size="is-small">{{ $t('Delete') }}
-
Notes
+
+ -
+
+
+
+
+
+
{{ comment.actor.name }} @{{ comment.actor.preferredUsername }}
+
+
+
+
+
+
+
+
+
+
{{ $t('Notes') }}
@@ -110,6 +145,7 @@ import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
import { IPerson } from '@/types/actor';
import { DELETE_EVENT } from '@/graphql/event';
import { uniq } from 'lodash';
+import { nl2br } from '@/utils/html';
@Component({
apollo: {
@@ -137,6 +173,7 @@ export default class Report extends Vue {
ReportStatusEnum = ReportStatusEnum;
RouteName = RouteName;
+ nl2br = nl2br;
noteContent: string = '';
@@ -175,9 +212,9 @@ export default class Report extends Vue {
confirmDelete() {
this.$buefy.dialog.confirm({
- title: 'Deleting event',
- message: 'Are you sure you want to
delete this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.',
- confirmText: 'Delete Event',
+ title: this.$t('Deleting event') as string,
+ message: this.$t('Are you sure you want to
delete this event? This action cannot be undone. You may want to engage the conversation with the event creator or edit its event instead.') as string,
+ confirmText: this.$t('Delete Event') as string,
type: 'is-danger',
hasIcon: true,
onConfirm: () => this.deleteEvent(),
@@ -232,6 +269,7 @@ export default class Report extends Vue {
store.writeQuery({ query: REPORT, variables: { id: this.report.id }, data: { report } });
},
});
+ await this.$router.push({ name: RouteName.REPORTS });
} catch (error) {
console.error(error);
}
@@ -248,7 +286,9 @@ export default class Report extends Vue {
}
-
\ No newline at end of file
diff --git a/js/src/views/Moderation/ReportList.vue b/js/src/views/Moderation/ReportList.vue
index 82fbcab10..1ac893bbf 100644
--- a/js/src/views/Moderation/ReportList.vue
+++ b/js/src/views/Moderation/ReportList.vue
@@ -2,8 +2,8 @@
diff --git a/js/yarn.lock b/js/yarn.lock
index b3652bb0f..a354fa3d3 100644
--- a/js/yarn.lock
+++ b/js/yarn.lock
@@ -17,17 +17,17 @@
"@babel/highlight" "^7.0.0"
"@babel/core@^7.0.0", "@babel/core@^7.6.4":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.2.tgz#ea5b99693bcfc058116f42fa1dd54da412b29d91"
- integrity sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab"
+ integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==
dependencies:
"@babel/code-frame" "^7.5.5"
- "@babel/generator" "^7.7.2"
- "@babel/helpers" "^7.7.0"
- "@babel/parser" "^7.7.2"
- "@babel/template" "^7.7.0"
- "@babel/traverse" "^7.7.2"
- "@babel/types" "^7.7.2"
+ "@babel/generator" "^7.7.4"
+ "@babel/helpers" "^7.7.4"
+ "@babel/parser" "^7.7.4"
+ "@babel/template" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
convert-source-map "^1.7.0"
debug "^4.1.0"
json5 "^2.1.0"
@@ -47,132 +47,132 @@
source-map "^0.5.0"
trim-right "^1.0.1"
-"@babel/generator@^7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af"
- integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==
+"@babel/generator@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369"
+ integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==
dependencies:
- "@babel/types" "^7.7.2"
+ "@babel/types" "^7.7.4"
jsesc "^2.5.1"
lodash "^4.17.13"
source-map "^0.5.0"
-"@babel/helper-annotate-as-pure@^7.0.0", "@babel/helper-annotate-as-pure@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e"
- integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==
+"@babel/helper-annotate-as-pure@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce"
+ integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz#32dd9551d6ed3a5fc2edc50d6912852aa18274d9"
- integrity sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f"
+ integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==
dependencies:
- "@babel/helper-explode-assignable-expression" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-explode-assignable-expression" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-call-delegate@^7.4.4":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz#df8942452c2c1a217335ca7e393b9afc67f668dc"
- integrity sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==
+"@babel/helper-call-delegate@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801"
+ integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==
dependencies:
- "@babel/helper-hoist-variables" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-hoist-variables" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-create-class-features-plugin@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz#bcdc223abbfdd386f94196ae2544987f8df775e8"
- integrity sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==
+"@babel/helper-create-class-features-plugin@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d"
+ integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==
dependencies:
- "@babel/helper-function-name" "^7.7.0"
- "@babel/helper-member-expression-to-functions" "^7.7.0"
- "@babel/helper-optimise-call-expression" "^7.7.0"
+ "@babel/helper-function-name" "^7.7.4"
+ "@babel/helper-member-expression-to-functions" "^7.7.4"
+ "@babel/helper-optimise-call-expression" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-replace-supers" "^7.7.0"
- "@babel/helper-split-export-declaration" "^7.7.0"
+ "@babel/helper-replace-supers" "^7.7.4"
+ "@babel/helper-split-export-declaration" "^7.7.4"
-"@babel/helper-create-regexp-features-plugin@^7.7.0":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz#6f20443778c8fce2af2ff4206284afc0ced65db6"
- integrity sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==
+"@babel/helper-create-regexp-features-plugin@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59"
+ integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==
dependencies:
"@babel/helper-regex" "^7.4.4"
regexpu-core "^4.6.0"
-"@babel/helper-define-map@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529"
- integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==
+"@babel/helper-define-map@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176"
+ integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==
dependencies:
- "@babel/helper-function-name" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-function-name" "^7.7.4"
+ "@babel/types" "^7.7.4"
lodash "^4.17.13"
-"@babel/helper-explode-assignable-expression@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz#db2a6705555ae1f9f33b4b8212a546bc7f9dc3ef"
- integrity sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==
+"@babel/helper-explode-assignable-expression@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84"
+ integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==
dependencies:
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-function-name@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3"
- integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==
+"@babel/helper-function-name@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e"
+ integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==
dependencies:
- "@babel/helper-get-function-arity" "^7.7.0"
- "@babel/template" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-get-function-arity" "^7.7.4"
+ "@babel/template" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-get-function-arity@^7.0.0", "@babel/helper-get-function-arity@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d"
- integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==
+"@babel/helper-get-function-arity@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0"
+ integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
-"@babel/helper-hoist-variables@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81"
- integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==
+"@babel/helper-hoist-variables@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12"
+ integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
-"@babel/helper-member-expression-to-functions@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a"
- integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==
+"@babel/helper-member-expression-to-functions@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74"
+ integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d"
- integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91"
+ integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
-"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786"
- integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==
+"@babel/helper-module-transforms@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a"
+ integrity sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA==
dependencies:
- "@babel/helper-module-imports" "^7.7.0"
- "@babel/helper-simple-access" "^7.7.0"
- "@babel/helper-split-export-declaration" "^7.7.0"
- "@babel/template" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-module-imports" "^7.7.4"
+ "@babel/helper-simple-access" "^7.7.4"
+ "@babel/helper-split-export-declaration" "^7.7.4"
+ "@babel/template" "^7.7.4"
+ "@babel/types" "^7.7.4"
lodash "^4.17.13"
-"@babel/helper-optimise-call-expression@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365"
- integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==
+"@babel/helper-optimise-call-expression@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2"
+ integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
"@babel/helper-plugin-utils@^7.0.0":
version "7.0.0"
@@ -186,60 +186,60 @@
dependencies:
lodash "^4.17.13"
-"@babel/helper-remap-async-to-generator@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7"
- integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==
+"@babel/helper-remap-async-to-generator@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234"
+ integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.7.0"
- "@babel/helper-wrap-function" "^7.7.0"
- "@babel/template" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-annotate-as-pure" "^7.7.4"
+ "@babel/helper-wrap-function" "^7.7.4"
+ "@babel/template" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-replace-supers@^7.5.5", "@babel/helper-replace-supers@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512"
- integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==
+"@babel/helper-replace-supers@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2"
+ integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.7.0"
- "@babel/helper-optimise-call-expression" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-member-expression-to-functions" "^7.7.4"
+ "@babel/helper-optimise-call-expression" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-simple-access@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d"
- integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==
+"@babel/helper-simple-access@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294"
+ integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==
dependencies:
- "@babel/template" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/template" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helper-split-export-declaration@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300"
- integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==
+"@babel/helper-split-export-declaration@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8"
+ integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==
dependencies:
- "@babel/types" "^7.7.0"
+ "@babel/types" "^7.7.4"
-"@babel/helper-wrap-function@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74"
- integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==
+"@babel/helper-wrap-function@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace"
+ integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==
dependencies:
- "@babel/helper-function-name" "^7.7.0"
- "@babel/template" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/helper-function-name" "^7.7.4"
+ "@babel/template" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/helpers@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.0.tgz#359bb5ac3b4726f7c1fde0ec75f64b3f4275d60b"
- integrity sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==
+"@babel/helpers@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302"
+ integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==
dependencies:
- "@babel/template" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/template" "^7.7.4"
+ "@babel/traverse" "^7.7.4"
+ "@babel/types" "^7.7.4"
"@babel/highlight@^7.0.0":
version "7.5.0"
@@ -250,385 +250,385 @@
esutils "^2.0.2"
js-tokens "^4.0.0"
-"@babel/parser@^7.2.3", "@babel/parser@^7.7.0", "@babel/parser@^7.7.2":
- version "7.7.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.3.tgz#5fad457c2529de476a248f75b0f090b3060af043"
- integrity sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==
+"@babel/parser@^7.2.3", "@babel/parser@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb"
+ integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==
-"@babel/plugin-proposal-async-generator-functions@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz#83ef2d6044496b4c15d8b4904e2219e6dccc6971"
- integrity sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==
+"@babel/plugin-proposal-async-generator-functions@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d"
+ integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-remap-async-to-generator" "^7.7.0"
- "@babel/plugin-syntax-async-generators" "^7.2.0"
+ "@babel/helper-remap-async-to-generator" "^7.7.4"
+ "@babel/plugin-syntax-async-generators" "^7.7.4"
"@babel/plugin-proposal-class-properties@^7.4.4":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz#ac54e728ecf81d90e8f4d2a9c05a890457107917"
- integrity sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba"
+ integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.7.0"
+ "@babel/helper-create-class-features-plugin" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-decorators@^7.6.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.0.tgz#d386a45730a4eb8c03e23a80b6d3dbefd761c9c9"
- integrity sha512-dMCDKmbYFQQTn1+VJjl5hbqlweuHl5oDeMU9B1Q7oAWi0mHxjQQDHdJIK6iW76NE1KJT3zA6dDU3weR1WT5D4A==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz#58c1e21d21ea12f9f5f0a757e46e687b94a7ab2b"
+ integrity sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.7.0"
+ "@babel/helper-create-class-features-plugin" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-decorators" "^7.2.0"
+ "@babel/plugin-syntax-decorators" "^7.7.4"
-"@babel/plugin-proposal-dynamic-import@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f"
- integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==
+"@babel/plugin-proposal-dynamic-import@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d"
+ integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.7.4"
-"@babel/plugin-proposal-json-strings@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
- integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==
+"@babel/plugin-proposal-json-strings@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d"
+ integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-json-strings" "^7.2.0"
+ "@babel/plugin-syntax-json-strings" "^7.7.4"
-"@babel/plugin-proposal-object-rest-spread@^7.6.2":
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096"
- integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==
+"@babel/plugin-proposal-object-rest-spread@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71"
+ integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+ "@babel/plugin-syntax-object-rest-spread" "^7.7.4"
-"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5"
- integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==
+"@babel/plugin-proposal-optional-catch-binding@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379"
+ integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.7.4"
-"@babel/plugin-proposal-unicode-property-regex@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d"
- integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==
+"@babel/plugin-proposal-unicode-property-regex@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb"
+ integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-create-regexp-features-plugin" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-async-generators@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f"
- integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==
+"@babel/plugin-syntax-async-generators@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889"
+ integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-decorators@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b"
- integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==
+"@babel/plugin-syntax-decorators@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b"
+ integrity sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
- integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec"
+ integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-json-strings@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470"
- integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==
+"@babel/plugin-syntax-json-strings@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc"
+ integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7"
- integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec"
+ integrity sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-object-rest-spread@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e"
- integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==
+"@babel/plugin-syntax-object-rest-spread@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46"
+ integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-optional-catch-binding@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c"
- integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==
+"@babel/plugin-syntax-optional-catch-binding@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6"
+ integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-syntax-top-level-await@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d"
- integrity sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==
+"@babel/plugin-syntax-top-level-await@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da"
+ integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-arrow-functions@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
- integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==
+"@babel/plugin-transform-arrow-functions@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12"
+ integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-async-to-generator@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492"
- integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==
+"@babel/plugin-transform-async-to-generator@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba"
+ integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==
dependencies:
- "@babel/helper-module-imports" "^7.7.0"
+ "@babel/helper-module-imports" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-remap-async-to-generator" "^7.7.0"
+ "@babel/helper-remap-async-to-generator" "^7.7.4"
-"@babel/plugin-transform-block-scoped-functions@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190"
- integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==
+"@babel/plugin-transform-block-scoped-functions@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b"
+ integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-block-scoping@^7.6.3":
- version "7.6.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a"
- integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==
+"@babel/plugin-transform-block-scoping@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224"
+ integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
lodash "^4.17.13"
-"@babel/plugin-transform-classes@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a"
- integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==
+"@babel/plugin-transform-classes@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec"
+ integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.7.0"
- "@babel/helper-define-map" "^7.7.0"
- "@babel/helper-function-name" "^7.7.0"
- "@babel/helper-optimise-call-expression" "^7.7.0"
+ "@babel/helper-annotate-as-pure" "^7.7.4"
+ "@babel/helper-define-map" "^7.7.4"
+ "@babel/helper-function-name" "^7.7.4"
+ "@babel/helper-optimise-call-expression" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-replace-supers" "^7.7.0"
- "@babel/helper-split-export-declaration" "^7.7.0"
+ "@babel/helper-replace-supers" "^7.7.4"
+ "@babel/helper-split-export-declaration" "^7.7.4"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da"
- integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==
+"@babel/plugin-transform-computed-properties@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d"
+ integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-destructuring@^7.6.0":
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6"
- integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==
+"@babel/plugin-transform-destructuring@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267"
+ integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-dotall-regex@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b"
- integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==
+"@babel/plugin-transform-dotall-regex@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96"
+ integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-create-regexp-features-plugin" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-duplicate-keys@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853"
- integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==
+"@babel/plugin-transform-duplicate-keys@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91"
+ integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-exponentiation-operator@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008"
- integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==
+"@babel/plugin-transform-exponentiation-operator@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9"
+ integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-for-of@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556"
- integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==
+"@babel/plugin-transform-for-of@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc"
+ integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-function-name@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz#0fa786f1eef52e3b7d4fc02e54b2129de8a04c2a"
- integrity sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==
+"@babel/plugin-transform-function-name@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1"
+ integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==
dependencies:
- "@babel/helper-function-name" "^7.7.0"
+ "@babel/helper-function-name" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-literals@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1"
- integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==
+"@babel/plugin-transform-literals@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e"
+ integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-member-expression-literals@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d"
- integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==
+"@babel/plugin-transform-member-expression-literals@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a"
+ integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-modules-amd@^7.5.0":
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91"
- integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==
+"@babel/plugin-transform-modules-amd@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71"
+ integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ==
dependencies:
- "@babel/helper-module-transforms" "^7.1.0"
+ "@babel/helper-module-transforms" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-commonjs@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3"
- integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==
+"@babel/plugin-transform-modules-commonjs@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3"
+ integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA==
dependencies:
- "@babel/helper-module-transforms" "^7.7.0"
+ "@babel/helper-module-transforms" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-simple-access" "^7.7.0"
+ "@babel/helper-simple-access" "^7.7.4"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-systemjs@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417"
- integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==
+"@babel/plugin-transform-modules-systemjs@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30"
+ integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==
dependencies:
- "@babel/helper-hoist-variables" "^7.7.0"
+ "@babel/helper-hoist-variables" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-umd@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz#d62c7da16670908e1d8c68ca0b5d4c0097b69966"
- integrity sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==
+"@babel/plugin-transform-modules-umd@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f"
+ integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==
dependencies:
- "@babel/helper-module-transforms" "^7.7.0"
+ "@babel/helper-module-transforms" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf"
- integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220"
+ integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-create-regexp-features-plugin" "^7.7.4"
-"@babel/plugin-transform-new-target@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5"
- integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==
+"@babel/plugin-transform-new-target@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167"
+ integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-object-super@^7.5.5":
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9"
- integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==
+"@babel/plugin-transform-object-super@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262"
+ integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/helper-replace-supers" "^7.5.5"
+ "@babel/helper-replace-supers" "^7.7.4"
-"@babel/plugin-transform-parameters@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16"
- integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==
+"@babel/plugin-transform-parameters@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce"
+ integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==
dependencies:
- "@babel/helper-call-delegate" "^7.4.4"
- "@babel/helper-get-function-arity" "^7.0.0"
+ "@babel/helper-call-delegate" "^7.7.4"
+ "@babel/helper-get-function-arity" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-property-literals@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905"
- integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==
+"@babel/plugin-transform-property-literals@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2"
+ integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-regenerator@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz#f1b20b535e7716b622c99e989259d7dd942dd9cc"
- integrity sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==
+"@babel/plugin-transform-regenerator@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0"
+ integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw==
dependencies:
regenerator-transform "^0.14.0"
-"@babel/plugin-transform-reserved-words@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634"
- integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==
+"@babel/plugin-transform-reserved-words@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb"
+ integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-transform-runtime@^7.6.2":
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8"
- integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz#51fe458c1c1fa98a8b07934f4ed38b6cd62177a6"
+ integrity sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ==
dependencies:
- "@babel/helper-module-imports" "^7.0.0"
+ "@babel/helper-module-imports" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
resolve "^1.8.1"
semver "^5.5.1"
-"@babel/plugin-transform-shorthand-properties@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0"
- integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==
+"@babel/plugin-transform-shorthand-properties@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e"
+ integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-spread@^7.6.2":
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd"
- integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==
+"@babel/plugin-transform-spread@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578"
+ integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-sticky-regex@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1"
- integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==
+"@babel/plugin-transform-sticky-regex@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c"
+ integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/helper-regex" "^7.0.0"
-"@babel/plugin-transform-template-literals@^7.4.4":
- version "7.4.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0"
- integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==
+"@babel/plugin-transform-template-literals@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604"
+ integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.0.0"
+ "@babel/helper-annotate-as-pure" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-typeof-symbol@^7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2"
- integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==
+"@babel/plugin-transform-typeof-symbol@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e"
+ integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-unicode-regex@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3"
- integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==
+"@babel/plugin-transform-unicode-regex@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae"
+ integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.7.0"
+ "@babel/helper-create-regexp-features-plugin" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/polyfill@^7.6.0":
@@ -640,56 +640,56 @@
regenerator-runtime "^0.13.2"
"@babel/preset-env@^7.6.3":
- version "7.7.1"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.1.tgz#04a2ff53552c5885cf1083e291c8dd5490f744bb"
- integrity sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8"
+ integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==
dependencies:
- "@babel/helper-module-imports" "^7.7.0"
+ "@babel/helper-module-imports" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-async-generator-functions" "^7.7.0"
- "@babel/plugin-proposal-dynamic-import" "^7.7.0"
- "@babel/plugin-proposal-json-strings" "^7.2.0"
- "@babel/plugin-proposal-object-rest-spread" "^7.6.2"
- "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.7.0"
- "@babel/plugin-syntax-async-generators" "^7.2.0"
- "@babel/plugin-syntax-dynamic-import" "^7.2.0"
- "@babel/plugin-syntax-json-strings" "^7.2.0"
- "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
- "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
- "@babel/plugin-syntax-top-level-await" "^7.7.0"
- "@babel/plugin-transform-arrow-functions" "^7.2.0"
- "@babel/plugin-transform-async-to-generator" "^7.7.0"
- "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
- "@babel/plugin-transform-block-scoping" "^7.6.3"
- "@babel/plugin-transform-classes" "^7.7.0"
- "@babel/plugin-transform-computed-properties" "^7.2.0"
- "@babel/plugin-transform-destructuring" "^7.6.0"
- "@babel/plugin-transform-dotall-regex" "^7.7.0"
- "@babel/plugin-transform-duplicate-keys" "^7.5.0"
- "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
- "@babel/plugin-transform-for-of" "^7.4.4"
- "@babel/plugin-transform-function-name" "^7.7.0"
- "@babel/plugin-transform-literals" "^7.2.0"
- "@babel/plugin-transform-member-expression-literals" "^7.2.0"
- "@babel/plugin-transform-modules-amd" "^7.5.0"
- "@babel/plugin-transform-modules-commonjs" "^7.7.0"
- "@babel/plugin-transform-modules-systemjs" "^7.7.0"
- "@babel/plugin-transform-modules-umd" "^7.7.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.0"
- "@babel/plugin-transform-new-target" "^7.4.4"
- "@babel/plugin-transform-object-super" "^7.5.5"
- "@babel/plugin-transform-parameters" "^7.4.4"
- "@babel/plugin-transform-property-literals" "^7.2.0"
- "@babel/plugin-transform-regenerator" "^7.7.0"
- "@babel/plugin-transform-reserved-words" "^7.2.0"
- "@babel/plugin-transform-shorthand-properties" "^7.2.0"
- "@babel/plugin-transform-spread" "^7.6.2"
- "@babel/plugin-transform-sticky-regex" "^7.2.0"
- "@babel/plugin-transform-template-literals" "^7.4.4"
- "@babel/plugin-transform-typeof-symbol" "^7.2.0"
- "@babel/plugin-transform-unicode-regex" "^7.7.0"
- "@babel/types" "^7.7.1"
+ "@babel/plugin-proposal-async-generator-functions" "^7.7.4"
+ "@babel/plugin-proposal-dynamic-import" "^7.7.4"
+ "@babel/plugin-proposal-json-strings" "^7.7.4"
+ "@babel/plugin-proposal-object-rest-spread" "^7.7.4"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.7.4"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.7.4"
+ "@babel/plugin-syntax-async-generators" "^7.7.4"
+ "@babel/plugin-syntax-dynamic-import" "^7.7.4"
+ "@babel/plugin-syntax-json-strings" "^7.7.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.7.4"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.7.4"
+ "@babel/plugin-syntax-top-level-await" "^7.7.4"
+ "@babel/plugin-transform-arrow-functions" "^7.7.4"
+ "@babel/plugin-transform-async-to-generator" "^7.7.4"
+ "@babel/plugin-transform-block-scoped-functions" "^7.7.4"
+ "@babel/plugin-transform-block-scoping" "^7.7.4"
+ "@babel/plugin-transform-classes" "^7.7.4"
+ "@babel/plugin-transform-computed-properties" "^7.7.4"
+ "@babel/plugin-transform-destructuring" "^7.7.4"
+ "@babel/plugin-transform-dotall-regex" "^7.7.4"
+ "@babel/plugin-transform-duplicate-keys" "^7.7.4"
+ "@babel/plugin-transform-exponentiation-operator" "^7.7.4"
+ "@babel/plugin-transform-for-of" "^7.7.4"
+ "@babel/plugin-transform-function-name" "^7.7.4"
+ "@babel/plugin-transform-literals" "^7.7.4"
+ "@babel/plugin-transform-member-expression-literals" "^7.7.4"
+ "@babel/plugin-transform-modules-amd" "^7.7.4"
+ "@babel/plugin-transform-modules-commonjs" "^7.7.4"
+ "@babel/plugin-transform-modules-systemjs" "^7.7.4"
+ "@babel/plugin-transform-modules-umd" "^7.7.4"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4"
+ "@babel/plugin-transform-new-target" "^7.7.4"
+ "@babel/plugin-transform-object-super" "^7.7.4"
+ "@babel/plugin-transform-parameters" "^7.7.4"
+ "@babel/plugin-transform-property-literals" "^7.7.4"
+ "@babel/plugin-transform-regenerator" "^7.7.4"
+ "@babel/plugin-transform-reserved-words" "^7.7.4"
+ "@babel/plugin-transform-shorthand-properties" "^7.7.4"
+ "@babel/plugin-transform-spread" "^7.7.4"
+ "@babel/plugin-transform-sticky-regex" "^7.7.4"
+ "@babel/plugin-transform-template-literals" "^7.7.4"
+ "@babel/plugin-transform-typeof-symbol" "^7.7.4"
+ "@babel/plugin-transform-unicode-regex" "^7.7.4"
+ "@babel/types" "^7.7.4"
browserslist "^4.6.0"
core-js-compat "^3.1.1"
invariant "^2.2.2"
@@ -697,40 +697,40 @@
semver "^5.5.0"
"@babel/runtime-corejs3@^7.6.3":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.7.2.tgz#2bf55c6cc576a7f54a40b970ea5215131abc1159"
- integrity sha512-odQQZpujq0AHttKrvp4n2KGjK5b5cuq7LeEcsdadwZOemMkmJnlgTXMCf5fIixLLaBxUypwn0krKK51vVMA5cg==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.7.4.tgz#f861adc1cecb9903dfd66ea97917f02ff8d79888"
+ integrity sha512-BBIEhzk8McXDcB3IbOi8zQPzzINUp4zcLesVlBSOcyGhzPUU8Xezk5GAG7Sy5GVhGmAO0zGd2qRSeY2g4Obqxw==
dependencies:
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.6.3":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a"
- integrity sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.4.tgz#b23a856751e4bf099262f867767889c0e3fe175b"
+ integrity sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==
dependencies:
regenerator-runtime "^0.13.2"
-"@babel/template@^7.7.0":
- version "7.7.0"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0"
- integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==
+"@babel/template@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b"
+ integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==
dependencies:
"@babel/code-frame" "^7.0.0"
- "@babel/parser" "^7.7.0"
- "@babel/types" "^7.7.0"
+ "@babel/parser" "^7.7.4"
+ "@babel/types" "^7.7.4"
-"@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09"
- integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==
+"@babel/traverse@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558"
+ integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==
dependencies:
"@babel/code-frame" "^7.5.5"
- "@babel/generator" "^7.7.2"
- "@babel/helper-function-name" "^7.7.0"
- "@babel/helper-split-export-declaration" "^7.7.0"
- "@babel/parser" "^7.7.2"
- "@babel/types" "^7.7.2"
+ "@babel/generator" "^7.7.4"
+ "@babel/helper-function-name" "^7.7.4"
+ "@babel/helper-split-export-declaration" "^7.7.4"
+ "@babel/parser" "^7.7.4"
+ "@babel/types" "^7.7.4"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.13"
@@ -744,10 +744,10 @@
lodash "^4.2.0"
to-fast-properties "^2.0.0"
-"@babel/types@^7.0.0", "@babel/types@^7.7.0", "@babel/types@^7.7.1", "@babel/types@^7.7.2":
- version "7.7.2"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7"
- integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==
+"@babel/types@^7.0.0", "@babel/types@^7.7.4":
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193"
+ integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==
dependencies:
esutils "^2.0.2"
lodash "^4.17.13"
@@ -847,9 +847,9 @@
yargs "^8.0.2"
"@mdi/font@^4.5.95":
- version "4.5.95"
- resolved "https://registry.yarnpkg.com/@mdi/font/-/font-4.5.95.tgz#43c0d2e7b08d4221a778f58d899455d0c45916ed"
- integrity sha512-AjR2Zgu1feBXWlTfEjD6JQqLAMCqYn2Gzia5PWqFnysvz5F6JmPHtQFldIHXqyv2s/FwME7ZDBc5N86NEHbyvQ==
+ version "4.6.95"
+ resolved "https://registry.yarnpkg.com/@mdi/font/-/font-4.6.95.tgz#f97ecbdfd59c183d19f3a24a6fe4f84f579cf287"
+ integrity sha512-m5AjVnVS9Xi4xbQQt2rh+ClVcWT9oFqSmo8mZs7teOGbAmUrZ9km1RuNRNKIr7LV3vy/zCeEfMc154Z9l+ab0g==
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
@@ -982,9 +982,9 @@
integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==
"@types/node@*", "@types/node@>=6":
- version "12.12.11"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.11.tgz#bec2961975888d964196bf0016a2f984d793d3ce"
- integrity sha512-O+x6uIpa6oMNTkPuHDa9MhMMehlxLAd5QcOvKRjAFsBVpeFWTOPnXbDvILvFgFFZfQ1xh1EZi1FbXxUix+zpsQ==
+ version "12.12.12"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.12.tgz#529bc3e73dbb35dd9e90b0a1c83606a9d3264bdb"
+ integrity sha512-MGuvYJrPU0HUwqF7LqvIj50RZUX23Z+m583KBygKYUZLlZ88n6w28XRNJRJgsHukLEnLz6w6SvxZoLgbr5wLqQ==
"@types/normalize-package-data@^2.4.0":
version "2.4.0"
@@ -2268,6 +2268,11 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
+bezier-easing@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/bezier-easing/-/bezier-easing-2.1.0.tgz#c04dfe8b926d6ecaca1813d69ff179b7c2025d86"
+ integrity sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY=
+
bfj@^6.1.1:
version "6.1.2"
resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
@@ -2498,7 +2503,7 @@ browserslist@4.7.0:
electron-to-chromium "^1.3.247"
node-releases "^1.1.29"
-browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.1, browserslist@^4.7.2, browserslist@^4.7.3:
+browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.7.1, browserslist@^4.7.3:
version "4.7.3"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.3.tgz#02341f162b6bcc1e1028e30624815d4924442dc3"
integrity sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ==
@@ -2522,9 +2527,9 @@ buble@0.19.8, buble@^0.19.7:
regexpu-core "^4.5.4"
buefy@^0.8.2:
- version "0.8.7"
- resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.8.7.tgz#ccfe47001156f3fab8bf3c5e5339ec646dca1b58"
- integrity sha512-Nmd6yuNPTQkwGXflLeRCINnLQWvDZcDqbw+7sy+LjX0n5kP5kcJ4DFc43koO+yPd4MpB7ZheHhLk5Sn00NnToA==
+ version "0.8.8"
+ resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.8.8.tgz#dc6a26c74793a6e28ee435d5ee06bdfe811dc9f4"
+ integrity sha512-kTUnroPBLm998KFZbeJuUgJV+nJbDUJxw1c8gzeJoe+Mve73Nb3hi6AZpgrIH8FtXmh5r8nMBYBqwN54EtPWXg==
dependencies:
bulma "0.7.5"
@@ -2765,9 +2770,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001010:
- version "1.0.30001011"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001011.tgz#0d6c4549c78c4a800bb043a83ca0cbe0aee6c6e1"
- integrity sha512-h+Eqyn/YA6o6ZTqpS86PyRmNWOs1r54EBDcd2NTwwfsXQ8re1B38SnB+p2RKF8OUsyEIjeDU8XGec1RGO/wYCg==
+ version "1.0.30001012"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001012.tgz#653ec635e815b9e0fb801890923b0c2079eb34ec"
+ integrity sha512-7RR4Uh04t9K1uYRWzOJmzplgEOAXbfK72oVNokCdMzA67trrhPzy93ahKk1AWHiA0c58tD2P+NHqxrA8FZ+Trg==
capture-stack-trace@^1.0.0:
version "1.0.1"
@@ -3518,17 +3523,17 @@ copy-webpack-plugin@^5.0.3, copy-webpack-plugin@^5.0.4:
webpack-log "^2.0.0"
core-js-compat@^3.1.1, core-js-compat@^3.3.2:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.1.tgz#e12c5a3ef9fcb50fd9d9a32805bfe674f9139246"
- integrity sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw==
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.4.2.tgz#652fa7c54652b7f6586a893e37001df55ea2ac37"
+ integrity sha512-W0Aj+LM3EAxxjD0Kp2o4be8UlnxIZHNupBv2znqrheR4aY2nOn91794k/xoSp+SxqqriiZpTsSwBtZr60cbkwQ==
dependencies:
- browserslist "^4.7.2"
+ browserslist "^4.7.3"
semver "^6.3.0"
core-js-pure@^3.0.0:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.4.1.tgz#483dbc687016b45cab4c185cf998c2c59e772c2a"
- integrity sha512-q3FgAYoFGS0LaqV4K7oMsJUpGU7Ud3IR6D2qcu7BAvg0OQPuwakrdNlal+0Zsm3bUPBpI5i/r9C6W3uQCcCrSw==
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.4.2.tgz#ffd4ea4dc1f8517f75d4a929986a214629477417"
+ integrity sha512-6+iSif/3zO0bSkhjVY9o4MTdv36X+rO6rqs/UxQ+uxBevmC4fsfwyQwFVdZXXONmLlKVLiXCG8PDvQ2Gn/iteA==
core-js@^2.4.0, core-js@^2.5.3, core-js@^2.5.7, core-js@^2.6.10, core-js@^2.6.5:
version "2.6.10"
@@ -3536,9 +3541,9 @@ core-js@^2.4.0, core-js@^2.5.3, core-js@^2.5.7, core-js@^2.6.10, core-js@^2.6.5:
integrity sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==
core-js@^3.3.2, core-js@^3.3.5:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.4.1.tgz#76dd6828412900ab27c8ce0b22e6114d7ce21b18"
- integrity sha512-KX/dnuY/J8FtEwbnrzmAjUYgLqtk+cxM86hfG60LGiW3MmltIc2yAmDgBgEkfm0blZhUrdr1Zd84J2Y14mLxzg==
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.4.2.tgz#ee2b1a60b50388d8ddcda8cdb44a92c7a9ea76df"
+ integrity sha512-bUTfqFWtNKWp73oNIfRkqwYZJeNT3lstzZcAkhhiuvDraRSgOH1/+F9ZklbpR4zpdKuo4cpXN8tKP7s61yjX+g==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
@@ -4446,9 +4451,9 @@ ejs@^2.6.1:
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
electron-to-chromium@^1.3.103, electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.306:
- version "1.3.309"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.309.tgz#9e1e5e23c73d04f0364e524afaafd6659289ae1b"
- integrity sha512-NZd91XD15v2UPLjYXoN/gLnkwIUQjdH4SQLpRCCQiYJH6BBkfgp5pWemBJPr1rZ2dl8Ee3o91O9Sa1QuAfZmog==
+ version "1.3.314"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.314.tgz#c186a499ed2c9057bce9eb8dca294d6d5450facc"
+ integrity sha512-IKDR/xCxKFhPts7h+VaSXS02Z1mznP3fli1BbXWXeN89i2gCzKraU8qLpEid8YzKcmZdZD3Mly3cn5/lY9xsBQ==
elegant-spinner@^1.0.1:
version "1.0.1"
@@ -4456,9 +4461,9 @@ elegant-spinner@^1.0.1:
integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
elliptic@^6.0.0:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b"
- integrity sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
+ integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
dependencies:
bn.js "^4.4.0"
brorand "^1.0.1"
@@ -4548,22 +4553,22 @@ error-stack-parser@^2.0.0:
stackframe "^1.1.0"
es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.1:
- version "1.16.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.0.tgz#d3a26dc9c3283ac9750dca569586e976d9dcc06d"
- integrity sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34"
+ integrity sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==
dependencies:
- es-to-primitive "^1.2.0"
+ es-to-primitive "^1.2.1"
function-bind "^1.1.1"
has "^1.0.3"
- has-symbols "^1.0.0"
+ has-symbols "^1.0.1"
is-callable "^1.1.4"
is-regex "^1.0.4"
- object-inspect "^1.6.0"
+ object-inspect "^1.7.0"
object-keys "^1.1.1"
string.prototype.trimleft "^2.1.0"
string.prototype.trimright "^2.1.0"
-es-to-primitive@^1.2.0:
+es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
@@ -4647,9 +4652,9 @@ eslint-visitor-keys@^1.1.0:
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@^6.5.1:
- version "6.6.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04"
- integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.1.tgz#269ccccec3ef60ab32358a44d147ac209154b919"
+ integrity sha512-UWzBS79pNcsDSxgxbdjkmzn/B6BhsXMfUaOHnNwyE8nD+Q6pyT96ow2MccVayUTV4yMid4qLhMiQaywctRkBLA==
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.10.0"
@@ -4666,7 +4671,7 @@ eslint@^6.5.1:
file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^5.0.0"
- globals "^11.7.0"
+ globals "^12.1.0"
ignore "^4.0.6"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
@@ -4679,7 +4684,7 @@ eslint@^6.5.1:
minimatch "^3.0.4"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
- optionator "^0.8.2"
+ optionator "^0.8.3"
progress "^2.0.0"
regexpp "^2.0.1"
semver "^6.1.2"
@@ -4840,9 +4845,9 @@ execa@^1.0.0:
strip-eof "^1.0.0"
execa@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-3.3.0.tgz#7e348eef129a1937f21ecbbd53390942653522c1"
- integrity sha512-j5Vit5WZR/cbHlqU97+qcnw9WHRCIL4V1SVe75VcHcD1JRBdt8fv0zw89b7CQHQdUHTt2VjuhcF5ibAgVOxqpg==
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
+ integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
dependencies:
cross-spawn "^7.0.0"
get-stream "^5.0.0"
@@ -5124,12 +5129,12 @@ file-entry-cache@^5.0.1:
flat-cache "^2.0.1"
file-loader@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e"
- integrity sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af"
+ integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==
dependencies:
loader-utils "^1.2.3"
- schema-utils "^2.0.0"
+ schema-utils "^2.5.0"
filesize@3.6.1, filesize@^3.6.1:
version "3.6.1"
@@ -5631,11 +5636,18 @@ global-prefix@^3.0.0:
kind-of "^6.0.2"
which "^1.3.1"
-globals@^11.1.0, globals@^11.12.0, globals@^11.7.0:
+globals@^11.1.0, globals@^11.12.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+globals@^12.1.0:
+ version "12.3.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13"
+ integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==
+ dependencies:
+ type-fest "^0.8.1"
+
globby@8.0.2:
version "8.0.2"
resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d"
@@ -7106,6 +7118,13 @@ javascript-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5"
integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==
+javascript-time-ago@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/javascript-time-ago/-/javascript-time-ago-2.0.4.tgz#02a7e81a161d73e518202274d5f72835cc89e3b4"
+ integrity sha512-p4flGt34MFUT8BW+UtRN5BOq28qndYALMoqP18FeixUw4InfA7MRay/wkSOorB+wnxTfnWYpqy9U1kcbUEdk5Q==
+ dependencies:
+ relative-time-format "^0.1.3"
+
jest-worker@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5"
@@ -8566,9 +8585,9 @@ node-pre-gyp@^0.12.0:
tar "^4"
node-releases@^1.1.29, node-releases@^1.1.3, node-releases@^1.1.40:
- version "1.1.40"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.40.tgz#a94facfa8e2d612302601ca1361741d529c4515a"
- integrity sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ==
+ version "1.1.41"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed"
+ integrity sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg==
dependencies:
semver "^6.3.0"
@@ -8791,7 +8810,7 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
-object-inspect@^1.6.0:
+object-inspect@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
@@ -8936,7 +8955,7 @@ optimism@^0.10.0:
dependencies:
"@wry/context" "^0.4.0"
-optionator@^0.8.1, optionator@^0.8.2:
+optionator@^0.8.1, optionator@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -9335,9 +9354,9 @@ path-key@^2.0.0, path-key@^2.0.1:
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
path-key@^3.0.0, path-key@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3"
- integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-parse@^1.0.6:
version "1.0.6"
@@ -9468,7 +9487,7 @@ pn@^1.1.0:
resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
-popper.js@^1.16.0:
+popper.js@^1.14.7:
version "1.16.0"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3"
integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==
@@ -10811,6 +10830,11 @@ relateurl@0.2.x:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
+relative-time-format@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/relative-time-format/-/relative-time-format-0.1.3.tgz#d50f49d13f97c7f801afba600b1a4a0890755df2"
+ integrity sha512-0O6i4fKjsx8qhz57zorG+LrIDnF9pSvP5s7H9R1Nb5nSqih5dvRyKzNKs6MxhL3bv4iwsz4DuDwAyw+c47QFIA==
+
remark-parse@^7.0.0:
version "7.0.2"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.2.tgz#41e7170d9c1d96c3d32cf1109600a9ed50dba7cf"
@@ -11019,9 +11043,9 @@ resolve-url@^0.2.1:
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
- integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.2.tgz#08b12496d9aa8659c75f534a8f05f0d892fff594"
+ integrity sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==
dependencies:
path-parse "^1.0.6"
@@ -11232,7 +11256,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
-schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.1.0, schema-utils@^2.4.1, schema-utils@^2.5.0:
+schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.1.0, schema-utils@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.5.0.tgz#8f254f618d402cc80257486213c8970edfd7c22f"
integrity sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==
@@ -12270,12 +12294,12 @@ tiny-warning@^1.0.2:
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
-tippy.js@^5.0.2:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-5.1.1.tgz#2a85cf3fb302ddc5ba1fca944e1f39bec62cb7b6"
- integrity sha512-ZrATAG/GX//w4aAWNyDeBTiNuDqwAqU5dnrkBxBcxdVQ+ywUs1CZOaQV/IT+8R9O3dqcPm7cZpUI9/iZ/OaU9Q==
+tippy.js@4.3.5:
+ version "4.3.5"
+ resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-4.3.5.tgz#882bff8d92f09bb0546d2826d5668c0560006f54"
+ integrity sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA==
dependencies:
- popper.js "^1.16.0"
+ popper.js "^1.14.7"
tiptap-commands@^1.12.3:
version "1.12.3"
@@ -12950,13 +12974,13 @@ url-join@4.0.0:
integrity sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=
url-loader@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.2.0.tgz#af321aece1fd0d683adc8aaeb27829f29c75b46e"
- integrity sha512-G8nk3np8ZAnwhHXas1JxJEwJyQdqFXAKJehfgZ/XrC48volFBRtO+FIKtF2u0Ma3bw+4vnDVjHPAQYlF9p2vsw==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b"
+ integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==
dependencies:
loader-utils "^1.2.3"
mime "^2.4.4"
- schema-utils "^2.4.1"
+ schema-utils "^2.5.0"
url-parse-lax@^1.0.0:
version "1.0.0"
@@ -13229,6 +13253,13 @@ vue-router@^3.0.6:
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.1.3.tgz#e6b14fabc0c0ee9fda0e2cbbda74b350e28e412b"
integrity sha512-8iSa4mGNXBjyuSZFCCO4fiKfvzqk+mhL0lnKuGcQtO1eoj8nq3CmbEG8FwK5QqoqwDgsjsf1GDuisDX4cdb/aQ==
+vue-scrollto@^2.17.1:
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/vue-scrollto/-/vue-scrollto-2.17.1.tgz#cd62ee0b98cf7e2ba9fd94f029addcd093978a48"
+ integrity sha512-uxOJXg6cZL88B+hTXRHDJMR+gHGiaS70ZTNk55fE5Z2TdwyIx9K/IHoNeTrtBrM6u3FASAIymKjZaQLmDf8Ykg==
+ dependencies:
+ bezier-easing "2.1.0"
+
vue-style-loader@^4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8"
diff --git a/lib/mobilizon/events/comment.ex b/lib/mobilizon/events/comment.ex
index c3ee90a31..9e2efd69d 100644
--- a/lib/mobilizon/events/comment.ex
+++ b/lib/mobilizon/events/comment.ex
@@ -29,8 +29,19 @@ defmodule Mobilizon.Events.Comment do
origin_comment: t
}
- @required_attrs [:text, :actor_id, :url]
- @optional_attrs [:event_id, :in_reply_to_comment_id, :origin_comment_id, :attributed_to_id]
+ # When deleting an event we only nihilify everything
+ @required_attrs [:url]
+ @creation_required_attrs @required_attrs ++ [:text, :actor_id]
+ @deletion_required_attrs @required_attrs ++ [:deleted_at]
+ @optional_attrs [
+ :text,
+ :actor_id,
+ :event_id,
+ :in_reply_to_comment_id,
+ :origin_comment_id,
+ :attributed_to_id,
+ :deleted_at
+ ]
@attrs @required_attrs ++ @optional_attrs
schema "comments" do
@@ -39,12 +50,15 @@ defmodule Mobilizon.Events.Comment do
field(:local, :boolean, default: true)
field(:visibility, CommentVisibility, default: :public)
field(:uuid, Ecto.UUID)
+ field(:total_replies, :integer, virtual: true, default: 0)
+ field(:deleted_at, :utc_datetime)
belongs_to(:actor, Actor, foreign_key: :actor_id)
belongs_to(:attributed_to, Actor, foreign_key: :attributed_to_id)
belongs_to(:event, Event, foreign_key: :event_id)
belongs_to(:in_reply_to_comment, Comment, foreign_key: :in_reply_to_comment_id)
belongs_to(:origin_comment, Comment, foreign_key: :origin_comment_id)
+ has_many(:replies, Comment, foreign_key: :in_reply_to_comment_id)
many_to_many(:tags, Tag, join_through: "comments_tags", on_replace: :delete)
has_many(:mentions, Mention)
@@ -62,16 +76,56 @@ defmodule Mobilizon.Events.Comment do
@doc false
@spec changeset(t, map) :: Ecto.Changeset.t()
def changeset(%__MODULE__{} = comment, attrs) do
- uuid = Map.get(attrs, :uuid) || Ecto.UUID.generate()
- url = Map.get(attrs, :url) || generate_url(uuid)
+ comment
+ |> common_changeset(attrs)
+ |> validate_required(@creation_required_attrs)
+ end
+ @spec delete_changeset(t, map) :: Ecto.Changeset.t()
+ def delete_changeset(%__MODULE__{} = comment, attrs) do
+ comment
+ |> common_changeset(attrs)
+ |> validate_required(@deletion_required_attrs)
+ end
+
+ @doc """
+ Checks whether an comment can be managed.
+ """
+ @spec can_be_managed_by(t, integer | String.t()) :: boolean
+ def can_be_managed_by(%__MODULE__{actor_id: creator_actor_id}, actor_id)
+ when creator_actor_id == actor_id do
+ {:comment_can_be_managed, true}
+ end
+
+ def can_be_managed_by(_comment, _actor), do: {:comment_can_be_managed, false}
+
+ defp common_changeset(%__MODULE__{} = comment, attrs) do
comment
|> cast(attrs, @attrs)
- |> put_change(:uuid, uuid)
- |> put_change(:url, url)
+ |> maybe_generate_uuid()
+ |> maybe_generate_url()
|> put_tags(attrs)
|> put_mentions(attrs)
- |> validate_required(@required_attrs)
+ end
+
+ @spec maybe_generate_uuid(Ecto.Changeset.t()) :: Ecto.Changeset.t()
+ defp maybe_generate_uuid(%Ecto.Changeset{} = changeset) do
+ case fetch_field(changeset, :uuid) do
+ :error -> put_change(changeset, :uuid, Ecto.UUID.generate())
+ {:data, nil} -> put_change(changeset, :uuid, Ecto.UUID.generate())
+ _ -> changeset
+ end
+ end
+
+ @spec maybe_generate_url(Ecto.Changeset.t()) :: Ecto.Changeset.t()
+ defp maybe_generate_url(%Ecto.Changeset{} = changeset) do
+ with res when res in [:error, {:data, nil}] <- fetch_field(changeset, :url),
+ {changes, uuid} when changes in [:changes, :data] <- fetch_field(changeset, :uuid),
+ url <- generate_url(uuid) do
+ put_change(changeset, :url, url)
+ else
+ _ -> changeset
+ end
end
@spec generate_url(String.t()) :: String.t()
diff --git a/lib/mobilizon/events/event.ex b/lib/mobilizon/events/event.ex
index 9cbe0023b..4dd35c7d1 100644
--- a/lib/mobilizon/events/event.ex
+++ b/lib/mobilizon/events/event.ex
@@ -14,6 +14,7 @@ defmodule Mobilizon.Events.Event do
alias Mobilizon.Addresses
alias Mobilizon.Events.{
+ Comment,
EventOptions,
EventStatus,
EventVisibility,
@@ -111,6 +112,7 @@ defmodule Mobilizon.Events.Event do
has_many(:tracks, Track)
has_many(:sessions, Session)
has_many(:mentions, Mention)
+ has_many(:comments, Comment)
many_to_many(:tags, Tag, join_through: "events_tags", on_replace: :delete)
many_to_many(:participants, Actor, join_through: Participant)
diff --git a/lib/mobilizon/events/events.ex b/lib/mobilizon/events/events.ex
index 636334eba..9e17d7826 100644
--- a/lib/mobilizon/events/events.ex
+++ b/lib/mobilizon/events/events.ex
@@ -89,12 +89,21 @@ defmodule Mobilizon.Events do
:sessions,
:tracks,
:tags,
+ :comments,
:participants,
:physical_address,
:picture
]
- @comment_preloads [:actor, :attributed_to, :in_reply_to_comment, :tags, :mentions]
+ @comment_preloads [
+ :actor,
+ :attributed_to,
+ :in_reply_to_comment,
+ :origin_comment,
+ :replies,
+ :tags,
+ :mentions
+ ]
@doc """
Gets a single event.
@@ -1001,6 +1010,29 @@ defmodule Mobilizon.Events do
|> Repo.all()
end
+ def data() do
+ Dataloader.Ecto.new(Repo, query: &query/2)
+ end
+
+ @doc """
+ Query for comment dataloader
+
+ We only get first comment of thread, and count replies.
+ Read: https://hexdocs.pm/absinthe/ecto.html#dataloader
+ """
+ def query(Comment, _params) do
+ Comment
+ |> join(:left, [c], r in Comment, on: r.origin_comment_id == c.id)
+ |> where([c, _], is_nil(c.in_reply_to_comment_id))
+ |> where([_, r], is_nil(r.deleted_at))
+ |> group_by([c], c.id)
+ |> select([c, r], %{c | total_replies: count(r.id)})
+ end
+
+ def query(queryable, _) do
+ queryable
+ end
+
@doc """
Gets a single comment.
"""
@@ -1015,6 +1047,15 @@ defmodule Mobilizon.Events do
@spec get_comment!(integer | String.t()) :: Comment.t()
def get_comment!(id), do: Repo.get!(Comment, id)
+ def get_comment_with_preload(nil), do: nil
+
+ def get_comment_with_preload(id) do
+ Comment
+ |> where(id: ^id)
+ |> preload_for_comment()
+ |> Repo.one()
+ end
+
@doc """
Gets a comment by its URL.
"""
@@ -1071,6 +1112,25 @@ defmodule Mobilizon.Events do
|> Repo.preload(@comment_preloads)
end
+ def get_threads(event_id) do
+ Comment
+ |> where([c, _], c.event_id == ^event_id and is_nil(c.origin_comment_id))
+ |> join(:left, [c], r in Comment, on: r.origin_comment_id == c.id)
+ |> group_by([c], c.id)
+ |> select([c, r], %{c | total_replies: count(r.id)})
+ |> Repo.all()
+ end
+
+ @doc """
+ Gets paginated replies for root comment
+ """
+ @spec get_thread_replies(integer()) :: [Comment.t()]
+ def get_thread_replies(parent_id) do
+ parent_id
+ |> public_replies_for_thread_query()
+ |> Repo.all()
+ end
+
def get_or_create_comment(%{"url" => url} = attrs) do
case Repo.get_by(Comment, url: url) do
%Comment{} = comment -> {:ok, Repo.preload(comment, @comment_preloads)}
@@ -1103,10 +1163,20 @@ defmodule Mobilizon.Events do
end
@doc """
- Deletes a comment.
+ Deletes a comment
+
+ But actually just empty the fields so that threads are not broken.
"""
@spec delete_comment(Comment.t()) :: {:ok, Comment.t()} | {:error, Changeset.t()}
- def delete_comment(%Comment{} = comment), do: Repo.delete(comment)
+ def delete_comment(%Comment{} = comment) do
+ comment
+ |> Comment.delete_changeset(%{
+ text: nil,
+ actor_id: nil,
+ deleted_at: DateTime.utc_now()
+ })
+ |> Repo.update()
+ end
@doc """
Returns the list of public comments.
@@ -1119,7 +1189,7 @@ defmodule Mobilizon.Events do
@doc """
Returns the list of public comments for the actor.
"""
- @spec list_public_events_for_actor(Actor.t(), integer | nil, integer | nil) ::
+ @spec list_public_comments_for_actor(Actor.t(), integer | nil, integer | nil) ::
{:ok, [Comment.t()], integer}
def list_public_comments_for_actor(%Actor{id: actor_id}, page \\ nil, limit \\ nil) do
comments =
@@ -1480,6 +1550,13 @@ defmodule Mobilizon.Events do
|> preload_for_comment()
end
+ defp public_replies_for_thread_query(comment_id) do
+ Comment
+ |> where([c], c.origin_comment_id == ^comment_id and c.visibility in ^@public_visibility)
+ |> group_by([c], [c.in_reply_to_comment_id, c.id])
+ |> preload_for_comment()
+ end
+
@spec list_participants_for_event_query(String.t()) :: Ecto.Query.t()
defp list_participants_for_event_query(event_id) do
from(
diff --git a/lib/mobilizon/reports/report.ex b/lib/mobilizon/reports/report.ex
index bcce0ec3e..38818b552 100644
--- a/lib/mobilizon/reports/report.ex
+++ b/lib/mobilizon/reports/report.ex
@@ -14,7 +14,7 @@ defmodule Mobilizon.Reports.Report do
@type t :: %__MODULE__{
content: String.t(),
status: ReportStatus.t(),
- uri: String.t(),
+ url: String.t(),
reported: Actor.t(),
reporter: Actor.t(),
manager: Actor.t(),
@@ -23,17 +23,18 @@ defmodule Mobilizon.Reports.Report do
notes: [Note.t()]
}
- @required_attrs [:uri, :reported_id, :reporter_id]
- @optional_attrs [:content, :status, :manager_id, :event_id]
+ @required_attrs [:url, :reported_id, :reporter_id]
+ @optional_attrs [:content, :status, :manager_id, :event_id, :local]
@attrs @required_attrs ++ @optional_attrs
@timestamps_opts [type: :utc_datetime]
- @derive {Jason.Encoder, only: [:status, :uri]}
+ @derive {Jason.Encoder, only: [:status, :url]}
schema "reports" do
field(:content, :string)
field(:status, ReportStatus, default: :open)
- field(:uri, :string)
+ field(:url, :string)
+ field(:local, :boolean, default: true)
# The reported actor
belongs_to(:reported, Actor)
@@ -56,14 +57,24 @@ defmodule Mobilizon.Reports.Report do
def changeset(%__MODULE__{} = report, attrs) do
report
|> cast(attrs, @attrs)
+ |> maybe_generate_url()
+ |> maybe_put_comments(attrs)
|> validate_required(@required_attrs)
end
- @doc false
- @spec creation_changeset(t, map) :: Ecto.Changeset.t()
- def creation_changeset(%__MODULE__{} = report, attrs) do
- report
- |> changeset(attrs)
- |> put_assoc(:comments, attrs["comments"])
+ defp maybe_put_comments(%Ecto.Changeset{} = changeset, %{comments: comments}) do
+ put_assoc(changeset, :comments, comments)
+ end
+
+ defp maybe_put_comments(%Ecto.Changeset{} = changeset, _), do: changeset
+
+ @spec maybe_generate_url(Ecto.Changeset.t()) :: Ecto.Changeset.t()
+ defp maybe_generate_url(%Ecto.Changeset{} = changeset) do
+ with res when res in [:error, {:data, nil}] <- fetch_field(changeset, :url),
+ url <- "#{MobilizonWeb.Endpoint.url()}/report/#{Ecto.UUID.generate()}" do
+ put_change(changeset, :url, url)
+ else
+ _ -> changeset
+ end
end
end
diff --git a/lib/mobilizon/tombstone.ex b/lib/mobilizon/tombstone.ex
new file mode 100644
index 000000000..d0160fe40
--- /dev/null
+++ b/lib/mobilizon/tombstone.ex
@@ -0,0 +1,45 @@
+defmodule Mobilizon.Tombstone do
+ @moduledoc """
+ Represent tombstones for deleted objects. Saves only URI
+ """
+
+ use Ecto.Schema
+ import Ecto.Changeset
+ alias Mobilizon.Actors.Actor
+ alias Mobilizon.Storage.Repo
+
+ @type t :: %__MODULE__{
+ uri: String.t(),
+ actor: Actor.t()
+ }
+
+ @required_attrs [:uri, :actor_id]
+ @optional_attrs []
+ @attrs @required_attrs ++ @optional_attrs
+
+ schema "tombstones" do
+ field(:uri, :string)
+ belongs_to(:actor, Actor)
+
+ timestamps()
+ end
+
+ @doc false
+ def changeset(%__MODULE__{} = tombstone, attrs) do
+ tombstone
+ |> cast(attrs, @attrs)
+ |> validate_required(@attrs)
+ end
+
+ @spec create_tombstone(map()) :: {:ok, Ecto.Schema.t()} | {:error, Ecto.Changeset.t()}
+ def create_tombstone(attrs) do
+ %__MODULE__{}
+ |> changeset(attrs)
+ |> Repo.insert(on_conflict: :replace_all, conflict_target: :uri)
+ end
+
+ @spec find_tombstone(String.t()) :: Ecto.Schema.t() | nil
+ def find_tombstone(uri) do
+ Repo.get_by(__MODULE__, uri: uri)
+ end
+end
diff --git a/lib/mobilizon_web/api/comments.ex b/lib/mobilizon_web/api/comments.ex
index 6a0d43105..e3feb3056 100644
--- a/lib/mobilizon_web/api/comments.ex
+++ b/lib/mobilizon_web/api/comments.ex
@@ -9,11 +9,22 @@ defmodule MobilizonWeb.API.Comments do
@doc """
Create a comment
- Creates a comment from an actor and a status
+ Creates a comment from an actor
"""
@spec create_comment(map()) ::
{:ok, Activity.t(), Comment.t()} | any()
def create_comment(args) do
ActivityPub.create(:comment, args, true)
end
+
+ @doc """
+ Deletes a comment
+
+ Deletes a comment from an actor
+ """
+ @spec delete_comment(Comment.t()) ::
+ {:ok, Activity.t(), Comment.t()} | any()
+ def delete_comment(%Comment{} = comment) do
+ ActivityPub.delete(comment, true)
+ end
end
diff --git a/lib/mobilizon_web/api/reports.ex b/lib/mobilizon_web/api/reports.ex
index 965b33b30..0b6dc89ff 100644
--- a/lib/mobilizon_web/api/reports.ex
+++ b/lib/mobilizon_web/api/reports.ex
@@ -5,11 +5,7 @@ defmodule MobilizonWeb.API.Reports do
import Mobilizon.Service.Admin.ActionLogService
- import MobilizonWeb.API.Utils
-
- alias Mobilizon.Actors
alias Mobilizon.Actors.Actor
- alias Mobilizon.Events
alias Mobilizon.Reports, as: ReportsAction
alias Mobilizon.Reports.{Note, Report, ReportStatus}
alias Mobilizon.Service.ActivityPub
@@ -20,44 +16,16 @@ defmodule MobilizonWeb.API.Reports do
@doc """
Create a report/flag on an actor, and optionally on an event or on comments.
"""
- def report(
- %{
- reporter_actor_id: reporter_actor_id,
- reported_actor_id: reported_actor_id
- } = args
- ) do
- with {:reporter, %Actor{url: reporter_url} = _reporter_actor} <-
- {:reporter, Actors.get_actor!(reporter_actor_id)},
- {:reported, %Actor{url: reported_actor_url} = reported_actor} <-
- {:reported, Actors.get_actor!(reported_actor_id)},
- {:ok, content} <- args |> Map.get(:content, nil) |> make_report_content_text(),
- {:ok, event} <- args |> Map.get(:event_id, nil) |> get_event(),
- {:get_report_comments, comments_urls} <-
- get_report_comments(reported_actor, Map.get(args, :comments_ids, [])),
- {:make_activity, {:ok, %Activity{} = activity, %Report{} = report}} <-
- {:make_activity,
- ActivityPub.flag(%{
- reporter_url: reporter_url,
- reported_actor_url: reported_actor_url,
- event_url: (!is_nil(event) && event.url) || nil,
- comments_url: comments_urls,
- content: content,
- forward: args[:forward] || false,
- local: args[:local] || args[:forward] || false
- })} do
- {:ok, activity, report}
- else
- {:make_activity, err} -> {:error, err}
- {:error, err} -> {:error, err}
- {:actor_id, %{}} -> {:error, "Valid `actor_id` required"}
- {:reporter, nil} -> {:error, "Reporter Actor not found"}
- {:reported, nil} -> {:error, "Reported Actor not found"}
+ def report(args) do
+ case {:make_activity, ActivityPub.flag(args, Map.get(args, :local, false) == false)} do
+ {:make_activity, {:ok, %Activity{} = activity, %Report{} = report}} ->
+ {:ok, activity, report}
+
+ {:make_activity, err} ->
+ {:error, err}
end
end
- defp get_event(nil), do: {:ok, nil}
- defp get_event(event_id), do: Events.get_event(event_id)
-
@doc """
Update the state of a report
"""
@@ -72,13 +40,6 @@ defmodule MobilizonWeb.API.Reports do
end
end
- defp get_report_comments(%Actor{id: actor_id}, comment_ids) do
- {:get_report_comments,
- actor_id |> Events.list_comments_by_actor_and_ids(comment_ids) |> Enum.map(& &1.url)}
- end
-
- defp get_report_comments(_, _), do: {:get_report_comments, nil}
-
@doc """
Create a note on a report
"""
diff --git a/lib/mobilizon_web/resolvers/admin.ex b/lib/mobilizon_web/resolvers/admin.ex
index b0688d792..21d4ec6c1 100644
--- a/lib/mobilizon_web/resolvers/admin.ex
+++ b/lib/mobilizon_web/resolvers/admin.ex
@@ -7,7 +7,7 @@ defmodule MobilizonWeb.Resolvers.Admin do
alias Mobilizon.Admin.ActionLog
alias Mobilizon.Events
- alias Mobilizon.Events.Event
+ alias Mobilizon.Events.{Event, Comment}
alias Mobilizon.Reports.{Note, Report}
alias Mobilizon.Service.Statistics
alias Mobilizon.Users.User
@@ -90,6 +90,15 @@ defmodule MobilizonWeb.Resolvers.Admin do
}
end
+ defp transform_action_log(Comment, :delete, %ActionLog{
+ changes: changes
+ }) do
+ %{
+ action: :comment_deletion,
+ object: convert_changes_to_struct(Comment, changes)
+ }
+ end
+
# Changes are stored as %{"key" => "value"} so we need to convert them back as struct
defp convert_changes_to_struct(struct, %{"report_id" => _report_id} = changes) do
with data <- for({key, val} <- changes, into: %{}, do: {String.to_atom(key), val}),
diff --git a/lib/mobilizon_web/resolvers/comment.ex b/lib/mobilizon_web/resolvers/comment.ex
index 15bfb9d2b..d61950d2e 100644
--- a/lib/mobilizon_web/resolvers/comment.ex
+++ b/lib/mobilizon_web/resolvers/comment.ex
@@ -3,25 +3,73 @@ defmodule MobilizonWeb.Resolvers.Comment do
Handles the comment-related GraphQL calls.
"""
- alias Mobilizon.Events.Comment
+ alias Mobilizon.Events
+ alias Mobilizon.Events.Comment, as: CommentModel
alias Mobilizon.Users.User
alias Mobilizon.Actors.Actor
+ alias Mobilizon.Actors
alias MobilizonWeb.API.Comments
+ import Mobilizon.Service.Admin.ActionLogService
require Logger
- def create_comment(_parent, %{text: text, actor_id: actor_id}, %{
+ def get_thread(_parent, %{id: thread_id}, _context) do
+ {:ok, Events.get_thread_replies(thread_id)}
+ end
+
+ def create_comment(_parent, %{actor_id: actor_id} = args, %{
context: %{current_user: %User{} = user}
}) do
with {:is_owned, %Actor{} = _organizer_actor} <- User.owns_actor(user, actor_id),
- {:ok, _, %Comment{} = comment} <-
- Comments.create_comment(%{actor_id: actor_id, text: text}) do
+ {:ok, _, %CommentModel{} = comment} <-
+ Comments.create_comment(args) do
{:ok, comment}
+ else
+ {:is_owned, nil} ->
+ {:error, "Actor id is not owned by authenticated user"}
end
end
- def create_comment(_parent, _args, %{}) do
+ def create_comment(_parent, _args, _context) do
{:error, "You are not allowed to create a comment if not connected"}
end
+
+ def delete_comment(_parent, %{actor_id: actor_id, comment_id: comment_id}, %{
+ context: %{current_user: %User{role: role} = user}
+ }) do
+ with {actor_id, ""} <- Integer.parse(actor_id),
+ {:is_owned, %Actor{} = _organizer_actor} <- User.owns_actor(user, actor_id),
+ %CommentModel{} = comment <- Events.get_comment_with_preload(comment_id) do
+ cond do
+ {:comment_can_be_managed, true} == CommentModel.can_be_managed_by(comment, actor_id) ->
+ do_delete_comment(comment)
+
+ role in [:moderator, :administrator] ->
+ with {:ok, res} <- do_delete_comment(comment),
+ %Actor{} = actor <- Actors.get_actor(actor_id) do
+ log_action(actor, "delete", comment)
+
+ {:ok, res}
+ end
+
+ true ->
+ {:error, "You cannot delete this comment"}
+ end
+ else
+ {:is_owned, nil} ->
+ {:error, "Actor id is not owned by authenticated user"}
+ end
+ end
+
+ def delete_comment(_parent, _args, %{}) do
+ {:error, "You are not allowed to delete a comment if not connected"}
+ end
+
+ defp do_delete_comment(%CommentModel{} = comment) do
+ with {:ok, _, %CommentModel{} = comment} <-
+ Comments.delete_comment(comment) do
+ {:ok, comment}
+ end
+ end
end
diff --git a/lib/mobilizon_web/resolvers/report.ex b/lib/mobilizon_web/resolvers/report.ex
index 0b06622e9..823e58a34 100644
--- a/lib/mobilizon_web/resolvers/report.ex
+++ b/lib/mobilizon_web/resolvers/report.ex
@@ -46,10 +46,10 @@ defmodule MobilizonWeb.Resolvers.Report do
"""
def create_report(
_parent,
- %{reporter_actor_id: reporter_actor_id} = args,
+ %{reporter_id: reporter_id} = args,
%{context: %{current_user: user}} = _resolution
) do
- with {:is_owned, %Actor{}} <- User.owns_actor(user, reporter_actor_id),
+ with {:is_owned, %Actor{}} <- User.owns_actor(user, reporter_id),
{:ok, _, %Report{} = report} <- ReportsAPI.report(args) do
{:ok, report}
else
diff --git a/lib/mobilizon_web/router.ex b/lib/mobilizon_web/router.ex
index 056b0be7f..caf0c99e0 100644
--- a/lib/mobilizon_web/router.ex
+++ b/lib/mobilizon_web/router.ex
@@ -49,7 +49,11 @@ defmodule MobilizonWeb.Router do
scope "/api" do
pipe_through(:graphql)
- forward("/", Absinthe.Plug, schema: MobilizonWeb.Schema)
+ forward("/", Absinthe.Plug,
+ schema: MobilizonWeb.Schema,
+ analyze_complexity: true,
+ max_complexity: 200
+ )
end
forward("/graphiql", Absinthe.Plug.GraphiQL, schema: MobilizonWeb.Schema)
diff --git a/lib/mobilizon_web/schema.ex b/lib/mobilizon_web/schema.ex
index 93dc840b5..e7f61efb3 100644
--- a/lib/mobilizon_web/schema.ex
+++ b/lib/mobilizon_web/schema.ex
@@ -96,7 +96,7 @@ defmodule MobilizonWeb.Schema do
Dataloader.new()
|> Dataloader.add_source(Actors, default_source)
|> Dataloader.add_source(Users, default_source)
- |> Dataloader.add_source(Events, default_source)
+ |> Dataloader.add_source(Events, Events.data())
|> Dataloader.add_source(Addresses, default_source)
|> Dataloader.add_source(Media, default_source)
|> Dataloader.add_source(Reports, default_source)
@@ -117,6 +117,7 @@ defmodule MobilizonWeb.Schema do
import_fields(:person_queries)
import_fields(:group_queries)
import_fields(:event_queries)
+ import_fields(:comment_queries)
import_fields(:tag_queries)
import_fields(:address_queries)
import_fields(:config_queries)
diff --git a/lib/mobilizon_web/schema/admin.ex b/lib/mobilizon_web/schema/admin.ex
index e73678f96..ca5ec8647 100644
--- a/lib/mobilizon_web/schema/admin.ex
+++ b/lib/mobilizon_web/schema/admin.ex
@@ -5,7 +5,7 @@ defmodule MobilizonWeb.Schema.AdminType do
use Absinthe.Schema.Notation
- alias Mobilizon.Events.Event
+ alias Mobilizon.Events.{Event, Comment}
alias Mobilizon.Reports.{Note, Report}
alias MobilizonWeb.Resolvers.Admin
@@ -26,6 +26,7 @@ defmodule MobilizonWeb.Schema.AdminType do
value(:note_creation)
value(:note_deletion)
value(:event_deletion)
+ value(:comment_deletion)
value(:event_update)
end
@@ -43,6 +44,9 @@ defmodule MobilizonWeb.Schema.AdminType do
%Event{}, _ ->
:event
+ %Comment{}, _ ->
+ :comment
+
_, _ ->
nil
end)
diff --git a/lib/mobilizon_web/schema/comment.ex b/lib/mobilizon_web/schema/comment.ex
index 9a92d6c12..8f68d16d5 100644
--- a/lib/mobilizon_web/schema/comment.ex
+++ b/lib/mobilizon_web/schema/comment.ex
@@ -4,9 +4,12 @@ defmodule MobilizonWeb.Schema.CommentType do
"""
use Absinthe.Schema.Notation
alias MobilizonWeb.Resolvers.Comment
+ alias Mobilizon.{Actors, Events}
+ import Absinthe.Resolution.Helpers, only: [dataloader: 1]
@desc "A comment"
object :comment do
+ interfaces([:action_log_object])
field(:id, :id, description: "Internal ID for this comment")
field(:uuid, :uuid)
field(:url, :string)
@@ -14,8 +17,20 @@ defmodule MobilizonWeb.Schema.CommentType do
field(:visibility, :comment_visibility)
field(:text, :string)
field(:primaryLanguage, :string)
- field(:replies, list_of(:comment))
+
+ field(:replies, list_of(:comment)) do
+ resolve(dataloader(Events))
+ end
+
+ field(:total_replies, :integer)
+ field(:in_reply_to_comment, :comment, resolve: dataloader(Events))
+ field(:event, :event, resolve: dataloader(Events))
+ field(:origin_comment, :comment, resolve: dataloader(Events))
field(:threadLanguages, non_null(list_of(:string)))
+ field(:actor, :person, resolve: dataloader(Actors))
+ field(:inserted_at, :datetime)
+ field(:updated_at, :datetime)
+ field(:deleted_at, :datetime)
end
@desc "The list of visibility options for a comment"
@@ -31,13 +46,30 @@ defmodule MobilizonWeb.Schema.CommentType do
value(:invite, description: "visible only to people invited")
end
+ object :comment_queries do
+ @desc "Get replies for thread"
+ field :thread, type: list_of(:comment) do
+ arg(:id, :id)
+ resolve(&Comment.get_thread/3)
+ end
+ end
+
object :comment_mutations do
@desc "Create a comment"
field :create_comment, type: :comment do
arg(:text, non_null(:string))
+ arg(:event_id, :id)
+ arg(:in_reply_to_comment_id, :id)
arg(:actor_id, non_null(:id))
resolve(&Comment.create_comment/3)
end
+
+ field :delete_comment, type: :comment do
+ arg(:comment_id, non_null(:id))
+ arg(:actor_id, non_null(:id))
+
+ resolve(&Comment.delete_comment/3)
+ end
end
end
diff --git a/lib/mobilizon_web/schema/event.ex b/lib/mobilizon_web/schema/event.ex
index 61b703ffb..b0c617221 100644
--- a/lib/mobilizon_web/schema/event.ex
+++ b/lib/mobilizon_web/schema/event.ex
@@ -8,7 +8,7 @@ defmodule MobilizonWeb.Schema.EventType do
import Absinthe.Resolution.Helpers, only: [dataloader: 1]
import MobilizonWeb.Schema.Utils
- alias Mobilizon.{Actors, Addresses}
+ alias Mobilizon.{Actors, Addresses, Events}
alias MobilizonWeb.Resolvers.{Event, Picture, Tag}
@@ -78,6 +78,10 @@ defmodule MobilizonWeb.Schema.EventType do
description: "Events related to this one"
)
+ field(:comments, list_of(:comment), description: "The comments in reply to the event") do
+ resolve(dataloader(Events))
+ end
+
# field(:tracks, list_of(:track))
# field(:sessions, list_of(:session))
diff --git a/lib/mobilizon_web/schema/report.ex b/lib/mobilizon_web/schema/report.ex
index 7e9acec4e..65b0344a9 100644
--- a/lib/mobilizon_web/schema/report.ex
+++ b/lib/mobilizon_web/schema/report.ex
@@ -71,8 +71,8 @@ defmodule MobilizonWeb.Schema.ReportType do
@desc "Create a report"
field :create_report, type: :report do
arg(:content, :string)
- arg(:reporter_actor_id, non_null(:id))
- arg(:reported_actor_id, non_null(:id))
+ arg(:reporter_id, non_null(:id))
+ arg(:reported_id, non_null(:id))
arg(:event_id, :id, default_value: nil)
arg(:comments_ids, list_of(:id), default_value: [])
resolve(&Report.create_report/3)
diff --git a/lib/service/activity_pub/activity_pub.ex b/lib/service/activity_pub/activity_pub.ex
index 778e7b1d3..8e3d4a0ee 100644
--- a/lib/service/activity_pub/activity_pub.ex
+++ b/lib/service/activity_pub/activity_pub.ex
@@ -11,15 +11,18 @@ defmodule Mobilizon.Service.ActivityPub do
import Mobilizon.Service.ActivityPub.Utils
import Mobilizon.Service.ActivityPub.Visibility
- alias Mobilizon.{Actors, Config, Events}
+ alias Mobilizon.{Actors, Config, Events, Reports, Users}
alias Mobilizon.Actors.{Actor, Follower}
alias Mobilizon.Events.{Comment, Event, Participant}
+ alias Mobilizon.Reports.Report
+ alias Mobilizon.Tombstone
alias Mobilizon.Service.ActivityPub.{Activity, Converter, Convertible, Relay, Transmogrifier}
alias Mobilizon.Service.{Federator, WebFinger}
alias Mobilizon.Service.HTTPSignatures.Signature
alias MobilizonWeb.API.Utils, as: APIUtils
alias Mobilizon.Service.ActivityPub.Audience
alias Mobilizon.Service.ActivityPub.Converter.Utils, as: ConverterUtils
+ alias MobilizonWeb.Email.{Admin, Mailer}
require Logger
@@ -133,7 +136,8 @@ defmodule Mobilizon.Service.ActivityPub do
Logger.debug("creating an activity")
Logger.debug(inspect(args))
- with {:ok, entity, create_data} <-
+ with {:tombstone, nil} <- {:tombstone, check_for_tombstones(args)},
+ {:ok, entity, create_data} <-
(case type do
:event -> create_event(args, additional)
:comment -> create_comment(args, additional)
@@ -345,6 +349,8 @@ defmodule Mobilizon.Service.ActivityPub do
}
with {:ok, %Event{} = event} <- Events.delete_event(event),
+ {:ok, %Tombstone{} = _tombstone} <-
+ Tombstone.create_tombstone(%{uri: event.url, actor_id: actor.id}),
{:ok, activity} <- create_activity(data, local),
:ok <- maybe_federate(activity) do
{:ok, activity, event}
@@ -361,6 +367,8 @@ defmodule Mobilizon.Service.ActivityPub do
}
with {:ok, %Comment{} = comment} <- Events.delete_comment(comment),
+ {:ok, %Tombstone{} = _tombstone} <-
+ Tombstone.create_tombstone(%{uri: comment.url, actor_id: actor.id}),
{:ok, activity} <- create_activity(data, local),
:ok <- maybe_federate(activity) do
{:ok, activity, comment}
@@ -383,25 +391,25 @@ defmodule Mobilizon.Service.ActivityPub do
end
end
- def flag(params) do
- # only accept false as false value
- local = !(params[:local] == false)
- forward = !(params[:forward] == false)
-
- additional = params[:additional] || %{}
-
- additional =
- if forward do
- Map.merge(additional, %{"to" => [], "cc" => [params.reported_actor_url]})
- else
- Map.merge(additional, %{"to" => [], "cc" => []})
- end
-
- with flag_data <- make_flag_data(params, additional),
- {:ok, activity} <- create_activity(flag_data, local),
- {:ok, object} <- insert_full_object(flag_data),
+ def flag(args, local \\ false, _additional \\ %{}) do
+ with {:build_args, args} <- {:build_args, prepare_args_for_report(args)},
+ {:create_report, {:ok, %Report{} = report}} <-
+ {:create_report, Reports.create_report(args)},
+ report_as_data <- Convertible.model_to_as(report),
+ {:ok, activity} <- create_activity(report_as_data, local),
:ok <- maybe_federate(activity) do
- {:ok, activity, object}
+ Enum.each(Users.list_moderators(), fn moderator ->
+ moderator
+ |> Admin.report(report)
+ |> Mailer.deliver_later()
+ end)
+
+ {:ok, activity, report}
+ else
+ err ->
+ Logger.error("Something went wrong while creating an activity")
+ Logger.debug(inspect(err))
+ err
end
end
@@ -776,6 +784,10 @@ defmodule Mobilizon.Service.ActivityPub do
end
end
+ @spec check_for_tombstones(map()) :: Tombstone.t() | nil
+ defp check_for_tombstones(%{url: url}), do: Tombstone.find_tombstone(url)
+ defp check_for_tombstones(_), do: nil
+
@spec update_event(Event.t(), map(), map()) ::
{:ok, Event.t(), Activity.t()} | any()
defp update_event(
@@ -930,7 +942,12 @@ defmodule Mobilizon.Service.ActivityPub do
tags: tags,
in_reply_to_comment: in_reply_to_comment,
in_reply_to_comment_id:
- if(is_nil(in_reply_to_comment), do: nil, else: Map.get(in_reply_to_comment, :id))
+ if(is_nil(in_reply_to_comment), do: nil, else: Map.get(in_reply_to_comment, :id)),
+ origin_comment_id:
+ if(is_nil(in_reply_to_comment),
+ do: nil,
+ else: Comment.get_thread_id(in_reply_to_comment)
+ )
}) do
args
end
@@ -945,4 +962,27 @@ defmodule Mobilizon.Service.ActivityPub do
%{args | preferred_username: preferred_username, summary: summary}
end
end
+
+ defp prepare_args_for_report(args) do
+ with {:reporter, %Actor{} = reporter_actor} <-
+ {:reporter, Actors.get_actor!(args.reporter_id)},
+ {:reported, %Actor{} = reported_actor} <-
+ {:reported, Actors.get_actor!(args.reported_id)},
+ content <- HtmlSanitizeEx.strip_tags(args.content),
+ event <- Events.get_comment(Map.get(args, :event_id)),
+ {:get_report_comments, comments} <-
+ {:get_report_comments,
+ Events.list_comments_by_actor_and_ids(
+ reported_actor.id,
+ Map.get(args, :comments_ids, [])
+ )} do
+ Map.merge(args, %{
+ reporter: reporter_actor,
+ reported: reported_actor,
+ content: content,
+ event: event,
+ comments: comments
+ })
+ end
+ end
end
diff --git a/lib/service/activity_pub/converter/comment.ex b/lib/service/activity_pub/converter/comment.ex
index 1b0eaf0ff..da73e53c1 100644
--- a/lib/service/activity_pub/converter/comment.ex
+++ b/lib/service/activity_pub/converter/comment.ex
@@ -73,7 +73,7 @@ defmodule Mobilizon.Service.ActivityPub.Converter.Comment do
# Anything else is kind of a MP
{:error, parent} ->
- Logger.debug("Parent object is something we don't handle")
+ Logger.warn("Parent object is something we don't handle")
Logger.debug(inspect(parent))
data
end
@@ -95,7 +95,7 @@ defmodule Mobilizon.Service.ActivityPub.Converter.Comment do
"""
@impl Converter
@spec model_to_as(CommentModel.t()) :: map
- def model_to_as(%CommentModel{} = comment) do
+ def model_to_as(%CommentModel{deleted_at: nil} = comment) do
to =
if comment.visibility == :public,
do: ["https://www.w3.org/ns/activitystreams#Public"],
@@ -120,4 +120,17 @@ defmodule Mobilizon.Service.ActivityPub.Converter.Comment do
object
end
end
+
+ @impl Converter
+ @spec model_to_as(CommentModel.t()) :: map
+ def model_to_as(%CommentModel{} = comment) do
+ %{
+ "type" => "Tombstone",
+ "uuid" => comment.uuid,
+ "id" => comment.url,
+ "published" => comment.inserted_at,
+ "updated" => comment.updated_at,
+ "deleted" => comment.deleted_at
+ }
+ end
end
diff --git a/lib/service/activity_pub/converter/flag.ex b/lib/service/activity_pub/converter/flag.ex
index 93108613e..ac2c992b3 100644
--- a/lib/service/activity_pub/converter/flag.ex
+++ b/lib/service/activity_pub/converter/flag.ex
@@ -14,9 +14,16 @@ defmodule Mobilizon.Service.ActivityPub.Converter.Flag do
alias Mobilizon.Events.Event
alias Mobilizon.Reports.Report
alias Mobilizon.Service.ActivityPub.Converter
+ alias Mobilizon.Service.ActivityPub.Convertible
@behaviour Converter
+ defimpl Convertible, for: Report do
+ alias Mobilizon.Service.ActivityPub.Converter.Flag, as: FlagConverter
+
+ defdelegate model_to_as(report), to: FlagConverter
+ end
+
@doc """
Converts an AP object data to our internal data structure.
"""
@@ -35,18 +42,29 @@ defmodule Mobilizon.Service.ActivityPub.Converter.Flag do
end
end
+ @audience %{"to" => ["https://www.w3.org/ns/activitystreams#Public"], "cc" => []}
+
@doc """
Convert an event struct to an ActivityStream representation
"""
@impl Converter
- @spec model_to_as(EventModel.t()) :: map
+ @spec model_to_as(Report.t()) :: map
def model_to_as(%Report{} = report) do
+ object = [report.reported.url] ++ Enum.map(report.comments, fn comment -> comment.url end)
+
+ object = if report.event, do: object ++ [report.event.url], else: object
+
+ audience =
+ if report.local, do: @audience, else: Map.put(@audience, "cc", [report.reported.url])
+
%{
"type" => "Flag",
- "to" => ["https://www.w3.org/ns/activitystreams#Public"],
"actor" => report.reporter.url,
- "id" => report.url
+ "id" => report.url,
+ "content" => report.content,
+ "object" => object
}
+ |> Map.merge(audience)
end
@spec as_to_model(map) :: map
diff --git a/lib/service/activity_pub/transmogrifier.ex b/lib/service/activity_pub/transmogrifier.ex
index 1f7cd7f76..b82b3fbe2 100644
--- a/lib/service/activity_pub/transmogrifier.ex
+++ b/lib/service/activity_pub/transmogrifier.ex
@@ -49,7 +49,8 @@ defmodule Mobilizon.Service.ActivityPub.Transmogrifier do
object
|> Map.put("actor", object["attributedTo"])
|> fix_attachments
- |> fix_in_reply_to
+
+ # |> fix_in_reply_to
# |> fix_tag
end
@@ -127,16 +128,17 @@ defmodule Mobilizon.Service.ActivityPub.Transmogrifier do
def handle_incoming(%{"type" => "Flag"} = data) do
with params <- Converter.Flag.as_to_model(data) do
params = %{
- reporter_url: params["reporter"].url,
- reported_actor_url: params["reported"].url,
- comments_url: params["comments"] |> Enum.map(& &1.url),
+ reporter_id: params["reporter"].id,
+ reported_id: params["reported"].id,
+ comments_ids: params["comments"] |> Enum.map(& &1.id),
content: params["content"] || "",
additional: %{
"cc" => [params["reported"].url]
- }
+ },
+ local: false
}
- ActivityPub.flag(params)
+ ActivityPub.flag(params, false)
end
end
diff --git a/lib/service/activity_pub/visibility.ex b/lib/service/activity_pub/visibility.ex
index adca3e2aa..018aacb63 100644
--- a/lib/service/activity_pub/visibility.ex
+++ b/lib/service/activity_pub/visibility.ex
@@ -8,6 +8,7 @@ defmodule Mobilizon.Service.ActivityPub.Visibility do
Utility functions related to content visibility
"""
+ alias Mobilizon.Events.Comment
alias Mobilizon.Service.ActivityPub.Activity
@public "https://www.w3.org/ns/activitystreams#Public"
@@ -17,5 +18,6 @@ defmodule Mobilizon.Service.ActivityPub.Visibility do
def is_public?(%{data: data}), do: is_public?(data)
def is_public?(%Activity{data: data}), do: is_public?(data)
def is_public?(data) when is_map(data), do: @public in (data["to"] ++ (data["cc"] || []))
+ def is_public?(%Comment{deleted_at: deleted_at}), do: !is_nil(deleted_at)
def is_public?(err), do: raise(ArgumentError, message: "Invalid argument #{inspect(err)}")
end
diff --git a/lib/service/formatter/formatter.ex b/lib/service/formatter/formatter.ex
index bbff1ef5c..282fc392f 100644
--- a/lib/service/formatter/formatter.ex
+++ b/lib/service/formatter/formatter.ex
@@ -34,7 +34,12 @@ defmodule Mobilizon.Service.Formatter do
def mention_handler("@" <> nickname, buffer, _opts, acc) do
case Actors.get_actor_by_name(nickname) do
- %Actor{id: id, url: url, preferred_username: preferred_username} = actor ->
+ %Actor{preferred_username: preferred_username} = actor ->
+ link = "@#{preferred_username}"
+
+ {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, actor})}}
+
+ %Actor{type: :Person, id: id, url: url, preferred_username: preferred_username} = actor ->
link =
"@#{
preferred_username
diff --git a/lib/service/workers/build_search_worker.ex b/lib/service/workers/build_search_worker.ex
index bd85d3f50..acf742056 100644
--- a/lib/service/workers/build_search_worker.ex
+++ b/lib/service/workers/build_search_worker.ex
@@ -19,7 +19,7 @@ defmodule Mobilizon.Service.Workers.BuildSearchWorker do
def perform(%{"op" => "update_search_event", "event_id" => event_id}, _job) do
with {:ok, %Event{} = event} <- Events.get_event_with_preload(event_id) do
- update_search_event(event)
+ insert_search_event(event)
end
end
@@ -33,30 +33,12 @@ defmodule Mobilizon.Service.Workers.BuildSearchWorker do
setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
setweight(to_tsvector(unaccent($3)), 'C')
)
- );
- """,
- [
- event.id,
- event.title,
- HtmlSanitizeEx.strip_tags(event.description),
- get_tags_string(event)
- ]
- )
- end
-
- def update_search_event(%Event{} = event) do
- SQL.query(
- Repo,
- """
- UPDATE event_search
- SET document =
- (SELECT
- setweight(to_tsvector(unaccent($2)), 'A') ||
- setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
- setweight(to_tsvector(unaccent($3)), 'C')
- ),
- title = $2
- WHERE id = $1;
+ ) ON CONFLICT (id) DO UPDATE SET title = $2, document = (
+ SELECT
+ setweight(to_tsvector(unaccent($2)), 'A') ||
+ setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
+ setweight(to_tsvector(unaccent($3)), 'C')
+ );
""",
[
event.id,
diff --git a/mix.exs b/mix.exs
index abade3f18..d6612bb26 100644
--- a/mix.exs
+++ b/mix.exs
@@ -134,7 +134,6 @@ defmodule Mobilizon.Mixfile do
"ecto.setup"
],
test: [
- "ecto.create --quiet",
"ecto.migrate",
&run_test/1
],
diff --git a/priv/repo/migrations/20181108165151_fix_comments_references.exs b/priv/repo/migrations/20181108165151_fix_comments_references.exs
index 506bd83e3..8a5ac21f2 100644
--- a/priv/repo/migrations/20181108165151_fix_comments_references.exs
+++ b/priv/repo/migrations/20181108165151_fix_comments_references.exs
@@ -19,8 +19,8 @@ defmodule Mobilizon.Repo.Migrations.FixCommentsReferences do
drop(constraint(:comments, "comments_origin_comment_id_fkey"))
alter table(:comments) do
- modify(:in_reply_to_comment_id, references(:categories, on_delete: :nothing))
- modify(:origin_comment_id, references(:addresses, on_delete: :delete_all))
+ modify(:in_reply_to_comment_id, references(:comments, on_delete: :nothing))
+ modify(:origin_comment_id, references(:comments, on_delete: :delete_all))
end
end
end
diff --git a/priv/repo/migrations/20191114155534_cascade_comment_deletion.exs b/priv/repo/migrations/20191114155534_cascade_comment_deletion.exs
new file mode 100644
index 000000000..50b934b64
--- /dev/null
+++ b/priv/repo/migrations/20191114155534_cascade_comment_deletion.exs
@@ -0,0 +1,23 @@
+defmodule Mobilizon.Storage.Repo.Migrations.CascadeCommentDeletion do
+ use Ecto.Migration
+
+ def up do
+ drop(constraint(:comments, "comments_in_reply_to_comment_id_fkey"))
+ drop(constraint(:comments, "comments_origin_comment_id_fkey"))
+
+ alter table(:comments) do
+ modify(:in_reply_to_comment_id, references(:comments, on_delete: :nilify_all))
+ modify(:origin_comment_id, references(:comments, on_delete: :nilify_all))
+ end
+ end
+
+ def down do
+ drop(constraint(:comments, "comments_in_reply_to_comment_id_fkey"))
+ drop(constraint(:comments, "comments_origin_comment_id_fkey"))
+
+ alter table(:comments) do
+ modify(:in_reply_to_comment_id, references(:comments, on_delete: :nothing))
+ modify(:origin_comment_id, references(:comments, on_delete: :nothing))
+ end
+ end
+end
diff --git a/priv/repo/migrations/20191122154018_add_deleted_at_on_comments.exs b/priv/repo/migrations/20191122154018_add_deleted_at_on_comments.exs
new file mode 100644
index 000000000..d04f609d4
--- /dev/null
+++ b/priv/repo/migrations/20191122154018_add_deleted_at_on_comments.exs
@@ -0,0 +1,21 @@
+defmodule Mobilizon.Storage.Repo.Migrations.AddDeletedAtOnComments do
+ use Ecto.Migration
+
+ def up do
+ drop_if_exists(constraint(:comments, "comments_actor_id_fkey"))
+
+ alter table(:comments) do
+ add(:deleted_at, :utc_datetime, null: true)
+ modify(:actor_id, references(:actors, on_delete: :nilify_all), null: true)
+ end
+ end
+
+ def down do
+ drop_if_exists(constraint(:comments, "comments_actor_id_fkey"))
+
+ alter table(:comments) do
+ remove(:deleted_at)
+ modify(:actor_id, references(:actors, on_delete: :nilify_all), null: false)
+ end
+ end
+end
diff --git a/priv/repo/migrations/20191126173510_add_local_field_to_reports.exs b/priv/repo/migrations/20191126173510_add_local_field_to_reports.exs
new file mode 100644
index 000000000..33391a1b5
--- /dev/null
+++ b/priv/repo/migrations/20191126173510_add_local_field_to_reports.exs
@@ -0,0 +1,19 @@
+defmodule Mobilizon.Storage.Repo.Migrations.AddLocalFieldToReports do
+ use Ecto.Migration
+
+ def up do
+ alter table(:reports) do
+ add(:local, :boolean, default: true, null: false)
+ end
+
+ rename(table(:reports), :uri, to: :url)
+ end
+
+ def down do
+ alter table(:reports) do
+ remove(:local)
+ end
+
+ rename(table(:reports), :url, to: :uri)
+ end
+end
diff --git a/priv/repo/migrations/20191127163737_create_tombstones.exs b/priv/repo/migrations/20191127163737_create_tombstones.exs
new file mode 100644
index 000000000..9d014125c
--- /dev/null
+++ b/priv/repo/migrations/20191127163737_create_tombstones.exs
@@ -0,0 +1,14 @@
+defmodule Mobilizon.Repo.Migrations.CreateTombstones do
+ use Ecto.Migration
+
+ def change do
+ create table(:tombstones) do
+ add(:uri, :string)
+ add(:actor_id, references(:actors, on_delete: :delete_all))
+
+ timestamps()
+ end
+
+ create(unique_index(:tombstones, [:uri]))
+ end
+end
diff --git a/schema.graphql b/schema.graphql
index e31500363..66a412b0b 100644
--- a/schema.graphql
+++ b/schema.graphql
@@ -1,5 +1,5 @@
# source: http://localhost:4000/api
-# timestamp: Thu Nov 21 2019 15:58:08 GMT+0100 (Central European Standard Time)
+# timestamp: Fri Nov 22 2019 18:34:33 GMT+0100 (Central European Standard Time)
schema {
query: RootQueryType
@@ -157,13 +157,22 @@ input AddressInput {
"""A comment"""
type Comment {
+ actor: Person
+ deletedAt: DateTime
+ event: Event
+
"""Internal ID for this comment"""
id: ID
+ inReplyToComment: Comment
+ insertedAt: DateTime
local: Boolean
+ originComment: Comment
primaryLanguage: String
replies: [Comment]
text: String
threadLanguages: [String]!
+ totalReplies: Int
+ updatedAt: DateTime
url: String
uuid: UUID
visibility: CommentVisibility
@@ -259,6 +268,9 @@ type Event implements ActionLogObject {
"""The event's category"""
category: String
+ """The comments in reply to the event"""
+ comments: [Comment]
+
"""When the event was created"""
createdAt: DateTime
@@ -845,7 +857,7 @@ input PictureInputObject {
}
"""
-The `Point` scalar type represents Point geographic information compliant string data,
+The `Point` scalar type represents Point geographic information compliant string data,
represented as floats separated by a semi-colon. The geodetic system is WGS 84
"""
scalar Point
@@ -933,7 +945,7 @@ type RootMutationType {
changePassword(newPassword: String!, oldPassword: String!): User
"""Create a comment"""
- createComment(actorId: ID!, text: String!): Comment
+ createComment(actorId: ID!, eventId: ID, inReplyToCommentId: ID, text: String!): Comment
"""Create an event"""
createEvent(
@@ -1018,6 +1030,7 @@ type RootMutationType {
"""Create an user"""
createUser(email: String!, locale: String, password: String!): User
+ deleteComment(actorId: ID!, commentId: ID!): DeletedObject
"""Delete an event"""
deleteEvent(actorId: ID!, eventId: ID!): DeletedObject
@@ -1208,6 +1221,9 @@ type RootQueryType {
"""Get the list of tags"""
tags(limit: Int = 10, page: Int = 1): [Tag]!
+ """Get replies for thread"""
+ thread(id: ID): [Comment]
+
"""Get an user"""
user(id: ID!): User
diff --git a/test/mobilizon/events/events_test.exs b/test/mobilizon/events/events_test.exs
index d1cf081ab..bc0e4ba7a 100644
--- a/test/mobilizon/events/events_test.exs
+++ b/test/mobilizon/events/events_test.exs
@@ -581,7 +581,7 @@ defmodule Mobilizon.EventsTest do
test "delete_comment/1 deletes the comment" do
comment = insert(:comment)
assert {:ok, %Comment{}} = Events.delete_comment(comment)
- assert_raise Ecto.NoResultsError, fn -> Events.get_comment!(comment.id) end
+ refute is_nil(Events.get_comment!(comment.id).deleted_at)
end
end
end
diff --git a/test/mobilizon/service/activity_pub/activity_pub_test.exs b/test/mobilizon/service/activity_pub/activity_pub_test.exs
index a1b508c4a..63f781677 100644
--- a/test/mobilizon/service/activity_pub/activity_pub_test.exs
+++ b/test/mobilizon/service/activity_pub/activity_pub_test.exs
@@ -148,13 +148,14 @@ defmodule Mobilizon.Service.ActivityPub.ActivityPubTest do
test "it creates a delete activity and deletes the original comment" do
comment = insert(:comment)
comment = Events.get_comment_from_url_with_preload!(comment.url)
+ assert is_nil(Events.get_comment_from_url(comment.url).deleted_at)
{:ok, delete, _} = ActivityPub.delete(comment)
assert delete.data["type"] == "Delete"
assert delete.data["actor"] == comment.actor.url
assert delete.data["object"] == comment.url
- assert Events.get_comment_from_url(comment.url) == nil
+ refute is_nil(Events.get_comment_from_url(comment.url).deleted_at)
end
end
diff --git a/test/mobilizon/service/activity_pub/transmogrifier_test.exs b/test/mobilizon/service/activity_pub/transmogrifier_test.exs
index 605114829..995881ef4 100644
--- a/test/mobilizon/service/activity_pub/transmogrifier_test.exs
+++ b/test/mobilizon/service/activity_pub/transmogrifier_test.exs
@@ -91,31 +91,50 @@ defmodule Mobilizon.Service.ActivityPub.TransmogrifierTest do
# assert activity == returned_activity.data
# end
- # test "it fetches replied-to activities if we don't have them" do
- # data =
- # File.read!("test/fixtures/mastodon-post-activity.json")
- # |> Jason.decode!()
+ test "it fetches replied-to activities if we don't have them" do
+ data =
+ File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Jason.decode!()
- # object =
- # data["object"]
- # |> Map.put("inReplyTo", "https://shitposter.club/notice/2827873")
+ object =
+ data["object"]
+ |> Map.put("inReplyTo", "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94")
- # data =
- # data
- # |> Map.put("object", object)
+ data =
+ data
+ |> Map.put("object", object)
- # {:ok, returned_activity, _} = Transmogrifier.handle_incoming(data)
+ {:ok, returned_activity, _} = Transmogrifier.handle_incoming(data)
- # assert activity =
- # Activity.get_create_activity_by_object_ap_id(
- # "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment"
- # )
+ %Comment{} =
+ origin_comment =
+ Events.get_comment_from_url(
+ "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94"
+ )
- # assert returned_activity.data["object"]["inReplyToAtomUri"] ==
- # "https://shitposter.club/notice/2827873"
+ assert returned_activity.data["object"]["inReplyTo"] ==
+ "https://blob.cat/objects/02fdea3d-932c-4348-9ecb-3f9eb3fbdd94"
- # assert returned_activity.data["object"]["inReplyToStatusId"] == activity.id
- # end
+ assert returned_activity.data["object"]["inReplyTo"] == origin_comment.url
+ end
+
+ test "it does not crash if the object in inReplyTo can't be fetched" do
+ data =
+ File.read!("test/fixtures/mastodon-post-activity.json")
+ |> Poison.decode!()
+
+ object =
+ data["object"]
+ |> Map.put("inReplyTo", "https://404.site/whatever")
+
+ data =
+ data
+ |> Map.put("object", object)
+
+ assert ExUnit.CaptureLog.capture_log([level: :warn], fn ->
+ {:ok, _returned_activity, _entity} = Transmogrifier.handle_incoming(data)
+ end) =~ "[warn] Parent object is something we don't handle"
+ end
test "it works for incoming notices" do
use_cassette "activity_pub/mastodon_post_activity" do
@@ -440,10 +459,11 @@ defmodule Mobilizon.Service.ActivityPub.TransmogrifierTest do
|> Map.put("actor", actor_url)
assert Events.get_comment_from_url(comment_url)
+ assert is_nil(Events.get_comment_from_url(comment_url).deleted_at)
{:ok, %Activity{local: false}, _} = Transmogrifier.handle_incoming(data)
- refute Events.get_comment_from_url(comment_url)
+ refute is_nil(Events.get_comment_from_url(comment_url).deleted_at)
end
# TODO : make me ASAP
diff --git a/test/mobilizon/service/formatter/formatter_test.exs b/test/mobilizon/service/formatter/formatter_test.exs
index 47588c440..c1194a4fc 100644
--- a/test/mobilizon/service/formatter/formatter_test.exs
+++ b/test/mobilizon/service/formatter/formatter_test.exs
@@ -117,37 +117,32 @@ defmodule Mobilizon.Service.FormatterTest do
describe "add_user_links" do
test "gives a replacement for user links, using local nicknames in user links text" do
text = "@gsimg According to @archa_eme_, that is @daggsy. Also hello @archaeme@archae.me"
- gsimg = insert(:actor, preferred_username: "gsimg")
+ _gsimg = insert(:actor, preferred_username: "gsimg")
- archaeme =
+ _archaeme =
insert(:actor, preferred_username: "archa_eme_", url: "https://archeme/@archa_eme_")
- archaeme_remote = insert(:actor, preferred_username: "archaeme", domain: "archae.me")
+ _archaeme_remote = insert(:actor, preferred_username: "archaeme", domain: "archae.me")
{text, mentions, []} = Formatter.linkify(text)
assert length(mentions) == 3
expected_text =
- "@gsimg According to @archa_eme_, that is @daggsy. Also hello @archaeme"
+ "@gsimg According to @archa_eme_, that is @daggsy. Also hello @archaeme"
assert expected_text == text
end
test "gives a replacement for single-character local nicknames" do
text = "@o hi"
- o = insert(:actor, preferred_username: "o")
+ _o = insert(:actor, preferred_username: "o")
{text, mentions, []} = Formatter.linkify(text)
assert length(mentions) == 1
- expected_text =
- "@o hi"
+ expected_text = "@o hi"
assert expected_text == text
end
diff --git a/test/mobilizon_web/api/report_test.exs b/test/mobilizon_web/api/report_test.exs
index 12e02246f..e2e80c083 100644
--- a/test/mobilizon_web/api/report_test.exs
+++ b/test/mobilizon_web/api/report_test.exs
@@ -7,7 +7,6 @@ defmodule MobilizonWeb.API.ReportTest do
alias Mobilizon.Events.{Comment, Event}
alias Mobilizon.Reports.{Note, Report}
alias Mobilizon.Service.ActivityPub.Activity
- alias Mobilizon.Service.Formatter
alias Mobilizon.Users
alias Mobilizon.Users.User
@@ -24,11 +23,12 @@ defmodule MobilizonWeb.API.ReportTest do
assert {:ok, %Activity{} = flag_activity, _} =
Reports.report(%{
- reporter_actor_id: reporter_id,
- reported_actor_id: reported_id,
+ reporter_id: reporter_id,
+ reported_id: reported_id,
content: comment,
event_id: event_id,
- comments_ids: []
+ comments_ids: [],
+ local: true
})
assert %Activity{
@@ -37,8 +37,7 @@ defmodule MobilizonWeb.API.ReportTest do
"type" => "Flag",
"cc" => [],
"content" => ^comment,
- "object" => [^reported_url, ^event_url],
- "state" => "open"
+ "object" => [^reported_url, ^event_url]
}
} = flag_activity
end
@@ -57,8 +56,8 @@ defmodule MobilizonWeb.API.ReportTest do
assert {:ok, %Activity{} = flag_activity, _} =
Reports.report(%{
- reporter_actor_id: reporter_id,
- reported_actor_id: reported_id,
+ reporter_id: reporter_id,
+ reported_id: reported_id,
content: comment,
event_id: nil,
comments_ids: [comment_1_id, comment_2_id]
@@ -68,10 +67,11 @@ defmodule MobilizonWeb.API.ReportTest do
actor: ^reporter_url,
data: %{
"type" => "Flag",
- "cc" => [],
"content" => ^comment,
"object" => [^reported_url, ^comment_1_url, ^comment_2_url],
- "state" => "open"
+ "to" => ["https://www.w3.org/ns/activitystreams#Public"],
+ "cc" => [],
+ "actor" => ^reporter_url
}
} = flag_activity
end
@@ -87,16 +87,16 @@ defmodule MobilizonWeb.API.ReportTest do
_comment_2 = insert(:comment, actor: reported)
comment = "This is really not acceptable, remote admin I don't know"
- encoded_comment = Formatter.html_escape(comment, "text/plain")
+ encoded_comment = HtmlSanitizeEx.strip_tags(comment)
assert {:ok, %Activity{} = flag_activity, _} =
Reports.report(%{
- reporter_actor_id: reporter_id,
- reported_actor_id: reported_id,
+ reporter_id: reporter_id,
+ reported_id: reported_id,
content: comment,
event_id: nil,
comments_ids: [comment_1_id, comment_2_id],
- forward: true
+ local: false
})
assert %Activity{
@@ -107,8 +107,10 @@ defmodule MobilizonWeb.API.ReportTest do
"cc" => [^reported_url],
"content" => ^encoded_comment,
"object" => [^reported_url, ^comment_1_url, ^comment_2_url],
- "state" => "open"
- }
+ "to" => ["https://www.w3.org/ns/activitystreams#Public"]
+ },
+ local: true,
+ recipients: ["https://www.w3.org/ns/activitystreams#Public", ^reported_url]
} = flag_activity
end
@@ -120,8 +122,8 @@ defmodule MobilizonWeb.API.ReportTest do
assert {:ok, %Activity{} = flag_activity, %Report{id: report_id} = _report} =
Reports.report(%{
- reporter_actor_id: reporter_id,
- reported_actor_id: reported_id,
+ reporter_id: reporter_id,
+ reported_id: reported_id,
content: "This is not a nice thing",
event_id: nil,
comments_ids: [comment_1_id],
@@ -146,8 +148,8 @@ defmodule MobilizonWeb.API.ReportTest do
assert {:ok, %Activity{} = flag_activity, %Report{id: report_id} = _report} =
Reports.report(%{
- reporter_actor_id: reporter_id,
- reported_actor_id: reported_id,
+ reporter_id: reporter_id,
+ reported_id: reported_id,
content: "This is not a nice thing",
event_id: nil,
comments_ids: [comment_1_id],
diff --git a/test/mobilizon_web/resolvers/comment_resolver_test.exs b/test/mobilizon_web/resolvers/comment_resolver_test.exs
index 85361ecb5..3465ecb91 100644
--- a/test/mobilizon_web/resolvers/comment_resolver_test.exs
+++ b/test/mobilizon_web/resolvers/comment_resolver_test.exs
@@ -8,12 +8,42 @@ defmodule MobilizonWeb.Resolvers.CommentResolverTest do
setup %{conn: conn} do
user = insert(:user)
actor = insert(:actor, user: user)
+ event = insert(:event)
- {:ok, conn: conn, actor: actor, user: user}
+ {:ok, conn: conn, actor: actor, user: user, event: event}
end
describe "Comment Resolver" do
- test "create_comment/3 creates a comment", %{conn: conn, actor: actor, user: user} do
+ test "create_comment/3 creates a comment", %{
+ conn: conn,
+ actor: actor,
+ user: user,
+ event: event
+ } do
+ mutation = """
+ mutation {
+ createComment(
+ text: "#{@comment.text}",
+ actor_id: "#{actor.id}",
+ event_id: "#{event.id}"
+ ) {
+ text,
+ uuid
+ }
+ }
+ """
+
+ res =
+ conn
+ |> auth_conn(user)
+ |> AbsintheHelpers.graphql_query(query: mutation, variables: %{})
+
+ assert res["data"]["createComment"]["text"] == @comment.text
+ end
+
+ test "create_comment/3 checks that user owns actor", %{conn: conn, user: user} do
+ actor = insert(:actor)
+
mutation = """
mutation {
createComment(
@@ -29,9 +59,202 @@ defmodule MobilizonWeb.Resolvers.CommentResolverTest do
res =
conn
|> auth_conn(user)
- |> post("/api", AbsintheHelpers.mutation_skeleton(mutation))
+ |> AbsintheHelpers.graphql_query(query: mutation, variables: %{})
- assert json_response(res, 200)["data"]["createComment"]["text"] == @comment.text
+ assert hd(res["errors"])["message"] ==
+ "Actor id is not owned by authenticated user"
+ end
+
+ test "create_comment/3 requires that the user needs to be authenticated", %{conn: conn} do
+ actor = insert(:actor)
+
+ mutation = """
+ mutation {
+ createComment(
+ text: "#{@comment.text}",
+ actor_id: "#{actor.id}"
+ ) {
+ text,
+ uuid
+ }
+ }
+ """
+
+ res =
+ conn
+ |> AbsintheHelpers.graphql_query(query: mutation, variables: %{})
+
+ assert hd(res["errors"])["message"] ==
+ "You are not allowed to create a comment if not connected"
+ end
+
+ test "create_comment/3 creates a reply to a comment", %{
+ conn: conn,
+ actor: actor,
+ user: user,
+ event: event
+ } do
+ comment = insert(:comment)
+
+ mutation = """
+ mutation {
+ createComment(
+ text: "#{@comment.text}",
+ actor_id: "#{actor.id}",
+ event_id: "#{event.id}",
+ in_reply_to_comment_id: "#{comment.id}"
+ ) {
+ id,
+ text,
+ uuid,
+ in_reply_to_comment {
+ id,
+ text
+ }
+ }
+ }
+ """
+
+ res =
+ conn
+ |> auth_conn(user)
+ |> AbsintheHelpers.graphql_query(query: mutation, variables: %{})
+
+ assert res["errors"] == nil
+ assert res["data"]["createComment"]["text"] == @comment.text
+ uuid = res["data"]["createComment"]["uuid"]
+
+ assert res["data"]["createComment"]["in_reply_to_comment"]["id"] ==
+ to_string(comment.id)
+
+ query = """
+ query {
+ thread(id: #{comment.id}) {
+ text,
+ uuid
+ }
+ }
+ """
+
+ res =
+ conn
+ |> auth_conn(user)
+ |> AbsintheHelpers.graphql_query(query: query, variables: %{})
+
+ assert res["errors"] == nil
+ assert res["data"]["thread"] == [%{"uuid" => uuid, "text" => @comment.text}]
+ end
+
+ @delete_comment """
+ mutation DeleteComment($commentId: ID!, $actorId: ID!) {
+ deleteComment(commentId: $commentId, actorId: $actorId) {
+ id,
+ deletedAt
+ }
+ }
+ """
+
+ test "deletes a comment", %{conn: conn, user: user, actor: actor} do
+ comment = insert(:comment, actor: actor)
+
+ res =
+ conn
+ |> AbsintheHelpers.graphql_query(
+ query: @delete_comment,
+ variables: %{commentId: comment.id, actorId: actor.id}
+ )
+
+ assert hd(res["errors"])["message"] ==
+ "You are not allowed to delete a comment if not connected"
+
+ actor2 = insert(:actor, user: user)
+
+ res =
+ conn
+ |> auth_conn(user)
+ |> AbsintheHelpers.graphql_query(
+ query: @delete_comment,
+ variables: %{commentId: comment.id, actorId: actor2.id}
+ )
+
+ assert hd(res["errors"])["message"] ==
+ "You cannot delete this comment"
+
+ res =
+ conn
+ |> auth_conn(user)
+ |> AbsintheHelpers.graphql_query(
+ query: @delete_comment,
+ variables: %{commentId: comment.id, actorId: actor.id}
+ )
+
+ assert res["errors"] == nil
+ assert res["data"]["deleteComment"]["id"] == to_string(comment.id)
+ refute is_nil(res["data"]["deleteComment"]["deletedAt"])
+ end
+
+ test "delete_comment/3 allows a comment being deleted by a moderator and creates a entry in actionLogs",
+ %{
+ conn: conn,
+ user: _user,
+ actor: _actor
+ } do
+ user_moderator = insert(:user, role: :moderator)
+ actor_moderator = insert(:actor, user: user_moderator)
+
+ actor2 = insert(:actor)
+ comment = insert(:comment, actor: actor2)
+
+ res =
+ conn
+ |> auth_conn(user_moderator)
+ |> AbsintheHelpers.graphql_query(
+ query: @delete_comment,
+ variables: %{commentId: comment.id, actorId: actor_moderator.id}
+ )
+
+ assert res["data"]["deleteComment"]["id"] == to_string(comment.id)
+
+ query = """
+ {
+ actionLogs {
+ action,
+ actor {
+ preferredUsername
+ },
+ object {
+ ... on Report {
+ id,
+ status
+ },
+ ... on ReportNote {
+ content
+ }
+ ... on Event {
+ id,
+ title
+ },
+ ... on Comment {
+ id,
+ text
+ }
+ }
+ }
+ }
+ """
+
+ res =
+ conn
+ |> auth_conn(user_moderator)
+ |> get("/api", AbsintheHelpers.query_skeleton(query, "actionLogs"))
+
+ refute json_response(res, 200)["errors"]
+
+ assert hd(json_response(res, 200)["data"]["actionLogs"]) == %{
+ "action" => "COMMENT_DELETION",
+ "actor" => %{"preferredUsername" => actor_moderator.preferred_username},
+ "object" => %{"text" => comment.text, "id" => to_string(comment.id)}
+ }
end
end
end
diff --git a/test/mobilizon_web/resolvers/report_resolver_test.exs b/test/mobilizon_web/resolvers/report_resolver_test.exs
index b66f111ef..e068c735a 100644
--- a/test/mobilizon_web/resolvers/report_resolver_test.exs
+++ b/test/mobilizon_web/resolvers/report_resolver_test.exs
@@ -20,8 +20,8 @@ defmodule MobilizonWeb.Resolvers.ReportResolverTest do
mutation = """
mutation {
createReport(
- reporter_actor_id: #{reporter.id},
- reported_actor_id: #{reported.id},
+ reporter_id: #{reporter.id},
+ reported_id: #{reported.id},
event_id: #{event.id},
content: "This is an issue"
) {
@@ -57,8 +57,8 @@ defmodule MobilizonWeb.Resolvers.ReportResolverTest do
mutation = """
mutation {
createReport(
- reported_actor_id: #{reported.id},
- reporter_actor_id: 5,
+ reported_id: #{reported.id},
+ reporter_id: 5,
content: "This is an issue"
) {
content
diff --git a/test/support/factory.ex b/test/support/factory.ex
index 371c73e1c..f48e8c924 100644
--- a/test/support/factory.ex
+++ b/test/support/factory.ex
@@ -224,7 +224,7 @@ defmodule Mobilizon.Factory do
%Mobilizon.Reports.Report{
content: "This is problematic",
status: :open,
- uri: "http://mobilizon.test/report/deae1020-54b8-47df-9eea-d8c0e943e57f/activity",
+ url: "http://mobilizon.test/report/deae1020-54b8-47df-9eea-d8c0e943e57f/activity",
reported: build(:actor),
reporter: build(:actor),
event: build(:event),
{{ $t('Comments') }}
+ +