diff --git a/build/sw_plugin.js b/build/sw_plugin.js index 115e8ca3a..066c8da12 100644 --- a/build/sw_plugin.js +++ b/build/sw_plugin.js @@ -1,7 +1,7 @@ import { readFile } from 'node:fs/promises' -import { exactRegex } from '@rolldown/pluginutils' import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' +import { exactRegex } from '@rolldown/pluginutils' import { build } from 'vite' import { @@ -15,7 +15,6 @@ const getSWMessagesAsText = async () => { } const projectRoot = dirname(dirname(fileURLToPath(import.meta.url))) - // Idea taken from // https://github.com/vite-pwa/vite-plugin-pwa/blob/main/src/plugins/build.ts // rollup does not support compiling to iife if we want to code-split; @@ -27,13 +26,13 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { const swEnvName = 'virtual:pleroma-fe/service_worker_env' const swEnvNameResolved = '\0' + swEnvName - let rootConfig, config + let config return { name: 'build-sw-plugin', enforce: 'post', configResolved(resolvedConfig) { - rootConfig = resolvedConfig + resolvedConfig config = { define: resolvedConfig.define, resolve: resolvedConfig.resolve, @@ -44,14 +43,14 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { emptyOutDir: false, rolldownOptions: { input: { - main: swSrc + main: swSrc, }, context: 'self', output: { entryFileNames: swDest, codeSplitting: false, format: 'iife', - } + }, }, }, configFile: false, @@ -76,7 +75,7 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { filter: { id: exactRegex(swEnvNameResolved) }, handler() { return `self.serviceWorkerOption = { assets: ${JSON.stringify(assets)} };` - } + }, }, }) }, @@ -85,7 +84,7 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { filter: { id: new RegExp(swDest) }, handler() { return swFullSrc - } + }, }, load: { filter: { id: new RegExp(swFullSrc) }, @@ -100,17 +99,18 @@ export const buildSwPlugin = ({ swSrc, swDest }) => { load: { filter: { id: exactRegex(swEnvNameResolved) }, handler: () => 'self.serviceWorkerOption = { assets: [] }', - } + }, }) const swBundle = await build(config) return swBundle.output[0] - } + }, }, closeBundle: { order: 'post', sequential: true, async handler() { + if (process.env.VITEST) return console.info('Building service worker for production') await build(config) }, diff --git a/package.json b/package.json index c532d3050..c51d98b81 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "localforage": "1.10.0", "parse-link-header": "2.0.0", "phoenix": "1.8.1", - "pinia": "^3.0.0", + "pinia": "^3.0.4", "punycode.js": "2.3.1", "qrcode": "1.5.4", "querystring-es3": "0.2.1", diff --git a/src/App.js b/src/App.js index 21295c57d..16201e9ea 100644 --- a/src/App.js +++ b/src/App.js @@ -2,17 +2,14 @@ import { throttle } from 'lodash' import { mapState } from 'pinia' import { defineAsyncComponent } from 'vue' -import DesktopNav from './components/desktop_nav/desktop_nav.vue' -import FeaturesPanel from './components/features_panel/features_panel.vue' -import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' -import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue' -import MediaModal from './components/media_modal/media_modal.vue' -import MobileNav from './components/mobile_nav/mobile_nav.vue' -import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue' -import NavPanel from './components/nav_panel/nav_panel.vue' -import PostStatusModal from './components/post_status_modal/post_status_modal.vue' -import UserPanel from './components/user_panel/user_panel.vue' -import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' +import DesktopNav from 'src/components/desktop_nav/desktop_nav.vue' +import FeaturesPanel from 'src/components/features_panel/features_panel.vue' +import GlobalNoticeList from 'src/components/global_notice_list/global_notice_list.vue' +import InstanceSpecificPanel from 'src/components/instance_specific_panel/instance_specific_panel.vue' +import MobileNav from 'src/components/mobile_nav/mobile_nav.vue' +import MobilePostStatusButton from 'src/components/mobile_post_status_button/mobile_post_status_button.vue' +import NavPanel from 'src/components/nav_panel/nav_panel.vue' +import UserPanel from 'src/components/user_panel/user_panel.vue' import { getOrCreateServiceWorker } from './services/sw/sw' import { windowHeight, windowWidth } from './services/window_utils/window_utils' @@ -36,34 +33,43 @@ export default { UserPanel, NavPanel, Notifications: defineAsyncComponent( - () => import('./components/notifications/notifications.vue'), + () => import('src/components/notifications/notifications.vue'), ), InstanceSpecificPanel, FeaturesPanel, WhoToFollowPanel: defineAsyncComponent( - () => import('./components/who_to_follow_panel/who_to_follow_panel.vue'), + () => + import('src/components/who_to_follow_panel/who_to_follow_panel.vue'), ), ShoutPanel: defineAsyncComponent( () => import('src/components/shout_panel/shout_panel.vue'), ), - MediaModal, + MediaModal: defineAsyncComponent( + () => import('src/components/media_modal/media_modal.vue'), + ), MobilePostStatusButton, MobileNav, DesktopNav, SettingsModal: defineAsyncComponent( - () => import('./components/settings_modal/settings_modal.vue'), + () => import('src/components/settings_modal/settings_modal.vue'), ), UpdateNotification: defineAsyncComponent( - () => import('./components/update_notification/update_notification.vue'), + () => + import('src/components/update_notification/update_notification.vue'), + ), + PostStatusModal: defineAsyncComponent( + () => import('src/components/post_status_modal/post_status_modal.vue'), + ), + UserReportingModal: defineAsyncComponent( + () => + import('src/components/user_reporting_modal/user_reporting_modal.vue'), ), - UserReportingModal, - PostStatusModal, EditStatusModal: defineAsyncComponent( - () => import('./components/edit_status_modal/edit_status_modal.vue'), + () => import('src/components/edit_status_modal/edit_status_modal.vue'), ), StatusHistoryModal: defineAsyncComponent( () => - import('./components/status_history_modal/status_history_modal.vue'), + import('src/components/status_history_modal/status_history_modal.vue'), ), GlobalNoticeList, }, diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 8e008aef2..fe65a7387 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -6,8 +6,8 @@ import { createRouter, createWebHistory } from 'vue-router' import VueVirtualScroller from 'vue-virtual-scroller' import 'vue-virtual-scroller/dist/vue-virtual-scroller.css' -import Status from 'src/components/status/status.vue' import RichContent from 'src/components/rich_content/rich_content.jsx' +import Status from 'src/components/status/status.vue' import StillImage from 'src/components/still-image/still-image.vue' import { config } from '@fortawesome/fontawesome-svg-core' diff --git a/src/components/about/about.js b/src/components/about/about.js index e6a1067fe..e293895d5 100644 --- a/src/components/about/about.js +++ b/src/components/about/about.js @@ -1,10 +1,10 @@ import { mapState } from 'pinia' -import FeaturesPanel from '../features_panel/features_panel.vue' -import InstanceSpecificPanel from '../instance_specific_panel/instance_specific_panel.vue' -import MRFTransparencyPanel from '../mrf_transparency_panel/mrf_transparency_panel.vue' -import StaffPanel from '../staff_panel/staff_panel.vue' -import TermsOfServicePanel from '../terms_of_service_panel/terms_of_service_panel.vue' +import FeaturesPanel from 'src/components/features_panel/features_panel.vue' +import InstanceSpecificPanel from 'src/components/instance_specific_panel/instance_specific_panel.vue' +import MRFTransparencyPanel from 'src/components/mrf_transparency_panel/mrf_transparency_panel.vue' +import StaffPanel from 'src/components/staff_panel/staff_panel.vue' +import TermsOfServicePanel from 'src/components/terms_of_service_panel/terms_of_service_panel.vue' import { useInstanceStore } from 'src/stores/instance.js' import { useMergedConfigStore } from 'src/stores/merged_config.js' diff --git a/src/components/account_actions/account_actions.js b/src/components/account_actions/account_actions.js index cb4ac61eb..9b4775b97 100644 --- a/src/components/account_actions/account_actions.js +++ b/src/components/account_actions/account_actions.js @@ -1,9 +1,9 @@ import { mapState } from 'pinia' import { defineAsyncComponent } from 'vue' +import Popover from 'src/components/popover/popover.vue' +import ProgressButton from 'src/components/progress_button/progress_button.vue' import UserListMenu from 'src/components/user_list_menu/user_list_menu.vue' -import Popover from '../popover/popover.vue' -import ProgressButton from '../progress_button/progress_button.vue' import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js' import { useMergedConfigStore } from 'src/stores/merged_config.js' @@ -30,7 +30,10 @@ const AccountActions = { () => import('src/components/confirm_modal/confirm_modal.vue'), ), UserTimedFilterModal: defineAsyncComponent( - () => import( 'src/components/user_timed_filter_modal/user_timed_filter_modal.vue'), + () => + import( + 'src/components/user_timed_filter_modal/user_timed_filter_modal.vue' + ), ), }, methods: { diff --git a/src/components/announcement/announcement.js b/src/components/announcement/announcement.js index b6621264c..7f559f8fe 100644 --- a/src/components/announcement/announcement.js +++ b/src/components/announcement/announcement.js @@ -1,15 +1,13 @@ import { mapState } from 'vuex' +import AnnouncementEditor from 'src/components/announcement_editor/announcement_editor.vue' import localeService from '../../services/locale/locale.service.js' -import AnnouncementEditor from '../announcement_editor/announcement_editor.vue' - import { useAnnouncementsStore } from 'src/stores/announcements.js' const Announcement = { components: { AnnouncementEditor, - }, data() { return { diff --git a/src/components/announcement_editor/announcement_editor.js b/src/components/announcement_editor/announcement_editor.js index 6d22ac1fd..c816083a4 100644 --- a/src/components/announcement_editor/announcement_editor.js +++ b/src/components/announcement_editor/announcement_editor.js @@ -1,4 +1,4 @@ -import Checkbox from '../checkbox/checkbox.vue' +import Checkbox from 'src/components/checkbox/checkbox.vue' const AnnouncementEditor = { components: { diff --git a/src/components/announcements_page/announcements_page.js b/src/components/announcements_page/announcements_page.js index b8b1f000a..3c73198c5 100644 --- a/src/components/announcements_page/announcements_page.js +++ b/src/components/announcements_page/announcements_page.js @@ -1,7 +1,7 @@ import { mapState } from 'vuex' -import Announcement from '../announcement/announcement.vue' -import AnnouncementEditor from '../announcement_editor/announcement_editor.vue' +import Announcement from 'src/components/announcement/announcement.vue' +import AnnouncementEditor from 'src/components/announcement_editor/announcement_editor.vue' import { useAnnouncementsStore } from 'src/stores/announcements.js' diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js index da776bf33..4b733258f 100644 --- a/src/components/attachment/attachment.js +++ b/src/components/attachment/attachment.js @@ -1,10 +1,9 @@ import { mapState } from 'pinia' import { defineAsyncComponent } from 'vue' +import Popover from 'src/components/popover/popover.vue' +import VideoAttachment from 'src/components/video_attachment/video_attachment.vue' import nsfwImage from '../../assets/nsfw.png' -import Popover from '../popover/popover.vue' - -import VideoAttachment from '../video_attachment/video_attachment.vue' import { useInstanceStore } from 'src/stores/instance.js' import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js' @@ -69,12 +68,10 @@ const Attachment = { } }, components: { - Flash: defineAsyncComponent( - () => import( 'src/components/flash/flash.vue'), - ), + Flash: defineAsyncComponent(() => import('src/components/flash/flash.vue')), VideoAttachment: defineAsyncComponent( - () => import( 'src/components/video_attachment/video_attachment.vue'), + () => import('src/components/video_attachment/video_attachment.vue'), ), Popover, }, diff --git a/src/components/auth_form/auth_form.js b/src/components/auth_form/auth_form.js index 9e05095ca..7d853d119 100644 --- a/src/components/auth_form/auth_form.js +++ b/src/components/auth_form/auth_form.js @@ -1,9 +1,9 @@ import { mapState } from 'pinia' import { h, resolveComponent } from 'vue' -import LoginForm from '../login_form/login_form.vue' -import MFARecoveryForm from '../mfa_form/recovery_form.vue' -import MFATOTPForm from '../mfa_form/totp_form.vue' +import LoginForm from 'src/components/login_form/login_form.vue' +import MFARecoveryForm from 'src/components/mfa_form/recovery_form.vue' +import MFATOTPForm from 'src/components/mfa_form/totp_form.vue' import { useAuthFlowStore } from 'src/stores/auth_flow.js' diff --git a/src/components/avatar_list/avatar_list.js b/src/components/avatar_list/avatar_list.js index 830b64219..7806fba81 100644 --- a/src/components/avatar_list/avatar_list.js +++ b/src/components/avatar_list/avatar_list.js @@ -1,4 +1,4 @@ -import UserAvatar from '../user_avatar/user_avatar.vue' +import UserAvatar from 'src/components/user_avatar/user_avatar.vue' import { useInstanceStore } from 'src/stores/instance.js' diff --git a/src/components/basic_user_card/basic_user_card.js b/src/components/basic_user_card/basic_user_card.js index 964c60c56..1c69f81b4 100644 --- a/src/components/basic_user_card/basic_user_card.js +++ b/src/components/basic_user_card/basic_user_card.js @@ -1,7 +1,6 @@ - -import UserAvatar from '../user_avatar/user_avatar.vue' -import UserLink from '../user_link/user_link.vue' -import UserPopover from '../user_popover/user_popover.vue' +import UserAvatar from 'src/components/user_avatar/user_avatar.vue' +import UserLink from 'src/components/user_link/user_link.vue' +import UserPopover from 'src/components/user_popover/user_popover.vue' import { useInstanceStore } from 'src/stores/instance.js' import { useMergedConfigStore } from 'src/stores/merged_config.js' diff --git a/src/components/block_card/block_card.js b/src/components/block_card/block_card.js index 967ce2a3c..6484accff 100644 --- a/src/components/block_card/block_card.js +++ b/src/components/block_card/block_card.js @@ -1,7 +1,7 @@ import { mapState } from 'pinia' +import BasicUserCard from 'src/components/basic_user_card/basic_user_card.vue' import UserTimedFilterModal from 'src/components/user_timed_filter_modal/user_timed_filter_modal.vue' -import BasicUserCard from '../basic_user_card/basic_user_card.vue' import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js' diff --git a/src/components/bookmark_folder_edit/bookmark_folder_edit.js b/src/components/bookmark_folder_edit/bookmark_folder_edit.js index a036895bf..43aa239b2 100644 --- a/src/components/bookmark_folder_edit/bookmark_folder_edit.js +++ b/src/components/bookmark_folder_edit/bookmark_folder_edit.js @@ -1,5 +1,5 @@ +import EmojiPicker from 'src/components/emoji_picker/emoji_picker.vue' import apiService from '../../services/api/api.service' -import EmojiPicker from '../emoji_picker/emoji_picker.vue' import { useBookmarkFoldersStore } from 'src/stores/bookmark_folders.js' import { useInterfaceStore } from 'src/stores/interface.js' diff --git a/src/components/bookmark_folders/bookmark_folders.js b/src/components/bookmark_folders/bookmark_folders.js index 1147fd3a5..9fd62dae0 100644 --- a/src/components/bookmark_folders/bookmark_folders.js +++ b/src/components/bookmark_folders/bookmark_folders.js @@ -1,4 +1,4 @@ -import BookmarkFolderCard from '../bookmark_folder_card/bookmark_folder_card.vue' +import BookmarkFolderCard from 'src/components/bookmark_folder_card/bookmark_folder_card.vue' import { useBookmarkFoldersStore } from 'src/stores/bookmark_folders.js' diff --git a/src/components/bookmark_timeline/bookmark_timeline.js b/src/components/bookmark_timeline/bookmark_timeline.js index a241b6ac7..bf633c18c 100644 --- a/src/components/bookmark_timeline/bookmark_timeline.js +++ b/src/components/bookmark_timeline/bookmark_timeline.js @@ -1,4 +1,4 @@ -import Timeline from '../timeline/timeline.vue' +import Timeline from 'src/components/timeline/timeline.vue' const Bookmarks = { created() { diff --git a/src/components/bubble_timeline/bubble_timeline.js b/src/components/bubble_timeline/bubble_timeline.js index d3835e0e8..fcbc31ad2 100644 --- a/src/components/bubble_timeline/bubble_timeline.js +++ b/src/components/bubble_timeline/bubble_timeline.js @@ -1,4 +1,4 @@ -import Timeline from '../timeline/timeline.vue' +import Timeline from 'src/components/timeline/timeline.vue' const BubbleTimeline = { components: { diff --git a/src/components/chat/chat.js b/src/components/chat/chat.js index 2fef86c0a..7428c0dc7 100644 --- a/src/components/chat/chat.js +++ b/src/components/chat/chat.js @@ -2,13 +2,13 @@ import { throttle } from 'lodash' import { mapState as mapPiniaState } from 'pinia' import { mapGetters, mapState } from 'vuex' +import ChatMessage from 'src/components/chat_message/chat_message.vue' +import ChatTitle from 'src/components/chat_title/chat_title.vue' +import PostStatusForm from 'src/components/post_status_form/post_status_form.vue' import { WSConnectionStatus } from '../../services/api/api.service.js' import chatService from '../../services/chat_service/chat_service.js' import { buildFakeMessage } from '../../services/chat_utils/chat_utils.js' import { promiseInterval } from '../../services/promise_interval/promise_interval.js' -import ChatMessage from '../chat_message/chat_message.vue' -import ChatTitle from '../chat_title/chat_title.vue' -import PostStatusForm from '../post_status_form/post_status_form.vue' import { getNewTopPosition, getScrollPosition, diff --git a/src/components/chat_list/chat_list.js b/src/components/chat_list/chat_list.js index 4c3194ae1..597fcc709 100644 --- a/src/components/chat_list/chat_list.js +++ b/src/components/chat_list/chat_list.js @@ -1,8 +1,8 @@ import { mapGetters, mapState } from 'vuex' -import ChatListItem from '../chat_list_item/chat_list_item.vue' -import ChatNew from '../chat_new/chat_new.vue' -import List from '../list/list.vue' +import ChatListItem from 'src/components/chat_list_item/chat_list_item.vue' +import ChatNew from 'src/components/chat_new/chat_new.vue' +import List from 'src/components/list/list.vue' const ChatList = { components: { diff --git a/src/components/chat_list_item/chat_list_item.js b/src/components/chat_list_item/chat_list_item.js index 74df26c1f..3bbb93d60 100644 --- a/src/components/chat_list_item/chat_list_item.js +++ b/src/components/chat_list_item/chat_list_item.js @@ -1,10 +1,10 @@ import { mapState } from 'vuex' -import AvatarList from '../avatar_list/avatar_list.vue' -import ChatTitle from '../chat_title/chat_title.vue' -import StatusBody from '../status_content/status_content.vue' -import Timeago from '../timeago/timeago.vue' -import UserAvatar from '../user_avatar/user_avatar.vue' +import AvatarList from 'src/components/avatar_list/avatar_list.vue' +import ChatTitle from 'src/components/chat_title/chat_title.vue' +import StatusBody from 'src/components/status_content/status_content.vue' +import Timeago from 'src/components/timeago/timeago.vue' +import UserAvatar from 'src/components/user_avatar/user_avatar.vue' const ChatListItem = { name: 'ChatListItem', diff --git a/src/components/chat_message/chat_message.js b/src/components/chat_message/chat_message.js index 12a147803..ba06172ed 100644 --- a/src/components/chat_message/chat_message.js +++ b/src/components/chat_message/chat_message.js @@ -1,15 +1,15 @@ import { mapState as mapPiniaState } from 'pinia' -import { mapGetters, mapState } from 'vuex' import { defineAsyncComponent } from 'vue' +import { mapGetters, mapState } from 'vuex' import Attachment from 'src/components/attachment/attachment.vue' import ChatMessageDate from 'src/components/chat_message_date/chat_message_date.vue' +import Gallery from 'src/components/gallery/gallery.vue' import LinkPreview from 'src/components/link-preview/link-preview.vue' import Popover from 'src/components/popover/popover.vue' import StatusContent from 'src/components/status_content/status_content.vue' import UserAvatar from 'src/components/user_avatar/user_avatar.vue' import UserPopover from 'src/components/user_popover/user_popover.vue' -import Gallery from 'src/components/gallery/gallery.vue' import { useInstanceStore } from 'src/stores/instance.js' import { useInterfaceStore } from 'src/stores/interface' diff --git a/src/components/chat_new/chat_new.js b/src/components/chat_new/chat_new.js index 50e0f7a8f..5ee2b610d 100644 --- a/src/components/chat_new/chat_new.js +++ b/src/components/chat_new/chat_new.js @@ -1,7 +1,7 @@ import { mapGetters, mapState } from 'vuex' -import BasicUserCard from '../basic_user_card/basic_user_card.vue' -import UserAvatar from '../user_avatar/user_avatar.vue' +import BasicUserCard from 'src/components/basic_user_card/basic_user_card.vue' +import UserAvatar from 'src/components/user_avatar/user_avatar.vue' import { library } from '@fortawesome/fontawesome-svg-core' import { faChevronLeft, faSearch } from '@fortawesome/free-solid-svg-icons' diff --git a/src/components/chat_title/chat_title.js b/src/components/chat_title/chat_title.js index 5a2b5d775..52d4445b6 100644 --- a/src/components/chat_title/chat_title.js +++ b/src/components/chat_title/chat_title.js @@ -1,6 +1,5 @@ import { defineAsyncComponent } from 'vue' - import UserAvatar from 'src/components/user_avatar/user_avatar.vue' import UserPopover from 'src/components/user_popover/user_popover.vue' diff --git a/src/components/color_input/color_input.vue b/src/components/color_input/color_input.vue index 07aed6b81..208bdf2dc 100644 --- a/src/components/color_input/color_input.vue +++ b/src/components/color_input/color_input.vue @@ -66,8 +66,8 @@