From a9591043335883fe94cd378d104013225cc040c9 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Mon, 21 Feb 2022 11:14:20 -0500 Subject: [PATCH 01/23] Create service worker in app --- src/App.js | 2 ++ src/services/sw/sw.js | 2 ++ src/sw.js | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 1c1b3a8c2..deb413540 100644 --- a/src/App.js +++ b/src/App.js @@ -14,6 +14,7 @@ import EditStatusModal from './components/edit_status_modal/edit_status_modal.vu import PostStatusModal from './components/post_status_modal/post_status_modal.vue' import StatusHistoryModal from './components/status_history_modal/status_history_modal.vue' import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' +import { getOrCreateServiceWorker } from './services/sw/sw' import { windowWidth, windowHeight } from './services/window_utils/window_utils' import { mapGetters } from 'vuex' import { defineAsyncComponent } from 'vue' @@ -65,6 +66,7 @@ export default { if (useInterfaceStore().themeApplied) { this.removeSplash() } + getOrCreateServiceWorker() }, unmounted () { window.removeEventListener('resize', this.updateMobileState) diff --git a/src/services/sw/sw.js b/src/services/sw/sw.js index 2133db222..0eea849b1 100644 --- a/src/services/sw/sw.js +++ b/src/services/sw/sw.js @@ -146,3 +146,5 @@ export function unregisterPushNotifications (token) { ]).catch((e) => console.warn(`Failed to disable Web Push Notifications: ${e.message}`)) } } + +export { getOrCreateServiceWorker } diff --git a/src/sw.js b/src/sw.js index 3c53d5339..af21a8746 100644 --- a/src/sw.js +++ b/src/sw.js @@ -143,4 +143,4 @@ self.addEventListener('notificationclick', (event) => { })) }) -console.log('sw here') +self.addEventListener('fetch', _ => _) From 2b16dd55c408e8b057a08924cb8bbf8dafba1b81 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Thu, 12 Aug 2021 22:42:08 -0400 Subject: [PATCH 02/23] Cache compiled assets in service worker --- src/sw.js | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/sw.js b/src/sw.js index af21a8746..2b2d2f3e9 100644 --- a/src/sw.js +++ b/src/sw.js @@ -85,6 +85,35 @@ const showPushNotification = async (event) => { return Promise.resolve() } +const shouldCache = process.env.NODE_ENV === 'production' +const cacheKey = 'pleroma-fe' +const cacheFiles = self.serviceWorkerOption.assets + +self.addEventListener('install', async (event) => { + if (shouldCache) { + event.waitUntil((async () => { + const cache = await caches.open(cacheKey) + await cache.addAll(cacheFiles) + })()) + } +}) + +self.addEventListener('activate', async (event) => { + if (shouldCache) { + event.waitUntil((async () => { + const cache = await caches.open(cacheKey) + const keys = await cache.keys() + await Promise.all( + keys.filter(request => { + const url = new URL(request.url) + const shouldKeep = cacheFiles.includes(url.pathname) + return !shouldKeep + }).map(k => cache.delete(k)) + ) + })()) + } +}) + self.addEventListener('push', async (event) => { if (event.data) { // Supposedly, we HAVE to return a promise inside waitUntil otherwise it will @@ -143,4 +172,16 @@ self.addEventListener('notificationclick', (event) => { })) }) -self.addEventListener('fetch', _ => _) +self.addEventListener('fetch', async (event) => { + if (shouldCache) { + event.respondWith((async () => { + const r = await caches.match(event.request) + console.log(`[Service Worker] Fetching resource: ${event.request.url}`) + if (r) { + return r + } + const response = await fetch(event.request) + return response + })()) + } +}) From 63490ad2daf6a49ecfa374e38f678d6606ac95bc Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Sun, 15 Aug 2021 10:51:49 -0400 Subject: [PATCH 03/23] Cache emojis in service worker --- src/sw.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/sw.js b/src/sw.js index 2b2d2f3e9..94c0a93e8 100644 --- a/src/sw.js +++ b/src/sw.js @@ -88,6 +88,16 @@ const showPushNotification = async (event) => { const shouldCache = process.env.NODE_ENV === 'production' const cacheKey = 'pleroma-fe' const cacheFiles = self.serviceWorkerOption.assets +const emojiCacheKey = 'pleroma-fe-emoji' +const isEmoji = req => { + console.log('req.method=', req.method) + if (req.method !== 'GET') { + return false + } + const url = new URL(req.url) + console.log('pathname=', url.pathname) + return url.pathname.startsWith('/emoji/') +} self.addEventListener('install', async (event) => { if (shouldCache) { @@ -180,7 +190,13 @@ self.addEventListener('fetch', async (event) => { if (r) { return r } + const response = await fetch(event.request) + if (response.ok && isEmoji(event.request)) { + console.log(`[Service Worker] Caching emoji ${event.request.url}`) + const cache = await caches.open(emojiCacheKey) + await cache.put(event.request.clone(), response.clone()) + } return response })()) } From f1f7f5de5126d3aad3ca58d416677225ce080950 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Tue, 11 Jan 2022 23:03:46 -0500 Subject: [PATCH 04/23] Fix the bug where remote media fail to load without media proxy --- src/sw.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/sw.js b/src/sw.js index 94c0a93e8..65ab49c3c 100644 --- a/src/sw.js +++ b/src/sw.js @@ -182,8 +182,12 @@ self.addEventListener('notificationclick', (event) => { })) }) -self.addEventListener('fetch', async (event) => { - if (shouldCache) { +self.addEventListener('fetch', (event) => { + console.log(`[Service Worker] Got: ${event.request.url}`) + console.debug(event.request) + // Do not mess up with remote things + const isSameOrigin = (new URL(event.request.url)).origin === self.location.origin + if (shouldCache && event.request.method === 'GET' && isSameOrigin) { event.respondWith((async () => { const r = await caches.match(event.request) console.log(`[Service Worker] Fetching resource: ${event.request.url}`) @@ -191,13 +195,18 @@ self.addEventListener('fetch', async (event) => { return r } - const response = await fetch(event.request) - if (response.ok && isEmoji(event.request)) { - console.log(`[Service Worker] Caching emoji ${event.request.url}`) - const cache = await caches.open(emojiCacheKey) - await cache.put(event.request.clone(), response.clone()) + try { + const response = await fetch(event.request) + if (response.ok && isEmoji(event.request)) { + console.log(`[Service Worker] Caching emoji ${event.request.url}`) + const cache = await caches.open(emojiCacheKey) + await cache.put(event.request.clone(), response.clone()) + } + return response + } catch (e) { + console.log('error:', e) + throw e } - return response })()) } }) From 6ab98db7ad7a611c35fe5c7077079f6741cfe3f3 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Mon, 21 Feb 2022 11:19:10 -0500 Subject: [PATCH 05/23] Clean up debug code --- src/sw.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/sw.js b/src/sw.js index 65ab49c3c..87eb484a5 100644 --- a/src/sw.js +++ b/src/sw.js @@ -90,12 +90,11 @@ const cacheKey = 'pleroma-fe' const cacheFiles = self.serviceWorkerOption.assets const emojiCacheKey = 'pleroma-fe-emoji' const isEmoji = req => { - console.log('req.method=', req.method) if (req.method !== 'GET') { return false } const url = new URL(req.url) - console.log('pathname=', url.pathname) + return url.pathname.startsWith('/emoji/') } @@ -183,14 +182,12 @@ self.addEventListener('notificationclick', (event) => { }) self.addEventListener('fetch', (event) => { - console.log(`[Service Worker] Got: ${event.request.url}`) - console.debug(event.request) // Do not mess up with remote things const isSameOrigin = (new URL(event.request.url)).origin === self.location.origin if (shouldCache && event.request.method === 'GET' && isSameOrigin) { event.respondWith((async () => { const r = await caches.match(event.request) - console.log(`[Service Worker] Fetching resource: ${event.request.url}`) + if (r) { return r } @@ -198,13 +195,11 @@ self.addEventListener('fetch', (event) => { try { const response = await fetch(event.request) if (response.ok && isEmoji(event.request)) { - console.log(`[Service Worker] Caching emoji ${event.request.url}`) const cache = await caches.open(emojiCacheKey) await cache.put(event.request.clone(), response.clone()) } return response } catch (e) { - console.log('error:', e) throw e } })()) From ed04c2ac710cb51f01d34efcfdf8d007fa764c16 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 26 May 2023 16:37:06 -0400 Subject: [PATCH 06/23] Exclude local media requests --- src/sw.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/sw.js b/src/sw.js index 87eb484a5..c53927a32 100644 --- a/src/sw.js +++ b/src/sw.js @@ -97,6 +97,15 @@ const isEmoji = req => { return url.pathname.startsWith('/emoji/') } +const isNotMedia = req => { + console.log('req.method=', req.method) + if (req.method !== 'GET') { + return false + } + const url = new URL(req.url) + console.log('pathname=', url.pathname) + return !url.pathname.startsWith('/media/') +} self.addEventListener('install', async (event) => { if (shouldCache) { @@ -184,7 +193,7 @@ self.addEventListener('notificationclick', (event) => { self.addEventListener('fetch', (event) => { // Do not mess up with remote things const isSameOrigin = (new URL(event.request.url)).origin === self.location.origin - if (shouldCache && event.request.method === 'GET' && isSameOrigin) { + if (shouldCache && event.request.method === 'GET' && isSameOrigin && isNotMedia(event.request)) { event.respondWith((async () => { const r = await caches.match(event.request) From cc4d4ccbeb933738e52c9cfd85549215447ea5d4 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 16 Jun 2023 23:12:20 -0400 Subject: [PATCH 07/23] Treat html file as failure in emoji cache --- src/sw.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/sw.js b/src/sw.js index c53927a32..3e7af8fcb 100644 --- a/src/sw.js +++ b/src/sw.js @@ -193,17 +193,22 @@ self.addEventListener('notificationclick', (event) => { self.addEventListener('fetch', (event) => { // Do not mess up with remote things const isSameOrigin = (new URL(event.request.url)).origin === self.location.origin + const isEmojiSuccessful = (resp) => { + const type = resp.headers.get('Content-Type') + // Backend will revert to index.html if the file does not exist, so text/html for emojis is a failure + return type && !type.includes('text/html') + } if (shouldCache && event.request.method === 'GET' && isSameOrigin && isNotMedia(event.request)) { event.respondWith((async () => { const r = await caches.match(event.request) - if (r) { + if (r && (isEmojiSuccessful(r) || !isEmoji(event.request))) { return r } try { const response = await fetch(event.request) - if (response.ok && isEmoji(event.request)) { + if (response.ok && isEmojiSuccessful(response) && isEmoji(event.request)) { const cache = await caches.open(emojiCacheKey) await cache.put(event.request.clone(), response.clone()) } From 3315901b077512d3dfaa74e20ad64858a569d6b5 Mon Sep 17 00:00:00 2001 From: tusooa Date: Thu, 22 Aug 2024 21:41:14 -0400 Subject: [PATCH 08/23] Add changelog for caching assets --- changelog.d/sw-cache-assets.add | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/sw-cache-assets.add diff --git a/changelog.d/sw-cache-assets.add b/changelog.d/sw-cache-assets.add new file mode 100644 index 000000000..5f7414eee --- /dev/null +++ b/changelog.d/sw-cache-assets.add @@ -0,0 +1 @@ +Cache assets and emojis with service worker From 67724ad2a437ac380146ea33550e036f1b20cb14 Mon Sep 17 00:00:00 2001 From: tusooa Date: Thu, 22 Aug 2024 21:44:55 -0400 Subject: [PATCH 09/23] Fix useless try-catch --- src/sw.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sw.js b/src/sw.js index 3e7af8fcb..daf4cdd19 100644 --- a/src/sw.js +++ b/src/sw.js @@ -214,6 +214,7 @@ self.addEventListener('fetch', (event) => { } return response } catch (e) { + console.error('[Service worker] error when caching emoji:', e) throw e } })()) From e21bac3d704d42b650b56976b46c42ad9216feaf Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 23 Aug 2024 00:31:03 -0400 Subject: [PATCH 10/23] Implement clearing caches in settings --- .../settings_modal/tabs/general_tab.js | 16 +++++++++++++ .../settings_modal/tabs/general_tab.vue | 23 +++++++++++++++++++ src/i18n/en.json | 5 +++- src/services/sw/sw.js | 6 +++++ src/sw.js | 4 +--- 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 517f54eb1..9275d9e6f 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -8,6 +8,7 @@ import InterfaceLanguageSwitcher from 'src/components/interface_language_switche import SharedComputedObject from '../helpers/shared_computed_object.js' import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue' +import { clearCache, cacheKey, emojiCacheKey } from 'src/services/sw/sw.js' import { library } from '@fortawesome/fontawesome-svg-core' import { faGlobe @@ -98,6 +99,21 @@ const GeneralTab = { methods: { changeDefaultScope (value) { this.$store.dispatch('setProfileOption', { name: 'defaultScope', value }) + }, + clearCache (key) { + clearCache(key) + .then((v) => { + this.$store.dispatch('settingsSaved', { success: true }) + }) + .catch(error => { + this.$store.dispatch('settingsSaved', { error }) + }) + }, + clearAssetCache () { + this.clearCache(cacheKey) + }, + clearEmojiCache () { + this.clearCache(emojiCacheKey) } } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 02396114f..b8da782fb 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -509,6 +509,29 @@ +
+

{{ $t('settings.cache') }}

+
    +
  • + +
  • +
  • + +
  • +
+
diff --git a/src/i18n/en.json b/src/i18n/en.json index 9d3400d10..304a64ea3 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1049,7 +1049,10 @@ "reset_value": "Reset", "reset_value_tooltip": "Reset draft", "hard_reset_value": "Hard reset", - "hard_reset_value_tooltip": "Remove setting from storage, forcing use of default value" + "hard_reset_value_tooltip": "Remove setting from storage, forcing use of default value", + "cache": "Cache", + "clear_asset_cache": "Clear asset cache", + "clear_emoji_cache": "Clear emoji cache" }, "admin_dash": { "window_title": "Administration", diff --git a/src/services/sw/sw.js b/src/services/sw/sw.js index 0eea849b1..a986e98dd 100644 --- a/src/services/sw/sw.js +++ b/src/services/sw/sw.js @@ -147,4 +147,10 @@ export function unregisterPushNotifications (token) { } } +export const shouldCache = process.env.NODE_ENV === 'production' +export const cacheKey = 'pleroma-fe' +export const emojiCacheKey = 'pleroma-fe-emoji' + +export const clearCache = (key) => caches.delete(key) + export { getOrCreateServiceWorker } diff --git a/src/sw.js b/src/sw.js index daf4cdd19..2ce1a0648 100644 --- a/src/sw.js +++ b/src/sw.js @@ -3,6 +3,7 @@ import { storage } from 'src/lib/storage.js' import { parseNotification } from './services/entity_normalizer/entity_normalizer.service.js' import { prepareNotificationObject } from './services/notification_utils/notification_utils.js' +import { shouldCache, cacheKey, emojiCacheKey } from './services/sw/sw.js' import { createI18n } from 'vue-i18n' // Collects all messages for service workers // Needed because service workers cannot use dynamic imports @@ -85,10 +86,7 @@ const showPushNotification = async (event) => { return Promise.resolve() } -const shouldCache = process.env.NODE_ENV === 'production' -const cacheKey = 'pleroma-fe' const cacheFiles = self.serviceWorkerOption.assets -const emojiCacheKey = 'pleroma-fe-emoji' const isEmoji = req => { if (req.method !== 'GET') { return false From bbeafab1efca446c984eae037d78732c8e6fcc69 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 23 Aug 2024 01:45:36 -0400 Subject: [PATCH 11/23] Verify response is not html when pre-caching in install event --- src/sw.js | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/sw.js b/src/sw.js index 2ce1a0648..f9ae8dc17 100644 --- a/src/sw.js +++ b/src/sw.js @@ -105,11 +105,35 @@ const isNotMedia = req => { return !url.pathname.startsWith('/media/') } +const isSuccessful = (resp) => { + if (!resp.ok) { + return false + } + if ((new URL(resp.url)).pathname === '/index.html') { + // For index.html itself, there is no fallback possible. + return true + } + const type = resp.headers.get('Content-Type') + // Backend will revert to index.html if the file does not exist, so text/html for emojis and assets is a failure + return type && !type.includes('text/html') +} + self.addEventListener('install', async (event) => { if (shouldCache) { event.waitUntil((async () => { const cache = await caches.open(cacheKey) - await cache.addAll(cacheFiles) + await Promise.allSettled(cacheFiles.map(async (route) => { + // https://developer.mozilla.org/en-US/docs/Web/API/Cache/add + // originally we used addAll() but it will raise a problem in one edge case: + // when the file for the route is not found, backend will return index.html with code 200 + // but it's wrong, and it's cached, so we end up with a bad cache. + // this can happen when you refresh when you are in the process of upgrading + // the frontend. + const resp = await fetch(route) + if (isSuccessful(resp)) { + await cache.put(route, resp) + } + })) })()) } }) @@ -191,22 +215,17 @@ self.addEventListener('notificationclick', (event) => { self.addEventListener('fetch', (event) => { // Do not mess up with remote things const isSameOrigin = (new URL(event.request.url)).origin === self.location.origin - const isEmojiSuccessful = (resp) => { - const type = resp.headers.get('Content-Type') - // Backend will revert to index.html if the file does not exist, so text/html for emojis is a failure - return type && !type.includes('text/html') - } if (shouldCache && event.request.method === 'GET' && isSameOrigin && isNotMedia(event.request)) { event.respondWith((async () => { const r = await caches.match(event.request) - if (r && (isEmojiSuccessful(r) || !isEmoji(event.request))) { + if (r && (isSuccessful(r) || !isEmoji(event.request))) { return r } try { const response = await fetch(event.request) - if (response.ok && isEmojiSuccessful(response) && isEmoji(event.request)) { + if (response.ok && isSuccessful(response) && isEmoji(event.request)) { const cache = await caches.open(emojiCacheKey) await cache.put(event.request.clone(), response.clone()) } From 8b8f6cbca243f356b6a16c01d6f6900cfc9eccb9 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 23 Aug 2024 02:49:07 -0400 Subject: [PATCH 12/23] Cache assets when cache is missing --- src/sw.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/sw.js b/src/sw.js index f9ae8dc17..aa061e14f 100644 --- a/src/sw.js +++ b/src/sw.js @@ -96,14 +96,16 @@ const isEmoji = req => { return url.pathname.startsWith('/emoji/') } const isNotMedia = req => { - console.log('req.method=', req.method) if (req.method !== 'GET') { return false } const url = new URL(req.url) - console.log('pathname=', url.pathname) return !url.pathname.startsWith('/media/') } +const isAsset = req => { + const url = new URL(req.url) + return cacheFiles.includes(url.pathname) +} const isSuccessful = (resp) => { if (!resp.ok) { @@ -216,17 +218,23 @@ self.addEventListener('fetch', (event) => { // Do not mess up with remote things const isSameOrigin = (new URL(event.request.url)).origin === self.location.origin if (shouldCache && event.request.method === 'GET' && isSameOrigin && isNotMedia(event.request)) { + console.debug('[Service worker] fetch:', event.request.url) event.respondWith((async () => { const r = await caches.match(event.request) + const isEmojiReq = isEmoji(event.request) - if (r && (isSuccessful(r) || !isEmoji(event.request))) { + if (r && isSuccessful(r)) { + console.debug('[Service worker] already cached:', event.request.url) return r } try { const response = await fetch(event.request) - if (response.ok && isSuccessful(response) && isEmoji(event.request)) { - const cache = await caches.open(emojiCacheKey) + if (response.ok && + isSuccessful(response) && + (isEmojiReq || isAsset(event.request))) { + console.debug(`[Service worker] caching ${isEmojiReq ? 'emoji' : 'asset'}:`, event.request.url) + const cache = await caches.open(isEmojiReq ? emojiCacheKey : cacheKey) await cache.put(event.request.clone(), response.clone()) } return response From 652781fcc8ff1384555383bf1d81bc893cc28fc5 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 23 Aug 2024 02:57:44 -0400 Subject: [PATCH 13/23] Do not preload emoji annotations and i18n files --- src/sw.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sw.js b/src/sw.js index aa061e14f..8c83762ee 100644 --- a/src/sw.js +++ b/src/sw.js @@ -123,8 +123,12 @@ const isSuccessful = (resp) => { self.addEventListener('install', async (event) => { if (shouldCache) { event.waitUntil((async () => { + // Do not preload i18n and emoji annotations to speed up loading + const shouldPreload = (route) => { + return !route.startsWith('/static/js/i18n/') && !route.startsWith('/static/js/emoji-annotations/') + } const cache = await caches.open(cacheKey) - await Promise.allSettled(cacheFiles.map(async (route) => { + await Promise.allSettled(cacheFiles.filter(shouldPreload).map(async (route) => { // https://developer.mozilla.org/en-US/docs/Web/API/Cache/add // originally we used addAll() but it will raise a problem in one edge case: // when the file for the route is not found, backend will return index.html with code 200 From 0cb47652b88a0c2a3a7572f784246b7ed51dc2a1 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 4 Mar 2025 18:39:20 -0500 Subject: [PATCH 14/23] Make asset caching work with vite --- build/sw_plugin.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++ src/sw.js | 1 + vite.config.js | 9 ++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/build/sw_plugin.js b/build/sw_plugin.js index 90ab856ad..a2c792b7d 100644 --- a/build/sw_plugin.js +++ b/build/sw_plugin.js @@ -11,6 +11,11 @@ const getSWMessagesAsText = async () => { } const projectRoot = dirname(dirname(fileURLToPath(import.meta.url))) +const swEnvName = 'virtual:pleroma-fe/service_worker_env' +const swEnvNameResolved = '\0' + swEnvName +const getDevSwEnv = () => `self.serviceWorkerOption = { assets: [] };` +const getProdSwEnv = ({ assets }) => `self.serviceWorkerOption = { assets: ${JSON.stringify(assets)} };` + export const devSwPlugin = ({ swSrc, swDest, @@ -32,12 +37,16 @@ export const devSwPlugin = ({ const name = id.startsWith('/') ? id.slice(1) : id if (name === swDest) { return swFullSrc + } else if (name === swEnvName) { + return swEnvNameResolved } return null }, async load (id) { if (id === swFullSrc) { return readFile(swFullSrc, 'utf-8') + } else if (id === swEnvNameResolved) { + return getDevSwEnv() } return null }, @@ -79,6 +88,21 @@ export const devSwPlugin = ({ contents: await getSWMessagesAsText() })) } + }, { + name: 'sw-env', + setup (b) { + b.onResolve( + { filter: new RegExp('^' + swEnvName + '$') }, + args => ({ + path: args.path, + namespace: 'sw-env' + })) + b.onLoad( + { filter: /.*/, namespace: 'sw-env' }, + () => ({ + contents: getDevSwEnv() + })) + } }] }) const text = res.outputFiles[0].text @@ -126,6 +150,30 @@ export const buildSwPlugin = ({ configFile: false } }, + generateBundle: { + order: 'post', + sequential: true, + async handler (_, bundle) { + const assets = Object.keys(bundle) + .filter(name => !/\.map$/.test(name)) + .map(name => '/' + name) + config.plugins.push({ + name: 'build-sw-env-plugin', + resolveId (id) { + if (id === swEnvName) { + return swEnvNameResolved + } + return null + }, + load (id) { + if (id === swEnvNameResolved) { + return getProdSwEnv({ assets }) + } + return null + } + }) + } + }, closeBundle: { order: 'post', sequential: true, diff --git a/src/sw.js b/src/sw.js index 8c83762ee..7ba910589 100644 --- a/src/sw.js +++ b/src/sw.js @@ -1,5 +1,6 @@ /* eslint-env serviceworker */ +import 'virtual:pleroma-fe/service_worker_env' import { storage } from 'src/lib/storage.js' import { parseNotification } from './services/entity_normalizer/entity_normalizer.service.js' import { prepareNotificationObject } from './services/notification_utils/notification_utils.js' diff --git a/vite.config.js b/vite.config.js index 2abf18e50..4f78fc43e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -165,7 +165,14 @@ export default defineConfig(async ({ mode, command }) => { return 'static/js/[name].[hash].js' } }, - chunkFileNames () { + chunkFileNames (chunkInfo) { + if (chunkInfo.facadeModuleId) { + if (chunkInfo.facadeModuleId.includes('node_modules/@kazvmoe-infra/unicode-emoji-json/annotations/')) { + return 'static/js/emoji-annotations/[name].[hash].js' + } else if (chunkInfo.facadeModuleId.includes('src/i18n/')) { + return 'static/js/i18n/[name].[hash].js' + } + } return 'static/js/[name].[hash].js' }, assetFileNames (assetInfo) { From 7f880dea0e33b6a52ad645b212e79867dc5907b3 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 4 Mar 2025 19:37:24 -0500 Subject: [PATCH 15/23] Fix clear cache lint --- src/components/settings_modal/tabs/general_tab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 9275d9e6f..df28a23e3 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -102,7 +102,7 @@ const GeneralTab = { }, clearCache (key) { clearCache(key) - .then((v) => { + .then(() => { this.$store.dispatch('settingsSaved', { success: true }) }) .catch(error => { From 62c5939df61fa575dfd85b9b392ff7bcdd35134b Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Wed, 14 May 2025 09:04:25 +0000 Subject: [PATCH 16/23] Update dependency semver to v7.7.2 --- package.json | 2 +- yarn.lock | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2f9896d18..121323ad8 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "postcss-scss": "^4.0.6", "sass": "1.87.0", "selenium-server": "3.141.59", - "semver": "7.7.1", + "semver": "7.7.2", "serve-static": "2.2.0", "shelljs": "0.9.2", "sinon": "20.0.0", diff --git a/yarn.lock b/yarn.lock index 2f86adfef..fca665da9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6872,10 +6872,10 @@ semver@7.5.4: dependencies: lru-cache "^6.0.0" -semver@7.7.1, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== +semver@7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== semver@^5.5.0, semver@^5.6.0: version "5.7.2" @@ -6887,6 +6887,11 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + send@^1.1.0, send@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" From 3390377a263f6d18c3d966aaa9a005e4b307e3d9 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Fri, 16 May 2025 09:04:50 +0000 Subject: [PATCH 17/23] Update dependency shelljs to v0.10.0 --- package.json | 2 +- yarn.lock | 146 ++++++++++++++++++--------------------------------- 2 files changed, 53 insertions(+), 95 deletions(-) diff --git a/package.json b/package.json index 2f9896d18..e7bd82e83 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "selenium-server": "3.141.59", "semver": "7.7.1", "serve-static": "2.2.0", - "shelljs": "0.9.2", + "shelljs": "0.10.0", "sinon": "20.0.0", "sinon-chai": "4.0.0", "stylelint": "16.19.1", diff --git a/yarn.lock b/yarn.lock index 2f86adfef..859b6b561 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3348,17 +3348,6 @@ cross-spawn@7.0.6, cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -cross-spawn@^6.0.0: - version "6.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - css-functions-list@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.3.tgz#95652b0c24f0f59b291a9fc386041a19d4f40dbe" @@ -4199,18 +4188,20 @@ eventsource@^3.0.2: dependencies: eventsource-parser "^3.0.1" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" expect-type@^1.2.1: version "1.2.1" @@ -4556,13 +4547,6 @@ get-proto@^1.0.0, get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -4570,6 +4554,11 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" @@ -4868,6 +4857,11 @@ https-proxy-agent@^7.0.5, https-proxy-agent@^7.0.6: agent-base "^7.1.2" debug "4" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -4940,11 +4934,6 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - ip-address@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" @@ -5163,10 +5152,10 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.4: dependencies: call-bound "^1.0.3" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.7, is-string@^1.1.1: version "1.1.1" @@ -5650,6 +5639,11 @@ merge-descriptors@^2.0.0: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -5842,11 +5836,6 @@ netmask@^2.0.2: resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - nightwatch-axe-verbose@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/nightwatch-axe-verbose/-/nightwatch-axe-verbose-2.3.1.tgz#42cd226989cb5205b699db42d74b1b967587d099" @@ -5921,12 +5910,12 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - path-key "^2.0.0" + path-key "^3.0.0" nth-check@^2.1.1: version "2.1.1" @@ -6018,7 +6007,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -6075,11 +6064,6 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -6203,12 +6187,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -6596,13 +6575,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" @@ -6705,7 +6677,7 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.22.4: +resolve@^1.14.2, resolve@^1.22.4: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -6877,7 +6849,7 @@ semver@7.7.1, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -semver@^5.5.0, semver@^5.6.0: +semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -6974,13 +6946,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -6988,25 +6953,18 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.9.2.tgz#a8ac724434520cd7ae24d52071e37a18ac2bb183" - integrity sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw== +shelljs@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.10.0.tgz#e3bbae99b0f3f0cc5dce05b46a346fae2090e883" + integrity sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw== dependencies: - execa "^1.0.0" + execa "^5.1.1" fast-glob "^3.3.2" - interpret "^1.0.0" - rechoir "^0.6.2" side-channel-list@^1.0.0: version "1.0.0" @@ -7053,7 +7011,7 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -7293,10 +7251,10 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" @@ -8025,7 +7983,7 @@ which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.18: gopd "^1.2.0" has-tostringtag "^1.0.2" -which@^1.2.9, which@^1.3.1: +which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 8259526be6049549ba1e509366f049e349640492 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Mon, 9 Jun 2025 09:05:41 +0000 Subject: [PATCH 18/23] Update dependency msw to v2.10.2 --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 2f9896d18..15a660a90 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "http-proxy-middleware": "3.0.5", "iso-639-1": "3.1.5", "lodash": "4.17.21", - "msw": "2.7.6", + "msw": "2.10.2", "nightwatch": "3.12.1", "playwright": "1.52.0", "postcss": "8.5.3", diff --git a/yarn.lock b/yarn.lock index 2f86adfef..fadc4319a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1622,10 +1622,10 @@ zod "^3.23.8" zod-to-json-schema "^3.24.1" -"@mswjs/interceptors@^0.37.0": - version "0.37.6" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.37.6.tgz#2635319b7a81934e1ef1b5593ef7910347e2b761" - integrity sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w== +"@mswjs/interceptors@^0.39.1": + version "0.39.2" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.39.2.tgz#de9de0ab23f99d387c7904df7219a92157d1d666" + integrity sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg== dependencies: "@open-draft/deferred-promise" "^2.2.0" "@open-draft/logger" "^0.3.0" @@ -5793,16 +5793,16 @@ ms@2.1.3, ms@^2.1.1, ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msw@2.7.6: - version "2.7.6" - resolved "https://registry.yarnpkg.com/msw/-/msw-2.7.6.tgz#1471ce4311f4c173f287dced31dee211b6958deb" - integrity sha512-P+rwn43ktxN8ghcl8q+hSAUlEi0PbJpDhGmDkw4zeUnRj3hBCVynWD+dTu38yLYKCE9ZF1OYcvpy7CTBRcqkZA== +msw@2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.10.2.tgz#e7a56ed0b6865b00a30b4c4a5b59e5388fd48315" + integrity sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ== dependencies: "@bundled-es-modules/cookie" "^2.0.1" "@bundled-es-modules/statuses" "^1.0.1" "@bundled-es-modules/tough-cookie" "^0.1.6" "@inquirer/confirm" "^5.0.0" - "@mswjs/interceptors" "^0.37.0" + "@mswjs/interceptors" "^0.39.1" "@open-draft/deferred-promise" "^2.2.0" "@open-draft/until" "^2.1.0" "@types/cookie" "^0.6.0" From afce8c715dd305643bb7454f777130931253cc45 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Tue, 10 Jun 2025 09:06:12 +0000 Subject: [PATCH 19/23] Update dependency sass to v1.89.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2f9896d18..11f8325b7 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "postcss": "8.5.3", "postcss-html": "^1.5.0", "postcss-scss": "^4.0.6", - "sass": "1.87.0", + "sass": "1.89.2", "selenium-server": "3.141.59", "semver": "7.7.1", "serve-static": "2.2.0", diff --git a/yarn.lock b/yarn.lock index 2f86adfef..3cabf83df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6832,10 +6832,10 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@1.87.0: - version "1.87.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.87.0.tgz#8cceb36fa63fb48a8d5d7f2f4c13b49c524b723e" - integrity sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw== +sass@1.89.2: + version "1.89.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.89.2.tgz#a771716aeae774e2b529f72c0ff2dfd46c9de10e" + integrity sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA== dependencies: chokidar "^4.0.0" immutable "^5.0.2" From 598bdb613274a43e81a88977b83d729773b6ec34 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Thu, 19 Jun 2025 08:53:00 +0000 Subject: [PATCH 20/23] Update vue monorepo to v3.5.17 --- package.json | 4 +- yarn.lock | 141 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 108 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 2f9896d18..d3edb739d 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "url": "0.11.4", "utf8": "3.0.0", "uuid": "11.1.0", - "vue": "3.5.13", + "vue": "3.5.17", "vue-i18n": "11", "vue-router": "4.5.1", "vue-virtual-scroller": "^2.0.0-beta.7", @@ -66,7 +66,7 @@ "@vitest/ui": "^3.0.7", "@vue/babel-helper-vue-jsx-merge-props": "1.4.0", "@vue/babel-plugin-jsx": "1.4.0", - "@vue/compiler-sfc": "3.5.13", + "@vue/compiler-sfc": "3.5.17", "@vue/test-utils": "2.4.6", "autoprefixer": "10.4.21", "babel-plugin-lodash": "3.3.4", diff --git a/yarn.lock b/yarn.lock index 2f86adfef..0206d1d50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -411,6 +411,13 @@ dependencies: "@babel/types" "^7.27.1" +"@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== + dependencies: + "@babel/types" "^7.27.3" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" @@ -1061,6 +1068,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.27.3": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535" + integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@bazel/runfiles@^6.3.1": version "6.3.1" resolved "https://registry.yarnpkg.com/@bazel/runfiles/-/runfiles-6.3.1.tgz#3f8824b2d82853377799d42354b4df78ab0ace0b" @@ -2309,6 +2324,17 @@ estree-walker "^2.0.2" source-map-js "^1.2.0" +"@vue/compiler-core@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.17.tgz#23d291bd01b863da3ef2e26e7db84d8e01a9b4c5" + integrity sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA== + dependencies: + "@babel/parser" "^7.27.5" + "@vue/shared" "3.5.17" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.1" + "@vue/compiler-dom@3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" @@ -2317,7 +2343,30 @@ "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" -"@vue/compiler-sfc@3.5.13", "@vue/compiler-sfc@^3.5.13": +"@vue/compiler-dom@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz#7bc19a20e23b670243a64b47ce3a890239b870be" + integrity sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ== + dependencies: + "@vue/compiler-core" "3.5.17" + "@vue/shared" "3.5.17" + +"@vue/compiler-sfc@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz#c518871276e26593612bdab36f3f5bcd053b13bf" + integrity sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww== + dependencies: + "@babel/parser" "^7.27.5" + "@vue/compiler-core" "3.5.17" + "@vue/compiler-dom" "3.5.17" + "@vue/compiler-ssr" "3.5.17" + "@vue/shared" "3.5.17" + estree-walker "^2.0.2" + magic-string "^0.30.17" + postcss "^8.5.6" + source-map-js "^1.2.1" + +"@vue/compiler-sfc@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== @@ -2340,6 +2389,14 @@ "@vue/compiler-dom" "3.5.13" "@vue/shared" "3.5.13" +"@vue/compiler-ssr@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz#14ba3b7bba6e0e1fd02002316263165a5d1046c7" + integrity sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ== + dependencies: + "@vue/compiler-dom" "3.5.17" + "@vue/shared" "3.5.17" + "@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.6.4": version "6.6.4" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343" @@ -2372,44 +2429,49 @@ dependencies: rfdc "^1.4.1" -"@vue/reactivity@3.5.13": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f" - integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg== +"@vue/reactivity@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.17.tgz#169b5dcf96c7f23788e5ed9745ec8a7227f2125e" + integrity sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw== dependencies: - "@vue/shared" "3.5.13" + "@vue/shared" "3.5.17" -"@vue/runtime-core@3.5.13": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455" - integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== +"@vue/runtime-core@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.17.tgz#b17bd41e13011e85e9b1025545292d43f5512730" + integrity sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q== dependencies: - "@vue/reactivity" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/reactivity" "3.5.17" + "@vue/shared" "3.5.17" -"@vue/runtime-dom@3.5.13": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215" - integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== +"@vue/runtime-dom@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz#8e325e29cd03097fe179032fc8df384a426fc83a" + integrity sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g== dependencies: - "@vue/reactivity" "3.5.13" - "@vue/runtime-core" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/reactivity" "3.5.17" + "@vue/runtime-core" "3.5.17" + "@vue/shared" "3.5.17" csstype "^3.1.3" -"@vue/server-renderer@3.5.13": - version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7" - integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== +"@vue/server-renderer@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.17.tgz#9b8fd6a40a3d55322509fafe78ac841ede649fbe" + integrity sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA== dependencies: - "@vue/compiler-ssr" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/compiler-ssr" "3.5.17" + "@vue/shared" "3.5.17" "@vue/shared@3.5.13", "@vue/shared@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== +"@vue/shared@3.5.17": + version "3.5.17" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.17.tgz#e8b3a41f0be76499882a89e8ed40d86a70fa4b70" + integrity sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg== + "@vue/test-utils@2.4.6": version "2.4.6" resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c" @@ -5822,7 +5884,7 @@ mute-stream@^2.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== -nanoid@^3.3.8: +nanoid@^3.3.11, nanoid@^3.3.8: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== @@ -6416,6 +6478,15 @@ postcss@8.5.3, postcss@^8.4.48, postcss@^8.5.0, postcss@^8.5.3: picocolors "^1.1.1" source-map-js "^1.2.1" +postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -7910,16 +7981,16 @@ vue-virtual-scroller@^2.0.0-beta.7: vue-observe-visibility "^2.0.0-alpha.1" vue-resize "^2.0.0-alpha.1" -vue@3.5.13: - version "3.5.13" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a" - integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== +vue@3.5.17: + version "3.5.17" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.17.tgz#ea8a6a45abb2b0620e7d479319ce8434b55650cf" + integrity sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g== dependencies: - "@vue/compiler-dom" "3.5.13" - "@vue/compiler-sfc" "3.5.13" - "@vue/runtime-dom" "3.5.13" - "@vue/server-renderer" "3.5.13" - "@vue/shared" "3.5.13" + "@vue/compiler-dom" "3.5.17" + "@vue/compiler-sfc" "3.5.17" + "@vue/runtime-dom" "3.5.17" + "@vue/server-renderer" "3.5.17" + "@vue/shared" "3.5.17" vuex@4.1.0: version "4.1.0" From f4db0dbdd4c575bf1d7999b913f3d23be455b11b Mon Sep 17 00:00:00 2001 From: Pleroma User <66706-pleromian@users.noreply.git.pleroma.social> Date: Tue, 24 Jun 2025 12:35:50 +0000 Subject: [PATCH 21/23] Add arithmetic blend --- changelog.d/arithmetic-blend.add | 2 ++ src/services/color_convert/color_convert.js | 26 +++++++++++++++++++ .../theme_data/theme3_slot_functions.js | 21 +++++++++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 changelog.d/arithmetic-blend.add diff --git a/changelog.d/arithmetic-blend.add b/changelog.d/arithmetic-blend.add new file mode 100644 index 000000000..c579dca28 --- /dev/null +++ b/changelog.d/arithmetic-blend.add @@ -0,0 +1,2 @@ +Add arithmetic blend ISS function + diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js index 0e78b57af..aadbc90ff 100644 --- a/src/services/color_convert/color_convert.js +++ b/src/services/color_convert/color_convert.js @@ -95,6 +95,32 @@ export const getContrastRatioLayers = (text, layers, bedrock) => { return getContrastRatio(alphaBlendLayers(bedrock, layers), text) } +/** + * Blending of two solid colors with a user-defined operator: origin +- value + * + * @param {Object} origin - base color + * @param {Object} value - modification argument + * @param {string} operator - math operator to use + */ +export const arithmeticBlend = (origin, value, operator) => { + const func = (a, b) => { + switch (operator) { + case '+': + return Math.min(a + b, 255) + case '-': + return Math.max(a - b, 0) + default: + return a + } + } + + return { + r: func(origin.r, value.r), + g: func(origin.g, value.g), + b: func(origin.b, value.b), + } +} + /** * This performs alpha blending between solid background and semi-transparent foreground * diff --git a/src/services/theme_data/theme3_slot_functions.js b/src/services/theme_data/theme3_slot_functions.js index 137f19bf0..f534b19f4 100644 --- a/src/services/theme_data/theme3_slot_functions.js +++ b/src/services/theme_data/theme3_slot_functions.js @@ -1,8 +1,8 @@ import { convert, brightness } from 'chromatism' -import { alphaBlend, getTextColor, relativeLuminance } from '../color_convert/color_convert.js' +import { alphaBlend, arithmeticBlend, getTextColor, relativeLuminance } from '../color_convert/color_convert.js' export const process = (text, functions, { findColor, findShadow }, { dynamicVars, staticVars }) => { - const { funcName, argsString } = /\$(?\w+)\((?[#a-zA-Z0-9-,.'"\s]*)\)/.exec(text).groups + const { funcName, argsString } = /\$(?\w+)\((?[#a-zA-Z0-9-+,.'"\s]*)\)/.exec(text).groups const args = argsString.split(/ /g).map(a => a.trim()) const func = functions[funcName] @@ -81,6 +81,23 @@ export const colorFunctions = { return alphaBlend(background, amount, foreground) } }, + shift: { + argsNeeded: 2, + documentation: 'Arithmetic blend between two colors', + args: [ + 'origin: base color', + 'value: shift value', + 'operator: math operator to use (+ or -)' + ], + exec: (args, { findColor }, { dynamicVars, staticVars }) => { + const [originArg, valueArg, operatorArg] = args + + const origin = convert(findColor(originArg, { dynamicVars, staticVars })).rgb + const value = convert(findColor(valueArg, { dynamicVars, staticVars })).rgb + + return arithmeticBlend(origin, value, operatorArg) + } + }, boost: { argsNeeded: 2, documentation: 'If given color is dark makes it darker, if color is light - makes it lighter', From acd43a8593db3969f78f65f1b23e1c68868bde78 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 24 Jun 2025 17:15:00 +0300 Subject: [PATCH 22/23] oops --- src/components/nav_panel/nav_panel.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/nav_panel/nav_panel.js b/src/components/nav_panel/nav_panel.js index 70d378e86..a155abe0c 100644 --- a/src/components/nav_panel/nav_panel.js +++ b/src/components/nav_panel/nav_panel.js @@ -126,7 +126,8 @@ const NavPanel = { isFederating: this.federating, isPrivate: this.privateMode, currentUser: this.currentUser, - supportsBubbleTimeline: this.bubbleTimeline + supportsBubbleTimeline: this.bubbleTimeline, + supportsBookmarkFolders: this.bookmarkFolders } ) }, From 2ef96ecc193671ac60aca254158f315075f04adc Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 24 Jun 2025 17:51:09 +0300 Subject: [PATCH 23/23] fix changelog --- changelog.d/akkoma-sharkey-net-support.add | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/akkoma-sharkey-net-support.add b/changelog.d/akkoma-sharkey-net-support.add index 0e39a4145..4b4bff7fe 100644 --- a/changelog.d/akkoma-sharkey-net-support.add +++ b/changelog.d/akkoma-sharkey-net-support.add @@ -1 +1 @@ -Added support for Akkoma and Sharkey.NET backend (tested on Sharkey) +Added support for Akkoma and IceShrimp.NET backend