Improve build times

* Fix bulma/buefy being imported many (many !!!) times

* Remove javascript-time-ago because date-fns pretty much does the same
thing

* Make sure languages are loaded asynchronously

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2020-10-13 20:39:59 +02:00
parent f627cab292
commit 93cecbe49c
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773
66 changed files with 167 additions and 283 deletions

View File

@ -30,7 +30,6 @@
"graphql": "^15.0.0", "graphql": "^15.0.0",
"graphql-tag": "^2.10.3", "graphql-tag": "^2.10.3",
"intersection-observer": "^0.11.0", "intersection-observer": "^0.11.0",
"javascript-time-ago": "^2.0.4",
"leaflet": "^1.4.0", "leaflet": "^1.4.0",
"leaflet.locatecontrol": "^0.72.0", "leaflet.locatecontrol": "^0.72.0",
"lodash": "^4.17.11", "lodash": "^4.17.11",
@ -54,7 +53,6 @@
}, },
"devDependencies": { "devDependencies": {
"@types/chai": "^4.2.11", "@types/chai": "^4.2.11",
"@types/javascript-time-ago": "^2.0.1",
"@types/leaflet": "^1.5.2", "@types/leaflet": "^1.5.2",
"@types/leaflet.locatecontrol": "^0.60.7", "@types/leaflet.locatecontrol": "^0.60.7",
"@types/lodash": "^4.14.141", "@types/lodash": "^4.14.141",

View File

@ -1,5 +1,9 @@
@import "variables.scss"; @import "variables.scss";
@import "~bulma";
@import "~bulma-divider";
@import "~buefy/src/scss/buefy";
// a { // a {
// color: $violet-2; // color: $violet-2;
// } // }

View File

@ -46,8 +46,6 @@ export default class ActorCard extends Vue {
</style> </style>
<style lang="scss"> <style lang="scss">
@import "../../variables.scss";
.tooltip { .tooltip {
display: block !important; display: block !important;
z-index: 10000; z-index: 10000;

View File

@ -88,7 +88,6 @@ export default class ParticipantCard extends Vue {
</script> </script>
<style lang="scss"> <style lang="scss">
@import "../../variables.scss";
.card-footer-item { .card-footer-item {
height: $control-height; height: $control-height;
} }

View File

@ -51,7 +51,7 @@
<b-table-column field="targetActor.updatedAt" :label="$t('Date')" sortable v-slot="props"> <b-table-column field="targetActor.updatedAt" :label="$t('Date')" sortable v-slot="props">
<span :title="$options.filters.formatDateTimeString(props.row.updatedAt)">{{ <span :title="$options.filters.formatDateTimeString(props.row.updatedAt)">{{
timeago(props.row.updatedAt) formatDistanceToNow(new Date(props.row.updatedAt), { locale: $dateFnsLocale })
}}</span></b-table-column }}</span></b-table-column
> >
@ -102,6 +102,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Mixins } from "vue-property-decorator"; import { Component, Mixins } from "vue-property-decorator";
import { SnackbarProgrammatic as Snackbar } from "buefy"; import { SnackbarProgrammatic as Snackbar } from "buefy";
import { formatDistanceToNow } from "date-fns";
import { ACCEPT_RELAY, REJECT_RELAY, RELAY_FOLLOWERS } from "../../graphql/admin"; import { ACCEPT_RELAY, REJECT_RELAY, RELAY_FOLLOWERS } from "../../graphql/admin";
import { Paginate } from "../../types/paginate"; import { Paginate } from "../../types/paginate";
import { IFollower } from "../../types/actor/follower.model"; import { IFollower } from "../../types/actor/follower.model";
@ -126,6 +127,8 @@ export default class Followers extends Mixins(RelayMixin) {
RelayMixin = RelayMixin; RelayMixin = RelayMixin;
formatDistanceToNow = formatDistanceToNow;
async acceptRelays(): Promise<void> { async acceptRelays(): Promise<void> {
await this.checkedRows.forEach((row: IFollower) => { await this.checkedRows.forEach((row: IFollower) => {
this.acceptRelay(`${row.actor.preferredUsername}@${row.actor.domain}`); this.acceptRelay(`${row.actor.preferredUsername}@${row.actor.domain}`);

View File

@ -64,7 +64,7 @@
<b-table-column field="targetActor.updatedAt" :label="$t('Date')" sortable v-slot="props"> <b-table-column field="targetActor.updatedAt" :label="$t('Date')" sortable v-slot="props">
<span :title="$options.filters.formatDateTimeString(props.row.updatedAt)">{{ <span :title="$options.filters.formatDateTimeString(props.row.updatedAt)">{{
timeago(props.row.updatedAt) formatDistanceToNow(new Date(props.row.updatedAt), { locale: $dateFnsLocale })
}}</span></b-table-column }}</span></b-table-column
> >
@ -100,6 +100,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Mixins } from "vue-property-decorator"; import { Component, Mixins } from "vue-property-decorator";
import { SnackbarProgrammatic as Snackbar } from "buefy"; import { SnackbarProgrammatic as Snackbar } from "buefy";
import { formatDistanceToNow } from "date-fns";
import { ADD_RELAY, RELAY_FOLLOWINGS, REMOVE_RELAY } from "../../graphql/admin"; import { ADD_RELAY, RELAY_FOLLOWINGS, REMOVE_RELAY } from "../../graphql/admin";
import { IFollower } from "../../types/actor/follower.model"; import { IFollower } from "../../types/actor/follower.model";
import { Paginate } from "../../types/paginate"; import { Paginate } from "../../types/paginate";
@ -126,6 +127,8 @@ export default class Followings extends Mixins(RelayMixin) {
RelayMixin = RelayMixin; RelayMixin = RelayMixin;
formatDistanceToNow = formatDistanceToNow;
async followRelay(e: Event): Promise<void> { async followRelay(e: Event): Promise<void> {
e.preventDefault(); e.preventDefault();
try { try {

View File

@ -24,7 +24,12 @@
<strong :class="{ organizer: commentFromOrganizer }">{{ comment.actor.name }}</strong> <strong :class="{ organizer: commentFromOrganizer }">{{ comment.actor.name }}</strong>
<small>@{{ usernameWithDomain(comment.actor) }}</small> <small>@{{ usernameWithDomain(comment.actor) }}</small>
<a class="comment-link has-text-grey" :href="commentURL"> <a class="comment-link has-text-grey" :href="commentURL">
<small>{{ timeago(new Date(comment.updatedAt)) }}</small> <small>{{
formatDistanceToNow(new Date(comment.updatedAt), {
locale: $dateFnsLocale,
addSuffix: true,
})
}}</small>
</a> </a>
</span> </span>
<a v-else class="comment-link has-text-grey" :href="commentURL"> <a v-else class="comment-link has-text-grey" :href="commentURL">
@ -130,8 +135,8 @@
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue, Ref } from "vue-property-decorator"; import { Component, Prop, Vue, Ref } from "vue-property-decorator";
import EditorComponent from "@/components/Editor.vue"; import EditorComponent from "@/components/Editor.vue";
import TimeAgo from "javascript-time-ago";
import { SnackbarProgrammatic as Snackbar } from "buefy"; import { SnackbarProgrammatic as Snackbar } from "buefy";
import { formatDistanceToNow } from "date-fns";
import { CommentModel, IComment } from "../../types/comment.model"; import { CommentModel, IComment } from "../../types/comment.model";
import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor"; import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
import { IPerson, usernameWithDomain } from "../../types/actor"; import { IPerson, usernameWithDomain } from "../../types/actor";
@ -171,18 +176,13 @@ export default class Comment extends Vue {
showReplies = false; showReplies = false;
timeAgoInstance: TimeAgo | null = null;
CommentModeration = CommentModeration; CommentModeration = CommentModeration;
usernameWithDomain = usernameWithDomain; usernameWithDomain = usernameWithDomain;
async mounted(): Promise<void> { formatDistanceToNow = formatDistanceToNow;
const localeName = this.$i18n.locale;
const locale = await import(`javascript-time-ago/locale/${localeName}`);
TimeAgo.addLocale(locale);
this.timeAgoInstance = new TimeAgo(localeName);
async mounted(): Promise<void> {
const { hash } = this.$route; const { hash } = this.$route;
if (hash.includes(`#comment-${this.comment.uuid}`)) { if (hash.includes(`#comment-${this.comment.uuid}`)) {
this.fetchReplies(); this.fetchReplies();
@ -243,13 +243,6 @@ export default class Comment extends Vue {
this.showReplies = true; this.showReplies = true;
} }
timeago(dateTime: Date): string {
if (this.timeAgoInstance != null) {
return this.timeAgoInstance.format(dateTime);
}
return "";
}
get commentSelected(): boolean { get commentSelected(): boolean {
return this.commentId === this.$route.hash; return this.commentId === this.$route.hash;
} }
@ -316,8 +309,6 @@ export default class Comment extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
form.reply { form.reply {
padding-bottom: 1rem; padding-bottom: 1rem;
} }

View File

@ -43,7 +43,10 @@
</span> </span>
<div class="post-infos"> <div class="post-infos">
<span :title="comment.insertedAt | formatDateTimeString"> <span :title="comment.insertedAt | formatDateTimeString">
{{ $timeAgo.format(new Date(comment.updatedAt), "twitter") || $t("Right now") }}</span {{
formatDistanceToNow(new Date(comment.updatedAt), { locale: $dateFnsLocale }) ||
$t("Right now")
}}</span
> >
</div> </div>
</div> </div>
@ -53,7 +56,13 @@
v-if="comment.insertedAt.getTime() !== comment.updatedAt.getTime()" v-if="comment.insertedAt.getTime() !== comment.updatedAt.getTime()"
:title="comment.updatedAt | formatDateTimeString" :title="comment.updatedAt | formatDateTimeString"
> >
{{ $t("Edited {ago}", { ago: $timeAgo.format(new Date(comment.updatedAt)) }) }} {{
$t("Edited {ago}", {
ago: formatDistanceToNow(new Date(comment.updatedAt), {
locale: $dateFnsLocale,
}),
})
}}
</p> </p>
</div> </div>
<div class="comment-deleted" v-else-if="!editMode"> <div class="comment-deleted" v-else-if="!editMode">
@ -76,7 +85,8 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator"; import { Component, Prop, Vue } from "vue-property-decorator";
import { IComment, CommentModel } from "../../types/comment.model"; import { formatDistanceToNow } from "date-fns";
import { IComment } from "../../types/comment.model";
import { usernameWithDomain, IPerson } from "../../types/actor"; import { usernameWithDomain, IPerson } from "../../types/actor";
import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor"; import { CURRENT_ACTOR_CLIENT } from "../../graphql/actor";
@ -99,14 +109,16 @@ export default class DiscussionComment extends Vue {
usernameWithDomain = usernameWithDomain; usernameWithDomain = usernameWithDomain;
formatDistanceToNow = formatDistanceToNow;
// isReportModalActive: boolean = false; // isReportModalActive: boolean = false;
toggleEditMode() { toggleEditMode(): void {
this.updatedComment = this.comment.text; this.updatedComment = this.comment.text;
this.editMode = !this.editMode; this.editMode = !this.editMode;
} }
updateComment() { updateComment(): void {
this.comment.text = this.updatedComment; this.comment.text = this.updatedComment;
this.$emit("update-comment", this.comment); this.$emit("update-comment", this.comment);
this.toggleEditMode(); this.toggleEditMode();
@ -114,8 +126,6 @@ export default class DiscussionComment extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
article.comment { article.comment {
display: flex; display: flex;
border-top: 1px solid #e9e9e9; border-top: 1px solid #e9e9e9;

View File

@ -16,7 +16,10 @@
<div class="title-and-date"> <div class="title-and-date">
<p class="discussion-minimalist-title">{{ discussion.title }}</p> <p class="discussion-minimalist-title">{{ discussion.title }}</p>
<span :title="actualDate | formatDateTimeString"> <span :title="actualDate | formatDateTimeString">
{{ $timeAgo.format(new Date(actualDate), "twitter") || $t("Right now") }}</span {{
formatDistanceToNowStrict(new Date(actualDate), { locale: $dateFnsLocale }) ||
$t("Right now")
}}</span
> >
</div> </div>
<div class="has-text-grey" v-if="!discussion.lastComment.deletedAt"> <div class="has-text-grey" v-if="!discussion.lastComment.deletedAt">
@ -28,6 +31,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator"; import { Component, Prop, Vue } from "vue-property-decorator";
import { formatDistanceToNowStrict } from "date-fns";
import { IDiscussion } from "../../types/discussions"; import { IDiscussion } from "../../types/discussions";
import RouteName from "../../router/name"; import RouteName from "../../router/name";
@ -37,7 +41,9 @@ export default class DiscussionListItem extends Vue {
RouteName = RouteName; RouteName = RouteName;
get htmlTextEllipsis() { formatDistanceToNowStrict = formatDistanceToNowStrict;
get htmlTextEllipsis(): string {
const element = document.createElement("div"); const element = document.createElement("div");
if (this.discussion.lastComment && this.discussion.lastComment.text) { if (this.discussion.lastComment && this.discussion.lastComment.text) {
element.innerHTML = this.discussion.lastComment.text element.innerHTML = this.discussion.lastComment.text
@ -47,7 +53,7 @@ export default class DiscussionListItem extends Vue {
return element.innerText; return element.innerText;
} }
get actualDate() { get actualDate(): string | Date | undefined {
if (this.discussion.updatedAt === this.discussion.insertedAt && this.discussion.lastComment) { if (this.discussion.updatedAt === this.discussion.insertedAt && this.discussion.lastComment) {
return this.discussion.lastComment.publishedAt; return this.discussion.lastComment.publishedAt;
} }

View File

@ -552,8 +552,6 @@ export default class EditorComponent extends Vue {
} }
</script> </script>
<style lang="scss"> <style lang="scss">
@import "@/variables.scss";
$color-black: #000; $color-black: #000;
$color-white: #eee; $color-white: #eee;

View File

@ -27,23 +27,21 @@ export default class DateCalendarIcon extends Vue {
*/ */
@Prop({ required: true }) date!: string; @Prop({ required: true }) date!: string;
get dateObj() { get dateObj(): Date {
return new Date(this.$props.date); return new Date(this.$props.date);
} }
get month() { get month(): string {
return this.dateObj.toLocaleString(undefined, { month: "short" }); return this.dateObj.toLocaleString(undefined, { month: "short" });
} }
get day() { get day(): string {
return this.dateObj.toLocaleString(undefined, { day: "numeric" }); return this.dateObj.toLocaleString(undefined, { day: "numeric" });
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
time.datetime-container { time.datetime-container {
background: $backgrounds; background: $backgrounds;
border: 1px solid $borders; border: 1px solid $borders;

View File

@ -115,8 +115,6 @@ export default class EventCard extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
a.card { a.card {
display: block; display: block;
background: $secondary; background: $secondary;

View File

@ -275,8 +275,6 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
article.box { article.box {
div.tag-container { div.tag-container {
position: absolute; position: absolute;

View File

@ -104,8 +104,6 @@ export default class EventListViewCard extends mixins(ActorMixin, EventMixin) {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
article.box { article.box {
div.content { div.content {
padding: 5px; padding: 5px;

View File

@ -20,8 +20,6 @@ export default class EventMetadataBlock extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
h2 { h2 {
font-size: 1.8rem; font-size: 1.8rem;
font-weight: 500; font-weight: 500;

View File

@ -44,8 +44,6 @@ export default class Footer extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../variables.scss";
footer.footer { footer.footer {
color: $secondary; color: $secondary;
display: flex; display: flex;

View File

@ -32,8 +32,6 @@ export default class GroupSection extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
section { section {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@ -54,7 +54,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator"; import { Component, Prop, Vue } from "vue-property-decorator";
import { IGroup, IMember, usernameWithDomain } from "@/types/actor"; import { IMember, usernameWithDomain } from "@/types/actor";
import RouteName from "../../router/name"; import RouteName from "../../router/name";
@Component @Component
@ -68,8 +68,6 @@ export default class InvitationCard extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
.media:not(.subfield) { .media:not(.subfield) {
background: lighten($primary, 40%); background: lighten($primary, 40%);
padding: 10px; padding: 10px;

View File

@ -4,7 +4,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator"; import { Component, Prop, Vue } from "vue-property-decorator";
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore // @ts-ignore
import MobilizonLogo from "../assets/mobilizon_logo.svg?inline"; import MobilizonLogo from "../assets/mobilizon_logo.svg?inline";
@ -18,8 +18,6 @@ export default class Logo extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../variables.scss";
svg { svg {
fill: $background-color; fill: $background-color;

View File

@ -216,8 +216,6 @@ export default class NavBar extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../variables.scss";
nav { nav {
.navbar-item { .navbar-item {
a.button { a.button {

View File

@ -5,11 +5,17 @@
> >
<div class="title-info-wrapper"> <div class="title-info-wrapper">
<p class="post-minimalist-title">{{ post.title }}</p> <p class="post-minimalist-title">{{ post.title }}</p>
<small class="has-text-grey">{{ $timeAgo.format(new Date(post.insertedAt)) }}</small> <small class="has-text-grey">{{
formatDistanceToNow(new Date(post.publishAt || post.insertedAt), {
locale: $dateFnsLocale,
addSuffix: true,
})
}}</small>
</div> </div>
</router-link> </router-link>
</template> </template>
<script lang="ts"> <script lang="ts">
import { formatDistanceToNow } from "date-fns";
import { Component, Prop, Vue } from "vue-property-decorator"; import { Component, Prop, Vue } from "vue-property-decorator";
import RouteName from "../../router/name"; import RouteName from "../../router/name";
import { IPost } from "../../types/post.model"; import { IPost } from "../../types/post.model";
@ -19,6 +25,8 @@ export default class PostListItem extends Vue {
@Prop({ required: true, type: Object }) post!: IPost; @Prop({ required: true, type: Object }) post!: IPost;
RouteName = RouteName; RouteName = RouteName;
formatDistanceToNow = formatDistanceToNow;
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -114,8 +114,6 @@ export default class FolderItem extends Mixins(ResourceMixin) {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
.resource-wrapper { .resource-wrapper {
display: flex; display: flex;
flex: 1; flex: 1;

View File

@ -57,8 +57,6 @@ export default class ResourceItem extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
.resource-wrapper { .resource-wrapper {
display: flex; display: flex;
flex: 1; flex: 1;

View File

@ -111,8 +111,6 @@ export default class ResourceSelector extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
.panel { .panel {
a.panel-block { a.panel-block {
cursor: default; cursor: default;

View File

@ -30,8 +30,6 @@ export default class SettingMenuItem extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
li.setting-menu-item { li.setting-menu-item {
font-size: 1.05rem; font-size: 1.05rem;
background-color: #fff1de; background-color: #fff1de;

View File

@ -37,8 +37,6 @@ export default class SettingMenuSection extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
li { li {
font-size: 1.3rem; font-size: 1.3rem;
background-color: $secondary; background-color: $secondary;

View File

@ -13,8 +13,6 @@ export default class Tag extends Vue {}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../variables.scss";
span.tag { span.tag {
background: $purple-3; background: $purple-3;
color: $violet-2; color: $violet-2;

View File

@ -12,8 +12,6 @@ import { Component, Vue } from "vue-property-decorator";
export default class Subtitle extends Vue {} export default class Subtitle extends Vue {}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
h2 { h2 {
display: block; display: block;
margin: 15px 0 30px; margin: 15px 0 30px;

View File

@ -8,14 +8,12 @@ import { Component, Prop, Vue } from "vue-property-decorator";
export default class VerticalDivider extends Vue { export default class VerticalDivider extends Vue {
@Prop({ default: "Or" }) content!: string; @Prop({ default: "Or" }) content!: string;
get dataContent() { get dataContent(): string {
return this.content.toLocaleUpperCase(); return this.content.toLocaleUpperCase();
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
.is-divider-vertical[data-content]::after { .is-divider-vertical[data-content]::after {
background-color: $body-background-color; background-color: $body-background-color;
} }

View File

@ -2,7 +2,7 @@ import nl2br from "@/filters/utils";
import { formatDateString, formatTimeString, formatDateTimeString } from "./datetime"; import { formatDateString, formatTimeString, formatDateTimeString } from "./datetime";
export default { export default {
install(vue: any) { install(vue: any): void {
vue.filter("formatDateString", formatDateString); vue.filter("formatDateString", formatDateString);
vue.filter("formatTimeString", formatTimeString); vue.filter("formatTimeString", formatTimeString);
vue.filter("formatDateTimeString", formatDateTimeString); vue.filter("formatDateTimeString", formatDateTimeString);

View File

@ -204,7 +204,7 @@
"Duplicate": "Dupliquer", "Duplicate": "Dupliquer",
"Edit": "Modifier", "Edit": "Modifier",
"Edit post": "Éditer le billet", "Edit post": "Éditer le billet",
"Edited {ago}": "Édité {ago}", "Edited {ago}": "Édité il y a {ago}",
"Eg: Stockholm, Dance, Chess…": "Par exemple : Lyon, Danse, Bridge…", "Eg: Stockholm, Dance, Chess…": "Par exemple : Lyon, Danse, Bridge…",
"Either on the {instance} instance or on another instance.": "Sur l'instance {instance} ou bien sur une autre instance.", "Either on the {instance} instance or on another instance.": "Sur l'instance {instance} ou bien sur une autre instance.",
"Either the account is already validated, either the validation token is incorrect.": "Soit le compte est déjà validé, soit le jeton de validation est incorrect.", "Either the account is already validated, either the validation token is incorrect.": "Soit le compte est déjà validé, soit le jeton de validation est incorrect.",

View File

@ -1,43 +0,0 @@
/* eslint-disable @typescript-eslint/camelcase */
import ar from "./ar.json";
import be from "./be.json";
import ca from "./ca.json";
import cs from "./cs.json";
import de from "./de.json";
import en_US from "./en_US.json";
import es from "./es.json";
import fi from "./fi.json";
import fr_FR from "./fr_FR.json";
import it from "./it.json";
import ja from "./ja.json";
import nl from "./nl.json";
import oc from "./oc.json";
import pl from "./pl.json";
import pt from "./pt.json";
import pt_BR from "./pt_BR.json";
import ru from "./ru.json";
import sv from "./sv.json";
export default {
ar,
be,
ca,
cs,
de,
en: en_US,
en_US,
es,
fi,
fr: fr_FR,
fr_FR,
it,
ja,
nl,
oc,
pl,
pt,
pt_BR,
ru,
sv,
};

View File

@ -1,19 +1,14 @@
{ {
"ar": "العربية", "ar": "العربية",
"bg": "Български",
"be": "Беларуская мова", "be": "Беларуская мова",
"br": "Brezhoneg",
"ca": "Català", "ca": "Català",
"co": "Corsu",
"cs": "čeština", "cs": "čeština",
"de": "Deutsch", "de": "Deutsch",
"en": "English", "en": "English",
"eo": "Esperanto",
"es": "Español", "es": "Español",
"fi": "suomi", "fi": "suomi",
"fr": "Français", "fr": "Français",
"gl": "Galego", "gl": "Galego",
"hu": "Magyar",
"it": "Italiano", "it": "Italiano",
"ja": "日本語", "ja": "日本語",
"nl": "Dutch", "nl": "Dutch",
@ -22,9 +17,5 @@
"pt": "Português", "pt": "Português",
"pt_PT": "Português (Portugal)", "pt_PT": "Português (Portugal)",
"ru": "Русский", "ru": "Русский",
"sq": "Shqip", "sv": "Svenska"
"sv": "Svenska",
"tr": "Türkçe",
"vi": "Tiếng Việt",
"zh_Hant_TW": "繁體中文(台灣)"
} }

View File

@ -6,33 +6,17 @@ import Component from "vue-class-component";
import VueScrollTo from "vue-scrollto"; import VueScrollTo from "vue-scrollto";
import VueMeta from "vue-meta"; import VueMeta from "vue-meta";
import VTooltip from "v-tooltip"; import VTooltip from "v-tooltip";
import TimeAgo from "javascript-time-ago";
import App from "./App.vue"; import App from "./App.vue";
import router from "./router"; import router from "./router";
import { NotifierPlugin } from "./plugins/notifier"; import { NotifierPlugin } from "./plugins/notifier";
import { DateFnsPlugin } from "./plugins/dateFns";
import filters from "./filters"; import filters from "./filters";
import { i18n } from "./utils/i18n"; import { i18n } from "./utils/i18n";
import messages from "./i18n";
import apolloProvider from "./vue-apollo"; import apolloProvider from "./vue-apollo";
Vue.config.productionTip = false; Vue.config.productionTip = false;
let language = document.documentElement.getAttribute("lang") as string;
language =
language ||
((window.navigator as any).userLanguage || window.navigator.language).replace(/-/, "_");
export const locale =
language && messages.hasOwnProperty(language) ? language : language.split("-")[0];
import(`javascript-time-ago/locale/${locale}`).then((localeFile) => {
TimeAgo.addLocale(localeFile);
Vue.prototype.$timeAgo = new TimeAgo(locale);
});
Vue.use(Buefy); Vue.use(Buefy);
Vue.use(NotifierPlugin); Vue.use(NotifierPlugin);
Vue.use(DateFnsPlugin, { locale });
Vue.use(filters); Vue.use(filters);
Vue.use(VueMeta); Vue.use(VueMeta);
Vue.use(VueScrollTo); Vue.use(VueScrollTo);

View File

@ -1,7 +1,6 @@
import { Component, Vue, Ref } from "vue-property-decorator"; import { Component, Vue, Ref } from "vue-property-decorator";
import { ActorType, IActor } from "@/types/actor"; import { ActorType, IActor } from "@/types/actor";
import { IFollower } from "@/types/actor/follower.model"; import { IFollower } from "@/types/actor/follower.model";
import TimeAgo from "javascript-time-ago";
@Component @Component
export default class RelayMixin extends Vue { export default class RelayMixin extends Vue {
@ -13,20 +12,11 @@ export default class RelayMixin extends Vue {
perPage = 10; perPage = 10;
timeAgoInstance: TimeAgo | null = null; toggle(row: Record<string, unknown>): void {
async mounted() {
const localeName = this.$i18n.locale;
const locale = await import(`javascript-time-ago/locale/${localeName}`);
TimeAgo.addLocale(locale);
this.timeAgoInstance = new TimeAgo(localeName);
}
toggle(row: object) {
this.table.toggleDetails(row); this.table.toggleDetails(row);
} }
async onPageChange(page: number) { async onPageChange(page: number): Promise<void> {
this.page = page; this.page = page;
await this.$apollo.queries.relayFollowings.fetchMore({ await this.$apollo.queries.relayFollowings.fetchMore({
variables: { variables: {
@ -53,11 +43,4 @@ export default class RelayMixin extends Vue {
(actor.preferredUsername === "relay" || actor.preferredUsername === actor.domain) (actor.preferredUsername === "relay" || actor.preferredUsername === actor.domain)
); );
} }
timeago(dateTime: string): string {
if (this.timeAgoInstance != null) {
return this.timeAgoInstance.format(new Date(dateTime));
}
return "";
}
} }

View File

@ -1,5 +1,5 @@
import Vue from "vue";
import Locale from "date-fns"; import Locale from "date-fns";
import VueInstance from "vue";
declare module "vue/types/vue" { declare module "vue/types/vue" {
interface Vue { interface Vue {
@ -7,8 +7,8 @@ declare module "vue/types/vue" {
} }
} }
export function DateFnsPlugin(vue: typeof Vue, { locale }: { locale: string }): void { export function DateFnsPlugin(vue: typeof VueInstance, { locale }: { locale: string }): void {
import(`date-fns/locale/${locale}/index.js`).then((localeEntity) => { import(`date-fns/locale/${locale}/index.js`).then((localeEntity) => {
Vue.prototype.$dateFnsLocale = localeEntity; VueInstance.prototype.$dateFnsLocale = localeEntity;
}); });
} }

View File

@ -1,4 +1,5 @@
import Vue from "vue"; /* eslint-disable no-shadow */
import VueInstance from "vue";
import { ColorModifiers } from "buefy/types/helpers.d"; import { ColorModifiers } from "buefy/types/helpers.d";
import { Route, RawLocation } from "vue-router"; import { Route, RawLocation } from "vue-router";
@ -12,39 +13,39 @@ declare module "vue/types/vue" {
beforeRouteEnter?( beforeRouteEnter?(
to: Route, to: Route,
from: Route, from: Route,
next: (to?: RawLocation | false | ((vm: Vue) => void)) => void next: (to?: RawLocation | false | ((vm: VueInstance) => void)) => void
): void; ): void;
beforeRouteLeave?( beforeRouteLeave?(
to: Route, to: Route,
from: Route, from: Route,
next: (to?: RawLocation | false | ((vm: Vue) => void)) => void next: (to?: RawLocation | false | ((vm: VueInstance) => void)) => void
): void; ): void;
beforeRouteUpdate?( beforeRouteUpdate?(
to: Route, to: Route,
from: Route, from: Route,
next: (to?: RawLocation | false | ((vm: Vue) => void)) => void next: (to?: RawLocation | false | ((vm: VueInstance) => void)) => void
): void; ): void;
} }
} }
export class Notifier { export class Notifier {
private readonly vue: typeof Vue; private readonly vue: typeof VueInstance;
constructor(vue: typeof Vue) { constructor(vue: typeof VueInstance) {
this.vue = vue; this.vue = vue;
} }
success(message: string) { success(message: string): void {
this.notification(message, "is-success"); this.notification(message, "is-success");
} }
error(message: string) { error(message: string): void {
this.notification(message, "is-danger"); this.notification(message, "is-danger");
} }
info(message: string) { info(message: string): void {
this.notification(message, "is-info"); this.notification(message, "is-info");
} }
@ -60,6 +61,6 @@ export class Notifier {
} }
/* eslint-disable */ /* eslint-disable */
export function NotifierPlugin(vue: typeof Vue): void { export function NotifierPlugin(vue: typeof VueInstance): void {
vue.prototype.$notifier = new Notifier(vue); vue.prototype.$notifier = new Notifier(vue);
} }

View File

@ -1,18 +1,70 @@
import Vue from "vue"; import Vue from "vue";
import VueI18n from "vue-i18n"; import VueI18n from "vue-i18n";
import messages from "../i18n/index"; import { DateFnsPlugin } from "@/plugins/dateFns";
import en from "../i18n/en_US.json";
import langs from "../i18n/langs.json";
const DEFAULT_LOCALE = "en";
let language = document.documentElement.getAttribute("lang") as string; let language = document.documentElement.getAttribute("lang") as string;
language = language || ((window.navigator as any).userLanguage || window.navigator.language).replace(/-/, "_"); language = language || ((window.navigator as any).userLanguage || window.navigator.language).replace(/-/, "_");
export const locale = language && messages.hasOwnProperty(language) ? language : language.split("-")[0]; export const locale =
language && Object.prototype.hasOwnProperty.call(langs, language) ? language : language.split("-")[0];
Vue.use(VueI18n); Vue.use(VueI18n);
console.log(en);
console.log(locale);
export const i18n = new VueI18n({ export const i18n = new VueI18n({
locale, // set locale locale: DEFAULT_LOCALE, // set locale
messages, // set locale messages messages: (en as unknown) as VueI18n.LocaleMessages, // set locale messages
fallbackLocale: "en_US", fallbackLocale: "en",
}); });
console.log(i18n);
Vue.use(DateFnsPlugin, { locale });
const loadedLanguages = ["en"];
function setI18nLanguage(lang: string): string {
i18n.locale = lang;
return lang;
}
function fileForLanguage(lang: string) {
const matches: Record<string, string> = {
fr: "fr_FR",
en: "en_US",
};
if (Object.prototype.hasOwnProperty.call(matches, lang)) {
return matches[lang];
}
return lang;
}
export async function loadLanguageAsync(lang: string): Promise<string> {
// If the same language
if (i18n.locale === lang) {
return Promise.resolve(setI18nLanguage(lang));
}
// If the language was already loaded
if (loadedLanguages.includes(lang)) {
return Promise.resolve(setI18nLanguage(lang));
}
console.log(fileForLanguage(lang));
// If the language hasn't been loaded yet
return import(/* webpackChunkName: "lang-[request]" */ `@/i18n/${fileForLanguage(lang)}.json`).then(
(newMessages: any) => {
i18n.setLocaleMessage(lang, newMessages.default);
loadedLanguages.push(lang);
return setI18nLanguage(lang);
}
);
}
loadLanguageAsync(locale);
export function formatList(list: string[]): string { export function formatList(list: string[]): string {
if (window.Intl && Intl.ListFormat) { if (window.Intl && Intl.ListFormat) {

View File

@ -135,7 +135,3 @@ $subtitle-sup-size: 15px;
$breadcrumb-item-color: $primary; $breadcrumb-item-color: $primary;
$checkbox-background-color: #fff; $checkbox-background-color: #fff;
$title-color: $violet-3; $title-color: $violet-3;
@import "~bulma";
@import "~bulma-divider";
@import "~buefy/src/scss/buefy";

View File

@ -119,8 +119,6 @@ export default class About extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../variables.scss";
.hero.is-primary { .hero.is-primary {
background: $background-color; background: $background-color;

View File

@ -122,8 +122,6 @@ export default class AboutInstance extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
section { section {
&:not(:first-child) { &:not(:first-child) {
margin: 2rem auto; margin: 2rem auto;

View File

@ -166,8 +166,6 @@ export default class AboutMobilizon extends Vue {}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
.hero.is-primary { .hero.is-primary {
background: $background-color; background: $background-color;
.subtitle { .subtitle {

View File

@ -51,8 +51,6 @@ export default class Privacy extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
main > .container { main > .container {
background: $white; background: $white;

View File

@ -27,8 +27,6 @@ export default class Rules extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
main > .container { main > .container {
background: $white; background: $white;
} }

View File

@ -144,8 +144,3 @@ export default class Profile extends Vue {
} }
} }
</script> </script>
<style lang="scss">
@import "../../variables";
@import "~bulma/sass/utilities/_all";
@import "~bulma/sass/components/dropdown.sass";
</style>

View File

@ -168,7 +168,6 @@ export default class Register extends mixins(identityEditionMixin) {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
.avatar-enter-active { .avatar-enter-active {
transition: opacity 1s ease; transition: opacity 1s ease;
} }

View File

@ -359,8 +359,6 @@ export default class Settings extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
.notification a { .notification a {
color: $primary !important; color: $primary !important;
text-decoration: underline !important; text-decoration: underline !important;

View File

@ -145,14 +145,13 @@ export default class Users extends Vue {
}); });
} }
onFiltersChange({ email }: { email: string }) { onFiltersChange({ email }: { email: string }): void {
this.email = email; this.email = email;
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
a.profile, a.profile,
a.user-profile { a.user-profile {
text-decoration: none; text-decoration: none;

View File

@ -296,8 +296,6 @@
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
main section > .container { main section > .container {
background: $white; background: $white;
} }

View File

@ -1044,8 +1044,6 @@ export default class Event extends EventMixin {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
.section { .section {
padding: 1rem 2rem 4rem; padding: 1rem 2rem 4rem;
} }

View File

@ -278,8 +278,6 @@ export default class MyEvents extends Vue {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
main > .container { main > .container {
background: $white; background: $white;
} }

View File

@ -365,7 +365,7 @@ export default class Participants extends Vue {
nl2br = nl2br; nl2br = nl2br;
toggleQueueDetails(row: IParticipant) { toggleQueueDetails(row: IParticipant): void {
if (row.metadata.message && row.metadata.message.length < MESSAGE_ELLIPSIS_LENGTH) return; if (row.metadata.message && row.metadata.message.length < MESSAGE_ELLIPSIS_LENGTH) return;
this.queueTable.toggleDetails(row); this.queueTable.toggleDetails(row);
} }
@ -374,8 +374,6 @@ export default class Participants extends Vue {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
section { section {
padding: 1rem 0; padding: 1rem 0;
} }

View File

@ -546,8 +546,6 @@ export default class Group extends mixins(GroupMixin) {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
div.container { div.container {
background: white; background: white;
margin-bottom: 3rem; margin-bottom: 3rem;

View File

@ -120,8 +120,6 @@ export default class MyEvents extends Vue {
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
main > .container { main > .container {
background: $white; background: $white;
} }

View File

@ -338,8 +338,6 @@ export default class Home extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
main > div > .container { main > div > .container {
background: $white; background: $white;
} }

View File

@ -58,8 +58,6 @@ export default class Interact extends Vue {
} }
</script> </script>
<style lang="scss"> <style lang="scss">
@import "@/variables.scss";
main > .container { main > .container {
background: $white; background: $white;
} }

View File

@ -443,8 +443,6 @@ export default class Report extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "@/variables.scss";
tbody td img.image, tbody td img.image,
.note img.image { .note img.image {
display: inline; display: inline;

View File

@ -129,8 +129,6 @@ export default class Post extends Vue {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
article { article {
section.heading-section { section.heading-section {
text-align: center; text-align: center;

View File

@ -366,8 +366,6 @@ export default class Search extends Vue {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import "@/variables.scss";
main > .container { main > .container {
background: $white; background: $white;

View File

@ -323,8 +323,6 @@ export default class AccountSettings extends Vue {
} }
</script> </script>
<style lang="scss"> <style lang="scss">
@import "@/variables.scss";
.setting-title { .setting-title {
margin-top: 2rem; margin-top: 2rem;
margin-bottom: 1rem; margin-bottom: 1rem;

View File

@ -155,8 +155,6 @@ export default class Notifications extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables.scss";
.field { .field {
&:not(:last-child) { &:not(:last-child) {
margin-bottom: 1.5rem; margin-bottom: 1.5rem;

View File

@ -17,7 +17,7 @@
v-model="$i18n.locale" v-model="$i18n.locale"
:placeholder="$t('Select a language')" :placeholder="$t('Select a language')"
> >
<option v-for="(language, lang) in languages" :value="lang" :key="lang"> <option v-for="(language, lang) in langs" :value="lang" :key="lang">
{{ language }} {{ language }}
</option> </option>
</b-select> </b-select>
@ -73,8 +73,10 @@ export default class Preferences extends Vue {
RouteName = RouteName; RouteName = RouteName;
langs: Record<string, string> = langs;
@Watch("loggedUser") @Watch("loggedUser")
setSavedTimezone(loggedUser: IUser) { setSavedTimezone(loggedUser: IUser): void {
if (loggedUser && loggedUser.settings.timezone) { if (loggedUser && loggedUser.settings.timezone) {
this.selectedTimezone = loggedUser.settings.timezone; this.selectedTimezone = loggedUser.settings.timezone;
} else { } else {
@ -87,22 +89,24 @@ export default class Preferences extends Vue {
} }
} }
// eslint-disable-next-line class-methods-use-this
sanitize(timezone: string): string { sanitize(timezone: string): string {
return timezone.split("_").join(" ").replace("St ", "St. ").split("/").join(" - "); return timezone.split("_").join(" ").replace("St ", "St. ").split("/").join(" - ");
} }
get timezones() { get timezones(): Record<string, string[]> {
if (!this.config || !this.config.timezones) return {}; if (!this.config || !this.config.timezones) return {};
return this.config.timezones.reduce((acc: { [key: string]: Array<string> }, val: string) => { return this.config.timezones.reduce((acc: { [key: string]: Array<string> }, val: string) => {
const components = val.split("/"); const components = val.split("/");
const [prefix, suffix] = [components.shift() as string, components.join("/")]; const [prefix, suffix] = [components.shift() as string, components.join("/")];
const pushOrCreate = ( const pushOrCreate = (
acc: { [key: string]: Array<string> }, acc2: { [key: string]: Array<string> },
prefix: string, prefix2: string,
suffix: string suffix2: string
) => { ) => {
(acc[prefix] = acc[prefix] || []).push(suffix); // eslint-disable-next-line no-param-reassign
return acc; (acc2[prefix2] = acc2[prefix2] || []).push(suffix2);
return acc2;
}; };
if (suffix) { if (suffix) {
return pushOrCreate(acc, prefix, suffix); return pushOrCreate(acc, prefix, suffix);
@ -111,22 +115,8 @@ export default class Preferences extends Vue {
}, {}); }, {});
} }
get languages(): object {
return this.$i18n.availableLocales.reduce((acc: object, lang: string) => {
// @ts-ignore
if (langs[lang]) {
return {
...acc,
// @ts-ignore
[lang]: langs[lang],
};
}
return acc;
}, {} as object);
}
@Watch("selectedTimezone") @Watch("selectedTimezone")
async updateTimezone() { async updateTimezone(): Promise<void> {
if (this.selectedTimezone !== this.loggedUser.settings.timezone) { if (this.selectedTimezone !== this.loggedUser.settings.timezone) {
await this.$apollo.mutate<{ setUserSetting: string }>({ await this.$apollo.mutate<{ setUserSetting: string }>({
mutation: SET_USER_SETTINGS, mutation: SET_USER_SETTINGS,
@ -138,7 +128,7 @@ export default class Preferences extends Vue {
} }
@Watch("$i18n.locale") @Watch("$i18n.locale")
async updateLocale() { async updateLocale(): Promise<void> {
await this.$apollo.mutate({ await this.$apollo.mutate({
mutation: UPDATE_USER_LOCALE, mutation: UPDATE_USER_LOCALE,
variables: { variables: {

View File

@ -212,9 +212,6 @@ export default class Register extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../variables";
@import "../../common.scss";
.avatar-enter-active { .avatar-enter-active {
transition: opacity 1s ease; transition: opacity 1s ease;
} }

View File

@ -7,6 +7,7 @@
"importHelpers": true, "importHelpers": true,
"moduleResolution": "node", "moduleResolution": "node",
"experimentalDecorators": true, "experimentalDecorators": true,
"skipLibCheck": true,
"esModuleInterop": true, "esModuleInterop": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"resolveJsonModule": true, "resolveJsonModule": true,

View File

@ -5,6 +5,7 @@ module.exports = {
runtimeCompiler: true, runtimeCompiler: true,
lintOnSave: true, lintOnSave: true,
filenameHashing: true, filenameHashing: true,
productionSourceMap: false,
outputDir: path.resolve(__dirname, "../priv/static"), outputDir: path.resolve(__dirname, "../priv/static"),
configureWebpack: (config) => { configureWebpack: (config) => {
// Limit the used memory when building // Limit the used memory when building
@ -25,6 +26,17 @@ module.exports = {
config.plugins.push(new ForkTsCheckerWebpackPlugin(forkTsCheckerOptions)); config.plugins.push(new ForkTsCheckerWebpackPlugin(forkTsCheckerOptions));
}, },
chainWebpack: (config) => {
// remove the prefetch plugin
config.plugins.delete("prefetch");
},
css: {
loaderOptions: {
scss: {
additionalData: `@import "@/variables.scss";`,
},
},
},
// configureWebpack: { // configureWebpack: {
// optimization: { // optimization: {
// splitChunks: { // splitChunks: {

View File

@ -1352,11 +1352,6 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/javascript-time-ago@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/javascript-time-ago/-/javascript-time-ago-2.0.1.tgz#819ec39b467409e2fd6acb42bc53ae7d631bbdb0"
integrity sha512-6QWXsuqzfUMfsg1DTJan/MfUi80LGS1TOohSqxlgpBZEHH344xpl3LzgANTp7PPWf7Z/9S0l14RMQPF0vH7MIg==
"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6":
version "7.0.6" version "7.0.6"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
@ -7988,13 +7983,6 @@ javascript-stringify@^2.0.0, javascript-stringify@^2.0.1:
resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5"
integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==
javascript-time-ago@^2.0.4:
version "2.2.8"
resolved "https://registry.yarnpkg.com/javascript-time-ago/-/javascript-time-ago-2.2.8.tgz#d2821816a648f4659f605e030418af7949f0564e"
integrity sha512-VU2GZ88QYl7zEfnKe2VecnPlXunr1awIAf21S13CRUUYlk6cVbmA81GApMXHIbDUfYfsJVcPjjB76KLEPO4fGA==
dependencies:
relative-time-format "^1.0.5"
jest-worker@^25.4.0: jest-worker@^25.4.0:
version "25.5.0" version "25.5.0"
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1"
@ -11941,11 +11929,6 @@ relateurl@0.2.x:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
relative-time-format@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/relative-time-format/-/relative-time-format-1.0.5.tgz#3fb7c76ae39156afe0a3a7ff0cb7bf30aa0f0fb6"
integrity sha512-MAgx/YKcUQYJpIaWcfetPstElnWf26JxVis4PirdwVrrymFdbxyCSm6yENpfB1YuwFbtHSHksN3aBajVNxk10Q==
remark-parse@^7.0.0: remark-parse@^7.0.0:
version "7.0.2" version "7.0.2"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.2.tgz#41e7170d9c1d96c3d32cf1109600a9ed50dba7cf" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-7.0.2.tgz#41e7170d9c1d96c3d32cf1109600a9ed50dba7cf"