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:
parent
f627cab292
commit
93cecbe49c
|
@ -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",
|
||||||
|
|
|
@ -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;
|
||||||
// }
|
// }
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}`);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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.",
|
||||||
|
|
|
@ -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,
|
|
||||||
};
|
|
|
@ -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": "繁體中文(台灣)"
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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";
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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: {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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: {
|
||||||
|
|
17
js/yarn.lock
17
js/yarn.lock
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue