diff --git a/js/package.json b/js/package.json index cafffcbce..b9f97cf80 100644 --- a/js/package.json +++ b/js/package.json @@ -70,7 +70,6 @@ "@types/prosemirror-model": "^1.7.2", "@types/prosemirror-state": "^1.2.4", "@types/prosemirror-view": "^1.11.4", - "@types/vuedraggable": "^2.23.0", "@typescript-eslint/eslint-plugin": "^4.18.0", "@typescript-eslint/parser": "^4.18.0", "@vue/cli-plugin-babel": "~5.0.0-beta.2", diff --git a/js/src/App.vue b/js/src/App.vue index 218a48cdc..f0ef0bfe6 100644 --- a/js/src/App.vue +++ b/js/src/App.vue @@ -117,11 +117,38 @@ export default class App extends Vue { window.addEventListener("offline", () => { this.online = false; this.showOfflineNetworkWarning(); - console.log("offline"); + console.debug("offline"); }); window.addEventListener("online", () => { 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 () => { @@ -138,6 +165,30 @@ export default class App extends Vue { }, 60000); } + private async refreshApp( + registration: ServiceWorkerRegistration + ): Promise { + 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 { this.$notifier.error(this.$t("You are offline") as string); } diff --git a/js/src/components/Editor.vue b/js/src/components/Editor.vue index f83b9adc7..f0b5a0eac 100644 --- a/js/src/components/Editor.vue +++ b/js/src/components/Editor.vue @@ -179,7 +179,7 @@ diff --git a/js/src/i18n/en_US.json b/js/src/i18n/en_US.json index 3cf0514d1..b370a2fa0 100644 --- a/js/src/i18n/en_US.json +++ b/js/src/i18n/en_US.json @@ -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 upcoming events": "Your upcoming events", "Last published events": "Last published events", - "On {instance}": "On {instance}", "Events nearby": "Events nearby", "Within {number} kilometers of {place}": "|Within one kilometer of {place}|Within {number} kilometers of {place}", "@{username}": "@{username}", @@ -1047,5 +1046,12 @@ "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.", "{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" } diff --git a/js/src/i18n/fr_FR.json b/js/src/i18n/fr_FR.json index 2215a30c7..f9f94422c 100644 --- a/js/src/i18n/fr_FR.json +++ b/js/src/i18n/fr_FR.json @@ -561,7 +561,6 @@ "On {date} ending at {endTime}": "Le {date}, se terminant à {endTime}", "On {date} from {startTime} to {endTime}": "Le {date} de {startTime} à {endTime}", "On {date} starting at {startTime}": "Le {date} à partir de {startTime}", - "On {instance}": "Sur {instance}", "Ongoing tasks": "Tâches en cours", "Only accessible through link": "Accessible uniquement par le lien", "Only accessible through link (private)": "Uniquement accessible par lien (privé)", @@ -1138,5 +1137,12 @@ "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.", "{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" } diff --git a/js/src/registerServiceWorker.ts b/js/src/registerServiceWorker.ts index 141c1daa4..ee0de1d9b 100644 --- a/js/src/registerServiceWorker.ts +++ b/js/src/registerServiceWorker.ts @@ -5,25 +5,27 @@ import { register } from "register-service-worker"; if ("serviceWorker" in navigator && isProduction()) { register(`${process.env.BASE_URL}service-worker.js`, { ready() { - console.log( + console.debug( "App is being served from cache by a service worker.\n" + "For more details, visit https://goo.gl/AFskqB" ); }, registered() { - console.log("Service worker has been registered."); + console.debug("Service worker has been registered."); }, cached() { - console.log("Content has been cached for offline use."); + console.debug("Content has been cached for offline use."); }, updatefound() { - console.log("New content is downloading."); + console.debug("New content is downloading."); }, - updated() { - console.log("New content is available; please refresh."); + updated(registration: ServiceWorkerRegistration) { + const event = new CustomEvent("refreshApp", { detail: registration }); + document.dispatchEvent(event); + console.debug("New content is available; please refresh."); }, offline() { - console.log( + console.debug( "No internet connection found. App is running in offline mode." ); }, @@ -34,6 +36,5 @@ if ("serviceWorker" in navigator && isProduction()) { } function isProduction(): boolean { - return true; - // return process.env.NODE_ENV === "production"; + return process.env.NODE_ENV === "production"; } diff --git a/js/src/service-worker.ts b/js/src/service-worker.ts index 7ff855658..af230659d 100644 --- a/js/src/service-worker.ts +++ b/js/src/service-worker.ts @@ -42,10 +42,11 @@ registerRoute( // Cache CSS, JS, and Web Worker requests with a Stale While Revalidate strategy 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.destination === "style" || request.destination === "script" || + request.destination === "font" || request.destination === "worker", // Use a Stale While Revalidate caching strategy new StaleWhileRevalidate({ @@ -82,6 +83,24 @@ registerRoute( }) ); +async function isClientFocused(): Promise { + 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) => { if (!event.data) return; 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) { @@ -111,6 +138,7 @@ self.addEventListener("notificationclick", function (event: NotificationEvent) { (async () => { const clientList = await self.clients.matchAll({ type: "window", + includeUncontrolled: true, }); for (let i = 0; i < clientList.length; i++) { 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 }) + ) + ); + } +}); diff --git a/js/src/variables.scss b/js/src/variables.scss index 18f916fc2..02942a8c1 100644 --- a/js/src/variables.scss +++ b/js/src/variables.scss @@ -128,10 +128,6 @@ $subtitle-size: 32px; $subtitle-sub-size: 30px; $subtitle-sup-size: 15px; -.title { - margin: 30px auto 45px; -} - .subtitle { background: $secondary; display: inline; diff --git a/js/src/views/Home.vue b/js/src/views/Home.vue index 38337dd88..47a7aaf6d 100644 --- a/js/src/views/Home.vue +++ b/js/src/views/Home.vue @@ -52,11 +52,13 @@ v-if="config && (!currentUser.id || !currentActor.id)" >
-

+

{{ $t("Last published events") }}

- {{ $t("On {instance}", { instance: config.name }) }} + + {{ config.name }} +

@@ -176,7 +178,7 @@ class="container section" v-if="config && loggedUser && loggedUser.settings" > -
+
{{ $t("Welcome back {username}!", { username: currentActor.displayName(), @@ -189,34 +191,33 @@ }}
-
-

{{ $t("Your upcoming events") }}

+
+

{{ $t("Your upcoming events") }}

- - - {{ + {{ $tc("You have one event today.", row[1].length, { count: row[1].length, }) - }} - {{ + }} + {{ $tc("You have one event tomorrow.", row[1].length, { count: row[1].length, }) - }} - + }} + {{ $tc("You have one event in {days} days.", row[1].length, { count: row[1].length, days: calculateDiffDays(row[0]), }) }} - - + +

+
-

{{ $t("Last week") }}

+

{{ $t("Last week") }}

+
-

+

{{ $t("Events nearby") }}

@@ -289,11 +298,13 @@ " />

-

+

{{ $t("Last published events") }}

- {{ $t("On {instance}", { instance: config.name }) }} + + {{ config.name }} +

@@ -629,20 +640,16 @@ main > div > .container { .date-component-container { display: flex; align-items: center; - margin: 1.5rem auto; + margin: 0.5rem auto 1rem; h3.subtitle { margin-left: 7px; } } -section.container { - margin: auto auto 3rem; -} - span.view-all { display: block; - margin-top: 2rem; + margin-top: 1rem; text-align: right; a { @@ -688,8 +695,8 @@ section.hero { } #recent_events { - padding: 1rem 0; - min-height: calc(100vh - 400px); + padding: 0; + min-height: 20vh; z-index: 10; .title { @@ -697,7 +704,7 @@ section.hero { } .columns { - margin: 0rem auto 3rem; + margin: 0 auto; } } @@ -761,4 +768,11 @@ section.hero { .clickable { cursor: pointer; } + +.title { + font-size: 27px; + &:not(:last-child) { + margin-bottom: 0.5rem; + } +} diff --git a/js/src/vue-apollo.ts b/js/src/vue-apollo.ts index b1dd2e8de..6ae0ee0a6 100644 --- a/js/src/vue-apollo.ts +++ b/js/src/vue-apollo.ts @@ -26,6 +26,7 @@ import { typePolicies, refreshAccessToken, } from "./apollo/utils"; +import { GraphQLError } from "graphql"; // Install the vue plugin Vue.use(VueApollo); @@ -120,10 +121,14 @@ const errorLink = onError( } if (graphQLErrors) { - graphQLErrors.map(({ message, locations, path }) => - console.log( - `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}` - ) + graphQLErrors.map( + (graphQLError: GraphQLError & { status_code?: number }) => { + if (graphQLError?.status_code !== 401) { + console.log( + `[GraphQL error]: Message: ${graphQLError.message}, Location: ${graphQLError.locations}, Path: ${graphQLError.path}` + ); + } + } ); } diff --git a/js/yarn.lock b/js/yarn.lock index de743ce7b..7ca5dba01 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -1483,10 +1483,10 @@ ejs "^2.6.1" magic-string "^0.25.0" -"@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.83": - version "2.0.0-beta.83" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.83.tgz#29bfd96591651469ec4d22dfb1bbaba8d74877ce" - integrity sha512-F6nvNQHoCQhkmKxuU1d6HFXi3L1lTyWsN4Sbgn8mr8HTK2HhdMPkkMdwk4pOIFvaNVjWBpe4/tH/8YAUjI7JbA== +"@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.84": + version "2.0.0-beta.84" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.84.tgz#71d4f6b1d3c9ba44da7a285950b8b56c7fbd6866" + integrity sha512-wf3qax8/sstXSBsCxnxNCccuKH2vfzz+sozMjaFDvZDjlvItKeYHZ9jVnK9Cv3zuFfCVajJ9zt4+qdcjXB+q2A== dependencies: "@types/prosemirror-commands" "^1.0.4" "@types/prosemirror-inputrules" "^1.0.4" @@ -1499,7 +1499,7 @@ prosemirror-commands "^1.1.9" prosemirror-inputrules "^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-state "^1.3.4" prosemirror-transform "^1.3.2" @@ -1630,11 +1630,11 @@ integrity sha512-5nvrCvcV35J6WjLd8xQCQWnj2HIDsfTalr0D57jMwym3ZCIEvLwf23DQQ1nNsOHhopmS/Emixh+RQpXUZjH8lQ== "@tiptap/extension-mention@^2.0.0-beta.42": - version "2.0.0-beta.59" - resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.59.tgz#5fde39a68c1c3c8c896fa28b9dfa4b8448ec340a" - integrity sha512-qwIc/KBjS0/8ZHoV7WJaKSU8VRtX+GDdIksvrPaw+C2k2l7E7KWyi7SxYtu1+cFP27Ob1pCWiwD5Yv/x/wVEVg== + version "2.0.0-beta.60" + resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.60.tgz#9b062b45c22bc659cde7ae5ac9b612cce1fc9678" + integrity sha512-Tk7HbQ21R9cH/Je74mbgeLNkQn97j9G8+oblXY/B2RWawhUMVqlSDM8YogCzU6e6PKJ+mww5o9rta7Npw0jjVw== 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": version "2.0.0-beta.14" @@ -1664,11 +1664,11 @@ integrity sha512-xrdNYXBuDaiKBByAuJ8Z9g+1w4I1pp8Id6ZbhxnljiTIwtX6SD/Pp4z/4dKhXNSpHvipyaFEXY0CVpxzbSEk5w== "@tiptap/starter-kit@^2.0.0-beta.37": - version "2.0.0-beta.79" - resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.79.tgz#4c8fdccefe3e4b1dcb6576280c1cfb2320673a71" - integrity sha512-Te0+SkrwgOYl8/fxb+2zBzzBsqtAftYipvMtNOzi94khQEWC7bZs1voJWpmVRZX6dG0vQBpZxVL0wVsFLQTAkg== + version "2.0.0-beta.80" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.80.tgz#eaa3a683b59c5f8805c82d00af4f4c4eadeadbdb" + integrity sha512-ly4LFofIfkmbJh/EemAZM1s5GXBLju7+WER8UiHFAyRJ7ktl0Q/l2lny35JcK5fWHWR8W1mH50HOCgR0GkIrxw== 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-bold" "^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-text" "^2.0.0-beta.12" -"@tiptap/suggestion@^2.0.0-beta.57": - version "2.0.0-beta.57" - resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.57.tgz#7da90521098a323bfc55ad380a06599a566d027f" - integrity sha512-dZKwo7zGTCV1wH5M5k/ZhDIIs1cJgxK48scddxu/Ine6ZlGCQyFdUYFkhhiS8eC5Z4Mkgixogr60AfJ/g+Tu1Q== +"@tiptap/suggestion@^2.0.0-beta.58": + version "2.0.0-beta.58" + resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.58.tgz#a199fa20fabab24f019ffc569e13a11fcf417feb" + integrity sha512-Z8DUiFPPAJ33gN63ZmypSdCtfu1p41xQf36wJiWzGB/s9GaV1dw/lWC+hf0gU7PCN8RW3+SAtAQz8xO2Y/fCHg== dependencies: - prosemirror-model "^1.14.1" + prosemirror-model "^1.14.2" prosemirror-state "^1.3.4" prosemirror-view "^1.18.7" @@ -1936,9 +1936,9 @@ integrity sha512-6nlq2eEh75JegDGUXis9wGTYIJpUvbori4qx++PRKQsV3YRkaqUNPNykzphniqPSZADXCouBuAnyptjUkMkhvw== "@types/node@*": - version "15.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" - integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== + version "15.12.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.3.tgz#2817bf5f25bc82f56579018c53f7d41b1830b1af" + integrity sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ== "@types/node@^14.14.31": version "14.17.3" @@ -2113,13 +2113,6 @@ dependencies: 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": version "3.11.4" 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" babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" - integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" + integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== dependencies: "@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: version "0.2.2" @@ -3658,9 +3651,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001230: - version "1.0.30001237" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz#4b7783661515b8e7151fc6376cfd97f0e427b9e5" - integrity sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw== + version "1.0.30001238" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001238.tgz#e6a8b45455c5de601718736d0242feef0ecdda15" + integrity sha512-bZGam2MxEt7YNsa2VwshqWQMwrYs5tR5WZQRYSuFxsBQunWjBuXhN4cS9nV5FFb1Z9y+DoQcQ0COyQbv6A+CKw== capture-exit@^2.0.0: version "2.0.0" @@ -4112,7 +4105,7 @@ copy-webpack-plugin@^8.0.0: schema-utils "^3.0.0" 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" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== @@ -5839,9 +5832,9 @@ globals@^13.6.0, globals@^13.9.0: type-fest "^0.20.2" globby@^11.0.2, globby@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -8923,9 +8916,9 @@ postcss@^7.0.36: supports-color "^6.1.0" postcss@^8.2.15, postcss@^8.2.6, postcss@^8.2.9: - version "8.3.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.4.tgz#41ece1c43f2f7c74dc7d90144047ce052757b822" - integrity sha512-/tZY0PXExXXnNhKv3TOvZAOUYRyuqcCbBm2c17YMDK0PlVII3K7/LKdt3ScHL+hhouddjUWi+1sKDf9xXW+8YA== + version "8.3.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.5.tgz#982216b113412bc20a86289e91eb994952a5b709" + integrity sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA== dependencies: colorette "^1.2.2" nanoid "^3.1.23" @@ -9106,7 +9099,7 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.3: prosemirror-state "^1.0.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" resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.2.tgz#4e8c39cfff4e097631af4495e125d9a8a9773116" integrity sha512-TwkACyEiSi8FJiRhg2ffbzmQRy5DR+aTwAr7trNQNZL24HJR8ouxy4qCkG99PnWK0xZ0AjSMtPXSU6hnxAiP7Q== @@ -9594,9 +9587,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.52.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.52.0.tgz#9df3de6028fae79569a985942b81110205a5a411" - integrity sha512-lSkBDGsVoXjqaBf7dsHwxBJz+p+hJEP72P+LOitA0yVs+Nzxj76FidkZE2thrmhjwGqLYiJo39opi7mAfaQ/Vg== + version "2.52.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.52.1.tgz#dd1cc178d70cf35c48d943fc06fdc32d546e6876" + integrity sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w== optionalDependencies: fsevents "~2.3.2" @@ -10638,9 +10631,9 @@ ts-invariant@^0.4.0: tslib "^1.9.3" ts-invariant@^0.7.0: - version "0.7.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.3.tgz#13aae22a4a165393aaf5cecdee45ef4128d358b8" - integrity sha512-UWDDeovyUTIMWj+45g5nhnl+8oo+GhxL5leTaHn5c8FkQWfh8v66gccLd2/YzVmV5hoQUjCEjhrXnQqVDJdvKA== + version "0.7.5" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.7.5.tgz#f9658719f9a7737b117d09820d952aacf6263f9c" + integrity sha512-qfVyqTYWEqADMtncLqwpUdMjMSXnsqOeqGtj1LeJNFDjz8oqZ1YxLEp29YCOq65z0LgEiERqQ8ThVjnfibJNpg== dependencies: tslib "^2.1.0" @@ -10770,14 +10763,14 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^3.9.3: - version "3.9.9" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" - integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== typescript@~4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" - integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== + version "4.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.6.tgz#1becd85d77567c3c741172339e93ce2e69932138" + integrity sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow== unbox-primitive@^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" integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== -vuedraggable@*, vuedraggable@^2.24.3: +vuedraggable@^2.24.3: version "2.24.3" resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19" integrity sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g== @@ -11322,9 +11315,9 @@ webpack-virtual-modules@^0.4.2: integrity sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw== webpack@^5.22.0: - version "5.39.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.0.tgz#37d6899f1f40c31d5901abc0f39bc8cc7224138c" - integrity sha512-25CHmuDj+oOTyteI13sUqNlCnjCnySuhiKWE/cRYPQYeoQ3ijHgyWX27CiyUKLNGq27v8S0mrksyTreT/xo7pg== + version "5.39.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.39.1.tgz#d1e014b6d71e1aef385316ad528f21cd5b1f9784" + integrity sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.47" @@ -11651,9 +11644,9 @@ ws@^6.2.1: async-limiter "~1.0.0" ws@^7.3.1, ws@^7.4.5: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + version "7.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691" + integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw== xml-name-validator@^3.0.0: version "3.0.0"