From 3570ca7d71e969de077098607b0269966a68166d Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Thu, 1 Jun 2023 12:08:43 +0100 Subject: [PATCH 01/23] refactor: use keycloak-js instead of @nuxtjs/auth --- package-lock.json | 15 +++++ packages/portal/nuxt.config.js | 62 +++---------------- packages/portal/package.json | 1 + .../portal/src/components/PageNavigation.vue | 3 +- .../src/components/account/UserSets.vue | 2 +- .../portal/src/components/item/ItemHero.vue | 4 +- .../src/components/set/AddItemToSetModal.vue | 2 +- packages/portal/src/layouts/default.vue | 17 ++--- packages/portal/src/middleware/l10n.js | 4 +- packages/portal/src/mixins/keycloak.js | 15 +++-- .../portal/src/pages/account/callback.vue | 6 +- packages/portal/src/pages/account/index.vue | 6 +- packages/portal/src/pages/account/logout.vue | 22 ++++--- .../portal/src/pages/collections/_type/_.vue | 4 +- packages/portal/src/pages/galleries/_.vue | 6 +- packages/portal/src/plugins/authScheme.js | 37 ----------- .../portal/src/plugins/europeana/utils.js | 17 +++-- .../portal/src/plugins/keycloak.client.js | 43 +++++++++++++ packages/portal/src/store/auth.js | 28 +++++++++ 19 files changed, 162 insertions(+), 132 deletions(-) delete mode 100644 packages/portal/src/plugins/authScheme.js create mode 100644 packages/portal/src/plugins/keycloak.client.js create mode 100644 packages/portal/src/store/auth.js diff --git a/package-lock.json b/package-lock.json index cfaf0e7f5f..0593614e9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22442,6 +22442,11 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -22839,6 +22844,15 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keycloak-js": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-21.1.1.tgz", + "integrity": "sha512-Viyhf0SOpu2jM/A33vpigSCFLo8l4yg8lqzaGyxXoZ3nGO9lo68B2LwJBDtgpzqDUh8DK//yCOzdWuR2CT4keA==", + "dependencies": { + "base64-js": "^1.5.1", + "js-sha256": "^0.9.0" + } + }, "node_modules/keyv": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", @@ -41016,6 +41030,7 @@ "elastic-apm-node": "^3.24.0", "express": "^4.17.1", "http-errors": "^2.0.0", + "keycloak-js": "^21.1.1", "lodash": "^4.17.21", "marked": "^4.0.10", "md5": "^2.3.0", diff --git a/packages/portal/nuxt.config.js b/packages/portal/nuxt.config.js index 7e43945c45..977c64da70 100644 --- a/packages/portal/nuxt.config.js +++ b/packages/portal/nuxt.config.js @@ -42,20 +42,6 @@ export default { translateLocales: (process.env.APP_SEARCH_TRANSLATE_LOCALES || '').split(',') } }, - auth: { - strategies: { - keycloak: { - client_id: process.env.OAUTH_CLIENT, - origin: process.env.OAUTH_ORIGIN || 'https://auth.europeana.eu', - scope: (process.env.OAUTH_SCOPE || 'openid,profile,email,usersets').split(','), - realm: process.env.OAUTH_REALM || 'europeana', - response_type: process.env.OAUTH_RESPONSE_TYPE || 'code', - access_type: process.env.OAUTH_ACCESS_TYPE || 'online', - grant_type: process.env.OAUTH_GRANT_TYPE || 'authorization_code', - token_type: process.env.OAUTH_TOKEN_TYPE || 'Bearer' - } - } - }, axios: { baseURL: process.env.PORTAL_BASE_URL }, @@ -93,6 +79,11 @@ export default { id: process.env.HOTJAR_ID, sv: process.env.HOTJAR_SNIPPET_VERSION }, + keycloak: { + clientId: process.env.KEYCLOAK_CLIENT_ID, + realm: process.env.KEYCLOAK_REALM, + url: process.env.KEYCLOAK_URL + }, matomo: { host: process.env.MATOMO_HOST, siteId: process.env.MATOMO_SITE_ID, @@ -100,16 +91,6 @@ export default { delay: process.env.MATOMO_LOAD_WAIT_DELAY, retries: process.env.MATOMO_LOAD_WAIT_RETRIES } - }, - oauth: { - origin: process.env.OAUTH_ORIGIN, - realm: process.env.OAUTH_REALM, - client: process.env.OAUTH_CLIENT, - scope: process.env.OAUTH_SCOPE, - responseType: process.env.OAUTH_RESPONSE_TYPE, - accessType: process.env.OAUTH_ACCESS_TYPE, - grantType: process.env.OAUTH_GRANT_TYPE, - tokenType: process.env.OAUTH_TOKEN_TYPE } }, @@ -250,6 +231,9 @@ export default { '~/plugins/vue-matomo.client', '~/plugins/i18n/iso-locale', '~/plugins/hotjar.client', + '~/plugins/keycloak.client', + '~/plugins/apis', + '~/plugins/user-likes.client', '~/plugins/error', '~/plugins/link', '~/plugins/axios.server', @@ -266,8 +250,7 @@ export default { '~/modules/contentful', '~/modules/axios-logger', '~/modules/query-sanitiser', - '@nuxtjs/axios', - '@nuxtjs/auth' + '@nuxtjs/axios' ], /* @@ -293,6 +276,7 @@ export default { parsePages: false, pages: { 'account/callback': false, + 'account/login': false, 'account/logout': false }, // Enable browser language detection to automatically redirect user @@ -309,32 +293,6 @@ export default { }] ], - auth: { - // Redirect routes: 'callback' option for keycloak redirects, - // 'login' option for unauthorised redirection - // 'home' option for redirection after login - // no redirect on logout - redirect: { - login: '/account/login', - logout: false, - callback: '/account/callback', - home: '/account' - }, - fullPathRedirect: true, - strategies: { - local: false, - // Include oauth2 so that ~/plugins/authScheme can extend it - _oauth2: { - _scheme: 'oauth2' - }, - keycloak: { - _scheme: '~/plugins/authScheme' - } - }, - defaultStrategy: 'keycloak', - plugins: ['~/plugins/apis', '~/plugins/user-likes.client'] - }, - axios: { proxyHeadersIgnore: [ // module defaults diff --git a/packages/portal/package.json b/packages/portal/package.json index c28260bd55..cbb456f95c 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -40,6 +40,7 @@ "elastic-apm-node": "^3.24.0", "express": "^4.17.1", "http-errors": "^2.0.0", + "keycloak-js": "^21.1.1", "lodash": "^4.17.21", "marked": "^4.0.10", "md5": "^2.3.0", diff --git a/packages/portal/src/components/PageNavigation.vue b/packages/portal/src/components/PageNavigation.vue index f6792f85ca..89239068ec 100644 --- a/packages/portal/src/components/PageNavigation.vue +++ b/packages/portal/src/components/PageNavigation.vue @@ -67,8 +67,7 @@ v-b-toggle.menu data-qa="log in button" class="nav-link" - :href="localePath({ name: 'account-login', query: { redirect: $route.fullPath } })" - @click.prevent="keycloakLogin" + @click="keycloakLogin" > diff --git a/packages/portal/src/components/account/UserSets.vue b/packages/portal/src/components/account/UserSets.vue index 9c131b0431..8e8a1479c1 100644 --- a/packages/portal/src/components/account/UserSets.vue +++ b/packages/portal/src/components/account/UserSets.vue @@ -144,7 +144,7 @@ }, computed: { userId() { - return this.$auth.user?.sub; + return this.$store.state.auth.profile?.id; }, userField() { return this.type === 'EntityBestItemsSet' ? 'contributor' : 'creator'; diff --git a/packages/portal/src/components/item/ItemHero.vue b/packages/portal/src/components/item/ItemHero.vue index d7c5cc4255..032430da09 100644 --- a/packages/portal/src/components/item/ItemHero.vue +++ b/packages/portal/src/components/item/ItemHero.vue @@ -192,10 +192,10 @@ return this.userIsEntitiesEditor && this.userIsSetsEditor && this.entities.length > 0; }, userIsEntitiesEditor() { - return this.$auth.userHasClientRole('entities', 'editor'); + return this.$store.getters['auth/userHasClientRole']('entities', 'editor'); }, userIsSetsEditor() { - return this.$auth.userHasClientRole('usersets', 'editor'); + return this.$store.getters['auth/userHasClientRole']('usersets', 'editor'); }, showTranscribathonLink() { return this.$features.transcribathonCta && this.linkForContributingAnnotation && RegExp(TRANSCRIBATHON_URL_ROOT).test(this.linkForContributingAnnotation); diff --git a/packages/portal/src/components/set/AddItemToSetModal.vue b/packages/portal/src/components/set/AddItemToSetModal.vue index 84fce9fa5f..7cf298eedf 100644 --- a/packages/portal/src/components/set/AddItemToSetModal.vue +++ b/packages/portal/src/components/set/AddItemToSetModal.vue @@ -99,7 +99,7 @@ methods: { async fetchCollections() { - const creator = this.$auth.user?.sub; + const creator = this.$store.state.auth.profile?.id; // TODO: pagination and/or search within one's collections const searchParams = { query: `creator:${creator}`, diff --git a/packages/portal/src/layouts/default.vue b/packages/portal/src/layouts/default.vue index b9042dcf51..6f46c07d94 100644 --- a/packages/portal/src/layouts/default.vue +++ b/packages/portal/src/layouts/default.vue @@ -168,6 +168,7 @@ }, mounted() { + console.log('this.$keycloak', this.$keycloak); if (!this.klaro) { this.klaro = window.klaro; } @@ -177,14 +178,14 @@ const renderKlaroAfter = this.$waitForMatomo ? this.$waitForMatomo() : Promise.resolve(); renderKlaroAfter.catch(() => {}).finally(this.renderKlaro); - if (this.$auth.$storage.getUniversal('portalLoggingIn') && this.$auth.loggedIn) { - this.makeToast(this.$t('account.notifications.loggedIn')); - this.$auth.$storage.removeUniversal('portalLoggingIn'); - } - if (this.$auth.$storage.getUniversal('portalLoggingOut') && !this.$auth.loggedIn) { - this.makeToast(this.$t('account.notifications.loggedOut')); - this.$auth.$storage.removeUniversal('portalLoggingOut'); - } + // if (this.$auth.$storage.getUniversal('portalLoggingIn') && this.$auth.loggedIn) { + // this.makeToast(this.$t('account.notifications.loggedIn')); + // this.$auth.$storage.removeUniversal('portalLoggingIn'); + // } + // if (this.$auth.$storage.getUniversal('portalLoggingOut') && !this.$auth.loggedIn) { + // this.makeToast(this.$t('account.notifications.loggedOut')); + // this.$auth.$storage.removeUniversal('portalLoggingOut'); + // } }, methods: { diff --git a/packages/portal/src/middleware/l10n.js b/packages/portal/src/middleware/l10n.js index 948bba73b1..123cecc1a2 100644 --- a/packages/portal/src/middleware/l10n.js +++ b/packages/portal/src/middleware/l10n.js @@ -25,8 +25,8 @@ const localiseRoute = ({ route, req, redirect, app }) => { export default ({ app, route, redirect, req }) => { // Exit early if this is an auth callback - if (app.$auth && [ - app.$auth.options.redirect.callback, + if ([ + '/account/login', '/account/logout' ].includes(route.path)) { return; diff --git a/packages/portal/src/mixins/keycloak.js b/packages/portal/src/mixins/keycloak.js index d004321d53..7e3674f6ea 100644 --- a/packages/portal/src/mixins/keycloak.js +++ b/packages/portal/src/mixins/keycloak.js @@ -18,10 +18,10 @@ export default { keycloakAccountUrl() { const keycloakAccountUrl = new URL( - `/auth/realms/${this.$auth.strategy.options.realm}/account`, this.$auth.strategy.options.origin + `/realms/${this.$config.keycloak.realm}/account`, this.$config.keycloak.url ); keycloakAccountUrl.search = new URLSearchParams({ - referrer: this.$auth.strategy.options.client_id, + referrer: this.$config.keycloak.clientId, 'referrer_uri': this.$config.app.baseUrl }).toString(); return keycloakAccountUrl.toString(); @@ -30,9 +30,14 @@ export default { methods: { keycloakLogin() { - this.$auth.$storage.setUniversal('redirect', this.keycloakLoginRedirect); - this.$auth.$storage.setUniversal('portalLoggingIn', true); - this.$auth.loginWith('keycloak', { params: { 'ui_locales': this.$i18n.locale } }); + console.log('this.$keycloak', this.$keycloak); + this.$keycloak?.login({ + locale: this.$i18n.locale, + redirectUri: `${window.location.origin}${this.keycloakLoginRedirect}` + }); + // this.$auth.$storage.setUniversal('redirect', this.keycloakLoginRedirect); + // this.$auth.$storage.setUniversal('portalLoggingIn', true); + // this.$auth.loginWith('keycloak', { params: { 'ui_locales': this.$i18n.locale } }); } } }; diff --git a/packages/portal/src/pages/account/callback.vue b/packages/portal/src/pages/account/callback.vue index 111ecd5be0..c21ab50e62 100644 --- a/packages/portal/src/pages/account/callback.vue +++ b/packages/portal/src/pages/account/callback.vue @@ -6,6 +6,10 @@ export default { name: 'AccountCallbackPage', auth: false, - layout: 'minimal' + layout: 'minimal', + mounted() { + this.$store.commit('auth/setLoggedIn', this.$keycloak.authenticated); + this.$router.push('/'); + } }; diff --git a/packages/portal/src/pages/account/index.vue b/packages/portal/src/pages/account/index.vue index 56d561d5b0..a3423a8a5d 100644 --- a/packages/portal/src/pages/account/index.vue +++ b/packages/portal/src/pages/account/index.vue @@ -180,7 +180,7 @@ pageMetaMixin ], - middleware: 'auth', + // middleware: 'auth', data() { return { @@ -208,8 +208,8 @@ }; }, userIsEditor() { - return this.$auth.userHasClientRole('entities', 'editor') && - this.$auth.userHasClientRole('usersets', 'editor'); + return this.$store.getters['auth/userHasClientRole']('entities', 'editor') && + this.$store.getters['auth/userHasClientRole']('usersets', 'editor'); }, ...mapState({ likesId: state => state.set.likesId, diff --git a/packages/portal/src/pages/account/logout.vue b/packages/portal/src/pages/account/logout.vue index f68e5daa0a..956473b783 100644 --- a/packages/portal/src/pages/account/logout.vue +++ b/packages/portal/src/pages/account/logout.vue @@ -9,24 +9,28 @@ beforeRouteEnter(to, from, next) { next(vm => { const redirectPath = /^account___[a-z]{2}$/.test(from.name) ? `/${vm.$i18n.locale}` : from.fullPath; - vm.$auth.$storage.setUniversal('redirect', redirectPath); + // vm.$auth.$storage.setUniversal('redirect', redirectPath); }); }, layout: 'minimal', created() { - this.$auth.$storage.setUniversal('portalLoggingOut', true); + // this.$auth.$storage.setUniversal('portalLoggingOut', true); }, mounted() { - this.$auth.logout({ params: { 'ui_locales': this.$i18n.locale } }); - localStorage.setItem('logout-event', `logout-${Math.random()}`); - - const path = this.$auth.strategies.keycloak.options.end_session_endpoint; - const redirect = window.location.origin + this.$auth.$storage.getUniversal('redirect'); - - window.location.assign(`${path}?redirect_uri=${encodeURIComponent(redirect)}`); + this.$keycloak.logout({ + redirectUri: window.location.origin + '/', + ui_locales: this.$i18n.locale + }); + // this.$auth.logout({ params: { 'ui_locales': this.$i18n.locale } }); + // localStorage.setItem('logout-event', `logout-${Math.random()}`); + // + // const path = this.$auth.strategies.keycloak.options.end_session_endpoint; + // const redirect = window.location.origin + this.$auth.$storage.getUniversal('redirect'); + // + // window.location.assign(`${path}?redirect_uri=${encodeURIComponent(redirect)}`); } }; diff --git a/packages/portal/src/pages/collections/_type/_.vue b/packages/portal/src/pages/collections/_type/_.vue index bad31fb0c8..cca2f49eb3 100644 --- a/packages/portal/src/pages/collections/_type/_.vue +++ b/packages/portal/src/pages/collections/_type/_.vue @@ -229,10 +229,10 @@ ['topic', 'organisation'].includes(this.collectionType); }, userIsEntitiesEditor() { - return this.$auth.userHasClientRole('entities', 'editor'); + return this.$store.getters['auth/userHasClientRole']('entities', 'editor'); }, userIsSetsEditor() { - return this.$auth.userHasClientRole('usersets', 'editor'); + return this.$store.getters['auth/userHasClientRole']('usersets', 'editor'); }, route() { return { diff --git a/packages/portal/src/pages/galleries/_.vue b/packages/portal/src/pages/galleries/_.vue index abbb508583..19f48d15dc 100644 --- a/packages/portal/src/pages/galleries/_.vue +++ b/packages/portal/src/pages/galleries/_.vue @@ -276,11 +276,11 @@ this.setCreatorId?.endsWith(`/${this.$auth.user.sub}`); }, userIsEntityEditor() { - return this.$auth.userHasClientRole('entities', 'editor') && - this.$auth.userHasClientRole('usersets', 'editor'); + return this.$store.getters['auth/userHasClientRole']('entities', 'editor') && + this.$store.getters['auth/userHasClientRole']('usersets', 'editor'); }, userIsPublisher() { - return this.$auth.userHasClientRole('usersets', 'publisher'); + return this.$store.getters['auth/userHasClientRole']('usersets', 'publisher'); }, userCanHandleRecommendations() { return this.userIsOwner || (this.setIsEntityBestItems && this.userIsEntityEditor); diff --git a/packages/portal/src/plugins/authScheme.js b/packages/portal/src/plugins/authScheme.js deleted file mode 100644 index 8a4f68be67..0000000000 --- a/packages/portal/src/plugins/authScheme.js +++ /dev/null @@ -1,37 +0,0 @@ -// Custom Nuxt auth scheme extending oAuth2 scheme to support Nuxt runtime config - -// TODO: delete once auth module supports Nuxt runtime config -// @see https://github.com/nuxt-community/auth-module/issues/713 - -// When Nuxt is built, this custom auth plugin will end up in .nuxt/auth/schemes, -// as will @nuxtjs/auth/lib/schemes/oauth2.js if it's also a registered strategy -// in the auth module config (in nuxt.config.js). -import Oauth2Scheme from './oauth2'; - -const keycloakOpenIDConnectEndpoint = (method, { realm, origin }) => - `${origin}/auth/realms/${realm}/protocol/openid-connect/${method}`; - -export function userHasClientRole(client, role) { - return this.user?.resource_access?.[client]?.roles?.includes(role) || false; -} - -// Inspired by https://github.com/nuxt-community/auth-module/issues/713#issuecomment-724031930 -export default class RuntimeConfigurableOauth2Scheme extends Oauth2Scheme { - constructor($auth, options) { - const configOptions = { - ...options, - ...$auth.ctx?.$config?.auth?.strategies[options['_name']] - }; - - configOptions['authorization_endpoint'] = keycloakOpenIDConnectEndpoint('auth', configOptions); - configOptions['access_token_endpoint'] = keycloakOpenIDConnectEndpoint('token', configOptions); - configOptions['userinfo_endpoint'] = keycloakOpenIDConnectEndpoint('userinfo', configOptions); - configOptions['end_session_endpoint'] = keycloakOpenIDConnectEndpoint('logout', configOptions); - - if (typeof $auth.userHasClientRole !== 'function') { - $auth.userHasClientRole = userHasClientRole; - } - - super($auth, configOptions); - } -} diff --git a/packages/portal/src/plugins/europeana/utils.js b/packages/portal/src/plugins/europeana/utils.js index ec8e71c129..fa4f00f793 100644 --- a/packages/portal/src/plugins/europeana/utils.js +++ b/packages/portal/src/plugins/europeana/utils.js @@ -2,7 +2,7 @@ import axios from 'axios'; import qs from 'qs'; import locales from '../i18n/locales.js'; -import { keycloakResponseErrorHandler } from './auth.js'; +// import { keycloakResponseErrorHandler } from './auth.js'; export const createAxios = ({ id, baseURL, $axios } = {}, context = {}) => { const axiosOptions = axiosInstanceOptions({ id, baseURL }, context); @@ -20,9 +20,18 @@ export const createAxios = ({ id, baseURL, $axios } = {}, context = {}) => { export const createKeycloakAuthAxios = ({ id, baseURL, $axios }, context) => { const axiosInstance = createAxios({ id, baseURL, $axios }, context); - if (typeof axiosInstance.onResponseError === 'function') { - axiosInstance.onResponseError(error => keycloakResponseErrorHandler(context, error)); - } + axiosInstance.interceptors.request.use((requestConfig) => { + console.log('req interceptor', context.$keycloak); + if (context.$keycloak?.token) { + console.log('adding auth header'); + requestConfig.headers.authorization = `Bearer ${context.$keycloak.token}`; + } + return requestConfig; + }); + + // if (typeof axiosInstance.onResponseError === 'function') { + // axiosInstance.onResponseError(error => keycloakResponseErrorHandler(context, error)); + // } return axiosInstance; }; diff --git a/packages/portal/src/plugins/keycloak.client.js b/packages/portal/src/plugins/keycloak.client.js new file mode 100644 index 0000000000..8e0b1afd4a --- /dev/null +++ b/packages/portal/src/plugins/keycloak.client.js @@ -0,0 +1,43 @@ +import Keycloak from 'keycloak-js'; + +export default async(ctx, inject) => { + const config = ctx.$config.keycloak; + + const keycloak = new Keycloak(config); + + try { + await keycloak.init({ + checkLoginIframe: false, + token: localStorage.getItem('kc.token'), + idToken: localStorage.getItem('kc.idToken'), + refreshToken: localStorage.getItem('kc.refreshToken') + }); + // if (keycloak.authenticated) { + // keycloak.login(); + // } + } catch (e) { + localStorage.removeItem('kc.token'); + localStorage.removeItem('kc.idToken'); + localStorage.removeItem('kc.refreshToken'); + await keycloak.init({ + checkLoginIframe: false + }); + } + + console.log('keycloak', keycloak) + + ctx.store.commit('auth/setLoggedIn', keycloak.authenticated); + + // TODO: logout needs to clear these + localStorage.setItem('kc.token', keycloak.token); + localStorage.setItem('kc.idToken', keycloak.idToken); + localStorage.setItem('kc.refreshToken', keycloak.refreshToken); + + if (keycloak.authenticated) { + const profile = await keycloak.loadUserProfile(); + ctx.store.commit('auth/setProfile', profile); + ctx.store.commit('auth/setResourceAccess', keycloak.resourceAccess); + } + + inject('keycloak', keycloak); +}; diff --git a/packages/portal/src/store/auth.js b/packages/portal/src/store/auth.js new file mode 100644 index 0000000000..870b84aabd --- /dev/null +++ b/packages/portal/src/store/auth.js @@ -0,0 +1,28 @@ +export const state = () => ({ + loggedIn: false, + profile: {}, + resourceAccess: {} +}); + +export const mutations = { + setLoggedIn(state, value) { + console.log('setLoggedIn', value); + state.loggedIn = value; + }, + + setProfile(state, value) { + console.log('setProfile', value); + state.profile = value; + }, + + setResourceAccess(state, value) { + console.log('setResourceAccess', value); + state.resourceAccess = value; + } +}; + +export const getters = { + userHasClientRole: (state) => (client, role) => { + return state.resourceAccess[client]?.roles?.includes(role); + } +}; From e86c06bc2d170d96565deecb232c3ddc00fb14ba Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Thu, 1 Jun 2023 12:17:09 +0100 Subject: [PATCH 02/23] chore: remove unused @nuxtjs/auth --- package-lock.json | 95 ------------------------------------ packages/portal/package.json | 1 - 2 files changed, 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0593614e9e..29cc66d633 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7336,21 +7336,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@nuxtjs/auth": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@nuxtjs/auth/-/auth-4.9.1.tgz", - "integrity": "sha512-h5VZanq2+P47jq3t0EnsZv800cg/ufOPC6JqvcyeDFJM99p58jHSODAjDuePo3PrZxd8hovMk7zusU5lOHgjvQ==", - "dependencies": { - "@nuxtjs/axios": "^5.9.5", - "body-parser": "^1.19.0", - "consola": "^2.11.3", - "cookie": "^0.4.0", - "is-https": "^1.0.0", - "js-cookie": "^2.2.1", - "lodash": "^4.17.15", - "nanoid": "^2.1.11" - } - }, "node_modules/@nuxtjs/axios": { "version": "5.13.6", "resolved": "https://registry.npmjs.org/@nuxtjs/axios/-/axios-5.13.6.tgz", @@ -10223,56 +10208,6 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -20108,11 +20043,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-https/-/is-https-1.0.0.tgz", - "integrity": "sha512-1adLLwZT9XEXjzhQhZxd75uxf0l+xI9uTSFaZeSESjL3E1eXSPpO+u5RcgqtzeZ1KCaNvtEwZSTO2P4U5erVqQ==" - }, "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", @@ -22427,11 +22357,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - }, "node_modules/js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -25266,11 +25191,6 @@ "dev": true, "optional": true }, - "node_modules/nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" - }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -29933,20 +29853,6 @@ "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/rc9": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.0.tgz", @@ -41012,7 +40918,6 @@ "@nuxt/cli": "2.16.3", "@nuxt/core": "2.16.3", "@nuxt/vue-app": "2.16.3", - "@nuxtjs/auth": "^4.9.1", "@nuxtjs/axios": "^5.13.6", "@nuxtjs/i18n": "^7.2.0", "@vue-a11y/announcer": "^2.1.0", diff --git a/packages/portal/package.json b/packages/portal/package.json index cbb456f95c..b0613f09b2 100644 --- a/packages/portal/package.json +++ b/packages/portal/package.json @@ -22,7 +22,6 @@ "@nuxt/cli": "2.16.3", "@nuxt/core": "2.16.3", "@nuxt/vue-app": "2.16.3", - "@nuxtjs/auth": "^4.9.1", "@nuxtjs/axios": "^5.13.6", "@nuxtjs/i18n": "^7.2.0", "@vue-a11y/announcer": "^2.1.0", From 1182428ad6c1ba7a475322a70dab526650441a16 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Thu, 1 Jun 2023 14:33:52 +0100 Subject: [PATCH 03/23] refactor: replace $auth with $keycloak; refresh support --- package-lock.json | 1769 ++++++++++------- .../portal/src/components/PageNavigation.vue | 2 +- .../src/components/item/ItemAddButton.vue | 4 +- .../src/components/item/ItemLikeButton.vue | 2 +- .../components/item/ItemRecommendations.vue | 4 +- .../recommendation/RecommendationButtons.vue | 4 +- .../set/SetPublicationRequestWidget.vue | 2 +- packages/portal/src/layouts/default.vue | 4 +- packages/portal/src/pages/account/logout.vue | 3 + packages/portal/src/pages/galleries/_.vue | 6 +- packages/portal/src/plugins/europeana/auth.js | 104 - .../portal/src/plugins/europeana/utils.js | 14 +- packages/portal/src/plugins/keycloak-axios.js | 0 .../portal/src/plugins/keycloak.client.js | 72 +- .../portal/src/plugins/user-likes.client.js | 4 +- packages/portal/src/store/set.js | 2 +- 16 files changed, 1101 insertions(+), 895 deletions(-) delete mode 100644 packages/portal/src/plugins/europeana/auth.js create mode 100644 packages/portal/src/plugins/keycloak-axios.js diff --git a/package-lock.json b/package-lock.json index 29cc66d633..edd7047ad7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,30 +56,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", + "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz", + "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/generator": "^7.22.0", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helpers": "^7.22.0", + "@babel/parser": "^7.22.0", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -95,11 +95,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", + "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -121,24 +121,24 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", + "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", + "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", + "@babel/compat-data": "^7.22.0", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -152,17 +152,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", + "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.22.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", + "@babel/helper-replace-supers": "^7.22.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6", "semver": "^6.3.0" @@ -175,9 +175,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", + "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -192,9 +192,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -209,9 +209,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", + "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", "engines": { "node": ">=6.9.0" } @@ -240,12 +240,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", + "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -264,19 +264,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", + "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-module-imports": "^7.21.4", "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" }, "engines": { "node": ">=6.9.0" @@ -322,17 +322,17 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", + "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-member-expression-to-functions": "^7.22.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" }, "engines": { "node": ">=6.9.0" @@ -414,14 +414,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", + "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -441,9 +441,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", + "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -467,14 +467,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", + "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/plugin-transform-optional-chaining": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -483,24 +483,6 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -517,98 +499,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz", + "integrity": "sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-replace-supers": "^7.22.1", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/plugin-syntax-decorators": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -633,57 +534,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", @@ -803,12 +653,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz", + "integrity": "sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -856,6 +706,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", + "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1012,6 +877,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", @@ -1027,6 +908,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", + "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", @@ -1074,6 +973,39 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", + "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", + "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", @@ -1159,6 +1091,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", + "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", @@ -1175,6 +1123,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", + "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", @@ -1207,6 +1171,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", + "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", @@ -1222,6 +1202,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", + "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", @@ -1271,14 +1267,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", + "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { @@ -1305,13 +1301,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", + "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1321,12 +1317,63 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", + "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", + "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", + "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", + "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -1351,13 +1398,80 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", + "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", + "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", + "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", + "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", + "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1413,16 +1527,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz", + "integrity": "sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", + "@babel/helper-plugin-utils": "^7.21.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "engines": { @@ -1523,6 +1637,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", + "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", @@ -1539,39 +1669,42 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", + "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", + "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-attributes": "^7.22.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1582,28 +1715,43 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.21.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.3", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-class-properties": "^7.22.3", + "@babel/plugin-transform-class-static-block": "^7.22.3", "@babel/plugin-transform-classes": "^7.21.0", "@babel/plugin-transform-computed-properties": "^7.21.5", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-dynamic-import": "^7.22.1", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-export-namespace-from": "^7.22.3", "@babel/plugin-transform-for-of": "^7.21.5", "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-json-strings": "^7.22.3", "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", + "@babel/plugin-transform-modules-systemjs": "^7.22.3", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", + "@babel/plugin-transform-new-target": "^7.22.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", + "@babel/plugin-transform-numeric-separator": "^7.22.3", + "@babel/plugin-transform-object-rest-spread": "^7.22.3", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", + "@babel/plugin-transform-optional-catch-binding": "^7.22.3", + "@babel/plugin-transform-optional-chaining": "^7.22.3", + "@babel/plugin-transform-parameters": "^7.22.3", + "@babel/plugin-transform-private-methods": "^7.22.3", + "@babel/plugin-transform-private-property-in-object": "^7.22.3", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.21.5", "@babel/plugin-transform-reserved-words": "^7.18.6", @@ -1613,13 +1761,15 @@ "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.21.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.3", "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", + "@babel/types": "^7.22.4", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "engines": { @@ -1652,9 +1802,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1663,31 +1813,31 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", + "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/generator": "^7.22.3", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1696,9 +1846,9 @@ } }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", "dependencies": { "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", @@ -1724,9 +1874,9 @@ } }, "node_modules/@contentful/rich-text-types": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@contentful/rich-text-types/-/rich-text-types-16.1.0.tgz", - "integrity": "sha512-Pucb68FK0j9cHJ96FAewXv+bvH4XizC4KBbVqyHhPLkDIVfasj0AWU5rI1lnvysdVKu66NQkFe8xZdeFTkaLWQ==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@contentful/rich-text-types/-/rich-text-types-16.2.0.tgz", + "integrity": "sha512-4BHC+mfa50JB70epzpnas4EkiuB3mGdBZ5Rp8w7R5wXvswEf8TLg5yGau2FxmZeEjrAkDrt4vzBLVQ8v3Y//Jw==", "engines": { "node": ">=6.0.0" } @@ -1749,16 +1899,22 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-2.0.0.tgz", - "integrity": "sha512-VcPjEnp07RNgz/D+oI2uIALg+IPCSl6mj0XhA3pl3F2bM2B95vgzatExmmzSg/X0zkh+R2v+jFY/J2pV/bnwpw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-2.1.0.tgz", + "integrity": "sha512-OWkqBa7PDzZuJ3Ha7T5bxdSVfSCfTq6K1mbAhbO1MD+GSULGjrp45i5RudyJOedstSarN/3mdwu9upJE7gDXfw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" } }, "node_modules/@csstools/css-calc": { @@ -1779,21 +1935,27 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.1.2.tgz", - "integrity": "sha512-MjW/VspbFSkvbuou7tUUu2+FAlAR7VJ/PA69M9EGKltThbONC8nyW33wHRzNvLzRLGstZLEO5X5oR7IMhMDi0A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.2.0.tgz", + "integrity": "sha512-kt9jhqyL/Ig/Tsf1cY+iygxs2nu3/D532048G9BSeg9YjlpZxbor6I+nvgMNB1A1ppL+i15Mb/yyDHYMQmgBtQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/color-helpers": "^2.0.0", + "@csstools/color-helpers": "^2.1.0", "@csstools/css-calc": "^1.1.1" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1" @@ -1866,45 +2028,57 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-2.2.1.tgz", - "integrity": "sha512-T52iiqmzyKk09B9iNTQbuWa9Tn83SztXY7o6r2+j+o1BS/7+CiCjTgN2HgzybDmx8cr6XYhQ1BzqgV9tJzhrmw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-2.2.2.tgz", + "integrity": "sha512-HpBtNAS8m07Umr1kYYOIKTSg2uBMjWMc7zeXchhodsZtopICa5pTyCIuuT0z9oy07j/M4+Uj0M01OLvmN0AHqA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/css-color-parser": "^1.1.2", + "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^2.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-1.0.1.tgz", - "integrity": "sha512-NSVrzjVcI4TMzDfh6GKZXvEuelT81xpXzruuTNJrwKMTZXEBHY9G2gvmr0eC0wwmL8EF1TblXyPPfBbZobvfXg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-1.0.2.tgz", + "integrity": "sha512-SZRZ1osJo5CR89xojPEkORnH6RS0FK1aktMujo52TCc74oJCIf6udX1e22qTeV8YG78lRNx8NpM3WzI4dL94tQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/css-color-parser": "^1.1.2", + "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^2.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -1929,9 +2103,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-3.0.4.tgz", - "integrity": "sha512-GgKoY7OlvL65UPigEdlrvMAUCR5kOQCjtue2/36TPrBNoRS6KM2KOqmjIVsxEwYYwK+L28pdnM8r10m03hhZxA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-3.0.5.tgz", + "integrity": "sha512-x1tKUChKajjlZ+pOvapvHTXfRasXLBaChzwcKzI+wGsUmWIfIZhWVdksI/9Yeef0RhI9RFsEgr1fI3gWNcxHyg==", "dev": true, "funding": [ { @@ -1944,10 +2118,10 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^1.1.2", + "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^2.2.0" }, "engines": { "node": "^14 || ^16 || >=18" @@ -1957,51 +2131,73 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-2.2.1.tgz", - "integrity": "sha512-eiqB4DIs+xqProAly7KwIgE04oze1YHb0QSCw/Y7062d9gpw+Cdif3Y0Z+Te+U7JROYdO0/0j91A6Qy8fo/Rlw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-2.2.2.tgz", + "integrity": "sha512-W5Y5oaJ382HSlbdGfPf60d7dAK6Hqf10+Be1yZbd/TNNrQ/3dDdV1c07YwOXPQ3PZ6dvFMhxbIbn8EC3ki3nEg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/css-color-parser": "^1.1.2", + "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-ic-unit": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-2.0.2.tgz", - "integrity": "sha512-N84qGTJkfLTPj2qOG5P4CIqGjpZBbjOEMKMn+UjO5wlb9lcBTfBsxCF0lQsFdWJUzBHYFOz19dL66v71WF3Pig==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-2.0.3.tgz", + "integrity": "sha512-azDezOeI7IhLGqRauyfi/JuJOfNHM951h0TZWnL9L38xTmlBK+s7y4MpWXTq/Ohz8IuiIuVPobXTewsqXaTeiQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^2.0.0", + "@csstools/postcss-progressive-custom-properties": "^2.2.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-3.2.0.tgz", - "integrity": "sha512-uooelBL99jMg8ZD6xy0Pj1hSalchWmplcin00eI+JHpv1jW2iwbi1cn2UnVsToM4JLwJSZFzTSWCgSpmlyhe3A==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-3.2.1.tgz", + "integrity": "sha512-AtANdV34kJl04Al62is3eQRk/BfOfyAvEmRJvbt+nx5REqImLC+2XhuE6skgkcPli1l8ONS67wS+l1sBzySc3Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" @@ -2009,10 +2205,6 @@ "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -2153,41 +2345,81 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-2.2.1.tgz", - "integrity": "sha512-g4wrVopp6xXr1KetUK4Lj36P+PFPwvUUtd2gaqo7X/0xgJHmMtKMPhD9p77H9bmIpPtkIYQ8b7+7cdmrWNEVAw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-2.2.2.tgz", + "integrity": "sha512-25Y9GYia9QamEOHx3B8hyHftDo/lzVhmPPm96ziOzOri9MDZvphPYPyx8NxQXh0P1P0j92eJcOjw4AO6HcXWYw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/css-color-parser": "^1.1.2", + "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^2.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-2.1.1.tgz", - "integrity": "sha512-6p8eO5+j+9hn4h2Klr9dbmya0GIb9SRrnPaCxqR1muVlV1waAZq6YkmlApEwXrox9qxggSwGZD5TnLRIY9f7WA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-2.2.0.tgz", + "integrity": "sha512-qtJ2Jgf5bQW65OK7JaR0dw+XL3tc3BN99g+I5cRdik++HpyZitrKKxIwDGb3OHp2Yo3PZKuiX8pXljqmLHT/eg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-1.0.0.tgz", + "integrity": "sha512-/Q2xOHjOeq8p8j/+yilJlroWzqbBca3+tux2ikkArsAsQS9sHWbFtPz602EpNnoGSnVg7o/QSf3xxaekyzv/8A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^1.2.0", + "@csstools/css-parser-algorithms": "^2.1.1", + "@csstools/css-tokenizer": "^2.1.1", + "@csstools/postcss-progressive-custom-properties": "^2.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18" }, "peerDependencies": { "postcss": "^8.4" @@ -2234,21 +2466,27 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-2.2.3.tgz", - "integrity": "sha512-PADJidg/tdhDk120aWlGuDxsp5ZTc9Nx7GhJ8t0qBCk5fOgLK6V3DsB9X6sOAhDokIihXKzjtUu15puac5McWw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-2.2.4.tgz", + "integrity": "sha512-zPN56sQkS/7YTCVZhOBVCWf7AiNge8fXDl7JVaHLz2RyT4pnyK2gFjckWRLpO0A2xkm1lCgZ0bepYZTwAVd/5A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/color-helpers": "^2.0.0", + "@csstools/color-helpers": "^2.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -2463,9 +2701,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5132,9 +5370,9 @@ } }, "node_modules/@lokalise/node-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@lokalise/node-api/-/node-api-8.5.0.tgz", - "integrity": "sha512-csDh+powg68GL3eTjSRhrxDZeipW+Q7T+AaKJUCz31YY2b+8BX5whOG1FoyJ1WNV7tbaQO97NagdUmz4dLuIyg==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@lokalise/node-api/-/node-api-8.5.1.tgz", + "integrity": "sha512-HLGohlY62rVvwM/hIFCZIIV2ZAFfjQ1j9IAkNl0/i7lU9w9fzWFhENHLv9nXYiTUtM5z1YvoAce+YSjCBtxP+Q==", "dev": true, "dependencies": { "got": "^11.8.3" @@ -6488,11 +6726,14 @@ "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==" }, "node_modules/@nuxt/config/node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.3.tgz", + "integrity": "sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/@nuxt/core": { @@ -6922,24 +7163,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@nuxt/telemetry/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/@nuxt/telemetry/node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -7251,9 +7474,9 @@ } }, "node_modules/@nuxt/webpack/node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -7371,27 +7594,6 @@ "node": ">=14.16" } }, - "node_modules/@nuxtjs/i18n/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@nuxtjs/i18n/node_modules/is-https": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", - "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==" - }, - "node_modules/@nuxtjs/i18n/node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "engines": { - "node": ">=14" - } - }, "node_modules/@nuxtjs/i18n/node_modules/ufo": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz", @@ -7436,9 +7638,9 @@ } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", + "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", "dev": true, "dependencies": { "@octokit/auth-token": "^3.0.0", @@ -7468,9 +7670,9 @@ } }, "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, "dependencies": { "@octokit/request": "^6.0.0", @@ -7494,12 +7696,13 @@ "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.0.tgz", - "integrity": "sha512-5T4iXjJdYCVA1rdWS1C+uZV9AvtZY9QgTG74kFiSFVj94dZXowyi/YK8f4SGjZaL69jZthGlBaDKRdCMCF9log==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, "dependencies": { - "@octokit/types": "^9.2.2" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" }, "engines": { "node": ">= 14" @@ -7518,12 +7721,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.1.tgz", - "integrity": "sha512-1XYEQZOGrD4FDa2bxuPfAVmzbKbUDs+P1dqn2TyufIW3EIZFI53n+YFr0XV+EBNATRWUL2rWuZJRKBZiU6guGA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", + "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", "dev": true, "dependencies": { - "@octokit/types": "^9.2.2", + "@octokit/types": "^9.2.3", "deprecation": "^2.3.1" }, "engines": { @@ -7534,9 +7737,9 @@ } }, "node_modules/@octokit/request": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.4.tgz", - "integrity": "sha512-at92SYQstwh7HH6+Kf3bFMnHrle7aIrC0r5rTP+Bb30118B6j1vI2/M4walh6qcQgfuLIKs8NUO5CytHTnUI3A==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", "dev": true, "dependencies": { "@octokit/endpoint": "^7.0.0", @@ -7565,27 +7768,33 @@ } }, "node_modules/@octokit/rest": { - "version": "19.0.8", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.8.tgz", - "integrity": "sha512-/PKrzqn+zDzXKwBMwLI2IKrvk8yv8cedJOdcmxrjR3gmu6UIzURhP5oQj+4qkn7+uQi1gg7QqV4SqlaQ1HYW1Q==", + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", "dev": true, "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.1.0", + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.0" + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" }, "engines": { "node": ">= 14" } }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, "node_modules/@octokit/types": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.2.tgz", - "integrity": "sha512-9BjDxjgQIvCjNWZsbqyH5QC2Yni16oaE6xL+8SUBMzcYPF4TGQBXGA97Cl3KceK9mwiNMb1mOYCz6FbCCLEL+g==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^17.1.2" + "@octokit/openapi-types": "^17.2.0" } }, "node_modules/@opentelemetry/api": { @@ -7674,9 +7883,9 @@ "dev": true }, "node_modules/@popperjs/core": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", - "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "dev": true, "funding": { "type": "opencollective", @@ -7831,9 +8040,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", - "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", + "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" @@ -7909,9 +8118,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -7941,12 +8150,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.0.tgz", + "integrity": "sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/cacheable-request": { @@ -8055,9 +8264,9 @@ "integrity": "sha512-MhCUjojzDhVLnZnxwPwa+rETFRDQ0ffjxYdrqOP6TBO2O0/Z64PV5tNeYApo4bc4y4frbWOrRwv/eEkXlI13Rw==" }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/keyv": { @@ -8091,9 +8300,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.0.tgz", - "integrity": "sha512-3iD2jaCCziTx04uudpJKwe39QxXgSUnpxXSvRQjRvHPxFQfmfP4NXIm/NURVeNlTCc+ru4WqjYGTmpXrW9uMlw==" + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -8108,9 +8317,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/prop-types": { @@ -8119,9 +8328,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz", + "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -8286,12 +8495,12 @@ "dev": true }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.6.tgz", - "integrity": "sha512-UIVfEaaHggOuhgqdpFlFQ7IN9UFMCiBR/N7uPBUyUlwNdJzYfAu9m4wbOj0b59oI/HSPW1N63Q7lsvfwTQY13w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.8.tgz", + "integrity": "sha512-jAf+hihtd0G2RLB9x796+3i8D0L5T5xjftuPpJ82RLsPNHdzGXmbZNNftQ558h90ogc45DD8/W3OrxmdSO5Nng==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.59.6" + "@typescript-eslint/utils": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -8305,13 +8514,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -8322,9 +8531,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -8335,13 +8544,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -8395,17 +8604,17 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -8476,12 +8685,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -9916,13 +10125,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", + "@babel/helper-define-polyfill-provider": "^0.4.0", "semver": "^6.1.1" }, "peerDependencies": { @@ -9930,25 +10139,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -10208,6 +10417,64 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -10491,9 +10758,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "dev": true, "funding": [ { @@ -10503,13 +10770,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -10766,17 +11037,17 @@ } }, "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } }, "node_modules/c8": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", - "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", @@ -11162,9 +11433,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001488", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", - "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", + "version": "1.0.30001492", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", + "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", "dev": true, "funding": [ { @@ -11952,14 +12223,6 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12497,9 +12760,9 @@ } }, "node_modules/contentful-export": { - "version": "7.19.56", - "resolved": "https://registry.npmjs.org/contentful-export/-/contentful-export-7.19.56.tgz", - "integrity": "sha512-waIbzvhlZbc3Sdf9KCcVYupfNiCOR6yRsBEM55PMWqPT9HUV/gST3fb4ZZb9i1L+FWRHe8l4J1ELlycfYksFsw==", + "version": "7.19.58", + "resolved": "https://registry.npmjs.org/contentful-export/-/contentful-export-7.19.58.tgz", + "integrity": "sha512-sJK/eHZwai8qRKP5zTG42UJSHsGP7C5+3Lwe6tWjaJjrco+zz+Ie2ost5tzWyPk8C6cfmciANZGd+GktyxM9nQ==", "dependencies": { "bfj": "^7.0.2", "bluebird": "^3.3.3", @@ -12540,15 +12803,15 @@ } }, "node_modules/contentful-import": { - "version": "8.5.54", - "resolved": "https://registry.npmjs.org/contentful-import/-/contentful-import-8.5.54.tgz", - "integrity": "sha512-sb2Df9s1eNz9p6W5UpIM5zvkK8iz+YkdGiC636FB8Ei6WUAbVNnyoNiZ4nK0xpZEBw29hWbpXv3JcSiDgRTTTQ==", + "version": "8.5.56", + "resolved": "https://registry.npmjs.org/contentful-import/-/contentful-import-8.5.56.tgz", + "integrity": "sha512-K3o3MNveT6TfdyO6rzoQJim2tfjH/C5+EHbQ+wqkxLqpejt3con/ry3LEDyWfOInKfFx8tsct7yczfcMa4Q+pw==", "dependencies": { "@discoveryjs/json-ext": "^0.5.7", "bluebird": "^3.5.1", "cli-table3": "^0.6.0", "contentful-batch-libs": "^9.5.0", - "contentful-management": "^10.35.3", + "contentful-management": "^10.35.6", "date-fns": "^2.30.0", "joi": "^17.9.2", "listr": "^0.14.1", @@ -12566,9 +12829,9 @@ } }, "node_modules/contentful-management": { - "version": "10.35.3", - "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-10.35.3.tgz", - "integrity": "sha512-kX/dIfIChAViTkjYZdTzj2Yf3PF7G1kXgLf44qwaE9rwv2tZ5/MjYrqZhDCDxaSBREhD9NZWpsXWPGDD5I2CLw==", + "version": "10.35.6", + "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-10.35.6.tgz", + "integrity": "sha512-35tHt5zUPmtpTyrE8wqFro2Wzy50vBZ5z2vevAoWaiu/5onwyzq8FNj2aJBJzciNF1pDIMD/pB5YUKKlCk1bmQ==", "dependencies": { "@contentful/rich-text-types": "^16.0.3", "@types/json-patch": "0.0.30", @@ -12597,17 +12860,14 @@ "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" }, "node_modules/contentful-management/node_modules/type-fest": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.10.0.tgz", - "integrity": "sha512-hmAPf1datm+gt3c2mvu0sJyhFy6lTkIGf0GzyaZWxRLnabQfPUqg6tF95RPg6sLxKI7nFLGdFxBcf2/7+GXI+A==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.11.1.tgz", + "integrity": "sha512-aCuRNRERRVh33lgQaJRlUxZqzfhzwTrsE98Mc3o3VXqmiaQdHacgUtJ0esp+7MvZ92qhtzKPeusaX6vIEcoreA==", "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "typescript": ">=4.7.0" } }, "node_modules/contentful-migration": { @@ -12991,9 +13251,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -13021,6 +13281,14 @@ "cookie-universal": "^2.2.2" } }, + "node_modules/cookie-universal/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -14043,9 +14311,9 @@ "dev": true }, "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", "dev": true }, "node_modules/dargs": { @@ -14550,9 +14818,9 @@ "dev": true }, "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -15117,14 +15385,6 @@ "node": ">=8.6.0" } }, - "node_modules/elastic-apm-node/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/elastic-apm-node/node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -15200,9 +15460,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/electron-to-chromium": { - "version": "1.4.399", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.399.tgz", - "integrity": "sha512-+V1aNvVgoWNWYIbMOiQ1n5fRIaY4SlQ/uRlrsCjLrUwr/3OvQgiX2f5vdav4oArVT9TnttJKcPCqjwPNyZqw/A==", + "version": "1.4.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz", + "integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==", "dev": true }, "node_modules/elegant-spinner": { @@ -15628,15 +15888,15 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -15656,13 +15916,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -16331,37 +16590,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -16406,20 +16634,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -17400,9 +17614,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", "dev": true }, "node_modules/fs-write-stream-atomic": { @@ -17986,10 +18200,10 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/gzip-size": { @@ -20043,6 +20257,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-https": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", + "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==" + }, "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", @@ -20551,9 +20770,9 @@ "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" }, "node_modules/jake": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", - "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -22357,14 +22576,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" } }, "node_modules/js-sha256": { @@ -25191,6 +25408,23 @@ "dev": true, "optional": true }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -25599,9 +25833,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, "node_modules/node-res": { @@ -26177,9 +26411,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", "dev": true }, "node_modules/nx": { @@ -27794,9 +28028,9 @@ } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "funding": [ { "type": "opencollective", @@ -28092,21 +28326,27 @@ } }, "node_modules/postcss-double-position-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-4.0.2.tgz", - "integrity": "sha512-GXL1RmFREDK4Q9aYvI2RhVrA6a6qqSMQQ5ke8gSH1xgV6exsqbcJpIumC7AOgooH6/WIG3/K/T8xxAiVHy/tJg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-4.0.3.tgz", + "integrity": "sha512-Td1+C+kFCadnhRBMMf6D/eiQxjp33eAgwgMcLNYzZPcgXt1iU6vi/qEJ/YObp4nwn3QOtudFBMUOVHoGqmpfiA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^2.0.0", + "@csstools/postcss-progressive-custom-properties": "^2.2.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -28250,23 +28490,29 @@ } }, "node_modules/postcss-lab-function": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-5.2.1.tgz", - "integrity": "sha512-u71Adr4nWi+4EmSZq5EV/fg9d1dYO6W26RNtT9LISEyjhH1q23vJIUkSqRwHgD6v7xxsxLOY5cSdVyaNE6rqzw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-5.2.2.tgz", + "integrity": "sha512-O5LrVYzOD3anfPqvSL1HiQ8PpKAav74Gst3pXgZBHSFo6t5sws3dLGTQMnw4hgn1t064SODWAjb9KcC39N820A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { - "@csstools/css-color-parser": "^1.1.2", + "@csstools/css-color-parser": "^1.2.0", "@csstools/css-parser-algorithms": "^2.1.1", "@csstools/css-tokenizer": "^2.1.1", - "@csstools/postcss-progressive-custom-properties": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^2.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -28347,20 +28593,26 @@ "dev": true }, "node_modules/postcss-logical": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-6.1.0.tgz", - "integrity": "sha512-qb1+LpClhYjxac8SfOcWotnY3unKZesDqIOm+jnGt8rTl7xaIWpE2bPGZHxflOip1E/4ETo79qlJyRL3yrHn1g==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-6.2.0.tgz", + "integrity": "sha512-aqlfKGaY0nnbgI9jwUikp4gJKBqcH5noU/EdnIVceghaaDPYhZuyJVxlvWNy55tlTG5tunRKCTAX9yljLiFgmw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, "peerDependencies": { "postcss": "^8.4" } @@ -28887,9 +29139,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.3.2.tgz", - "integrity": "sha512-VSAOsfxTXzO/gX5QljC8x8hN3ABbD9iqqLgqHqohBdNI5FhJptwpl96kpu+kYvvzK7BWwaHYou0IeYrp+NqmcQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.4.1.tgz", + "integrity": "sha512-IlcUT8ZSuQFWXJ/F+KvqmkzT85u33rlvd36IzM6qhdnccO7Rs3uBrHY802BFjNcPRawqSCDmPv7KKyCzNxx5Fw==", "dev": true, "funding": [ { @@ -28903,13 +29155,13 @@ ], "dependencies": { "@csstools/postcss-cascade-layers": "^3.0.1", - "@csstools/postcss-color-function": "^2.2.1", - "@csstools/postcss-color-mix-function": "^1.0.1", + "@csstools/postcss-color-function": "^2.2.2", + "@csstools/postcss-color-mix-function": "^1.0.2", "@csstools/postcss-font-format-keywords": "^2.0.2", - "@csstools/postcss-gradients-interpolation-method": "^3.0.4", - "@csstools/postcss-hwb-function": "^2.2.1", - "@csstools/postcss-ic-unit": "^2.0.2", - "@csstools/postcss-is-pseudo-class": "^3.2.0", + "@csstools/postcss-gradients-interpolation-method": "^3.0.5", + "@csstools/postcss-hwb-function": "^2.2.2", + "@csstools/postcss-ic-unit": "^2.0.3", + "@csstools/postcss-is-pseudo-class": "^3.2.1", "@csstools/postcss-logical-float-and-clear": "^1.0.1", "@csstools/postcss-logical-resize": "^1.0.1", "@csstools/postcss-logical-viewport-units": "^1.0.3", @@ -28917,11 +29169,12 @@ "@csstools/postcss-media-queries-aspect-ratio-number-values": "^1.0.2", "@csstools/postcss-nested-calc": "^2.0.2", "@csstools/postcss-normalize-display-values": "^2.0.1", - "@csstools/postcss-oklab-function": "^2.2.1", - "@csstools/postcss-progressive-custom-properties": "^2.1.0", + "@csstools/postcss-oklab-function": "^2.2.2", + "@csstools/postcss-progressive-custom-properties": "^2.2.0", + "@csstools/postcss-relative-color-syntax": "^1.0.0", "@csstools/postcss-scope-pseudo-class": "^2.0.2", "@csstools/postcss-stepped-value-functions": "^2.1.1", - "@csstools/postcss-text-decoration-shorthand": "^2.2.3", + "@csstools/postcss-text-decoration-shorthand": "^2.2.4", "@csstools/postcss-trigonometric-functions": "^2.1.1", "@csstools/postcss-unset-value": "^2.0.1", "autoprefixer": "^10.4.14", @@ -28929,7 +29182,7 @@ "css-blank-pseudo": "^5.0.2", "css-has-pseudo": "^5.0.2", "css-prefers-color-scheme": "^8.0.2", - "cssdb": "^7.5.3", + "cssdb": "^7.6.0", "postcss-attribute-case-insensitive": "^6.0.2", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^5.0.2", @@ -28939,15 +29192,15 @@ "postcss-custom-properties": "^13.1.5", "postcss-custom-selectors": "^7.1.3", "postcss-dir-pseudo-class": "^7.0.2", - "postcss-double-position-gradients": "^4.0.2", + "postcss-double-position-gradients": "^4.0.3", "postcss-focus-visible": "^8.0.2", "postcss-focus-within": "^7.0.2", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^4.0.1", "postcss-image-set-function": "^5.0.2", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^5.2.1", - "postcss-logical": "^6.1.0", + "postcss-lab-function": "^5.2.2", + "postcss-logical": "^6.2.0", "postcss-nesting": "^11.2.1", "postcss-opacity-percentage": "^2.0.0", "postcss-overflow-shorthand": "^4.0.1", @@ -29167,23 +29420,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -29853,6 +30089,28 @@ "node": ">= 0.6" } }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc9": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.0.tgz", @@ -31882,9 +32140,9 @@ } }, "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.17.tgz", - "integrity": "sha512-XtojyZHGo/iYmGkOEL8psTQsr5XI4fd+QxCD16ru00mnJhuvXFXcPLHXj5cKJh/xUttxPCglnpUI8d2u6gUgzw==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.19.tgz", + "integrity": "sha512-jAPNLjG1DBnLQUMZz1py/5z7/wC8Gn8G+WAXQplDdVr9zO/xdTWLtDM3aPHm8e2gLT2xQxMql507IMuLA6himw==", "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" @@ -32855,9 +33113,9 @@ } }, "node_modules/require-in-the-middle": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.1.0.tgz", - "integrity": "sha512-6f86Mh0vWCxqKKatRPwgY6VzYmcVay3WUTIpJ1ILBCNh+dTWabMR1swKGKz3XcEZ5mgjndzRu7fQ+44G2H9Gew==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.1.1.tgz", + "integrity": "sha512-OScOjQjrrjhAdFpQmnkE/qbIBGCRFhQB/YaJhcC3CPOlmhe7llnW46Ac1J5+EjcNXOTnDdpF96Erw/yedsGksQ==", "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -35721,9 +35979,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.17.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.4.tgz", - "integrity": "sha512-jcEKZw6UPrgugz/0Tuk/PVyLAPfMBJf5clnGueo45wTweoV8yh7Q7PEkhkJ5uuUbC7zAxEcG3tqNr1bstkQ8nw==", + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -36271,9 +36529,9 @@ } }, "node_modules/tslib": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.1.tgz", - "integrity": "sha512-KaI6gPil5m9vF7DKaoXxx1ia9fxS4qG5YveErRRVknPDXXriu5M8h48YRjB6h5ZUOKuAKlSJYb0GaDe8I39fRw==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -36377,6 +36635,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, "peer": true, "bin": { "tsc": "bin/tsc", @@ -37288,9 +37547,9 @@ "integrity": "sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==" }, "node_modules/vue-inbrowser-compiler": { - "version": "4.72.1", - "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler/-/vue-inbrowser-compiler-4.72.1.tgz", - "integrity": "sha512-sV7xODGIoVklKUAA7I4BIGhMPQY7/A6NGMlja0grZ5EntkCDi+1QnB9Mo7xk9g1fQVOt1zLcKuU2d9b2B1aamA==", + "version": "4.72.4", + "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler/-/vue-inbrowser-compiler-4.72.4.tgz", + "integrity": "sha512-3uhtgUm85HY3ma1lue5vZvziEsycj7Lzm7DIl21z+kPlfOKm4/zIlszwya9/JW7bsJnm0gQnWzyEa4v64mwQVg==", "dev": true, "dependencies": { "acorn": "^6.4.2", @@ -37298,7 +37557,7 @@ "buble": "^0.20.0", "camelcase": "^5.3.1", "detect-browser": "^5.2.0", - "vue-inbrowser-compiler-utils": "^4.71.1", + "vue-inbrowser-compiler-utils": "^4.72.4", "walkes": "^0.2.1" }, "peerDependencies": { @@ -37315,9 +37574,9 @@ } }, "node_modules/vue-inbrowser-compiler-utils": { - "version": "4.71.1", - "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-utils/-/vue-inbrowser-compiler-utils-4.71.1.tgz", - "integrity": "sha512-tyxCHpJLj3ii6u2M0xw3N+1+K7qQ+7MsSFUXAXnS1N8z0Rq74WiEfMlJFc+LdRmxiMk6T4eetJlkPzEIrBtmNA==", + "version": "4.72.4", + "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-utils/-/vue-inbrowser-compiler-utils-4.72.4.tgz", + "integrity": "sha512-RPMg/Qj6Vbtxao2W/ye8PIkxj8duuv7tqRiuEULSqcs+mm8acboHL4Ui2ClcwgQuArKb/lfUKHVSBN8ZEnTUhA==", "dev": true, "dependencies": { "camelcase": "^5.3.1", @@ -38658,9 +38917,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", + "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", diff --git a/packages/portal/src/components/PageNavigation.vue b/packages/portal/src/components/PageNavigation.vue index 89239068ec..22af6db1a5 100644 --- a/packages/portal/src/components/PageNavigation.vue +++ b/packages/portal/src/components/PageNavigation.vue @@ -167,7 +167,7 @@ }, storageEvent(event) { if (event.key === 'logout-event') { - this.$auth.logout(); + this.$router.push({ name: 'account-logout' }); } } } diff --git a/packages/portal/src/components/item/ItemAddButton.vue b/packages/portal/src/components/item/ItemAddButton.vue index cd0dd2cd7a..4e4d8b4275 100644 --- a/packages/portal/src/components/item/ItemAddButton.vue +++ b/packages/portal/src/components/item/ItemAddButton.vue @@ -14,7 +14,7 @@ {{ buttonText ? $t('actions.save') : '' }} diff --git a/packages/portal/src/pages/account/logout.vue b/packages/portal/src/pages/account/logout.vue index f08adaf38a..439986e6cf 100644 --- a/packages/portal/src/pages/account/logout.vue +++ b/packages/portal/src/pages/account/logout.vue @@ -6,34 +6,10 @@ export default { name: 'AccountLogoutPage', - beforeRouteEnter(to, from, next) { - next(vm => { - // const redirectPath = /^account___[a-z]{2}$/.test(from.name) ? `/${vm.$i18n.locale}` : from.fullPath; - // vm.$auth.$storage.setUniversal('redirect', redirectPath); - }); - }, - layout: 'minimal', - created() { - // this.$auth.$storage.setUniversal('portalLoggingOut', true); - }, - mounted() { - this.$keycloak.auth.logout({ - redirectUri: window.location.origin + '/', - 'ui_locales': this.$i18n.locale - }); - localStorage.removeItem('kc.token'); - localStorage.removeItem('kc.idToken'); - localStorage.removeItem('kc.refreshToken'); - // this.$auth.logout({ params: { 'ui_locales': this.$i18n.locale } }); - // localStorage.setItem('logout-event', `logout-${Math.random()}`); - // - // const path = this.$auth.strategies.keycloak.options.end_session_endpoint; - // const redirect = window.location.origin + this.$auth.$storage.getUniversal('redirect'); - // - // window.location.assign(`${path}?redirect_uri=${encodeURIComponent(redirect)}`); + this.$keycloak.logout(); } }; diff --git a/packages/portal/src/plugins/keycloak.js b/packages/portal/src/plugins/keycloak.js index 2b19561a60..7e832effde 100644 --- a/packages/portal/src/plugins/keycloak.js +++ b/packages/portal/src/plugins/keycloak.js @@ -116,15 +116,109 @@ const storeModule = { } }; +const plugin = async(ctx) => ({ + get accountUrl() { + const keycloakAccountUrl = new URL(ctx.$config.keycloak.url); + + keycloakAccountUrl.pathname = `${keycloakAccountUrl.pathname}/realms/${ctx.$config.keycloak.realm}/account`; + if (keycloakAccountUrl.pathname.startsWith('//')) { + keycloakAccountUrl.pathname = keycloakAccountUrl.pathname.slice(1); + } + + const referrerUri = new URL(ctx.$config.app.baseUrl); + referrerUri.pathname = ctx.route.path; + referrerUri.search = new URLSearchParams(ctx.route.query).toString(); + referrerUri.hash = ctx.route.hash; + + keycloakAccountUrl.search = new URLSearchParams({ + referrer: ctx.$config.keycloak.clientId, + 'referrer_uri': referrerUri.toString() + }).toString(); + + return keycloakAccountUrl.toString(); + }, + auth: process.client && await keycloakAuth(ctx), + axios: keycloakAxios(ctx), + callback() { + if (ctx.route.query.action === 'login') { + this.loginCallback(); + } else if (ctx.route.query.action === 'logout') { + this.logoutCallback(); + } else { + ctx.app.router.push('/'); + } + }, + login() { + this.auth.login({ + locale: ctx.i18n.locale, + redirectUri: this.loginRedirect + }); + }, + loginCallback() { + ctx.store.commit('keycloak/setLoggedIn', this.auth.authenticated); + ctx.app.router.push(ctx.route.query.redirect?.startsWith('/') ? ctx.route.query.redirect : '/account'); + }, + get loginRedirect() { + let redirectPath = '/account'; + + if (ctx.route) { + if (ctx.route.query?.redirect) { + redirectPath = ctx.route.query.redirect; + } else if (ctx.route.path === '/account/login') { + redirectPath = `/account${ctx.route.hash || ''}`; + } else if (ctx.route.fullPath) { + redirectPath = ctx.route.fullPath; + } + } + + const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); + redirectUrl.searchParams.set('action', 'login'); + redirectUrl.searchParams.set('redirect', redirectPath); + + return redirectUrl.toString(); + }, + logout() { + this.auth.logout({ + redirectUri: this.logoutRedirect, + 'ui_locales': ctx.i18n.locale + }); + }, + logoutCallback() { + localStorage.removeItem('kc.token'); + localStorage.removeItem('kc.idToken'); + localStorage.removeItem('kc.refreshToken'); + ctx.store.commit('keycloak/setLoggedIn', this.auth.authenticated); + ctx.app.router.push(ctx.route.query.redirect?.startsWith('/') ? ctx.route.query.redirect : '/'); + }, + get logoutRedirect() { + let redirectPath = '/'; + if ((ctx.route.query?.redirect || '').startsWith('/')) { + redirectPath = ctx.route.query.redirect; + } + + const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); + redirectUrl.searchParams.set('action', 'logout'); + redirectUrl.searchParams.set('redirect', redirectPath); + + return redirectUrl.toString(); + }, + get logoutRoute() { + let redirect = '/'; + if (!ctx.route.name.startsWith('account')) { + redirect = ctx.route.fullPath; + } + return { + name: 'account-logout', + query: { + redirect + } + }; + } +}); + export default async(ctx, inject) => { ctx.store.registerModule('keycloak', storeModule); ctx.store.commit('keycloak/setLoggedIn', !!ctx.$cookies.get('kc.token')); - if (process.client) { - // TODO: add fn's from keycloak mixin as properties - inject('keycloak', { - auth: await keycloakAuth(ctx), - axios: keycloakAxios(ctx) - }); - } + inject('keycloak', await plugin(ctx)); }; From ac6397d25ff97d0b094424d8a95af182f09eb332 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Mon, 26 Jun 2023 11:30:53 +0100 Subject: [PATCH 17/23] chore: debugging --- .../src/components/page/PageNavigation.vue | 87 ++++++++++--------- packages/portal/src/layouts/default.vue | 20 +++-- .../portal/src/pages/account/callback.vue | 2 +- packages/portal/src/pages/account/login.vue | 1 + packages/portal/src/pages/account/logout.vue | 1 + packages/portal/src/plugins/keycloak.js | 83 ++++++++++-------- 6 files changed, 106 insertions(+), 88 deletions(-) diff --git a/packages/portal/src/components/page/PageNavigation.vue b/packages/portal/src/components/page/PageNavigation.vue index 819e7c7ff1..26f0b164f4 100644 --- a/packages/portal/src/components/page/PageNavigation.vue +++ b/packages/portal/src/components/page/PageNavigation.vue @@ -22,59 +22,61 @@ - - + @@ -128,6 +130,7 @@ } }, mounted() { + console.log('PageNavigation mounted') window.addEventListener('storage', this.storageEvent); }, methods: { diff --git a/packages/portal/src/layouts/default.vue b/packages/portal/src/layouts/default.vue index 61ebdd3623..944e30b364 100644 --- a/packages/portal/src/layouts/default.vue +++ b/packages/portal/src/layouts/default.vue @@ -164,19 +164,11 @@ this.enableAnnouncer = true; } }); - }, - - // FIXME: this is never getting fired - '$store.state.keycloak.loggedIn'(newVal) { - if (newVal) { - this.makeToast(this.$t('account.notifications.loggedIn')); - } else { - this.makeToast(this.$t('account.notifications.loggedOut')); - } } }, mounted() { + console.log('default layout mounted') if (!this.klaro) { this.klaro = window.klaro; } @@ -185,6 +177,16 @@ // Klaro if it fails to. const renderKlaroAfter = this.$waitForMatomo ? this.$waitForMatomo() : Promise.resolve(); renderKlaroAfter.catch(() => {}).finally(this.renderKlaro); + + // Notify of login/logout + if (localStorage['kc.loggedIn']) { + this.makeToast(this.$t('account.notifications.loggedIn')); + localStorage.removeItem('kc.loggedIn'); + } + if (localStorage['kc.loggedOut']) { + this.makeToast(this.$t('account.notifications.loggedOut')); + localStorage.removeItem('kc.loggedOut'); + } }, methods: { diff --git a/packages/portal/src/pages/account/callback.vue b/packages/portal/src/pages/account/callback.vue index 788c1d0efc..62b5eea61d 100644 --- a/packages/portal/src/pages/account/callback.vue +++ b/packages/portal/src/pages/account/callback.vue @@ -10,7 +10,7 @@ layout: 'minimal', mounted() { - this.$keycloak.callback(); + // this.$keycloak.callback(); } }; diff --git a/packages/portal/src/pages/account/login.vue b/packages/portal/src/pages/account/login.vue index ededb1912f..00a2fde77d 100644 --- a/packages/portal/src/pages/account/login.vue +++ b/packages/portal/src/pages/account/login.vue @@ -9,6 +9,7 @@ layout: 'minimal', mounted() { + localStorage['kc.login'] = 'true'; this.$keycloak.login(); } }; diff --git a/packages/portal/src/pages/account/logout.vue b/packages/portal/src/pages/account/logout.vue index 439986e6cf..04f00f0e06 100644 --- a/packages/portal/src/pages/account/logout.vue +++ b/packages/portal/src/pages/account/logout.vue @@ -9,6 +9,7 @@ layout: 'minimal', mounted() { + localStorage['kc.logout'] = 'true'; this.$keycloak.logout(); } }; diff --git a/packages/portal/src/plugins/keycloak.js b/packages/portal/src/plugins/keycloak.js index 7e832effde..b47c0a0dac 100644 --- a/packages/portal/src/plugins/keycloak.js +++ b/packages/portal/src/plugins/keycloak.js @@ -17,6 +17,7 @@ const keycloakAxios = (ctx) => (axiosInstance) => { }; const keycloakResponseErrorHandler = (ctx, error) => { + console.log('keycloakResponseErrorHandler') if (error.response?.status === 401) { return keycloakUnauthorizedResponseErrorHandler(ctx, error); } else { @@ -25,6 +26,7 @@ const keycloakResponseErrorHandler = (ctx, error) => { }; const keycloakUnauthorizedResponseErrorHandler = ({ $axios, $keycloak, redirect, route }, error) => { + console.log('keycloakUnauthorizedResponseErrorHandler') if ($keycloak.auth.refreshToken) { // User has previously logged in, and we have a refresh token, e.g. // access token has expired @@ -36,12 +38,13 @@ const keycloakUnauthorizedResponseErrorHandler = ({ $axios, $keycloak, redirect, } }; -const keycloakRefreshAccessToken = async({ $keycloak, $cookies, $axios }, requestConfig) => { +const keycloakRefreshAccessToken = async({ $keycloak, $axios }, requestConfig) => { + console.log('keycloakRefreshAccessToken') const updated = await $keycloak.auth.updateToken(-1); if (updated) { - $cookies.set('kc.token', $keycloak.auth.token); - $cookies.set('kc.idToken', $keycloak.auth.idToken); - $cookies.set('kc.refreshToken', $keycloak.auth.refreshToken); + localStorage.setItem('kc.token', $keycloak.auth.token); + localStorage.setItem('kc.idToken', $keycloak.auth.idToken); + localStorage.setItem('kc.refreshToken', $keycloak.auth.refreshToken); } else { // Refresh token is no longer valid; clear tokens and try again in case it // doesn't require auth anyway @@ -53,19 +56,22 @@ const keycloakRefreshAccessToken = async({ $keycloak, $cookies, $axios }, reques }; const keycloakAuth = async(ctx) => { + console.log('keycloakAuth') const keycloak = new Keycloak(ctx.$config.keycloak); try { + console.log('keycloakAuth init') await keycloak.init({ checkLoginIframe: false, - token: ctx.$cookies.get('kc.token'), - idToken: ctx.$cookies.get('kc.idToken'), - refreshToken: ctx.$cookies.get('kc.refreshToken') + token: localStorage.getItem('kc.token'), + idToken: localStorage.getItem('kc.idToken'), + refreshToken: localStorage.getItem('kc.refreshToken') }); } catch (e) { - ctx.$cookies.remove('kc.token'); - ctx.$cookies.remove('kc.idToken'); - ctx.$cookies.remove('kc.refreshToken'); + console.log('keycloakAuth init catch', e) + localStorage.removeItem('kc.token'); + localStorage.removeItem('kc.idToken'); + localStorage.removeItem('kc.refreshToken'); await keycloak.init({ checkLoginIframe: false }); @@ -73,11 +79,12 @@ const keycloakAuth = async(ctx) => { ctx.store.commit('keycloak/setLoggedIn', keycloak.authenticated); - ctx.$cookies.set('kc.token', keycloak.token); - ctx.$cookies.set('kc.idToken', keycloak.idToken); - ctx.$cookies.set('kc.refreshToken', keycloak.refreshToken); + localStorage.setItem('kc.token', keycloak.token); + localStorage.setItem('kc.idToken', keycloak.idToken); + localStorage.setItem('kc.refreshToken', keycloak.refreshToken); if (keycloak.authenticated) { + console.log('keycloakAuth loadUserProfile') const profile = await keycloak.loadUserProfile(); ctx.store.commit('keycloak/setProfile', profile); ctx.store.commit('keycloak/setResourceAccess', keycloak.resourceAccess); @@ -97,6 +104,7 @@ const storeModule = { mutations: { setLoggedIn(state, value) { + console.log('keycloak store setLoggedIn', value) state.loggedIn = value; }, @@ -117,6 +125,7 @@ const storeModule = { }; const plugin = async(ctx) => ({ + // TODO: use this.auth.createLoginUrl instead get accountUrl() { const keycloakAccountUrl = new URL(ctx.$config.keycloak.url); @@ -140,13 +149,20 @@ const plugin = async(ctx) => ({ auth: process.client && await keycloakAuth(ctx), axios: keycloakAxios(ctx), callback() { + let redirect = '/'; + if (ctx.route.query.action === 'login') { - this.loginCallback(); + redirect = '/account'; + localStorage['kc.loggedIn'] = 'true'; } else if (ctx.route.query.action === 'logout') { - this.logoutCallback(); - } else { - ctx.app.router.push('/'); + localStorage['kc.loggedOut'] = 'true'; + } + + if (ctx.route.query.redirect?.startsWith('/')) { + redirect = ctx.route.query.redirect; } + + ctx.app.router.push(redirect); }, login() { this.auth.login({ @@ -154,15 +170,11 @@ const plugin = async(ctx) => ({ redirectUri: this.loginRedirect }); }, - loginCallback() { - ctx.store.commit('keycloak/setLoggedIn', this.auth.authenticated); - ctx.app.router.push(ctx.route.query.redirect?.startsWith('/') ? ctx.route.query.redirect : '/account'); - }, get loginRedirect() { let redirectPath = '/account'; if (ctx.route) { - if (ctx.route.query?.redirect) { + if ((ctx.route.query?.redirect || '').startsWith('/')) { redirectPath = ctx.route.query.redirect; } else if (ctx.route.path === '/account/login') { redirectPath = `/account${ctx.route.hash || ''}`; @@ -171,9 +183,11 @@ const plugin = async(ctx) => ({ } } - const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); - redirectUrl.searchParams.set('action', 'login'); - redirectUrl.searchParams.set('redirect', redirectPath); + // const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); + // redirectUrl.searchParams.set('action', 'login'); + // redirectUrl.searchParams.set('redirect', redirectPath); + + const redirectUrl = new URL(`${ctx.$config.app.baseUrl}${redirectPath}`); return redirectUrl.toString(); }, @@ -183,22 +197,20 @@ const plugin = async(ctx) => ({ 'ui_locales': ctx.i18n.locale }); }, - logoutCallback() { - localStorage.removeItem('kc.token'); - localStorage.removeItem('kc.idToken'); - localStorage.removeItem('kc.refreshToken'); - ctx.store.commit('keycloak/setLoggedIn', this.auth.authenticated); - ctx.app.router.push(ctx.route.query.redirect?.startsWith('/') ? ctx.route.query.redirect : '/'); - }, get logoutRedirect() { let redirectPath = '/'; + if ((ctx.route.query?.redirect || '').startsWith('/')) { redirectPath = ctx.route.query.redirect; + } else if (ctx.route.fullPath) { + redirectPath = ctx.route.fullPath; } - const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); - redirectUrl.searchParams.set('action', 'logout'); - redirectUrl.searchParams.set('redirect', redirectPath); + // const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); + // redirectUrl.searchParams.set('action', 'logout'); + // redirectUrl.searchParams.set('redirect', redirectPath); + + const redirectUrl = new URL(`${ctx.$config.app.baseUrl}${redirectPath}`); return redirectUrl.toString(); }, @@ -218,7 +230,6 @@ const plugin = async(ctx) => ({ export default async(ctx, inject) => { ctx.store.registerModule('keycloak', storeModule); - ctx.store.commit('keycloak/setLoggedIn', !!ctx.$cookies.get('kc.token')); inject('keycloak', await plugin(ctx)); }; From 47aca23a284d03a86ec49ea8239e18cd5816e5bb Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Fri, 30 Jun 2023 12:47:12 +0100 Subject: [PATCH 18/23] refactor: stop excluding account pages from i18n --- packages/portal/nuxt.config.js | 7 --- .../components/generic/LanguageSelector.vue | 7 +-- .../components/item/ItemLanguageSelector.vue | 5 --- .../src/components/page/PageNavigation.vue | 5 +-- packages/portal/src/layouts/default.vue | 15 +------ packages/portal/src/middleware/l10n.js | 12 +----- packages/portal/src/mixins/locales.js | 1 + .../portal/src/pages/account/callback.vue | 15 ++++++- packages/portal/src/plugins/keycloak.js | 43 ++++++------------- 9 files changed, 34 insertions(+), 76 deletions(-) diff --git a/packages/portal/nuxt.config.js b/packages/portal/nuxt.config.js index 5650821536..532fde149b 100644 --- a/packages/portal/nuxt.config.js +++ b/packages/portal/nuxt.config.js @@ -268,13 +268,6 @@ export default { silentFallbackWarn: true, dateTimeFormats: i18nDateTime }, - // Disable redirects to account pages - parsePages: false, - pages: { - 'account/callback': false, - 'account/login': false, - 'account/logout': false - }, // Enable browser language detection to automatically redirect user // to their preferred language as they visit your app for the first time // Set to false to disable diff --git a/packages/portal/src/components/generic/LanguageSelector.vue b/packages/portal/src/components/generic/LanguageSelector.vue index 4dbd8d48c7..b7b7f0a667 100644 --- a/packages/portal/src/components/generic/LanguageSelector.vue +++ b/packages/portal/src/components/generic/LanguageSelector.vue @@ -19,11 +19,12 @@ diff --git a/packages/portal/src/plugins/keycloak.js b/packages/portal/src/plugins/keycloak.js index b47c0a0dac..d6e5d567ad 100644 --- a/packages/portal/src/plugins/keycloak.js +++ b/packages/portal/src/plugins/keycloak.js @@ -17,7 +17,6 @@ const keycloakAxios = (ctx) => (axiosInstance) => { }; const keycloakResponseErrorHandler = (ctx, error) => { - console.log('keycloakResponseErrorHandler') if (error.response?.status === 401) { return keycloakUnauthorizedResponseErrorHandler(ctx, error); } else { @@ -26,7 +25,6 @@ const keycloakResponseErrorHandler = (ctx, error) => { }; const keycloakUnauthorizedResponseErrorHandler = ({ $axios, $keycloak, redirect, route }, error) => { - console.log('keycloakUnauthorizedResponseErrorHandler') if ($keycloak.auth.refreshToken) { // User has previously logged in, and we have a refresh token, e.g. // access token has expired @@ -39,7 +37,6 @@ const keycloakUnauthorizedResponseErrorHandler = ({ $axios, $keycloak, redirect, }; const keycloakRefreshAccessToken = async({ $keycloak, $axios }, requestConfig) => { - console.log('keycloakRefreshAccessToken') const updated = await $keycloak.auth.updateToken(-1); if (updated) { localStorage.setItem('kc.token', $keycloak.auth.token); @@ -56,11 +53,9 @@ const keycloakRefreshAccessToken = async({ $keycloak, $axios }, requestConfig) = }; const keycloakAuth = async(ctx) => { - console.log('keycloakAuth') const keycloak = new Keycloak(ctx.$config.keycloak); try { - console.log('keycloakAuth init') await keycloak.init({ checkLoginIframe: false, token: localStorage.getItem('kc.token'), @@ -68,7 +63,6 @@ const keycloakAuth = async(ctx) => { refreshToken: localStorage.getItem('kc.refreshToken') }); } catch (e) { - console.log('keycloakAuth init catch', e) localStorage.removeItem('kc.token'); localStorage.removeItem('kc.idToken'); localStorage.removeItem('kc.refreshToken'); @@ -84,7 +78,6 @@ const keycloakAuth = async(ctx) => { localStorage.setItem('kc.refreshToken', keycloak.refreshToken); if (keycloak.authenticated) { - console.log('keycloakAuth loadUserProfile') const profile = await keycloak.loadUserProfile(); ctx.store.commit('keycloak/setProfile', profile); ctx.store.commit('keycloak/setResourceAccess', keycloak.resourceAccess); @@ -104,7 +97,6 @@ const storeModule = { mutations: { setLoggedIn(state, value) { - console.log('keycloak store setLoggedIn', value) state.loggedIn = value; }, @@ -124,6 +116,8 @@ const storeModule = { } }; +// TODO: store tokens etc in cookies instead of localStorage, so that it's +// possible to e.g. reload account page and be auth'd const plugin = async(ctx) => ({ // TODO: use this.auth.createLoginUrl instead get accountUrl() { @@ -151,18 +145,11 @@ const plugin = async(ctx) => ({ callback() { let redirect = '/'; - if (ctx.route.query.action === 'login') { - redirect = '/account'; - localStorage['kc.loggedIn'] = 'true'; - } else if (ctx.route.query.action === 'logout') { - localStorage['kc.loggedOut'] = 'true'; - } - if (ctx.route.query.redirect?.startsWith('/')) { redirect = ctx.route.query.redirect; } - ctx.app.router.push(redirect); + ctx.app.router.replace(redirect); }, login() { this.auth.login({ @@ -171,23 +158,20 @@ const plugin = async(ctx) => ({ }); }, get loginRedirect() { - let redirectPath = '/account'; + let redirectPath = ctx.localePath('/account'); if (ctx.route) { if ((ctx.route.query?.redirect || '').startsWith('/')) { redirectPath = ctx.route.query.redirect; - } else if (ctx.route.path === '/account/login') { - redirectPath = `/account${ctx.route.hash || ''}`; - } else if (ctx.route.fullPath) { + } else if (ctx.route.path === ctx.localePath('/account/login')) { + redirectPath = ctx.localePath('/account'); + } else { redirectPath = ctx.route.fullPath; } } - // const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); - // redirectUrl.searchParams.set('action', 'login'); - // redirectUrl.searchParams.set('redirect', redirectPath); - - const redirectUrl = new URL(`${ctx.$config.app.baseUrl}${redirectPath}`); + const redirectUrl = new URL(`${ctx.$config.app.baseUrl}${ctx.localePath('/account/callback')}`); + redirectUrl.searchParams.set('redirect', redirectPath); return redirectUrl.toString(); }, @@ -198,7 +182,7 @@ const plugin = async(ctx) => ({ }); }, get logoutRedirect() { - let redirectPath = '/'; + let redirectPath = ctx.localePath('/'); if ((ctx.route.query?.redirect || '').startsWith('/')) { redirectPath = ctx.route.query.redirect; @@ -206,11 +190,8 @@ const plugin = async(ctx) => ({ redirectPath = ctx.route.fullPath; } - // const redirectUrl = new URL(`${ctx.$config.app.baseUrl}/account/callback`); - // redirectUrl.searchParams.set('action', 'logout'); - // redirectUrl.searchParams.set('redirect', redirectPath); - - const redirectUrl = new URL(`${ctx.$config.app.baseUrl}${redirectPath}`); + const redirectUrl = new URL(`${ctx.$config.app.baseUrl}${ctx.localePath('/account/callback')}`); + redirectUrl.searchParams.set('redirect', redirectPath); return redirectUrl.toString(); }, From 94d281f6c7335b81cf00087212b10286e40ddf31 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Fri, 30 Jun 2023 12:49:44 +0100 Subject: [PATCH 19/23] chore: delete redundant file --- packages/portal/src/plugins/oauth2.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 packages/portal/src/plugins/oauth2.js diff --git a/packages/portal/src/plugins/oauth2.js b/packages/portal/src/plugins/oauth2.js deleted file mode 100644 index 7dbe84fdea..0000000000 --- a/packages/portal/src/plugins/oauth2.js +++ /dev/null @@ -1,5 +0,0 @@ -export default class Oauth2Scheme { - constructor() { - // Dummy class to support testing of ./authScheme.js - } -} From 938aff3488da3ad0d959a91fa3d2e76487d55e75 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Fri, 30 Jun 2023 12:58:53 +0100 Subject: [PATCH 20/23] refactor: use cookied instead of localStorage --- .../src/components/page/PageNavigation.vue | 86 +++++++++---------- packages/portal/src/plugins/keycloak.js | 42 ++++----- 2 files changed, 63 insertions(+), 65 deletions(-) diff --git a/packages/portal/src/components/page/PageNavigation.vue b/packages/portal/src/components/page/PageNavigation.vue index c8dec88b8b..dd5f639982 100644 --- a/packages/portal/src/components/page/PageNavigation.vue +++ b/packages/portal/src/components/page/PageNavigation.vue @@ -22,61 +22,59 @@ - - + + {{ $t('account.myProfile') }} + + + - + + diff --git a/packages/portal/src/plugins/keycloak.js b/packages/portal/src/plugins/keycloak.js index d6e5d567ad..9c9d997d6c 100644 --- a/packages/portal/src/plugins/keycloak.js +++ b/packages/portal/src/plugins/keycloak.js @@ -24,28 +24,28 @@ const keycloakResponseErrorHandler = (ctx, error) => { } }; -const keycloakUnauthorizedResponseErrorHandler = ({ $axios, $keycloak, redirect, route }, error) => { - if ($keycloak.auth.refreshToken) { +const keycloakUnauthorizedResponseErrorHandler = (ctx, error) => { + if (ctx.$keycloak.auth.refreshToken) { // User has previously logged in, and we have a refresh token, e.g. // access token has expired - return keycloakRefreshAccessToken({ $keycloak, $axios, redirect, route }, error.config); + return keycloakRefreshAccessToken(ctx, error.config); } else { // User has not already logged in, or we have no refresh token: // redirect to OIDC login URL - return redirect('/account/login', { redirect: route.path }); + return ctx.redirect('/account/login', { redirect: route.path }); } }; -const keycloakRefreshAccessToken = async({ $keycloak, $axios }, requestConfig) => { - const updated = await $keycloak.auth.updateToken(-1); +const keycloakRefreshAccessToken = async(ctx, requestConfig) => { + const updated = await ctx.$keycloak.auth.updateToken(-1); if (updated) { - localStorage.setItem('kc.token', $keycloak.auth.token); - localStorage.setItem('kc.idToken', $keycloak.auth.idToken); - localStorage.setItem('kc.refreshToken', $keycloak.auth.refreshToken); + ctx.$cookies.set('kc.token', ctx.$keycloak.auth.token); + ctx.$cookies.set('kc.idToken', ctx.$keycloak.auth.idToken); + ctx.$cookies.set('kc.refreshToken', ctx.$keycloak.auth.refreshToken); } else { // Refresh token is no longer valid; clear tokens and try again in case it // doesn't require auth anyway - $keycloak.auth.clearToken(); + ctx.$keycloak.auth.clearToken(); } // Retry request with new access token @@ -58,14 +58,14 @@ const keycloakAuth = async(ctx) => { try { await keycloak.init({ checkLoginIframe: false, - token: localStorage.getItem('kc.token'), - idToken: localStorage.getItem('kc.idToken'), - refreshToken: localStorage.getItem('kc.refreshToken') + token: ctx.$cookies.get('kc.token'), + idToken: ctx.$cookies.get('kc.idToken'), + refreshToken: ctx.$cookies.get('kc.refreshToken') }); } catch (e) { - localStorage.removeItem('kc.token'); - localStorage.removeItem('kc.idToken'); - localStorage.removeItem('kc.refreshToken'); + ctx.$cookies.remove('kc.token'); + ctx.$cookies.remove('kc.idToken'); + ctx.$cookies.remove('kc.refreshToken'); await keycloak.init({ checkLoginIframe: false }); @@ -73,9 +73,9 @@ const keycloakAuth = async(ctx) => { ctx.store.commit('keycloak/setLoggedIn', keycloak.authenticated); - localStorage.setItem('kc.token', keycloak.token); - localStorage.setItem('kc.idToken', keycloak.idToken); - localStorage.setItem('kc.refreshToken', keycloak.refreshToken); + ctx.$cookies.set('kc.token', keycloak.token); + ctx.$cookies.set('kc.idToken', keycloak.idToken); + ctx.$cookies.set('kc.refreshToken', keycloak.refreshToken); if (keycloak.authenticated) { const profile = await keycloak.loadUserProfile(); @@ -116,8 +116,6 @@ const storeModule = { } }; -// TODO: store tokens etc in cookies instead of localStorage, so that it's -// possible to e.g. reload account page and be auth'd const plugin = async(ctx) => ({ // TODO: use this.auth.createLoginUrl instead get accountUrl() { @@ -212,5 +210,7 @@ const plugin = async(ctx) => ({ export default async(ctx, inject) => { ctx.store.registerModule('keycloak', storeModule); + ctx.store.commit('keycloak/setLoggedIn', !!ctx.$cookies.get('kc.token')); + inject('keycloak', await plugin(ctx)); }; From ec95e607b3697de89ef4556bf858a44262927372 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Fri, 30 Jun 2023 13:30:41 +0100 Subject: [PATCH 21/23] refactor: init keycloak when layout mounted --- packages/portal/src/layouts/default.vue | 2 + packages/portal/src/plugins/keycloak.js | 93 ++++++++++++------------- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/packages/portal/src/layouts/default.vue b/packages/portal/src/layouts/default.vue index f024d75abb..ba013955a1 100644 --- a/packages/portal/src/layouts/default.vue +++ b/packages/portal/src/layouts/default.vue @@ -174,6 +174,8 @@ // Klaro if it fails to. const renderKlaroAfter = this.$waitForMatomo ? this.$waitForMatomo() : Promise.resolve(); renderKlaroAfter.catch(() => {}).finally(this.renderKlaro); + + this.$keycloak?.init(); }, methods: { diff --git a/packages/portal/src/plugins/keycloak.js b/packages/portal/src/plugins/keycloak.js index 9c9d997d6c..071e2370e4 100644 --- a/packages/portal/src/plugins/keycloak.js +++ b/packages/portal/src/plugins/keycloak.js @@ -5,8 +5,8 @@ import Keycloak from 'keycloak-js'; const keycloakAxios = (ctx) => (axiosInstance) => { axiosInstance.interceptors.request.use((requestConfig) => { - if (ctx.$keycloak.auth?.token) { - requestConfig.headers.authorization = `Bearer ${ctx.$keycloak.auth.token}`; + if (ctx.$keycloak.keycloak?.token) { + requestConfig.headers.authorization = `Bearer ${ctx.$keycloak.keycloak.token}`; } return requestConfig; }); @@ -25,65 +25,31 @@ const keycloakResponseErrorHandler = (ctx, error) => { }; const keycloakUnauthorizedResponseErrorHandler = (ctx, error) => { - if (ctx.$keycloak.auth.refreshToken) { + if (ctx.$keycloak.keycloak.refreshToken) { // User has previously logged in, and we have a refresh token, e.g. // access token has expired return keycloakRefreshAccessToken(ctx, error.config); } else { // User has not already logged in, or we have no refresh token: // redirect to OIDC login URL - return ctx.redirect('/account/login', { redirect: route.path }); + return ctx.redirect('/account/login', { redirect: ctx.route.path }); } }; const keycloakRefreshAccessToken = async(ctx, requestConfig) => { - const updated = await ctx.$keycloak.auth.updateToken(-1); + const updated = await ctx.$keycloak.keycloak.updateToken(-1); if (updated) { - ctx.$cookies.set('kc.token', ctx.$keycloak.auth.token); - ctx.$cookies.set('kc.idToken', ctx.$keycloak.auth.idToken); - ctx.$cookies.set('kc.refreshToken', ctx.$keycloak.auth.refreshToken); + ctx.$cookies.set('kc.token', ctx.$keycloak.keycloak.token); + ctx.$cookies.set('kc.idToken', ctx.$keycloak.keycloak.idToken); + ctx.$cookies.set('kc.refreshToken', ctx.$keycloak.keycloak.refreshToken); } else { // Refresh token is no longer valid; clear tokens and try again in case it // doesn't require auth anyway - ctx.$keycloak.auth.clearToken(); + ctx.$keycloak.keycloak.clearToken(); } // Retry request with new access token - return $axios.request(requestConfig); -}; - -const keycloakAuth = async(ctx) => { - const keycloak = new Keycloak(ctx.$config.keycloak); - - try { - await keycloak.init({ - checkLoginIframe: false, - token: ctx.$cookies.get('kc.token'), - idToken: ctx.$cookies.get('kc.idToken'), - refreshToken: ctx.$cookies.get('kc.refreshToken') - }); - } catch (e) { - ctx.$cookies.remove('kc.token'); - ctx.$cookies.remove('kc.idToken'); - ctx.$cookies.remove('kc.refreshToken'); - await keycloak.init({ - checkLoginIframe: false - }); - } - - ctx.store.commit('keycloak/setLoggedIn', keycloak.authenticated); - - ctx.$cookies.set('kc.token', keycloak.token); - ctx.$cookies.set('kc.idToken', keycloak.idToken); - ctx.$cookies.set('kc.refreshToken', keycloak.refreshToken); - - if (keycloak.authenticated) { - const profile = await keycloak.loadUserProfile(); - ctx.store.commit('keycloak/setProfile', profile); - ctx.store.commit('keycloak/setResourceAccess', keycloak.resourceAccess); - } - - return keycloak; + return ctx.$axios.request(requestConfig); }; const storeModule = { @@ -116,8 +82,8 @@ const storeModule = { } }; -const plugin = async(ctx) => ({ - // TODO: use this.auth.createLoginUrl instead +const plugin = (ctx) => ({ + // TODO: use this.keycloak.createLoginUrl instead get accountUrl() { const keycloakAccountUrl = new URL(ctx.$config.keycloak.url); @@ -138,7 +104,6 @@ const plugin = async(ctx) => ({ return keycloakAccountUrl.toString(); }, - auth: process.client && await keycloakAuth(ctx), axios: keycloakAxios(ctx), callback() { let redirect = '/'; @@ -149,8 +114,38 @@ const plugin = async(ctx) => ({ ctx.app.router.replace(redirect); }, + async init() { + try { + await this.keycloak.init({ + checkLoginIframe: false, + token: ctx.$cookies.get('kc.token'), + idToken: ctx.$cookies.get('kc.idToken'), + refreshToken: ctx.$cookies.get('kc.refreshToken') + }); + } catch (e) { + ctx.$cookies.remove('kc.token'); + ctx.$cookies.remove('kc.idToken'); + ctx.$cookies.remove('kc.refreshToken'); + await this.keycloak.init({ + checkLoginIframe: false + }); + } + + ctx.store.commit('keycloak/setLoggedIn', this.keycloak.authenticated); + + ctx.$cookies.set('kc.token', this.keycloak.token); + ctx.$cookies.set('kc.idToken', this.keycloak.idToken); + ctx.$cookies.set('kc.refreshToken', this.keycloak.refreshToken); + + if (this.keycloak.authenticated) { + const profile = await this.keycloak.loadUserProfile(); + ctx.store.commit('keycloak/setProfile', profile); + ctx.store.commit('keycloak/setResourceAccess', this.keycloak.resourceAccess); + } + }, + keycloak: process.client && new Keycloak(ctx.$config.keycloak), login() { - this.auth.login({ + this.keycloak.login({ locale: ctx.i18n.locale, redirectUri: this.loginRedirect }); @@ -174,7 +169,7 @@ const plugin = async(ctx) => ({ return redirectUrl.toString(); }, logout() { - this.auth.logout({ + this.keycloak.logout({ redirectUri: this.logoutRedirect, 'ui_locales': ctx.i18n.locale }); From 684d370ec1b4d5ec11cfa1560e185a89fa7a3dc3 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Fri, 30 Jun 2023 13:34:25 +0100 Subject: [PATCH 22/23] refactor: make logged-in user computed --- packages/portal/src/pages/account/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/portal/src/pages/account/index.vue b/packages/portal/src/pages/account/index.vue index d4c4d8411f..b716b57891 100644 --- a/packages/portal/src/pages/account/index.vue +++ b/packages/portal/src/pages/account/index.vue @@ -188,7 +188,6 @@ data() { return { - loggedInUser: this.$store.state.keycloak.profile, tabHashes: { likes: '#likes', publicGalleries: '#public-galleries', @@ -218,6 +217,7 @@ ...mapState({ likesId: state => state.set.likesId, likedItems: state => state.set.likedItems, + loggedInUser: state => state.keycloak.profile, curations: state => state.set.curations }), activeTab() { From 904d4c5b20b10b74c91a660f065a0b6e96b5ecc8 Mon Sep 17 00:00:00 2001 From: Richard Doe Date: Mon, 3 Jul 2023 10:23:28 +0100 Subject: [PATCH 23/23] refactor: fetch likes when layout mounted --- packages/portal/nuxt.config.js | 1 - packages/portal/src/layouts/default.vue | 18 +++++++++++++++++- .../portal/src/plugins/user-likes.client.js | 12 ------------ packages/portal/src/store/set.js | 4 ++-- 4 files changed, 19 insertions(+), 16 deletions(-) delete mode 100644 packages/portal/src/plugins/user-likes.client.js diff --git a/packages/portal/nuxt.config.js b/packages/portal/nuxt.config.js index 532fde149b..3e6e4a82fb 100644 --- a/packages/portal/nuxt.config.js +++ b/packages/portal/nuxt.config.js @@ -238,7 +238,6 @@ export default { '~/plugins/hotjar.client', '~/plugins/keycloak', '~/plugins/apis', - '~/plugins/user-likes.client', '~/plugins/error', '~/plugins/link', '~/plugins/axios.server', diff --git a/packages/portal/src/layouts/default.vue b/packages/portal/src/layouts/default.vue index ba013955a1..01e741507a 100644 --- a/packages/portal/src/layouts/default.vue +++ b/packages/portal/src/layouts/default.vue @@ -175,10 +175,26 @@ const renderKlaroAfter = this.$waitForMatomo ? this.$waitForMatomo() : Promise.resolve(); renderKlaroAfter.catch(() => {}).finally(this.renderKlaro); - this.$keycloak?.init(); + this.initKeycloak(); }, methods: { + async initKeycloak() { + await this.$keycloak?.init(); + + if (this.$store.state.keycloak?.loggedIn) { + try { + // TODO: assess whether there is a more efficient way to do this with fewer + // API requests + await this.$store.dispatch('set/setLikes'); + await this.$store.dispatch('set/fetchLikes'); + } catch (e) { + // Don't cause everything to break if the Set API is down... + console.error('user likes plugin error', e) + } + } + }, + renderKlaro() { if (this.klaro) { const config = klaroConfig(this.$i18n, this.$initHotjar, this.$matomo); diff --git a/packages/portal/src/plugins/user-likes.client.js b/packages/portal/src/plugins/user-likes.client.js deleted file mode 100644 index d94729186b..0000000000 --- a/packages/portal/src/plugins/user-likes.client.js +++ /dev/null @@ -1,12 +0,0 @@ -export default async({ store }) => { - if (store.state.keycloak.loggedIn) { - try { - // TODO: assess whether there is a more efficient way to do this with fewer - // API requests - await store.dispatch('set/setLikes'); - await store.dispatch('set/fetchLikes'); - } catch (e) { - // Don't cause everything to break if the Set API is down... - } - } -}; diff --git a/packages/portal/src/store/set.js b/packages/portal/src/store/set.js index b5adc2074e..cde48d4053 100644 --- a/packages/portal/src/store/set.js +++ b/packages/portal/src/store/set.js @@ -82,8 +82,8 @@ export default { async removeItem(ctx, { setId, itemId }) { await this.$apis.set.modifyItems('delete', setId, itemId); }, - async setLikes({ commit }) { - const likesId = await this.$apis.set.getLikes(this.$store.state.keycloak.profile ? this.$store.state.keycloak.profile.id : null); + async setLikes({ commit, rootState }) { + const likesId = await this.$apis.set.getLikes(rootState.keycloak?.profile?.id || null); commit('setLikesId', likesId); }, async createLikes({ commit }) {