Merge branch 'service-worker' into 'master'

Service worker & homepage

See merge request framasoft/mobilizon!943
This commit is contained in:
Thomas Citharel 2021-06-20 12:09:44 +00:00
commit a51723e239
13 changed files with 238 additions and 119 deletions

View file

@ -70,7 +70,6 @@
"@types/prosemirror-model": "^1.7.2", "@types/prosemirror-model": "^1.7.2",
"@types/prosemirror-state": "^1.2.4", "@types/prosemirror-state": "^1.2.4",
"@types/prosemirror-view": "^1.11.4", "@types/prosemirror-view": "^1.11.4",
"@types/vuedraggable": "^2.23.0",
"@typescript-eslint/eslint-plugin": "^4.18.0", "@typescript-eslint/eslint-plugin": "^4.18.0",
"@typescript-eslint/parser": "^4.18.0", "@typescript-eslint/parser": "^4.18.0",
"@vue/cli-plugin-babel": "~5.0.0-beta.2", "@vue/cli-plugin-babel": "~5.0.0-beta.2",

View file

@ -117,11 +117,38 @@ export default class App extends Vue {
window.addEventListener("offline", () => { window.addEventListener("offline", () => {
this.online = false; this.online = false;
this.showOfflineNetworkWarning(); this.showOfflineNetworkWarning();
console.log("offline"); console.debug("offline");
}); });
window.addEventListener("online", () => { window.addEventListener("online", () => {
this.online = true; this.online = true;
console.log("online"); console.debug("online");
});
document.addEventListener("refreshApp", (event: Event) => {
this.$buefy.snackbar.open({
queue: false,
indefinite: true,
type: "is-primary",
actionText: this.$t("Update app") as string,
cancelText: this.$t("Ignore") as string,
message: this.$t("A new version is available.") as string,
onAction: async () => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const detail = event.detail;
const registration = detail as ServiceWorkerRegistration;
try {
await this.refreshApp(registration);
window.location.reload();
} catch (err) {
console.error(err);
this.$notifier.error(
this.$t(
"An error has occured while refreshing the page."
) as string
);
}
},
});
}); });
this.interval = setInterval(async () => { this.interval = setInterval(async () => {
@ -138,6 +165,30 @@ export default class App extends Vue {
}, 60000); }, 60000);
} }
private async refreshApp(
registration: ServiceWorkerRegistration
): Promise<any> {
const worker = registration.waiting;
if (!worker) {
return Promise.resolve();
}
console.debug("Doing worker.skipWaiting().");
return new Promise((resolve, reject) => {
const channel = new MessageChannel();
channel.port1.onmessage = (event) => {
console.debug("Done worker.skipWaiting().");
if (event.data.error) {
reject(event.data);
} else {
resolve(event.data);
}
};
console.debug("calling skip waiting");
worker?.postMessage({ type: "skip-waiting" }, [channel.port2]);
});
}
showOfflineNetworkWarning(): void { showOfflineNetworkWarning(): void {
this.$notifier.error(this.$t("You are offline") as string); this.$notifier.error(this.$t("You are offline") as string);
} }

View file

@ -179,7 +179,7 @@
<script lang="ts"> <script lang="ts">
import { Component, Prop, Vue, Watch } from "vue-property-decorator"; import { Component, Prop, Vue, Watch } from "vue-property-decorator";
import { Editor, EditorContent, BubbleMenu } from "@tiptap/vue-2"; import { Editor, EditorContent, BubbleMenu } from "@tiptap/vue-2";
import { defaultExtensions } from "@tiptap/starter-kit"; import StarterKit from "@tiptap/starter-kit";
import Document from "@tiptap/extension-document"; import Document from "@tiptap/extension-document";
import Paragraph from "@tiptap/extension-paragraph"; import Paragraph from "@tiptap/extension-paragraph";
import Text from "@tiptap/extension-text"; import Text from "@tiptap/extension-text";
@ -241,6 +241,7 @@ export default class EditorComponent extends Vue {
mounted(): void { mounted(): void {
this.editor = new Editor({ this.editor = new Editor({
extensions: [ extensions: [
StarterKit,
Document, Document,
Paragraph, Paragraph,
Text, Text,
@ -253,7 +254,6 @@ export default class EditorComponent extends Vue {
CharacterCount.configure({ CharacterCount.configure({
limit: this.maxSize, limit: this.maxSize,
}), }),
...defaultExtensions(),
], ],
injectCSS: false, injectCSS: false,
content: this.value, content: this.value,

View file

@ -2,7 +2,13 @@
<article class="box"> <article class="box">
<div class="identity-header"> <div class="identity-header">
<figure class="image is-24x24" v-if="participation.actor.avatar"> <figure class="image is-24x24" v-if="participation.actor.avatar">
<img class="is-rounded" :src="participation.actor.avatar.url" alt="" /> <img
class="is-rounded"
:src="participation.actor.avatar.url"
alt=""
height="24"
width="24"
/>
</figure> </figure>
{{ displayNameAndUsername(participation.actor) }} {{ displayNameAndUsername(participation.actor) }}
</div> </div>

View file

@ -30,6 +30,6 @@ export default class RecentEventCardWrapper extends Vue {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
p.time { p.time {
color: $orange-2; color: $violet-3;
} }
</style> </style>

View file

@ -857,7 +857,6 @@
"Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.": "Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.", "Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.": "Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.",
"Your upcoming events": "Your upcoming events", "Your upcoming events": "Your upcoming events",
"Last published events": "Last published events", "Last published events": "Last published events",
"On {instance}": "On {instance}",
"Events nearby": "Events nearby", "Events nearby": "Events nearby",
"Within {number} kilometers of {place}": "|Within one kilometer of {place}|Within {number} kilometers of {place}", "Within {number} kilometers of {place}": "|Within one kilometer of {place}|Within {number} kilometers of {place}",
"@{username}": "@{username}", "@{username}": "@{username}",
@ -1047,5 +1046,12 @@
"Share this group": "Share this group", "Share this group": "Share this group",
"This group is accessible only through it's link. Be careful where you post this link.": "This group is accessible only through it's link. Be careful where you post this link.", "This group is accessible only through it's link. Be careful where you post this link.": "This group is accessible only through it's link. Be careful where you post this link.",
"{count} members": "No members|One member|{count} members", "{count} members": "No members|One member|{count} members",
"Share": "Share" "Share": "Share",
"Update app": "Update app",
"Ignore": "Ignore",
"A new version is available.": "A new version is available.",
"An error has occured while refreshing the page.": "An error has occured while refreshing the page.",
"Join group {group}": "Join group {group}",
"Public preview": "Public preview",
"On {instance} and other federated instances": "On {instance} and other federated instances"
} }

View file

@ -561,7 +561,6 @@
"On {date} ending at {endTime}": "Le {date}, se terminant à {endTime}", "On {date} ending at {endTime}": "Le {date}, se terminant à {endTime}",
"On {date} from {startTime} to {endTime}": "Le {date} de {startTime} à {endTime}", "On {date} from {startTime} to {endTime}": "Le {date} de {startTime} à {endTime}",
"On {date} starting at {startTime}": "Le {date} à partir de {startTime}", "On {date} starting at {startTime}": "Le {date} à partir de {startTime}",
"On {instance}": "Sur {instance}",
"Ongoing tasks": "Tâches en cours", "Ongoing tasks": "Tâches en cours",
"Only accessible through link": "Accessible uniquement par le lien", "Only accessible through link": "Accessible uniquement par le lien",
"Only accessible through link (private)": "Uniquement accessible par lien (privé)", "Only accessible through link (private)": "Uniquement accessible par lien (privé)",
@ -1138,5 +1137,12 @@
"Share this group": "Partager ce groupe", "Share this group": "Partager ce groupe",
"This group is accessible only through it's link. Be careful where you post this link.": "Ce groupe est accessible uniquement à travers son lien. Faites attention où vous le diffusez.", "This group is accessible only through it's link. Be careful where you post this link.": "Ce groupe est accessible uniquement à travers son lien. Faites attention où vous le diffusez.",
"{count} members": "Aucun membre|Un⋅e membre|{count} membres", "{count} members": "Aucun membre|Un⋅e membre|{count} membres",
"Share": "Partager" "Share": "Partager",
"Update app": "Mettre à jour",
"Ignore": "Ignorer",
"A new version is available.": "Une nouvelle version est disponible.",
"An error has occured while refreshing the page.": "Une erreur est survenue lors du rafraîchissement de la page.",
"Join group {group}": "Rejoindre le groupe {group}",
"Public preview": "Aperçu public",
"On {instance} and other federated instances": "Sur {instance} et d'autres instances fédérées"
} }

View file

@ -5,25 +5,27 @@ import { register } from "register-service-worker";
if ("serviceWorker" in navigator && isProduction()) { if ("serviceWorker" in navigator && isProduction()) {
register(`${process.env.BASE_URL}service-worker.js`, { register(`${process.env.BASE_URL}service-worker.js`, {
ready() { ready() {
console.log( console.debug(
"App is being served from cache by a service worker.\n" + "App is being served from cache by a service worker.\n" +
"For more details, visit https://goo.gl/AFskqB" "For more details, visit https://goo.gl/AFskqB"
); );
}, },
registered() { registered() {
console.log("Service worker has been registered."); console.debug("Service worker has been registered.");
}, },
cached() { cached() {
console.log("Content has been cached for offline use."); console.debug("Content has been cached for offline use.");
}, },
updatefound() { updatefound() {
console.log("New content is downloading."); console.debug("New content is downloading.");
}, },
updated() { updated(registration: ServiceWorkerRegistration) {
console.log("New content is available; please refresh."); const event = new CustomEvent("refreshApp", { detail: registration });
document.dispatchEvent(event);
console.debug("New content is available; please refresh.");
}, },
offline() { offline() {
console.log( console.debug(
"No internet connection found. App is running in offline mode." "No internet connection found. App is running in offline mode."
); );
}, },
@ -34,6 +36,5 @@ if ("serviceWorker" in navigator && isProduction()) {
} }
function isProduction(): boolean { function isProduction(): boolean {
return true; return process.env.NODE_ENV === "production";
// return process.env.NODE_ENV === "production";
} }

View file

@ -42,10 +42,11 @@ registerRoute(
// Cache CSS, JS, and Web Worker requests with a Stale While Revalidate strategy // Cache CSS, JS, and Web Worker requests with a Stale While Revalidate strategy
registerRoute( registerRoute(
// Check to see if the request's destination is style for stylesheets, script for JavaScript, or worker for web worker // Check to see if the request's destination is style for stylesheets, script for JavaScript, font, or worker for web worker
({ request }) => ({ request }) =>
request.destination === "style" || request.destination === "style" ||
request.destination === "script" || request.destination === "script" ||
request.destination === "font" ||
request.destination === "worker", request.destination === "worker",
// Use a Stale While Revalidate caching strategy // Use a Stale While Revalidate caching strategy
new StaleWhileRevalidate({ new StaleWhileRevalidate({
@ -82,6 +83,24 @@ registerRoute(
}) })
); );
async function isClientFocused(): Promise<boolean> {
const windowClients = await self.clients.matchAll({
type: "window",
includeUncontrolled: true,
});
let clientIsFocused = false;
for (let i = 0; i < windowClients.length; i++) {
const windowClient = windowClients[i] as WindowClient;
if (windowClient.focused) {
clientIsFocused = true;
break;
}
}
return clientIsFocused;
}
self.addEventListener("push", async (event: PushEvent) => { self.addEventListener("push", async (event: PushEvent) => {
if (!event.data) return; if (!event.data) return;
const payload = event.data.json(); const payload = event.data.json();
@ -98,7 +117,15 @@ self.addEventListener("push", async (event: PushEvent) => {
}, },
}; };
event.waitUntil(self.registration.showNotification(payload.title, options)); event.waitUntil(
(async () => {
if (await isClientFocused()) {
// No need to show a notification, client already focused
return;
}
self.registration.showNotification(payload.title, options);
})()
);
}); });
self.addEventListener("notificationclick", function (event: NotificationEvent) { self.addEventListener("notificationclick", function (event: NotificationEvent) {
@ -111,6 +138,7 @@ self.addEventListener("notificationclick", function (event: NotificationEvent) {
(async () => { (async () => {
const clientList = await self.clients.matchAll({ const clientList = await self.clients.matchAll({
type: "window", type: "window",
includeUncontrolled: true,
}); });
for (let i = 0; i < clientList.length; i++) { for (let i = 0; i < clientList.length; i++) {
const client = clientList[i] as WindowClient; const client = clientList[i] as WindowClient;
@ -124,3 +152,17 @@ self.addEventListener("notificationclick", function (event: NotificationEvent) {
})() })()
); );
}); });
self.addEventListener("message", (event: ExtendableMessageEvent) => {
const replyPort = event.ports[0];
const message = event.data;
if (replyPort && message && message.type === "skip-waiting") {
console.log("doing skip waiting");
event.waitUntil(
self.skipWaiting().then(
() => replyPort.postMessage({ error: null }),
(error) => replyPort.postMessage({ error })
)
);
}
});

View file

@ -128,10 +128,6 @@ $subtitle-size: 32px;
$subtitle-sub-size: 30px; $subtitle-sub-size: 30px;
$subtitle-sup-size: 15px; $subtitle-sup-size: 15px;
.title {
margin: 30px auto 45px;
}
.subtitle { .subtitle {
background: $secondary; background: $secondary;
display: inline; display: inline;

View file

@ -52,11 +52,13 @@
v-if="config && (!currentUser.id || !currentActor.id)" v-if="config && (!currentUser.id || !currentActor.id)"
> >
<section class="events-recent"> <section class="events-recent">
<h2 class="is-size-2 has-text-weight-bold"> <h2 class="title">
{{ $t("Last published events") }} {{ $t("Last published events") }}
</h2> </h2>
<p> <p>
{{ $t("On {instance}", { instance: config.name }) }} <i18n tag="span" path="On {instance} and other federated instances">
<b slot="instance">{{ config.name }}</b>
</i18n>
<b-loading :active.sync="$apollo.loading" /> <b-loading :active.sync="$apollo.loading" />
</p> </p>
<b-loading :active.sync="$apollo.loading" /> <b-loading :active.sync="$apollo.loading" />
@ -176,7 +178,7 @@
class="container section" class="container section"
v-if="config && loggedUser && loggedUser.settings" v-if="config && loggedUser && loggedUser.settings"
> >
<section v-if="currentActor.id"> <section v-if="currentActor.id && (welcomeBack || newRegisteredUser)">
<b-message type="is-info" v-if="welcomeBack">{{ <b-message type="is-info" v-if="welcomeBack">{{
$t("Welcome back {username}!", { $t("Welcome back {username}!", {
username: currentActor.displayName(), username: currentActor.displayName(),
@ -189,34 +191,33 @@
}}</b-message> }}</b-message>
</section> </section>
<!-- Your upcoming events --> <!-- Your upcoming events -->
<section v-if="canShowMyUpcomingEvents" class="container"> <section v-if="canShowMyUpcomingEvents">
<h3 class="title">{{ $t("Your upcoming events") }}</h3> <h2 class="title">{{ $t("Your upcoming events") }}</h2>
<b-loading :active.sync="$apollo.loading" /> <b-loading :active.sync="$apollo.loading" />
<div v-for="row of goingToEvents" class="upcoming-events" :key="row[0]"> <div v-for="row of goingToEvents" class="upcoming-events" :key="row[0]">
<span <p
class="date-component-container" class="date-component-container"
v-if="isInLessThanSevenDays(row[0])" v-if="isInLessThanSevenDays(row[0])"
> >
<date-component :date="row[0]" /> <span v-if="isToday(row[0])">{{
<subtitle v-if="isToday(row[0])">{{
$tc("You have one event today.", row[1].length, { $tc("You have one event today.", row[1].length, {
count: row[1].length, count: row[1].length,
}) })
}}</subtitle> }}</span>
<subtitle v-else-if="isTomorrow(row[0])">{{ <span v-else-if="isTomorrow(row[0])">{{
$tc("You have one event tomorrow.", row[1].length, { $tc("You have one event tomorrow.", row[1].length, {
count: row[1].length, count: row[1].length,
}) })
}}</subtitle> }}</span>
<subtitle v-else-if="isInLessThanSevenDays(row[0])"> <span v-else-if="isInLessThanSevenDays(row[0])">
{{ {{
$tc("You have one event in {days} days.", row[1].length, { $tc("You have one event in {days} days.", row[1].length, {
count: row[1].length, count: row[1].length,
days: calculateDiffDays(row[0]), days: calculateDiffDays(row[0]),
}) })
}} }}
</subtitle> </span>
</span> </p>
<div> <div>
<EventListCard <EventListCard
v-for="participation in thisWeek(row)" v-for="participation in thisWeek(row)"
@ -232,9 +233,13 @@
> >
</span> </span>
</section> </section>
<hr
class="home-separator"
v-if="canShowMyUpcomingEvents && canShowLastWeekEvents"
/>
<!-- Last week events --> <!-- Last week events -->
<section v-if="canShowLastWeekEvents"> <section v-if="canShowLastWeekEvents">
<h3 class="title">{{ $t("Last week") }}</h3> <h2 class="title">{{ $t("Last week") }}</h2>
<b-loading :active.sync="$apollo.loading" /> <b-loading :active.sync="$apollo.loading" />
<div> <div>
<EventListCard <EventListCard
@ -246,9 +251,13 @@
/> />
</div> </div>
</section> </section>
<hr
class="home-separator"
v-if="canShowLastWeekEvents && canShowCloseEvents"
/>
<!-- Events close to you --> <!-- Events close to you -->
<section class="events-close" v-if="canShowCloseEvents"> <section class="events-close" v-if="canShowCloseEvents">
<h2 class="is-size-2 has-text-weight-bold"> <h2 class="title">
{{ $t("Events nearby") }} {{ $t("Events nearby") }}
</h2> </h2>
<p> <p>
@ -289,11 +298,13 @@
" "
/> />
<section class="events-recent"> <section class="events-recent">
<h2 class="is-size-2 has-text-weight-bold"> <h2 class="title">
{{ $t("Last published events") }} {{ $t("Last published events") }}
</h2> </h2>
<p> <p>
{{ $t("On {instance}", { instance: config.name }) }} <i18n tag="span" path="On {instance} and other federated instances">
<b slot="instance">{{ config.name }}</b>
</i18n>
<b-loading :active.sync="$apollo.loading" /> <b-loading :active.sync="$apollo.loading" />
</p> </p>
@ -629,20 +640,16 @@ main > div > .container {
.date-component-container { .date-component-container {
display: flex; display: flex;
align-items: center; align-items: center;
margin: 1.5rem auto; margin: 0.5rem auto 1rem;
h3.subtitle { h3.subtitle {
margin-left: 7px; margin-left: 7px;
} }
} }
section.container {
margin: auto auto 3rem;
}
span.view-all { span.view-all {
display: block; display: block;
margin-top: 2rem; margin-top: 1rem;
text-align: right; text-align: right;
a { a {
@ -688,8 +695,8 @@ section.hero {
} }
#recent_events { #recent_events {
padding: 1rem 0; padding: 0;
min-height: calc(100vh - 400px); min-height: 20vh;
z-index: 10; z-index: 10;
.title { .title {
@ -697,7 +704,7 @@ section.hero {
} }
.columns { .columns {
margin: 0rem auto 3rem; margin: 0 auto;
} }
} }
@ -761,4 +768,11 @@ section.hero {
.clickable { .clickable {
cursor: pointer; cursor: pointer;
} }
.title {
font-size: 27px;
&:not(:last-child) {
margin-bottom: 0.5rem;
}
}
</style> </style>

View file

@ -26,6 +26,7 @@ import {
typePolicies, typePolicies,
refreshAccessToken, refreshAccessToken,
} from "./apollo/utils"; } from "./apollo/utils";
import { GraphQLError } from "graphql";
// Install the vue plugin // Install the vue plugin
Vue.use(VueApollo); Vue.use(VueApollo);
@ -120,10 +121,14 @@ const errorLink = onError(
} }
if (graphQLErrors) { if (graphQLErrors) {
graphQLErrors.map(({ message, locations, path }) => graphQLErrors.map(
console.log( (graphQLError: GraphQLError & { status_code?: number }) => {
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}` if (graphQLError?.status_code !== 401) {
) console.log(
`[GraphQL error]: Message: ${graphQLError.message}, Location: ${graphQLError.locations}, Path: ${graphQLError.path}`
);
}
}
); );
} }

View file

@ -1483,10 +1483,10 @@
ejs "^2.6.1" ejs "^2.6.1"
magic-string "^0.25.0" magic-string "^0.25.0"
"@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.83": "@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.84":
version "2.0.0-beta.83" version "2.0.0-beta.84"
resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.83.tgz#29bfd96591651469ec4d22dfb1bbaba8d74877ce" resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.84.tgz#71d4f6b1d3c9ba44da7a285950b8b56c7fbd6866"
integrity sha512-F6nvNQHoCQhkmKxuU1d6HFXi3L1lTyWsN4Sbgn8mr8HTK2HhdMPkkMdwk4pOIFvaNVjWBpe4/tH/8YAUjI7JbA== integrity sha512-wf3qax8/sstXSBsCxnxNCccuKH2vfzz+sozMjaFDvZDjlvItKeYHZ9jVnK9Cv3zuFfCVajJ9zt4+qdcjXB+q2A==
dependencies: dependencies:
"@types/prosemirror-commands" "^1.0.4" "@types/prosemirror-commands" "^1.0.4"
"@types/prosemirror-inputrules" "^1.0.4" "@types/prosemirror-inputrules" "^1.0.4"
@ -1499,7 +1499,7 @@
prosemirror-commands "^1.1.9" prosemirror-commands "^1.1.9"
prosemirror-inputrules "^1.1.3" prosemirror-inputrules "^1.1.3"
prosemirror-keymap "^1.1.3" prosemirror-keymap "^1.1.3"
prosemirror-model "^1.14.1" prosemirror-model "^1.14.2"
prosemirror-schema-list "^1.1.4" prosemirror-schema-list "^1.1.4"
prosemirror-state "^1.3.4" prosemirror-state "^1.3.4"
prosemirror-transform "^1.3.2" prosemirror-transform "^1.3.2"
@ -1630,11 +1630,11 @@
integrity sha512-5nvrCvcV35J6WjLd8xQCQWnj2HIDsfTalr0D57jMwym3ZCIEvLwf23DQQ1nNsOHhopmS/Emixh+RQpXUZjH8lQ== integrity sha512-5nvrCvcV35J6WjLd8xQCQWnj2HIDsfTalr0D57jMwym3ZCIEvLwf23DQQ1nNsOHhopmS/Emixh+RQpXUZjH8lQ==
"@tiptap/extension-mention@^2.0.0-beta.42": "@tiptap/extension-mention@^2.0.0-beta.42":
version "2.0.0-beta.59" version "2.0.0-beta.60"
resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.59.tgz#5fde39a68c1c3c8c896fa28b9dfa4b8448ec340a" resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.60.tgz#9b062b45c22bc659cde7ae5ac9b612cce1fc9678"
integrity sha512-qwIc/KBjS0/8ZHoV7WJaKSU8VRtX+GDdIksvrPaw+C2k2l7E7KWyi7SxYtu1+cFP27Ob1pCWiwD5Yv/x/wVEVg== integrity sha512-Tk7HbQ21R9cH/Je74mbgeLNkQn97j9G8+oblXY/B2RWawhUMVqlSDM8YogCzU6e6PKJ+mww5o9rta7Npw0jjVw==
dependencies: dependencies:
"@tiptap/suggestion" "^2.0.0-beta.57" "@tiptap/suggestion" "^2.0.0-beta.58"
"@tiptap/extension-ordered-list@^2.0.0-beta.14", "@tiptap/extension-ordered-list@^2.0.0-beta.6": "@tiptap/extension-ordered-list@^2.0.0-beta.14", "@tiptap/extension-ordered-list@^2.0.0-beta.6":
version "2.0.0-beta.14" version "2.0.0-beta.14"
@ -1664,11 +1664,11 @@
integrity sha512-xrdNYXBuDaiKBByAuJ8Z9g+1w4I1pp8Id6ZbhxnljiTIwtX6SD/Pp4z/4dKhXNSpHvipyaFEXY0CVpxzbSEk5w== integrity sha512-xrdNYXBuDaiKBByAuJ8Z9g+1w4I1pp8Id6ZbhxnljiTIwtX6SD/Pp4z/4dKhXNSpHvipyaFEXY0CVpxzbSEk5w==
"@tiptap/starter-kit@^2.0.0-beta.37": "@tiptap/starter-kit@^2.0.0-beta.37":
version "2.0.0-beta.79" version "2.0.0-beta.80"
resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.79.tgz#4c8fdccefe3e4b1dcb6576280c1cfb2320673a71" resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.80.tgz#eaa3a683b59c5f8805c82d00af4f4c4eadeadbdb"
integrity sha512-Te0+SkrwgOYl8/fxb+2zBzzBsqtAftYipvMtNOzi94khQEWC7bZs1voJWpmVRZX6dG0vQBpZxVL0wVsFLQTAkg== integrity sha512-ly4LFofIfkmbJh/EemAZM1s5GXBLju7+WER8UiHFAyRJ7ktl0Q/l2lny35JcK5fWHWR8W1mH50HOCgR0GkIrxw==
dependencies: dependencies:
"@tiptap/core" "^2.0.0-beta.83" "@tiptap/core" "^2.0.0-beta.84"
"@tiptap/extension-blockquote" "^2.0.0-beta.14" "@tiptap/extension-blockquote" "^2.0.0-beta.14"
"@tiptap/extension-bold" "^2.0.0-beta.14" "@tiptap/extension-bold" "^2.0.0-beta.14"
"@tiptap/extension-bullet-list" "^2.0.0-beta.14" "@tiptap/extension-bullet-list" "^2.0.0-beta.14"
@ -1688,12 +1688,12 @@
"@tiptap/extension-strike" "^2.0.0-beta.16" "@tiptap/extension-strike" "^2.0.0-beta.16"
"@tiptap/extension-text" "^2.0.0-beta.12" "@tiptap/extension-text" "^2.0.0-beta.12"
"@tiptap/suggestion@^2.0.0-beta.57": "@tiptap/suggestion@^2.0.0-beta.58":
version "2.0.0-beta.57" version "2.0.0-beta.58"
resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.57.tgz#7da90521098a323bfc55ad380a06599a566d027f" resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.58.tgz#a199fa20fabab24f019ffc569e13a11fcf417feb"
integrity sha512-dZKwo7zGTCV1wH5M5k/ZhDIIs1cJgxK48scddxu/Ine6ZlGCQyFdUYFkhhiS8eC5Z4Mkgixogr60AfJ/g+Tu1Q== integrity sha512-Z8DUiFPPAJ33gN63ZmypSdCtfu1p41xQf36wJiWzGB/s9GaV1dw/lWC+hf0gU7PCN8RW3+SAtAQz8xO2Y/fCHg==
dependencies: dependencies:
prosemirror-model "^1.14.1" prosemirror-model "^1.14.2"
prosemirror-state "^1.3.4" prosemirror-state "^1.3.4"
prosemirror-view "^1.18.7" prosemirror-view "^1.18.7"
@ -1936,9 +1936,9 @@
integrity sha512-6nlq2eEh75JegDGUXis9wGTYIJpUvbori4qx++PRKQsV3YRkaqUNPNykzphniqPSZADXCouBuAnyptjUkMkhvw== integrity sha512-6nlq2eEh75JegDGUXis9wGTYIJpUvbori4qx++PRKQsV3YRkaqUNPNykzphniqPSZADXCouBuAnyptjUkMkhvw==
"@types/node@*": "@types/node@*":
version "15.12.2" version "15.12.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.3.tgz#2817bf5f25bc82f56579018c53f7d41b1830b1af"
integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== integrity sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==
"@types/node@^14.14.31": "@types/node@^14.14.31":
version "14.17.3" version "14.17.3"
@ -2113,13 +2113,6 @@
dependencies: dependencies:
source-map "^0.6.1" source-map "^0.6.1"
"@types/vuedraggable@^2.23.0":
version "2.24.0"
resolved "https://registry.yarnpkg.com/@types/vuedraggable/-/vuedraggable-2.24.0.tgz#f09e8d772c6021b87bc13898fd1183fb81674a61"
integrity sha512-QdR7Vi36ga+cjlILUWVxUBERCRWDoNbjvnWJ6SzoxPlPJUQaY1XjBprF4aH4CI/xSch8TJg5x3rjgTLlt85rew==
dependencies:
vuedraggable "*"
"@types/webpack-dev-server@^3.11.0": "@types/webpack-dev-server@^3.11.0":
version "3.11.4" version "3.11.4"
resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.4.tgz#90d47dd660b696d409431ab8c1e9fa3615103a07" resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.4.tgz#90d47dd660b696d409431ab8c1e9fa3615103a07"
@ -3287,12 +3280,12 @@ babel-plugin-polyfill-corejs2@^0.2.2:
semver "^6.1.1" semver "^6.1.1"
babel-plugin-polyfill-corejs3@^0.2.2: babel-plugin-polyfill-corejs3@^0.2.2:
version "0.2.2" version "0.2.3"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b"
integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==
dependencies: dependencies:
"@babel/helper-define-polyfill-provider" "^0.2.2" "@babel/helper-define-polyfill-provider" "^0.2.2"
core-js-compat "^3.9.1" core-js-compat "^3.14.0"
babel-plugin-polyfill-regenerator@^0.2.2: babel-plugin-polyfill-regenerator@^0.2.2:
version "0.2.2" version "0.2.2"
@ -3658,9 +3651,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0" lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001230: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001230:
version "1.0.30001237" version "1.0.30001238"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz#4b7783661515b8e7151fc6376cfd97f0e427b9e5" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001238.tgz#e6a8b45455c5de601718736d0242feef0ecdda15"
integrity sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw== integrity sha512-bZGam2MxEt7YNsa2VwshqWQMwrYs5tR5WZQRYSuFxsBQunWjBuXhN4cS9nV5FFb1Z9y+DoQcQ0COyQbv6A+CKw==
capture-exit@^2.0.0: capture-exit@^2.0.0:
version "2.0.0" version "2.0.0"
@ -4112,7 +4105,7 @@ copy-webpack-plugin@^8.0.0:
schema-utils "^3.0.0" schema-utils "^3.0.0"
serialize-javascript "^5.0.1" serialize-javascript "^5.0.1"
core-js-compat@^3.14.0, core-js-compat@^3.8.3, core-js-compat@^3.9.1: core-js-compat@^3.14.0, core-js-compat@^3.8.3:
version "3.14.0" version "3.14.0"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5"
integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A==
@ -5839,9 +5832,9 @@ globals@^13.6.0, globals@^13.9.0:
type-fest "^0.20.2" type-fest "^0.20.2"
globby@^11.0.2, globby@^11.0.3: globby@^11.0.2, globby@^11.0.3:
version "11.0.3" version "11.0.4"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
dependencies: dependencies:
array-union "^2.1.0" array-union "^2.1.0"
dir-glob "^3.0.1" dir-glob "^3.0.1"
@ -8923,9 +8916,9 @@ postcss@^7.0.36:
supports-color "^6.1.0" supports-color "^6.1.0"
postcss@^8.2.15, postcss@^8.2.6, postcss@^8.2.9: postcss@^8.2.15, postcss@^8.2.6, postcss@^8.2.9:
version "8.3.4" version "8.3.5"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.4.tgz#41ece1c43f2f7c74dc7d90144047ce052757b822" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709"
integrity sha512-/tZY0PXExXXnNhKv3TOvZAOUYRyuqcCbBm2c17YMDK0PlVII3K7/LKdt3ScHL+hhouddjUWi+1sKDf9xXW+8YA== integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==
dependencies: dependencies:
colorette "^1.2.2" colorette "^1.2.2"
nanoid "^3.1.23" nanoid "^3.1.23"
@ -9106,7 +9099,7 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.3:
prosemirror-state "^1.0.0" prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0" w3c-keyname "^2.2.0"
prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.14.1: prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.14.2:
version "1.14.2" version "1.14.2"
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.2.tgz#4e8c39cfff4e097631af4495e125d9a8a9773116" resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.2.tgz#4e8c39cfff4e097631af4495e125d9a8a9773116"
integrity sha512-TwkACyEiSi8FJiRhg2ffbzmQRy5DR+aTwAr7trNQNZL24HJR8ouxy4qCkG99PnWK0xZ0AjSMtPXSU6hnxAiP7Q== integrity sha512-TwkACyEiSi8FJiRhg2ffbzmQRy5DR+aTwAr7trNQNZL24HJR8ouxy4qCkG99PnWK0xZ0AjSMtPXSU6hnxAiP7Q==
@ -9594,9 +9587,9 @@ rollup-plugin-terser@^7.0.0:
terser "^5.0.0" terser "^5.0.0"
rollup@^2.43.1: rollup@^2.43.1:
version "2.52.0" version "2.52.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.52.0.tgz#9df3de6028fae79569a985942b81110205a5a411" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.52.1.tgz#dd1cc178d70cf35c48d943fc06fdc32d546e6876"
integrity sha512-lSkBDGsVoXjqaBf7dsHwxBJz+p+hJEP72P+LOitA0yVs+Nzxj76FidkZE2thrmhjwGqLYiJo39opi7mAfaQ/Vg== integrity sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w==
optionalDependencies: optionalDependencies:
fsevents "~2.3.2" fsevents "~2.3.2"
@ -10638,9 +10631,9 @@ ts-invariant@^0.4.0:
tslib "^1.9.3" tslib "^1.9.3"
ts-invariant@^0.7.0: ts-invariant@^0.7.0:
version "0.7.3" version "0.7.5"
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.3.tgz#13aae22a4a165393aaf5cecdee45ef4128d358b8" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.5.tgz#f9658719f9a7737b117d09820d952aacf6263f9c"
integrity sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA== integrity sha512-qfVyqTYWEqADMtncLqwpUdMjMSXnsqOeqGtj1LeJNFDjz8oqZ1YxLEp29YCOq65z0LgEiERqQ8ThVjnfibJNpg==
dependencies: dependencies:
tslib "^2.1.0" tslib "^2.1.0"
@ -10770,14 +10763,14 @@ typedarray-to-buffer@^3.1.5:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
typescript@^3.9.3: typescript@^3.9.3:
version "3.9.9" version "3.9.10"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8"
integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==
typescript@~4.1.5: typescript@~4.1.5:
version "4.1.5" version "4.1.6"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.6.tgz#1becd85d77567c3c741172339e93ce2e69932138"
integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== integrity sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow==
unbox-primitive@^1.0.1: unbox-primitive@^1.0.1:
version "1.0.1" version "1.0.1"
@ -11122,7 +11115,7 @@ vue@^2.6.11:
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235"
integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==
vuedraggable@*, vuedraggable@^2.24.3: vuedraggable@^2.24.3:
version "2.24.3" version "2.24.3"
resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19" resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19"
integrity sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g== integrity sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==
@ -11322,9 +11315,9 @@ webpack-virtual-modules@^0.4.2:
integrity sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw== integrity sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==
webpack@^5.22.0: webpack@^5.22.0:
version "5.39.0" version "5.39.1"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.0.tgz#37d6899f1f40c31d5901abc0f39bc8cc7224138c" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.1.tgz#d1e014b6d71e1aef385316ad528f21cd5b1f9784"
integrity sha512-25CHmuDj+oOTyteI13sUqNlCnjCnySuhiKWE/cRYPQYeoQ3ijHgyWX27CiyUKLNGq27v8S0mrksyTreT/xo7pg== integrity sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==
dependencies: dependencies:
"@types/eslint-scope" "^3.7.0" "@types/eslint-scope" "^3.7.0"
"@types/estree" "^0.0.47" "@types/estree" "^0.0.47"
@ -11651,9 +11644,9 @@ ws@^6.2.1:
async-limiter "~1.0.0" async-limiter "~1.0.0"
ws@^7.3.1, ws@^7.4.5: ws@^7.3.1, ws@^7.4.5:
version "7.4.6" version "7.5.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691"
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==
xml-name-validator@^3.0.0: xml-name-validator@^3.0.0:
version "3.0.0" version "3.0.0"