]> source.dussan.org Git - nextcloud-server.git/commitdiff
chore: Enable ESLint for apps and fix all errors
authorFerdinand Thiessen <opensource@fthiessen.de>
Mon, 24 Jun 2024 22:00:31 +0000 (00:00 +0200)
committerFerdinand Thiessen <opensource@fthiessen.de>
Tue, 9 Jul 2024 15:13:30 +0000 (17:13 +0200)
Nevertheless this causes a huge amount of new warnings.
Previously the shell script for directories to lint was wrong it was generating all app names to lint,
but was missing the `apps/` prefix. Causing only `core` to be linted.

Co-authored-by: Grigorii K. Shartsev <me@shgk.me>
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
88 files changed:
.eslintrc.js
__tests__/mock-window.js [new file with mode: 0644]
apps/comments/src/services/DavClient.js
apps/comments/src/services/GetComments.ts
apps/comments/src/utils/cancelableRequest.js
apps/dav/src/components/AbsenceForm.vue
apps/dav/src/dav/client.js
apps/dav/src/service/PreferenceService.js
apps/dav/src/settings.js
apps/dav/src/views/CalDavSettings.spec.js
apps/dav/src/views/CalDavSettings.vue
apps/federatedfilesharing/src/components/AdminSettings.vue
apps/federatedfilesharing/src/components/PersonalSettings.vue
apps/federatedfilesharing/src/external.js
apps/files/src/actions/deleteAction.ts
apps/files/src/actions/sidebarAction.ts
apps/files/src/components/FileEntryMixin.ts
apps/files/src/components/NavigationQuota.vue
apps/files/src/components/TransferOwnershipDialogue.vue
apps/files/src/components/VirtualList.vue
apps/files/src/composables/useNavigation.spec.ts
apps/files/src/init.ts
apps/files/src/main.ts
apps/files/src/plugins/search/folderSearch.ts
apps/files/src/services/LivePhotos.ts
apps/files/src/services/PreviewService.ts
apps/files/src/store/dragging.ts
apps/files/src/store/files.ts
apps/files/src/store/keyboard.ts
apps/files/src/store/selection.ts
apps/files/src/store/userconfig.ts
apps/files/src/store/viewConfig.ts
apps/files_external/src/actions/inlineStorageCheckAction.ts
apps/files_external/tests/appSpec.js
apps/files_reminders/src/actions/setReminderSuggestionActions.ts
apps/files_reminders/src/shared/types.ts
apps/files_sharing/src/components/SharingInput.vue
apps/files_sharing/src/mixins/ShareDetails.js
apps/files_sharing/src/services/SharingService.ts
apps/files_trashbin/src/services/client.ts
apps/files_versions/src/utils/davClient.js
apps/oauth2/src/App.vue
apps/oauth2/src/components/OAuthItem.vue
apps/settings/src/components/AdminSettingsSharingForm.vue
apps/settings/src/components/BasicSettings/BackgroundJob.vue
apps/settings/src/components/DeclarativeSettings/DeclarativeSection.vue
apps/settings/src/components/Encryption.vue
apps/settings/src/components/PersonalInfo/BirthdaySection.vue
apps/settings/src/components/Users/UserRow.vue
apps/settings/src/components/WebAuthn/AddDevice.vue
apps/settings/src/components/WebAuthn/Section.vue
apps/settings/src/main-declarative-settings-forms.ts
apps/settings/src/service/PersonalInfo/EmailService.js
apps/settings/src/service/PersonalInfo/PersonalInfoService.js
apps/settings/src/store/apps.js
apps/settings/src/store/authtoken.ts
apps/settings/src/store/users.js
apps/settings/src/utils/userUtils.ts
apps/sharebymail/src/components/AdminSettings.vue
apps/systemtags/src/services/api.ts
apps/systemtags/src/services/davClient.ts
apps/systemtags/src/services/files.ts
apps/systemtags/src/utils.ts
apps/theming/src/components/BackgroundSettings.vue
apps/theming/src/components/ItemPreview.vue
apps/theming/src/components/admin/CheckboxField.vue
apps/theming/src/components/admin/FileInputField.vue
apps/twofactor_backupcodes/src/views/PersonalSettings.vue
apps/workflowengine/src/components/Rule.vue
apps/workflowengine/src/store.js
babel.config.js
core/src/OC/menu.js
core/src/OC/notification.js
core/src/OC/util-history.js
core/src/OC/xhr-error.js
core/src/Util/get-url-parameter.js
core/src/components/ContactsMenu/Contact.vue
core/src/components/setup/RecommendedApps.vue
core/src/jquery/octemplate.js
core/src/session-heartbeat.js
core/src/systemtags/systemtagmodel.js
core/src/tests/components/ContactsMenu/Contact.spec.js
core/src/tests/views/ContactsMenu.spec.js
core/src/utils/xhr-request.js
core/src/views/ContactsMenu.vue
jest.config.ts
package-lock.json
package.json

index 737e689d0ea19630a17c70e1d8a846bae4aedcec..40fa92d1e8cec40ba36578048309d847bac2f893 100644 (file)
@@ -36,4 +36,13 @@ module.exports = {
                        mode: 'typescript',
                },
        },
+       overrides: [
+               // Allow any in tests
+               {
+                       files: ['**/*.spec.ts'],
+                       rules: {
+                               '@typescript-eslint/no-explicit-any': 'warn',
+                       },
+               }
+       ],
 }
diff --git a/__tests__/mock-window.js b/__tests__/mock-window.js
new file mode 100644 (file)
index 0000000..47ff5f9
--- /dev/null
@@ -0,0 +1,3 @@
+window.OC = { ...window.OC }
+window.OCA = { ...window.OCA }
+window.OCP = { ...window.OCP }
index 6202294b52f4782e9551033808cfadb47a478cb5..3e9a529283f0bad47b36abfd8a5fcef14ea02d7b 100644 (file)
@@ -12,12 +12,12 @@ const client = createClient(getRootPath())
 
 // set CSRF token header
 const setHeaders = (token) => {
-  client.setHeaders({
-    // Add this so the server knows it is an request from the browser
-    'X-Requested-With': 'XMLHttpRequest',
-    // Inject user auth
-    requesttoken: token ?? '',
-  })
+       client.setHeaders({
+               // Add this so the server knows it is an request from the browser
+               'X-Requested-With': 'XMLHttpRequest',
+               // Inject user auth
+               requesttoken: token ?? '',
+       })
 }
 
 // refresh headers when request token changes
index 1e24c8ede8e7ba4bc1f1820be7c22dc3b2ff2352..c42aa21d6cb3820117d61ab88792f482c00c1c8a 100644 (file)
@@ -60,7 +60,7 @@ const getDirectoryFiles = function(
        // Map all items to a consistent output structure (results)
        return responseItems.map(item => {
                // Each item should contain a stat object
-               const props = item.propstat!.prop!;
+               const props = item.propstat!.prop!
 
                return prepareFileFromProps(props, props.id!.toString(), isDetailed)
        })
index 47baa5050831c7f19e0b756977d73c52fb2990b9..c2d380c80f9cd584a25b2ca54291433fd1db4c04 100644 (file)
@@ -22,7 +22,7 @@ const cancelableRequest = function(request) {
        const fetch = async function(url, options) {
                const response = await request(
                        url,
-                       Object.assign({ signal }, options)
+                       Object.assign({ signal }, options),
                )
                return response
        }
index 33f1483a7fb45ceee83246be335c06f4220e8a58..cb3fabe49dfc026e5f2580115bcdb9cdf36b7b06 100644 (file)
@@ -26,8 +26,7 @@
                        :clear-search-on-blur="() => false"
                        :user-select="true"
                        :options="options"
-                       @search="asyncFind"
-                       >
+                       @search="asyncFind">
                        <template #no-options="{ search }">
                                {{ search ?$t('dav', 'No results.') : $t('dav', 'Start typing.') }}
                        </template>
 </template>
 
 <script>
+import { getCurrentUser } from '@nextcloud/auth'
+import { showError, showSuccess } from '@nextcloud/dialogs'
+import { loadState } from '@nextcloud/initial-state'
+import { generateOcsUrl } from '@nextcloud/router'
+import { ShareType } from '@nextcloud/sharing'
+import { formatDateAsYMD } from '../utils/date.js'
+import axios from '@nextcloud/axios'
+import debounce from 'debounce'
+import logger from '../service/logger.js'
+
 import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
 import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js'
 import NcTextArea from '@nextcloud/vue/dist/Components/NcTextArea.js'
 import NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'
 import NcDateTimePickerNative from '@nextcloud/vue/dist/Components/NcDateTimePickerNative.js'
-import { generateOcsUrl } from '@nextcloud/router'
-import { getCurrentUser } from '@nextcloud/auth'
-import debounce from 'debounce'
-import axios from '@nextcloud/axios'
-import { formatDateAsYMD } from '../utils/date.js'
-import { loadState } from '@nextcloud/initial-state'
-import { showError, showSuccess } from '@nextcloud/dialogs'
-import { Type as ShareTypes } from '@nextcloud/sharing'
-
-import logger from '../service/logger.js'
 
 export default {
        name: 'AbsenceForm',
@@ -74,17 +73,17 @@ export default {
                NcTextField,
                NcTextArea,
                NcDateTimePickerNative,
-               NcSelect
+               NcSelect,
        },
        data() {
-               const { firstDay, lastDay, status, message ,replacementUserId ,replacementUserDisplayName } = loadState('dav', 'absence', {})
+               const { firstDay, lastDay, status, message, replacementUserId, replacementUserDisplayName } = loadState('dav', 'absence', {})
                return {
                        loading: false,
                        status: status ?? '',
                        message: message ?? '',
                        firstDay: firstDay ? new Date(firstDay) : new Date(),
                        lastDay: lastDay ? new Date(lastDay) : null,
-                       replacementUserId: replacementUserId ,
+                       replacementUserId,
                        replacementUser: replacementUserId ? { user: replacementUserId, displayName: replacementUserDisplayName } : null,
                        searchLoading: false,
                        options: [],
@@ -126,10 +125,10 @@ export default {
                        return {
                                user: result.uuid || result.value.shareWith,
                                displayName: result.name || result.label,
-                               subtitle: result.dsc | ''
+                               subtitle: result.dsc | '',
                        }
                },
-       
+
                async asyncFind(query) {
                        this.searchLoading = true
                        await this.debounceGetSuggestions(query.trim())
@@ -142,7 +141,7 @@ export default {
                 async getSuggestions(search) {
 
                        const shareType = [
-                               ShareTypes.SHARE_TYPE_USER,
+                               ShareType.SHARE_TYPE_USER,
                        ]
 
                        let request = null
index a4e41114862773a181500e3b6694ea885dd462a1..d286f6f48d626c083d0610a30072970833d88c49 100644 (file)
@@ -27,5 +27,5 @@ export const getClient = memoize((service) => {
        onRequestTokenUpdate(setHeaders)
        setHeaders(getRequestToken())
 
-       return client;
+       return client
 })
index f03d53a10cc751e35861fd7806b62a9e871707a9..39b2c067c616e19955a75360d8f1122a3103c129 100644 (file)
@@ -17,7 +17,7 @@ export async function enableUserStatusAutomation() {
                }),
                {
                        configValue: 'yes',
-               }
+               },
        )
 }
 
@@ -29,6 +29,6 @@ export async function disableUserStatusAutomation() {
                generateOcsUrl('/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
                        appId: 'dav',
                        configKey: 'user_status_automation',
-               })
+               }),
        )
 }
index bb9b7107a2570c990508385884466cd2899b37fb..c69a8b036147e977e2ca4cd681cc71ae9d1beca8 100644 (file)
@@ -17,12 +17,12 @@ const CalDavSettingsView = new View({
                        sendInvitations: loadState('dav', 'sendInvitations'),
                        generateBirthdayCalendar: loadState(
                                'dav',
-                               'generateBirthdayCalendar'
+                               'generateBirthdayCalendar',
                        ),
                        sendEventReminders: loadState('dav', 'sendEventReminders'),
                        sendEventRemindersToSharedUsers: loadState(
                                'dav',
-                               'sendEventRemindersToSharedUsers'
+                               'sendEventRemindersToSharedUsers',
                        ),
                        sendEventRemindersPush: loadState('dav', 'sendEventRemindersPush'),
                }
index e5f18999fe032a303bf78c279b4fbf6c93ff6b8f..feaca3a735f73b7894c02cf5774956905e0100bc 100644 (file)
@@ -54,27 +54,27 @@ describe('CalDavSettings', () => {
                        },
                        Vue => {
                                Vue.prototype.$t = jest.fn((app, text) => text)
-                       }
+                       },
                )
                expect(TLUtils.container).toMatchSnapshot()
                const sendInvitations = TLUtils.getByLabelText(
-                       'Send invitations to attendees'
+                       'Send invitations to attendees',
                )
                expect(sendInvitations).toBeChecked()
                const generateBirthdayCalendar = TLUtils.getByLabelText(
-                       'Automatically generate a birthday calendar'
+                       'Automatically generate a birthday calendar',
                )
                expect(generateBirthdayCalendar).toBeChecked()
                const sendEventReminders = TLUtils.getByLabelText(
-                       'Send notifications for events'
+                       'Send notifications for events',
                )
                expect(sendEventReminders).toBeChecked()
                const sendEventRemindersToSharedUsers = TLUtils.getByLabelText(
-                       'Send reminder notifications to calendar sharees as well'
+                       'Send reminder notifications to calendar sharees as well',
                )
                expect(sendEventRemindersToSharedUsers).toBeChecked()
                const sendEventRemindersPush = TLUtils.getByLabelText(
-                       'Enable notifications for events via push'
+                       'Enable notifications for events via push',
                )
                expect(sendEventRemindersPush).toBeChecked()
 
index 162f85743a26eb7d82413f86e1f5f9bd5017e9b2..c55767dc6affb362dbf37916529cff77f44201dd 100644 (file)
@@ -128,7 +128,7 @@ export default {
                        OCP.AppConfig.setValue(
                                'dav',
                                'sendInvitations',
-                               value ? 'yes' : 'no'
+                               value ? 'yes' : 'no',
                        )
                },
                sendEventReminders(value) {
@@ -138,7 +138,7 @@ export default {
                        OCP.AppConfig.setValue(
                                'dav',
                                'sendEventRemindersToSharedUsers',
-                               value ? 'yes' : 'no'
+                               value ? 'yes' : 'no',
                        )
                },
                sendEventRemindersPush(value) {
index 2047278d0b1513a473c7d7dbac5de4b45aa67b81..dfafe64c0622bd9ff6d1e546b89aa1e635cd238b 100644 (file)
 </template>
 
 <script>
-import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
-import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
 import { loadState } from '@nextcloud/initial-state'
 import { showError } from '@nextcloud/dialogs'
-import axios from '@nextcloud/axios'
 import { generateOcsUrl } from '@nextcloud/router'
 import { confirmPassword } from '@nextcloud/password-confirmation'
+import axios from '@nextcloud/axios'
+import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
+import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
+
 import '@nextcloud/password-confirmation/dist/style.css'
 
 export default {
index da207be7322aa587d10206213282c826d01b72ff..cbcea0c1e9bfe9d7b92f657cb5218f7bec110c16 100644 (file)
@@ -44,8 +44,8 @@
                                                xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M502 197q-96 0-96.5 1.5t-1.5 137-1.5 138-2 2.5T266 432.5 132.5 390t-30 94T74 578l232 77q21 8 21 10t-79.5 117.5T168 899t79.5 56.5T328 1011t81-110 82-110 41 55l83 115q43 60 44 60t79.5-58 79-59-76-112.5-76-113.5T795 632.5t129.5-44-28-94T867 400t-128 42-128.5 43-2.5-7.5-1-38.5l-3-108q-4-133-5-133.5t-97-.5z" /></svg>
                                </template>
                        </NcButton>
-                       <NcButton @click="showHtml = !showHtml"
-                               class="social-button__website-button">
+                       <NcButton class="social-button__website-button"
+                               @click="showHtml = !showHtml">
                                <template #icon>
                                        <Web :size="20" />
                                </template>
index 5db1c57ffa1d1c455e223e751d9825ac67767d21..09e007489b53d39d99cd415a020f122cce18c9ea 100644 (file)
@@ -109,7 +109,7 @@ const processIncomingShareFromUrl = function() {
                                                password,
                                        },
                                ).done(function(data) {
-                                       if (data.hasOwnProperty('legacyMount')) {
+                                       if (Object.hasOwn(data, 'legacyMount')) {
                                                reloadFilesList()
                                        } else {
                                                window.OC.Notification.showTemporary(data.message)
index be39ecdcf044ea611e32d58d7f5d396ecf78fd3d..b4958ac0262f8ebb013307ee1c0298987f3bdb26 100644 (file)
@@ -126,7 +126,7 @@ export const action = new FileAction({
                        .every(permission => (permission & Permission.DELETE) !== 0)
        },
 
-       async exec(node: Node, view: View, dir: string) {
+       async exec(node: Node) {
                try {
                        await axios.delete(node.encodedSource)
 
index aeb09490fb02d005789aaf1fb4863b9d77652449..9ac5215976125dcf2feff6b7a27f69e8a3731600 100644 (file)
@@ -2,7 +2,7 @@
  * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
-import { Permission, type Node, View, FileAction, FileType } from '@nextcloud/files'
+import { Permission, type Node, View, FileAction } from '@nextcloud/files'
 import { translate as t } from '@nextcloud/l10n'
 import InformationSvg from '@mdi/svg/svg/information-variant.svg?raw'
 
index 243b963c7b2e8da6e624f10c7f21c448eef9ef20..6c0b278c61bcf517461d66fcba2ea66f5863f31b 100644 (file)
@@ -7,7 +7,7 @@ import type { ComponentPublicInstance, PropType } from 'vue'
 import type { FileSource } from '../types.ts'
 
 import { showError } from '@nextcloud/dialogs'
-import { FileType, Permission, Folder, File as NcFile, NodeStatus, Node, View } from '@nextcloud/files'
+import { FileType, Permission, Folder, File as NcFile, NodeStatus, Node } from '@nextcloud/files'
 import { translate as t } from '@nextcloud/l10n'
 import { generateUrl } from '@nextcloud/router'
 import { vOnClickOutside } from '@vueuse/components'
@@ -179,6 +179,8 @@ export default defineComponent({
                /**
                 * When the source changes, reset the preview
                 * and fetch the new one.
+                * @param a
+                * @param b
                 */
                source(a: Node, b: Node) {
                        if (a.source !== b.source) {
index 9cbee4c66726dee26c570e0ff795f53477475439..557fb240797a0518457be01a00a9c94f52f1a671 100644 (file)
@@ -94,12 +94,12 @@ export default {
        mounted() {
                // If the user has a quota set, warn if the available account storage is <=0
                //
-               // NOTE: This doesn't catch situations where actual *server* 
+               // NOTE: This doesn't catch situations where actual *server*
                // disk (non-quota) space is low, but those should probably
                // be handled differently anyway since a regular user can't
-               // can't do much about them (If we did want to indicate server disk 
+               // can't do much about them (If we did want to indicate server disk
                // space matters to users, we'd probably want to use a warning
-               // specific to that situation anyhow. So this covers warning covers 
+               // specific to that situation anyhow. So this covers warning covers
                // our primary day-to-day concern (individual account quota usage).
                //
                if (this.storageStats?.quota > 0 && this.storageStats?.free <= 0) {
@@ -121,7 +121,7 @@ export default {
                 * Update the storage stats
                 * Throttled at max 1 refresh per minute
                 *
-                * @param {Event} [event = null] if user interaction
+                * @param {Event} [event] if user interaction
                 */
                async updateStorageStats(event = null) {
                        if (this.loadingStorageStats) {
@@ -135,7 +135,7 @@ export default {
                                        throw new Error('Invalid storage stats')
                                }
 
-                               // Warn the user if the available account storage changed from > 0 to 0 
+                               // Warn the user if the available account storage changed from > 0 to 0
                                // (unless only because quota was intentionally set to 0 by admin in the interim)
                                if (this.storageStats?.free > 0 && response.data.data?.free <= 0 && response.data.data?.quota > 0) {
                                        this.showStorageFullWarning()
index 7c2dbd7d8e13af9a92c190f611c9de477a9b60d7..346bc3bbeb8baee9cf7a2d8d207c4fca1c312b9c 100644 (file)
@@ -9,7 +9,7 @@
                <form @submit.prevent="submit">
                        <p class="transfer-select-row">
                                <span>{{ readableDirectory }}</span>
-                               <NcButton v-if="directory === undefined" 
+                               <NcButton v-if="directory === undefined"
                                        class="transfer-select-row__choose_button"
                                        @click.prevent="start">
                                        {{ t('files', 'Choose file or folder to transfer') }}
@@ -22,8 +22,8 @@
                                <label for="targetUser">
                                        <span>{{ t('files', 'New owner') }}</span>
                                </label>
-                               <NcSelect input-id="targetUser"
-                                       v-model="selectedUser"
+                               <NcSelect v-model="selectedUser"
+                                       input-id="targetUser"
                                        :options="formatedUserSuggestions"
                                        :multiple="false"
                                        :loading="loadingUsers"
index 0ca2d869d17c8fe8641bd9413e54f2ab3c76866f..3a08ab590e0802df2deaaa01d76a1d80df4c16b3 100644 (file)
@@ -62,6 +62,10 @@ interface RecycledPoolItem {
        item: Node,
 }
 
+type DataSource = File | Folder
+
+type DataSourceKey = keyof DataSource
+
 export default Vue.extend({
        name: 'VirtualList',
 
@@ -73,11 +77,11 @@ export default Vue.extend({
                        required: true,
                },
                dataKey: {
-                       type: String,
+                       type: String as PropType<DataSourceKey>,
                        required: true,
                },
                dataSources: {
-                       type: Array as PropType<(File | Folder)[]>,
+                       type: Array as PropType<DataSource[]>,
                        required: true,
                },
                extraProps: {
@@ -260,7 +264,7 @@ export default Vue.extend({
                // Adding scroll listener AFTER the initial scroll to index
                this.$el.addEventListener('scroll', this.onScroll, { passive: true })
 
-               this.$_recycledPool = {} as Record<string, any>
+               this.$_recycledPool = {} as Record<string, DataSource[DataSourceKey]>
        },
 
        beforeDestroy() {
index 360e12660f3c406862d65bbb7af1c781c9707f39..364c9ab653d6c551503781508535f9dbb7e35434 100644 (file)
@@ -3,13 +3,11 @@
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
 import { beforeEach, describe, expect, it, jest } from '@jest/globals'
-import { Navigation, View } from '@nextcloud/files'
+import nextcloudFiles, { Navigation, View } from '@nextcloud/files'
 import { mount } from '@vue/test-utils'
-import { defineComponent, nextTick } from 'vue'
+import { defineComponent } from 'vue'
 import { useNavigation } from './useNavigation'
 
-import nextcloudFiles from '@nextcloud/files'
-
 // Just a wrapper so we can test the composable
 const TestComponent = defineComponent({
        template: '<div></div>',
@@ -38,7 +36,7 @@ describe('Composables: useNavigation', () => {
                })
 
                it('should return already active navigation', async () => {
-                       const view = new View({ getContents: () => Promise.reject(), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+                       const view = new View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
                        navigation.register(view)
                        navigation.setActive(view)
                        // Now the navigation is already set it should take the active navigation
@@ -47,7 +45,7 @@ describe('Composables: useNavigation', () => {
                })
 
                it('should be reactive on updating active navigation', async () => {
-                       const view = new View({ getContents: () => Promise.reject(), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+                       const view = new View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
                        navigation.register(view)
                        const wrapper = mount(TestComponent)
 
@@ -72,7 +70,7 @@ describe('Composables: useNavigation', () => {
                })
 
                it('should return already registered views', () => {
-                       const view = new View({ getContents: () => Promise.reject(), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+                       const view = new View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
                        // register before mount
                        navigation.register(view)
                        // now mount and check that the view is listed
@@ -81,8 +79,8 @@ describe('Composables: useNavigation', () => {
                })
 
                it('should be reactive on registering new views', () => {
-                       const view = new View({ getContents: () => Promise.reject(), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
-                       const view2 = new View({ getContents: () => Promise.reject(), icon: '<svg></svg>', id: 'view-2', name: 'My View 2', order: 1 })
+                       const view = new View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-1', name: 'My View 1', order: 0 })
+                       const view2 = new View({ getContents: () => Promise.reject(new Error()), icon: '<svg></svg>', id: 'view-2', name: 'My View 2', order: 1 })
 
                        // register before mount
                        navigation.register(view)
index d5ecf8c65da65b070249bc862d43be9513062f35..25bcc1072f0f4d7cd1b45b3b8db54e317f1d49b0 100644 (file)
@@ -24,7 +24,6 @@ import registerPersonalFilesView from './views/personal-files'
 import registerFilesView from './views/files'
 import registerPreviewServiceWorker from './services/ServiceWorker.js'
 
-
 import { initLivePhotos } from './services/LivePhotos'
 
 // Register file actions
index 25fac9c1a946d33de491111a12dcb9906bdf6433..9b057a5d3787053686bc20eb1d56c68a3e3e6a0b 100644 (file)
@@ -19,9 +19,9 @@ __webpack_nonce__ = btoa(getRequestToken())
 
 declare global {
        interface Window {
-               OC: any;
-               OCA: any;
-               OCP: any;
+               OC: Nextcloud.v28.OC;
+               OCA: Record<string, unknown>;
+               OCP: Nextcloud.v28.OCP;
        }
 }
 
index 25049fc25b49dd2a59e7d2bf4f64d2960dd04375..2b29c7aec4daea012ccca796af44284b6d0ad0d2 100644 (file)
@@ -5,7 +5,7 @@
 
 import type { Node } from '@nextcloud/files'
 import { emit } from '@nextcloud/event-bus'
-import { getFilePickerBuilder } from '@nextcloud/dialogs';
+import { getFilePickerBuilder } from '@nextcloud/dialogs'
 import { imagePath } from '@nextcloud/router'
 import { translate as t } from '@nextcloud/l10n'
 import logger from '../../logger'
@@ -19,7 +19,7 @@ function init() {
                return
        }
 
-       logger.info('Initializing unified search plugin: folder search from files app');
+       logger.info('Initializing unified search plugin: folder search from files app')
        OCA.UnifiedSearch.registerFilterAction({
                id: 'files',
                appId: 'files',
index aee89ac6c3d65d2f86a68f91aacf3878fe3dbc1e..10be42444e20f589a505f9735fe0f9b4bfd45d4d 100644 (file)
@@ -4,6 +4,9 @@
  */
 import { Node, registerDavProperty } from '@nextcloud/files'
 
+/**
+ *
+ */
 export function initLivePhotos(): void {
        registerDavProperty('nc:metadata-files-live-photo', { nc: 'http://nextcloud.org/ns' })
 }
index 44864b18c01f353cdaa39cb739ac2df72aa518e3..769a1fcfb9f37c9431e2bc65f362a5cc67a78805 100644 (file)
@@ -8,6 +8,7 @@ const SWCacheName = 'previews'
 
 /**
  * Check if the preview is already cached by the service worker
+ * @param previewUrl
  */
 export const isCachedPreview = function(previewUrl: string): Promise<boolean> {
        if (!window?.caches?.open) {
index 74de1c4af16991aea8ca80edaf02af38bca176c7..667c6fe67a7266c6d611d4f0d42ebc059249e7c6 100644 (file)
@@ -14,6 +14,7 @@ export const useDragAndDropStore = defineStore('dragging', {
        actions: {
                /**
                 * Set the selection of fileIds
+                * @param selection
                 */
                set(selection = [] as FileSource[]) {
                        Vue.set(this, 'dragging', selection)
index 0b541024018a252fa7ff8beb3d1a64382da57dbc..f9024b0a6bdafc884d9932ad70341afdd5065ce2 100644 (file)
@@ -34,12 +34,14 @@ export const useFilesStore = function(...args) {
                getters: {
                        /**
                         * Get a file or folder by its source
+                        * @param state
                         */
                        getNode: (state) => (source: FileSource): Node|undefined => state.files[source],
 
                        /**
                         * Get a list of files or folders by their IDs
                         * Note: does not return undefined values
+                        * @param state
                         */
                        getNodes: (state) => (sources: FileSource[]): Node[] => sources
                                .map(source => state.files[source])
@@ -49,11 +51,13 @@ export const useFilesStore = function(...args) {
                         * Get files or folders by their file ID
                         * Multiple nodes can have the same file ID but different sources
                         * (e.g. in a shared context)
+                        * @param state
                         */
                        getNodesById: (state) => (fileId: number): Node[] => Object.values(state.files).filter(node => node.fileid === fileId),
 
                        /**
                         * Get the root folder of a service
+                        * @param state
                         */
                        getRoot: (state) => (service: Service): Folder|undefined => state.roots[service],
                },
index 2b092c89ff85825a3f32fc0d494ed43845b486a3..f2654933895f8410b3ed1f9b4ac21e1510ada5c9 100644 (file)
@@ -9,6 +9,7 @@ import Vue from 'vue'
  * Observe various events and save the current
  * special keys states. Useful for checking the
  * current status of a key when executing a method.
+ * @param {...any} args
  */
 export const useKeyboardStore = function(...args) {
        const store = defineStore('keyboard', {
index c8c5c6d7de31308062dbad9b4200c3d2d0d05a61..fa35d953406108759cef6ab7ea0a4ad770be3fa2 100644 (file)
@@ -16,6 +16,7 @@ export const useSelectionStore = defineStore('selection', {
        actions: {
                /**
                 * Set the selection of fileIds
+                * @param selection
                 */
                set(selection = [] as FileSource[]) {
                        Vue.set(this, 'selected', [...new Set(selection)])
@@ -23,6 +24,7 @@ export const useSelectionStore = defineStore('selection', {
 
                /**
                 * Set the last selected index
+                * @param lastSelectedIndex
                 */
                setLastIndex(lastSelectedIndex = null as number | null) {
                        // Update the last selection if we provided a new selection starting point
index 4faa63a068a90aed4b1757b0854d78c74f8843a4..78b4a2e656c51d2d44adda43f6a4612c2a7436ff 100644 (file)
@@ -27,6 +27,8 @@ export const useUserConfigStore = function(...args) {
                actions: {
                        /**
                         * Update the user config local store
+                        * @param key
+                        * @param value
                         */
                        onUpdate(key: string, value: boolean) {
                                Vue.set(this.userConfig, key, value)
@@ -34,6 +36,8 @@ export const useUserConfigStore = function(...args) {
 
                        /**
                         * Update the user config local store AND on server side
+                        * @param key
+                        * @param value
                         */
                        async update(key: string, value: boolean) {
                                await axios.put(generateUrl('/apps/files/api/v1/config/' + key), {
index eed17cd1b17491145400b38f518500cde7e9604c..f3021077c54661a42630ad0ad66fc29db4289d71 100644 (file)
@@ -26,6 +26,9 @@ export const useViewConfigStore = function(...args) {
                actions: {
                        /**
                         * Update the view config local store
+                        * @param view
+                        * @param key
+                        * @param value
                         */
                        onUpdate(view: ViewId, key: string, value: string | number | boolean) {
                                if (!this.viewConfig[view]) {
@@ -36,6 +39,9 @@ export const useViewConfigStore = function(...args) {
 
                        /**
                         * Update the view config local store AND on server side
+                        * @param view
+                        * @param key
+                        * @param value
                         */
                        async update(view: ViewId, key: string, value: string | number | boolean) {
                                axios.put(generateUrl(`/apps/files/api/v1/views/${view}/${key}`), {
@@ -49,6 +55,8 @@ export const useViewConfigStore = function(...args) {
                         * Set the sorting key AND sort by ASC
                         * The key param must be a valid key of a File object
                         * If not found, will be searched within the File attributes
+                        * @param key
+                        * @param view
                         */
                        setSortingBy(key = 'basename', view = 'files') {
                                // Save new config
@@ -58,6 +66,7 @@ export const useViewConfigStore = function(...args) {
 
                        /**
                         * Toggle the sorting direction
+                        * @param view
                         */
                        toggleSortingDirection(view = 'files') {
                                const config = this.getConfig(view) || { sorting_direction: 'asc' }
index e08b5fe370eee53d26979b0065ccbe1d7c86c792..a213c196b50374039d1c591b27a6f0e9dd3a20e1 100644 (file)
@@ -30,9 +30,10 @@ export const action = new FileAction({
        /**
         * Use this function to check the storage availability
         * We then update the node attributes directly.
+        * @param node
         */
        async renderInline(node: Node) {
-               let config = null as any as StorageConfig
+               let config = null as unknown as StorageConfig
                try {
                        const response = await getStatus(node.attributes.id, node.attributes.scope === 'system')
                        config = response.data
index 512dc13cc05594bef4a7e6607d1a83af314b5678..fcbef7ef8221e97df812ee771a125d7403d36548 100644 (file)
@@ -20,7 +20,7 @@ describe('OCA.Files_External.App tests', function() {
                        + '<div id="app-content-extstoragemounts" class="hidden">'
                        + '</div>'
                        + '</div>'
-                       + '</div>'
+                       + '</div>',
                )
                fileList = App.initList($('#app-content-extstoragemounts'))
        })
index b5f4425e3cde9fdff6048c0543a732f9795cf30f..fae18d758a8d9a6c56781dc8d1a17df07430aaa8 100644 (file)
@@ -31,7 +31,7 @@ const laterToday: ReminderOption = {
        label: t('files_reminders', 'Later today'),
        ariaLabel: t('files_reminders', 'Set reminder for later today'),
        dateString: '',
-       verboseDateString: ''
+       verboseDateString: '',
 }
 
 const tomorrow: ReminderOption = {
@@ -39,7 +39,7 @@ const tomorrow: ReminderOption = {
        label: t('files_reminders', 'Tomorrow'),
        ariaLabel: t('files_reminders', 'Set reminder for tomorrow'),
        dateString: '',
-       verboseDateString: ''
+       verboseDateString: '',
 }
 
 const thisWeekend: ReminderOption = {
@@ -47,7 +47,7 @@ const thisWeekend: ReminderOption = {
        label: t('files_reminders', 'This weekend'),
        ariaLabel: t('files_reminders', 'Set reminder for this weekend'),
        dateString: '',
-       verboseDateString: ''
+       verboseDateString: '',
 }
 
 const nextWeek: ReminderOption = {
@@ -55,7 +55,7 @@ const nextWeek: ReminderOption = {
        label: t('files_reminders', 'Next week'),
        ariaLabel: t('files_reminders', 'Set reminder for next week'),
        dateString: '',
-       verboseDateString: ''
+       verboseDateString: '',
 }
 
 /**
index 04c29aae147660cd1f3cee5b4f4b1ef6c090edd8..f8da6f6aed09b7bc30db9e3e10f364e03658c327 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 export interface FileAttributes {
-       [key: string]: any
+       [key: string]: unknown
        id: number
        name: string
 }
index cb8acbec4c22fbfc50009bdde9ebc6a5e0d589af..f2b2f57370059b2373c47425cbeb5284be1f11d3 100644 (file)
 </template>
 
 <script>
-import { generateOcsUrl } from '@nextcloud/router'
 import { getCurrentUser } from '@nextcloud/auth'
 import { getCapabilities } from '@nextcloud/capabilities'
+import { generateOcsUrl } from '@nextcloud/router'
 import axios from '@nextcloud/axios'
 import debounce from 'debounce'
 import NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'
 
 import Config from '../services/ConfigService.js'
-import GeneratePassword from '../utils/GeneratePassword.js'
 import Share from '../models/Share.js'
 import ShareRequests from '../mixins/ShareRequests.js'
 import ShareTypes from '../mixins/ShareTypes.js'
index de0bf875f162371b359b2be2170088b654addcef..36e0e6c03f7e250ecb2b226abb7fcace71258ce3 100644 (file)
@@ -3,7 +3,6 @@
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
 
-
 import Share from '../models/Share.js'
 import Config from '../services/ConfigService.js'
 
index 119b008c64dddc405f3fbf0f73af8417a52c0e09..b0f5fd2ff9afe6198ba792c1ad865c6e18f86381 100644 (file)
@@ -2,7 +2,9 @@
  * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
-/* eslint-disable camelcase, n/no-extraneous-import */
+// TODO: Fix this instead of disabling ESLint!!!
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
 import type { AxiosPromise } from '@nextcloud/axios'
 import type { OCSResponse } from '@nextcloud/typings/ocs'
 
@@ -71,7 +73,7 @@ const ocsEntryToNode = async function(ocsEntry: any): Promise<Folder | File | nu
                                'owner-id': ocsEntry?.uid_owner,
                                'owner-display-name': ocsEntry?.displayname_owner,
                                'share-types': ocsEntry?.share_type,
-                               favorite: ocsEntry?.tags?.includes(window.OC.TAG_FAVORITE) ? 1 : 0,
+                               favorite: ocsEntry?.tags?.includes((window.OC as Nextcloud.v28.OC & { TAG_FAVORITE: string }).TAG_FAVORITE) ? 1 : 0,
                        },
                })
        } catch (error) {
@@ -80,12 +82,12 @@ const ocsEntryToNode = async function(ocsEntry: any): Promise<Folder | File | nu
        }
 }
 
-const getShares = function(shared_with_me = false): AxiosPromise<OCSResponse<any>> {
+const getShares = function(shareWithMe = false): AxiosPromise<OCSResponse<any>> {
        const url = generateOcsUrl('apps/files_sharing/api/v1/shares')
        return axios.get(url, {
                headers,
                params: {
-                       shared_with_me,
+                       shared_with_me: shareWithMe,
                        include_tags: true,
                },
        })
@@ -142,6 +144,8 @@ const getDeletedShares = function(): AxiosPromise<OCSResponse<any>> {
 /**
  * Group an array of objects (here Nodes) by a key
  * and return an array of arrays of them.
+ * @param nodes
+ * @param key
  */
 const groupBy = function(nodes: (Folder | File)[], key: string) {
        return Object.values(nodes.reduce(function(acc, curr) {
index 25de3384c135161fd4b733e50f12e639eeaa4bb3..7c842858ae4019bc4404bcdd4447e7e5122fc03e 100644 (file)
@@ -14,12 +14,12 @@ const client = createClient(rootUrl)
 
 // set CSRF token header
 const setHeaders = (token: string | null) => {
-  client.setHeaders({
-    // Add this so the server knows it is an request from the browser
-    'X-Requested-With': 'XMLHttpRequest',
-    // Inject user auth
-    requesttoken: token ?? '',
-  })
+       client.setHeaders({
+               // Add this so the server knows it is an request from the browser
+               'X-Requested-With': 'XMLHttpRequest',
+               // Inject user auth
+               requesttoken: token ?? '',
+       })
 }
 
 // refresh headers when request token changes
index 094f9cee0f00413073d93bb155d466330c1e5bbf..029373e9193ed73b44598ffa05f91c9105ae8566 100644 (file)
@@ -14,16 +14,16 @@ const client = createClient(remote)
 
 // set CSRF token header
 const setHeaders = (token) => {
-  client.setHeaders({
-    // Add this so the server knows it is an request from the browser
-    'X-Requested-With': 'XMLHttpRequest',
-    // Inject user auth
-    requesttoken: token ?? '',
-  })
+       client.setHeaders({
+               // Add this so the server knows it is an request from the browser
+               'X-Requested-With': 'XMLHttpRequest',
+               // Inject user auth
+               requesttoken: token ?? '',
+       })
 }
 
 // refresh headers when request token changes
 onRequestTokenUpdate(setHeaders)
 setHeaders(getRequestToken())
 
-export default client
\ No newline at end of file
+export default client
index b150bc9fb8317f7b0c3bbb169604cefa1056c611..01e7c31061212c90240c7c95f96a7bcf3da40477 100644 (file)
@@ -102,7 +102,7 @@ export default {
        methods: {
                deleteClient(id) {
                        axios.delete(generateUrl('apps/oauth2/clients/{id}', { id }))
-                               .then((response) => {
+                               .then(() => {
                                        // eslint-disable-next-line vue/no-mutating-props
                                        this.clients = this.clients.filter(client => client.id !== id)
                                })
index 9945a7868aee751504373b1b67275584e666745c..7261674e25298a91b993afc02d91a7c79f42af6e 100644 (file)
@@ -14,7 +14,7 @@
                                        :aria-label="toggleAriaLabel"
                                        @click="toggleSecret">
                                        <template #icon>
-                                               <EyeOutline :size="20"/>
+                                               <EyeOutline :size="20" />
                                        </template>
                                </NcButton>
                        </div>
@@ -72,9 +72,9 @@ export default {
                toggleAriaLabel() {
                        if (!this.renderSecret) {
                                return t('oauth2', 'Show client secret')
-                       } 
+                       }
                        return t('oauth2', 'Hide client secret')
-               }
+               },
        },
        methods: {
                toggleSecret() {
index 38484c00d23000a32e39d6765bbc0094c070779a..dda651917083c165624c64a1d0f9850b2c4e13f9 100644 (file)
                        <label>{{ t('settings', 'Limit sharing based on groups') }}</label>
                        <div class="sharing__sub-section">
                                <NcCheckboxRadioSwitch :checked.sync="settings.excludeGroups"
-                                                                                                                        name="excludeGroups" value="no"
-                                                                                                                        type="radio" @update:checked="onUpdateExcludeGroups">
+                                       name="excludeGroups"
+                                       value="no"
+                                       type="radio"
+                                       @update:checked="onUpdateExcludeGroups">
                                        {{ t('settings', 'Allow sharing for everyone (default)') }}
                                </NcCheckboxRadioSwitch>
                                <NcCheckboxRadioSwitch :checked.sync="settings.excludeGroups"
-                                                                                                                        name="excludeGroups" value="yes"
-                                                                                                                        type="radio" @update:checked="onUpdateExcludeGroups">
+                                       name="excludeGroups"
+                                       value="yes"
+                                       type="radio"
+                                       @update:checked="onUpdateExcludeGroups">
                                        {{ t('settings', 'Exclude some groups from sharing') }}
                                </NcCheckboxRadioSwitch>
                                <NcCheckboxRadioSwitch :checked.sync="settings.excludeGroups"
-                                                                                                                        name="excludeGroups" value="allow"
-                                                                                                                        type="radio" @update:checked="onUpdateExcludeGroups">
+                                       name="excludeGroups"
+                                       value="allow"
+                                       type="radio"
+                                       @update:checked="onUpdateExcludeGroups">
                                        {{ t('settings', 'Limit sharing to some groups') }}
                                </NcCheckboxRadioSwitch>
                                <div v-show="settings.excludeGroups !== 'no'" class="sharing__labeled-entry sharing__input">
@@ -305,7 +311,7 @@ export default defineComponent({
                onUpdateExcludeGroups: debounce(function(value: string) {
                        window.OCP.AppConfig.setValue('core', 'excludeGroups', value)
                        this.settings.excludeGroups = value
-               }, 500) as (v?: string) => void
+               }, 500) as (v?: string) => void,
        },
 })
 </script>
index e699323be80a23fcd19744d9267efce5aa0ee934..835f65a2477f77e930198c205e8587d2ee3ca74b 100644 (file)
 <script>
 import { loadState } from '@nextcloud/initial-state'
 import { showError } from '@nextcloud/dialogs'
+import { generateOcsUrl } from '@nextcloud/router'
+import { confirmPassword } from '@nextcloud/password-confirmation'
+import axios from '@nextcloud/axios'
+import moment from '@nextcloud/moment'
+
 import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
 import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
 import NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js'
-import moment from '@nextcloud/moment'
-import axios from '@nextcloud/axios'
-import { generateOcsUrl } from '@nextcloud/router'
-import { confirmPassword } from '@nextcloud/password-confirmation'
+
 import '@nextcloud/password-confirmation/dist/style.css'
 
 const lastCron = loadState('settings', 'lastCron')
index 25bbfa48bf09613d6a2c16245b20e42f38c06c9e..0a5e2415668df7f4d8baea7170a9321944a7ad95 100644 (file)
@@ -3,14 +3,13 @@
   - SPDX-License-Identifier: AGPL-3.0-or-later
 -->
 <template>
-       <NcSettingsSection
-               class="declarative-settings-section"
+       <NcSettingsSection class="declarative-settings-section"
                :name="t(formApp, form.title)"
                :description="t(formApp, form.description)"
                :doc-url="form.doc_url || ''">
                <div v-for="formField in formFields"
-                        :key="formField.id"
-                        class="declarative-form-field"
+                       :key="formField.id"
+                       class="declarative-form-field"
                        :aria-label="t('settings', '{app}\'s declarative setting field: {name}', { app: formApp, name: t(formApp, formField.title) })"
                        :class="{
                                'declarative-form-field-text': isTextFormField(formField),
                                'declarative-form-field-multi_checkbox': formField.type === 'multi-checkbox',
                                'declarative-form-field-radio': formField.type === 'radio'
                        }">
-
                        <template v-if="isTextFormField(formField)">
                                <div class="input-wrapper">
-                                       <NcInputField
-                                               :type="formField.type"
+                                       <NcInputField :type="formField.type"
                                                :label="t(formApp, formField.title)"
                                                :value.sync="formFieldsData[formField.id].value"
                                                :placeholder="t(formApp, formField.placeholder)"
                                                @update:value="onChangeDebounced(formField)"
-                                               @submit="updateDeclarativeSettingsValue(formField)"/>
+                                               @submit="updateDeclarativeSettingsValue(formField)" />
                                </div>
                                <span class="hint">{{ t(formApp, formField.description) }}</span>
                        </template>
                        <template v-if="formField.type === 'select'">
                                <label :for="formField.id + '_field'">{{ t(formApp, formField.title) }}</label>
                                <div class="input-wrapper">
-                                       <NcSelect
-                                               :id="formField.id + '_field'"
+                                       <NcSelect :id="formField.id + '_field'"
                                                :options="formField.options"
                                                :placeholder="t(formApp, formField.placeholder)"
                                                :label-outside="true"
                                                :value="formFieldsData[formField.id].value"
-                                               @input="(value) => updateFormFieldDataValue(value, formField, true)"/>
+                                               @input="(value) => updateFormFieldDataValue(value, formField, true)" />
                                </div>
                                <span class="hint">{{ t(formApp, formField.description) }}</span>
                        </template>
@@ -51,8 +47,7 @@
                        <template v-if="formField.type === 'multi-select'">
                                <label :for="formField.id + '_field'">{{ t(formApp, formField.title) }}</label>
                                <div class="input-wrapper">
-                                       <NcSelect
-                                               :id="formField.id + '_field'"
+                                       <NcSelect :id="formField.id + '_field'"
                                                :options="formField.options"
                                                :placeholder="t(formApp, formField.placeholder)"
                                                :multiple="true"
                                                        formFieldsData[formField.id].value = value
                                                        updateDeclarativeSettingsValue(formField, JSON.stringify(formFieldsData[formField.id].value))
                                                }
-                               "/>
+                                               " />
                                </div>
                                <span class="hint">{{ t(formApp, formField.description) }}</span>
                        </template>
 
                        <template v-if="formField.type === 'checkbox'">
                                <label :for="formField.id + '_field'">{{ t(formApp, formField.title) }}</label>
-                               <NcCheckboxRadioSwitch
-                                       :id="formField.id + '_field'"
+                               <NcCheckboxRadioSwitch :id="formField.id + '_field'"
                                        :checked="Boolean(formFieldsData[formField.id].value)"
                                        @update:checked="(value) => {
                                                formField.value = value
                                                updateFormFieldDataValue(+value, formField, true)
                                        }
-                               ">
+                                       ">
                                        {{ t(formApp, formField.label) }}
                                </NcCheckboxRadioSwitch>
                                <span class="hint">{{ t(formApp, formField.description) }}</span>
@@ -84,8 +78,7 @@
 
                        <template v-if="formField.type === 'multi-checkbox'">
                                <label :for="formField.id + '_field'">{{ t(formApp, formField.title) }}</label>
-                               <NcCheckboxRadioSwitch
-                                       v-for="option in formField.options"
+                               <NcCheckboxRadioSwitch v-for="option in formField.options"
                                        :id="formField.id + '_field_' + option.value"
                                        :key="option.value"
                                        :checked="formFieldsData[formField.id].value[option.value]"
@@ -94,7 +87,7 @@
                                                // Update without re-generating initial formFieldsData.value object as the link to components are lost
                                                updateDeclarativeSettingsValue(formField, JSON.stringify(formFieldsData[formField.id].value))
                                        }
-                               ">
+                                       ">
                                        {{ t(formApp, option.name) }}
                                </NcCheckboxRadioSwitch>
                                <span class="hint">{{ t(formApp, formField.description) }}</span>
 
                        <template v-if="formField.type === 'radio'">
                                <label :for="formField.id + '_field'">{{ t(formApp, formField.title) }}</label>
-                               <NcCheckboxRadioSwitch
-                                       v-for="option in formField.options"
+                               <NcCheckboxRadioSwitch v-for="option in formField.options"
                                        :key="option.value"
                                        :value="option.value"
                                        type="radio"
@@ -146,9 +138,6 @@ export default {
                        formFieldsData: {},
                }
        },
-       beforeMount() {
-               this.initFormFieldsData()
-       },
        computed: {
                formApp() {
                        return this.form.app || ''
@@ -157,6 +146,9 @@ export default {
                        return this.form.fields || []
                },
        },
+       beforeMount() {
+               this.initFormFieldsData()
+       },
        methods: {
                initFormFieldsData() {
                        this.form.fields.forEach((formField) => {
@@ -175,7 +167,7 @@ export default {
                                                this.$set(formField, 'value', JSON.parse(formField.value))
                                                // Merge possible new options
                                                formField.options.forEach(option => {
-                                                       if (!formField.value.hasOwnProperty(option.value)) {
+                                                       if (!Object.prototype.hasOwnProperty.call(formField.value, option.value)) {
                                                                this.$set(formField.value, option.value, false)
                                                        }
                                                })
@@ -216,7 +208,7 @@ export default {
                                        formId: this.form.id.replace(this.formApp + '_', ''), // Remove app prefix to send clean form id
                                        fieldId: formField.id,
                                        value: value === null ? this.formFieldsData[formField.id].value : value,
-                               });
+                               })
                        } catch (err) {
                                console.debug(err)
                                showError(t('settings', 'Failed to save setting'))
index ba9fa186f9f68c4362c0f78afa520b4abd9c1617..6574f4e728db8bb2a94f24fd446dbc4f6a52a630 100644 (file)
 </template>
 
 <script>
+import { showError } from '@nextcloud/dialogs'
+import { loadState } from '@nextcloud/initial-state'
+import { generateOcsUrl } from '@nextcloud/router'
+import { confirmPassword } from '@nextcloud/password-confirmation'
 import axios from '@nextcloud/axios'
 import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
 import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
 import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
-import { loadState } from '@nextcloud/initial-state'
-import { getLoggerBuilder } from '@nextcloud/logger'
 
-import { generateOcsUrl } from '@nextcloud/router'
-import { confirmPassword } from '@nextcloud/password-confirmation'
-import '@nextcloud/password-confirmation/dist/style.css'
-import { showError } from '@nextcloud/dialogs'
+import logger from '../logger'
 
-const logger = getLoggerBuilder()
-       .setApp('settings')
-       .detectUser()
-       .build()
+import '@nextcloud/password-confirmation/dist/style.css'
 
 export default {
        name: 'Encryption',
@@ -122,7 +118,7 @@ export default {
 
                        try {
                                const { data } = await axios.post(url, {
-                                       value: value,
+                                       value,
                                })
                                this.handleResponse({
                                        status: data.ocs?.meta?.status,
index 7580e958023c0375c7252e86e4c2c328a0b5e8af..86917257600be0e53a5aeba64e0fbfb4fc173f35 100644 (file)
 </template>
 
 <script>
-import HeaderBar from './shared/HeaderBar.vue'
-import AccountPropertySection from './shared/AccountPropertySection.vue'
+import { loadState } from '@nextcloud/initial-state'
 import { NAME_READABLE_ENUM } from '../../constants/AccountPropertyConstants.js'
-import { NcDateTimePickerNative } from '@nextcloud/vue'
-import debounce from 'debounce'
 import { savePrimaryAccountProperty } from '../../service/PersonalInfo/PersonalInfoService'
 import { handleError } from '../../utils/handlers'
-import AlertCircle from 'vue-material-design-icons/AlertCircleOutline.vue'
-import { loadState } from '@nextcloud/initial-state'
+
+import debounce from 'debounce'
+
+import NcDateTimePickerNative from '@nextcloud/vue/dist/Components/NcDateTimePickerNative.js'
+import HeaderBar from './shared/HeaderBar.vue'
 
 const { birthdate } = loadState('settings', 'personalInfoParameters', {})
 
@@ -39,8 +39,6 @@ export default {
        name: 'BirthdaySection',
 
        components: {
-               AlertCircle,
-               AccountPropertySection,
                NcDateTimePickerNative,
                HeaderBar,
        },
@@ -74,7 +72,7 @@ export default {
                                const month = (value.getMonth() + 1).toString().padStart(2, '0')
                                const year = value.getFullYear()
                                this.birthdate.value = `${year}-${month}-${day}`
-                       }
+                       },
                },
        },
 
index 4a4a221e199d56fdcd2c5bb050767db6c05700f7..8d6cfdc5f3520bcbe198d82c59ea773d8413d5cd 100644 (file)
@@ -288,7 +288,7 @@ import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js'
 import UserRowActions from './UserRowActions.vue'
 
 import UserRowMixin from '../../mixins/UserRowMixin.js'
-import { isObfuscated, unlimitedQuota } from '../../utils/userUtils.ts';
+import { isObfuscated, unlimitedQuota } from '../../utils/userUtils.ts'
 
 export default {
        name: 'UserRow',
index 818341ba5fcdbd332bad9fea75e70a226c59ce6b..8e686af9b012c86b5956ee08851ffbc35b697358 100644 (file)
@@ -59,6 +59,8 @@ import {
        finishRegistration,
 } from '../../service/WebAuthnRegistrationSerice.ts'
 
+import '@nextcloud/password-confirmation/dist/style.css'
+
 const logAndPass = (text) => (data) => {
        logger.debug(text)
        return data
index bbeb880b8b9254cdf8b2e62c1721ae1e47a2770e..71ec616534c6e1315777df5148a0b22a1e2f8cd0 100644 (file)
@@ -38,7 +38,6 @@
 import { browserSupportsWebAuthn } from '@simplewebauthn/browser'
 import { confirmPassword } from '@nextcloud/password-confirmation'
 import NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js'
-import '@nextcloud/password-confirmation/dist/style.css'
 import sortBy from 'lodash/fp/sortBy.js'
 
 import AddDevice from './AddDevice.vue'
@@ -46,6 +45,8 @@ import Device from './Device.vue'
 import logger from '../../logger.ts'
 import { removeRegistration } from '../../service/WebAuthnRegistrationSerice.js'
 
+import '@nextcloud/password-confirmation/dist/style.css'
+
 const sortByName = sortBy('name')
 
 export default {
index 4644f3e7d87926e3a3e328159a2759200be9aa91..7cd4cb6834533df24d084add4ee17b1b6bcc6068 100644 (file)
@@ -2,10 +2,12 @@
  * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
-import Vue from 'vue';
-import { loadState } from '@nextcloud/initial-state';
-import { translate as t, translatePlural as n } from '@nextcloud/l10n';
-import DeclarativeSection from './components/DeclarativeSettings/DeclarativeSection.vue';
+import type { ComponentInstance } from 'vue'
+
+import { loadState } from '@nextcloud/initial-state'
+import { translate as t, translatePlural as n } from '@nextcloud/l10n'
+import Vue from 'vue'
+import DeclarativeSection from './components/DeclarativeSettings/DeclarativeSection.vue'
 
 interface DeclarativeFormField {
        id: string,
@@ -14,9 +16,9 @@ interface DeclarativeFormField {
        type: string,
        placeholder: string,
        label: string,
-       options: Array<any>|null,
-       value: any,
-       default: any,
+       options: Array<unknown>|null,
+       value: unknown,
+       default: unknown,
 }
 
 interface DeclarativeForm {
@@ -32,23 +34,28 @@ interface DeclarativeForm {
        fields: Array<DeclarativeFormField>,
 }
 
-const forms = loadState('settings', 'declarative-settings-forms', []) as Array<DeclarativeForm>;
-console.debug('Loaded declarative forms:', forms);
+const forms = loadState('settings', 'declarative-settings-forms', []) as Array<DeclarativeForm>
+console.debug('Loaded declarative forms:', forms)
 
-function renderDeclarativeSettingsSections(forms: Array<DeclarativeForm>): void {
+/**
+ *
+ * @param forms
+ */
+function renderDeclarativeSettingsSections(forms: Array<DeclarativeForm>): ComponentInstance[] {
        Vue.mixin({ methods: { t, n } })
-       const DeclarativeSettingsSection = Vue.extend(<any>DeclarativeSection);
-       for (const form of forms) {
+       const DeclarativeSettingsSection = Vue.extend(DeclarativeSection as never)
+
+       return forms.map((form) => {
                const el = `#${form.app}_${form.id}`
-               new DeclarativeSettingsSection({
-                       el: el,
+               return new DeclarativeSettingsSection({
+                       el,
                        propsData: {
                                form,
                        },
                })
-       }
+       })
 }
 
 document.addEventListener('DOMContentLoaded', () => {
-       renderDeclarativeSettingsSections(forms);
-});
+       renderDeclarativeSettingsSections(forms)
+})
index 5439e7cc1b1b095b46ad8567f4033206e03c457a..52e5106328d7960fdda9e379bff14d44ed692b28 100644 (file)
@@ -3,14 +3,15 @@
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
 
-import axios from '@nextcloud/axios'
 import { getCurrentUser } from '@nextcloud/auth'
 import { generateOcsUrl } from '@nextcloud/router'
 import { confirmPassword } from '@nextcloud/password-confirmation'
-import '@nextcloud/password-confirmation/dist/style.css'
+import axios from '@nextcloud/axios'
 
 import { ACCOUNT_PROPERTY_ENUM, SCOPE_SUFFIX } from '../../constants/AccountPropertyConstants.js'
 
+import '@nextcloud/password-confirmation/dist/style.css'
+
 /**
  * Save the primary email of the user
  *
index 6f0e02bf1a5231e1f8f57109ca3b50c8ee1641cf..678fab628d3e50f33404be6d0c0c6b911f95bcfd 100644 (file)
@@ -3,14 +3,15 @@
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
 
-import axios from '@nextcloud/axios'
 import { getCurrentUser } from '@nextcloud/auth'
 import { generateOcsUrl } from '@nextcloud/router'
 import { confirmPassword } from '@nextcloud/password-confirmation'
-import '@nextcloud/password-confirmation/dist/style.css'
+import axios from '@nextcloud/axios'
 
 import { SCOPE_SUFFIX } from '../../constants/AccountPropertyConstants.js'
 
+import '@nextcloud/password-confirmation/dist/style.css'
+
 /**
  * Save the primary account property value for the user
  *
index 84310ef8e13f36c77479d6cef40301c965a5056a..ed5a72453711147ce98195ddba4532a176bb64ac 100644 (file)
@@ -184,7 +184,7 @@ const actions = {
                                                                showInfo(
                                                                        t(
                                                                                'settings',
-                                                                               'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.'
+                                                                               'The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.',
                                                                        ),
                                                                        {
                                                                                onClick: () => window.location.reload(),
index efd3b49e32c6d9ff551e394b38f811b5c501e807..daf5583ab8c978065cb00acb84b2f6929e0b9382 100644 (file)
@@ -12,6 +12,8 @@ import { defineStore } from 'pinia'
 import axios from '@nextcloud/axios'
 import logger from '../logger'
 
+import '@nextcloud/password-confirmation/dist/style.css'
+
 const BASE_URL = generateUrl('/settings/personal/authtokens')
 
 const confirm = () => {
index bd53aca67044944a17be40c3d3ce02c95cbf72bc..03a10b04b5dd55759cd8a1aaadbd877f89b986ba 100644 (file)
@@ -390,6 +390,7 @@ const actions = {
         * @param {object} options destructuring object
         * @param {number} options.offset List offset to request
         * @param {number} options.limit List number to return from offset
+        * @param options.search
         * @return {Promise<number>}
         */
        async getDisabledUsers(context, { offset, limit, search }) {
index 0d62138d7fec78757486823f76b0406c15c1b4e7..9ac21fd4c0e5351080446d99a2566d57638c56b4 100644 (file)
@@ -3,6 +3,8 @@
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
 
+import { translate as t } from '@nextcloud/l10n'
+
 export const unlimitedQuota = {
        id: 'none',
        label: t('settings', 'Unlimited'),
@@ -19,7 +21,7 @@ export const defaultQuota = {
  * @param user
  * @param user.id
  */
-export const isObfuscated = (user: { id: string, [key: string]: any }) => {
+export const isObfuscated = (user: { id: string, [key: string]: unknown }) => {
        const keys = Object.keys(user)
        return keys.length === 1 && keys.at(0) === 'id'
 }
index 833efbb6ae156a20502ce164c1e2e376744fce9d..7bbd23ac5e885634d2623838d3138874845640f7 100644 (file)
 </template>
 
 <script>
-import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
-import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
 import { loadState } from '@nextcloud/initial-state'
 import { showError } from '@nextcloud/dialogs'
-import axios from '@nextcloud/axios'
 import { generateOcsUrl } from '@nextcloud/router'
 import { confirmPassword } from '@nextcloud/password-confirmation'
+import axios from '@nextcloud/axios'
+import NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'
+import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'
+
 import '@nextcloud/password-confirmation/dist/style.css'
 
 export default {
index f8d626f672090cdd9d9678a49ca61c37de0321ea..64ca97fc02c81e26e16a31e6ba74547121896677 100644 (file)
@@ -52,6 +52,7 @@ export const fetchLastUsedTagIds = async (): Promise<number[]> => {
 }
 
 /**
+ * @param tag
  * @return created tag id
  */
 export const createTag = async (tag: Tag | ServerTag): Promise<number> => {
index 505319f2970967233afbb9d2e3d882aaf9807b73..9a5eeeecb55370bd187a84978019711c182ff335 100644 (file)
@@ -13,12 +13,12 @@ export const davClient = createClient(rootUrl)
 
 // set CSRF token header
 const setHeaders = (token: string | null) => {
-  davClient.setHeaders({
-    // Add this so the server knows it is an request from the browser
-    'X-Requested-With': 'XMLHttpRequest',
-    // Inject user auth
-    requesttoken: token ?? '',
-  })
+       davClient.setHeaders({
+               // Add this so the server knows it is an request from the browser
+               'X-Requested-With': 'XMLHttpRequest',
+               // Inject user auth
+               requesttoken: token ?? '',
+       })
 }
 
 // refresh headers when request token changes
index c645837715a19ab75fc65342d8e692a4205c61d7..74917bf0415d52adc54842b85535363098820748 100644 (file)
@@ -27,6 +27,8 @@ export const fetchTagsForFile = async (fileId: number): Promise<TagWithId[]> =>
 }
 
 /**
+ * @param tag
+ * @param fileId
  * @return created tag id
  */
 export const createTagForFile = async (tag: Tag, fileId: number): Promise<number> => {
index 41250cea695ee7d89ea706622052900de1e4e505..c7e0dcbaa5b066ce866ee19dfa8321b95de642dc 100644 (file)
@@ -45,12 +45,13 @@ export const parseIdFromLocation = (url: string): number => {
 }
 
 export const formatTag = (initialTag: Tag | ServerTag): ServerTag => {
-       const tag: any = { ...initialTag }
-       if (tag.name && !tag.displayName) {
-               return tag
+       if ('name' in initialTag && !('displayName' in initialTag)) {
+               return { ...initialTag }
        }
+
+       const tag: Record<string, unknown> = { ...initialTag }
        tag.name = tag.displayName
        delete tag.displayName
 
-       return tag
+       return tag as unknown as ServerTag
 }
index 6368f0958d576e035ad18790b3bfa7336f887f25..f5a082b34903ddd2395ba632be9f38e1d664eaf0 100644 (file)
@@ -96,7 +96,7 @@ const shippedBackgroundList = loadState('theming', 'shippedBackgrounds')
 const backgroundImage = loadState('theming', 'userBackgroundImage')
 const {
        backgroundImage: defaultBackgroundImage,
-       backgroundColor: defaultBackgroundColor,
+       // backgroundColor: defaultBackgroundColor,
        backgroundMime: defaultBackgroundMime,
        defaultShippedBackground,
 } = loadState('theming', 'themingDefaults')
index 1e34d947d7da6e653c4c8fec680382236953e14e..b1f52f2134c64be3ee02a197cb45eef242876981 100644 (file)
@@ -7,7 +7,9 @@
                <div class="theming__preview-image" :style="{ backgroundImage: 'url(' + img + ')' }" @click="onToggle" />
                <div class="theming__preview-description">
                        <h3>{{ theme.title }}</h3>
-                       <p class="theming__preview-explanation">{{ theme.description }}</p>
+                       <p class="theming__preview-explanation">
+                               {{ theme.description }}
+                       </p>
                        <span v-if="enforced" class="theming__preview-warning" role="note">
                                {{ t('theming', 'Theme selection is enforced') }}
                        </span>
index 17886189f514f308818e86535cb72748a7b1a52e..e214c3417e17e8c559ba1bbbf8a5110c38c8b2d1 100644 (file)
@@ -7,15 +7,17 @@
        <div class="field">
                <label :for="id">{{ displayName }}</label>
                <div class="field__row">
-                       <NcCheckboxRadioSwitch type="switch"
-                               :id="id"
+                       <NcCheckboxRadioSwitch :id="id"
+                               type="switch"
                                :checked.sync="localValue"
                                @update:checked="save">
                                {{ label }}
                        </NcCheckboxRadioSwitch>
                </div>
 
-               <p class="field__description">{{ description }}</p>
+               <p class="field__description">
+                       {{ description }}
+               </p>
 
                <NcNoteCard v-if="errorMessage"
                        type="error"
index 717f222abbfe06e1ffc8159bc375e4c88bc58bdc..b184779ce5c92ce1ba68828c1f9e37157747e3b2 100644 (file)
@@ -7,8 +7,8 @@
        <div class="field">
                <label :for="id">{{ displayName }}</label>
                <div class="field__row">
-                       <NcButton type="secondary"
-                               :id="id"
+                       <NcButton :id="id"
+                               type="secondary"
                                :aria-label="ariaLabel"
                                data-admin-theming-setting-file-picker
                                @click="activateLocalFilePicker">
index 1ce2958c8aafab5d0e96969f6959a2173dfee7b5..0b61645748799add2ee4b511d1033c5e1117ac2a 100644 (file)
 
 <script>
 import { confirmPassword } from '@nextcloud/password-confirmation'
-import '@nextcloud/password-confirmation/dist/style.css'
 import { print } from '../service/PrintService.js'
 
+import '@nextcloud/password-confirmation/dist/style.css'
+
 export default {
        name: 'PersonalSettings',
        data() {
@@ -97,7 +98,7 @@ export default {
                                // Hide old codes
                                this.generatingCodes = true
 
-                               this.$store.dispatch('generate').then(data => {
+                               this.$store.dispatch('generate').then(() => {
                                        this.generatingCodes = false
                                }).catch(err => {
                                        OC.Notification.showTemporary(t('twofactor_backupcodes', 'An error occurred while generating your backup codes'))
index 2f5244d624885e07aa939297db48e3f09cd316d1..bc5d56376002b9122bc77d3e43824e4a9bffc708 100644 (file)
@@ -132,7 +132,7 @@ export default {
                        this.$set(this.rule, 'operation', operation)
                        await this.updateRule()
                },
-               validate(state) {
+               validate(/* state */) {
                        this.error = null
                        this.$store.dispatch('updateRule', this.rule)
                },
index 7097abf5dd47da741bc74cc30a267e24d9ac49e5..a07b0989357d8f4c093a2d1869716ace32da52cf 100644 (file)
@@ -6,10 +6,11 @@
 import Vue from 'vue'
 import Vuex, { Store } from 'vuex'
 import axios from '@nextcloud/axios'
-import { getApiUrl } from './helpers/api.js'
 import { confirmPassword } from '@nextcloud/password-confirmation'
-import '@nextcloud/password-confirmation/dist/style.css'
 import { loadState } from '@nextcloud/initial-state'
+import { getApiUrl } from './helpers/api.js'
+
+import '@nextcloud/password-confirmation/dist/style.css'
 
 Vue.use(Vuex)
 
index 044e5a3fed1749182e46736bc1ccd5db9160a2c7..dfead674f3fb08e573c7025de6d47b920ca54ebd 100644 (file)
@@ -5,7 +5,7 @@
 module.exports = {
        plugins: [
                '@babel/plugin-syntax-dynamic-import',
-               '@babel/plugin-proposal-class-properties',
+               '@babel/plugin-transform-class-properties',
                // We need the bundler entry not the web one
                // Jest will otherwise resolve the wrong one
                [
index 87ec53270476cdc55bacbf10dc118724b45d48b0..4b4eb658592495a6c279ee15f463ec01bf19ef4b 100644 (file)
@@ -104,7 +104,7 @@ export const hideMenus = function(complete) {
 /**
  * Shows a given element as menu
  *
- * @param {object} [$toggle=null] menu toggle
+ * @param {object} [$toggle] menu toggle
  * @param {object} $menuEl menu element
  * @param {Function} complete callback when the showing animation is done
  */
index 817620e96341259aeb12a44640d4288504c4921b..7f95f8335f4dfb0bebd048950dec418c9163a174 100644 (file)
@@ -76,7 +76,7 @@ export default {
         * @param {string} html Message to display
         * @param {object} [options] options
         * @param {string} [options.type] notification type
-        * @param {number} [options.timeout=0] timeout value, defaults to 0 (permanent)
+        * @param {number} [options.timeout] timeout value, defaults to 0 (permanent)
         * @return {jQuery} jQuery element for notification row
         * @deprecated 17.0.0 use the `@nextcloud/dialogs` package
         */
@@ -95,7 +95,7 @@ export default {
         * @param {string} text Message to display
         * @param {object} [options] options
         * @param {string} [options.type] notification type
-        * @param {number} [options.timeout=0] timeout value, defaults to 0 (permanent)
+        * @param {number} [options.timeout] timeout value, defaults to 0 (permanent)
         * @return {jQuery} jQuery element for notification row
         * @deprecated 17.0.0 use the `@nextcloud/dialogs` package
         */
@@ -138,8 +138,8 @@ export default {
         *
         * @param {string} text Message to show
         * @param {Array} [options] options array
-        * @param {number} [options.timeout=7] timeout in seconds, if this is 0 it will show the message permanently
-        * @param {boolean} [options.isHTML=false] an indicator for HTML notifications (true) or text (false)
+        * @param {number} [options.timeout] timeout in seconds, if this is 0 it will show the message permanently
+        * @param {boolean} [options.isHTML] an indicator for HTML notifications (true) or text (false)
         * @param {string} [options.type] notification type
         * @return {JQuery} the toast element
         * @deprecated 17.0.0 use the `@nextcloud/dialogs` package
index eb4ddb185c80693ad6e7eac8aee98829e2fa71d1..7ecd0e098c673059d7ef3381652de13aba21fd9a 100644 (file)
@@ -27,7 +27,7 @@ export default {
         * or a map
         * @param {string} [url] URL to be used, otherwise the current URL will be used,
         * using the params as query string
-        * @param {boolean} [replace=false] whether to replace instead of pushing
+        * @param {boolean} [replace] whether to replace instead of pushing
         */
        _pushState(params, url, replace) {
                let strParams
index f7dda747e674d46d3073b3108c170cf8076cd2ff..66ad638e10a25a5d15c0f69f2c106aa25cddb84f 100644 (file)
@@ -47,7 +47,7 @@ export const processAjaxError = xhr => {
                                                OC.reload()
                                        }
                                        timer++
-                               }, 1000 // 1 second interval
+                               }, 1000, // 1 second interval
                                )
 
                                // only call reload once
index 52105f9c7faf7af916da5eba111bf82de06c62ce..6df264f009f0f7558babd94bb14172a986ec1c12 100644 (file)
@@ -9,6 +9,6 @@
 export default function getURLParameter(name) {
        return decodeURIComponent(
                // eslint-disable-next-line no-sparse-arrays
-               (new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [, ''])[1].replace(/\+/g, '%20')
+               (new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [, ''])[1].replace(/\+/g, '%20'),
        ) || ''
 }
index a9b1be9b6e66bbc74a91a19c88def3b352748476..e57c0d067db04e15ac39e909140913473101f417 100644 (file)
@@ -78,7 +78,7 @@ export default {
                                }
                        }
                        return undefined
-               }
+               },
        },
 }
 </script>
index 38127d99d449193d62352fec32e46abdeb758631..99ee99dbe6c450e4f256d62bcfcd405d0751a16a 100644 (file)
@@ -111,7 +111,7 @@ export default {
                        loadingApps: true,
                        loadingAppsError: false,
                        apps: [],
-                       defaultPageUrl: loadState('core', 'defaultPageUrl')
+                       defaultPageUrl: loadState('core', 'defaultPageUrl'),
                }
        },
        computed: {
index 8de0a9d9506a0df0995d198c0dab7472a9ecac26..cecbe880aa674d2133fa32eb49e4a2590bd30a78 100644 (file)
@@ -89,7 +89,7 @@ const Template = {
                                function(a, b) {
                                        const r = o[b]
                                        return typeof r === 'string' || typeof r === 'number' ? r : a
-                               }
+                               },
                        )
                } catch (e) {
                        console.error(e, 'data:', data)
index b9a7dd42098e3848c79951e643f1585514f2bfa1..3bd4d6b9ccdee68ff395580888deba7de2d8d627 100644 (file)
@@ -52,8 +52,8 @@ const getInterval = () => {
                24 * 3600,
                Math.max(
                        60,
-                       isNaN(interval) ? 900 : interval
-               )
+                       isNaN(interval) ? 900 : interval,
+               ),
        )
 }
 
index d2401954b67e292c050dd070e45750b96902af48..349650e02be80908ef42d1b83e293def3aa78802 100644 (file)
@@ -2,6 +2,7 @@
  * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
  * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
  * SPDX-License-Identifier: AGPL-3.0-or-later
+ * @param OC
  */
 
 (function(OC) {
index 77a6bee1e86c0bb6dc0d86c7ebb6dd7483e4a817..bf4745050097367b88acf3dff69d86236890101e 100644 (file)
@@ -17,19 +17,19 @@ describe('Contact', function() {
                                        topAction: {
                                                title: 'Mail',
                                                icon: 'icon-mail',
-                                               hyperlink: 'mailto:deboraoliver%40centrexin.com'
+                                               hyperlink: 'mailto:deboraoliver%40centrexin.com',
                                        },
                                        emailAddresses: [],
                                        actions: [
                                                {
                                                        title: 'Mail',
                                                        icon: 'icon-mail',
-                                                       hyperlink: 'mailto:mathisholland%40virxo.com'
+                                                       hyperlink: 'mailto:mathisholland%40virxo.com',
                                                },
                                                {
                                                        title: 'Details',
                                                        icon: 'icon-info',
-                                                       hyperlink: 'https://localhost/index.php/apps/contacts'
+                                                       hyperlink: 'https://localhost/index.php/apps/contacts',
                                                },
                                        ],
                                        lastMessage: '',
index c28d7226e79f445daa14185a0eeb328052a18c0e..6df73fa182755cf7dae4da494c5177e4b0b8df2e 100644 (file)
@@ -82,19 +82,19 @@ describe('ContactsMenu', function() {
                                                topAction: {
                                                        title: 'Mail',
                                                        icon: 'icon-mail',
-                                                       hyperlink: 'mailto:deboraoliver%40centrexin.com'
+                                                       hyperlink: 'mailto:deboraoliver%40centrexin.com',
                                                },
                                                actions: [
                                                        {
                                                                title: 'Mail',
                                                                icon: 'icon-mail',
-                                                               hyperlink: 'mailto:mathisholland%40virxo.com'
+                                                               hyperlink: 'mailto:mathisholland%40virxo.com',
                                                        },
                                                        {
                                                                title: 'Details',
                                                                icon: 'icon-info',
-                                                               hyperlink: 'https://localhost/index.php/apps/contacts'
-                                                       }
+                                                               hyperlink: 'https://localhost/index.php/apps/contacts',
+                                                       },
                                                ],
                                                lastMessage: '',
                                                emailAddresses: [],
@@ -105,23 +105,23 @@ describe('ContactsMenu', function() {
                                                topAction: {
                                                        title: 'Mail',
                                                        icon: 'icon-mail',
-                                                       hyperlink: 'mailto:ceciliasoto%40essensia.com'
+                                                       hyperlink: 'mailto:ceciliasoto%40essensia.com',
                                                },
                                                actions: [
                                                        {
                                                                title: 'Mail',
                                                                icon: 'icon-mail',
-                                                               hyperlink: 'mailto:pearliesellers%40inventure.com'
+                                                               hyperlink: 'mailto:pearliesellers%40inventure.com',
                                                        },
                                                        {
                                                                title: 'Details',
                                                                icon: 'icon-info',
-                                                               hyperlink: 'https://localhost/index.php/apps/contacts'
-                                                       }
+                                                               hyperlink: 'https://localhost/index.php/apps/contacts',
+                                                       },
                                                ],
                                                lastMessage: 'cu',
                                                emailAddresses: [],
-                                       }
+                                       },
                                ],
                                contactsAppEnabled: true,
                        },
index b991ae875cf554ed5d3853452922285a967bf6a1..5eaeb7e64d7228f40d4a99c7f94d89272cf888b3 100644 (file)
@@ -8,7 +8,7 @@ import { getRootUrl } from '@nextcloud/router'
 /**
  *
  * @param {string} url the URL to check
- * @returns {boolean}
+ * @return {boolean}
  */
 const isRelativeUrl = (url) => {
        return !url.startsWith('https://') && !url.startsWith('http://')
index 51eea0a0fb1e02d2466e365edb2b97c7c77e274f..17bb9d5725c73c54a400ea270c2e31876733cb69 100644 (file)
                </template>
                <div class="contactsmenu__menu">
                        <div class="contactsmenu__menu__input-wrapper">
-                               <NcTextField :value.sync="searchTerm"
-                                       trailing-button-icon="close"
+                               <NcTextField id="contactsmenu__menu__search"
                                        ref="contactsMenuInput"
+                                       :value.sync="searchTerm"
+                                       trailing-button-icon="close"
                                        :label="t('core', 'Search contacts')"
                                        :trailing-button-label="t('core','Reset search')"
                                        :show-trailing-button="searchTerm !== ''"
                                        :placeholder="t('core', 'Search contacts â€¦')"
-                                       id="contactsmenu__menu__search"
                                        class="contactsmenu__menu__search"
                                        @input="onInputDebounced"
                                        @trailing-button-click="onReset" />
index 54b7ee1fd356474086f3af77f071aaaa7a040c0f..b2f9617874f8dcf219d5013ba2250e696f041da4 100644 (file)
@@ -38,7 +38,10 @@ const config: Config = {
        testMatch: ['<rootDir>/**/*.(spec|test).(ts|js)'],
 
        clearMocks: true,
-       setupFilesAfterEnv: ['<rootDir>/__tests__/jest-setup.ts'],
+       setupFilesAfterEnv: [
+               '<rootDir>/__tests__/jest-setup.ts',
+               '<rootDir>/__tests__/mock-window.js',
+       ],
 
        testEnvironment: 'jest-environment-jsdom',
        preset: 'ts-jest/presets/js-with-ts',
index 2f0379b42f8c2b43a3efba83c6f22ec6eed17d08..8cfc91e1c3d4906642928ce511cd86c6477f5028 100644 (file)
@@ -28,7 +28,7 @@
         "@nextcloud/password-confirmation": "^5.1.1",
         "@nextcloud/paths": "^2.1.0",
         "@nextcloud/router": "^3.0.0",
-        "@nextcloud/sharing": "^0.1.0",
+        "@nextcloud/sharing": "^0.2.2",
         "@nextcloud/upload": "^1.4.1",
         "@nextcloud/vue": "^8.14.0",
         "@simplewebauthn/browser": "^10.0.0",
         "webdav": "^5.6.0"
       },
       "devDependencies": {
-        "@babel/node": "^7.22.10",
-        "@babel/preset-typescript": "^7.24.1",
-        "@cypress/vue2": "^2.1.0",
-        "@cypress/webpack-preprocessor": "^6.0.1",
+        "@babel/node": "^7.24.7",
+        "@babel/preset-typescript": "^7.24.7",
+        "@cypress/vue2": "^2.1.1",
+        "@cypress/webpack-preprocessor": "^6.0.2",
         "@jest/globals": "^29.7.0",
-        "@nextcloud/babel-config": "^1.0.0",
+        "@nextcloud/babel-config": "^1.2.0",
         "@nextcloud/cypress": "^1.0.0-beta.8",
-        "@nextcloud/eslint-config": "^v8.4.1",
+        "@nextcloud/eslint-config": "^8.4.1",
         "@nextcloud/stylelint-config": "^3.0.1",
-        "@nextcloud/typings": "^1.8.0",
+        "@nextcloud/typings": "^1.9.1",
         "@nextcloud/webpack-vue-config": "^6.0.1",
-        "@pinia/testing": "^0.1.2",
+        "@pinia/testing": "^0.1.3",
         "@simplewebauthn/types": "^10.0.0",
         "@testing-library/cypress": "^10.0.2",
         "@testing-library/jest-dom": "^6.4.6",
       }
     },
     "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
-      "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+      "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
-      "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+      "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.15"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz",
-      "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-member-expression-to-functions": "^7.23.0",
-        "@babel/helper-optimise-call-expression": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.24.1",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz",
+      "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.7",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
         "semver": "^6.3.1"
       },
       "engines": {
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
-      "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz",
+      "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
         "regexpu-core": "^5.3.1",
         "semver": "^6.3.1"
       },
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
-      "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+      "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
       "dev": true,
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
       }
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
-      "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz",
+      "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.23.0"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
-      "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+      "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
-      "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+      "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
-      "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-wrap-function": "^7.22.20"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-wrap-function": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz",
-      "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
+      "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-member-expression-to-functions": "^7.23.0",
-        "@babel/helper-optimise-call-expression": "^7.22.5"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.7",
+        "@babel/helper-optimise-call-expression": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
-      "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+      "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-wrap-function": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
-      "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
+      "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.22.19"
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/template": "^7.24.7",
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/node": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.23.9.tgz",
-      "integrity": "sha512-/d4ju/POwlGIJlZ+NqWH1qu61wt6ZlTZZZutrK2MOSdaH1JCh726nLw/GSvAjG+LTY6CO9SsB8uWcttnFKm6yg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.24.7.tgz",
+      "integrity": "sha512-BCYNLxUQjGTgy8bAq12jy+Lt8soGWa/5u3s7U3aTVXxviIp0YVS+/Wm0b4eaitLVvetYrEoAiRF0QOk4WKsHAQ==",
       "dev": true,
       "dependencies": {
-        "@babel/register": "^7.23.7",
-        "commander": "^4.0.1",
+        "@babel/register": "^7.24.6",
+        "commander": "^6.2.0",
         "core-js": "^3.30.2",
         "node-environment-flags": "^1.0.5",
         "regenerator-runtime": "^0.14.0",
         "node": ">=6.0.0"
       }
     },
-    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz",
-      "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz",
+      "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
-      "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
+    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
+      "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/plugin-transform-optional-chaining": "^7.23.3"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.13.0"
+        "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz",
-      "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==",
+    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0"
+        "@babel/core": "^7.13.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",
-      "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
-      "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
+      "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==",
       "dev": true,
-      "peer": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       },
       "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/plugin-proposal-private-property-in-object": {
       }
     },
     "node_modules/@babel/plugin-syntax-import-assertions": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
-      "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
-      "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz",
-      "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
+      "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz",
-      "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
+      "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
-      "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-async-generator-functions": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz",
-      "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz",
+      "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-remap-async-to-generator": "^7.22.20",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7",
         "@babel/plugin-syntax-async-generators": "^7.8.4"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
-      "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-remap-async-to-generator": "^7.22.20"
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
-      "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
-      "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
+      "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-class-properties": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
-      "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-class-static-block": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
-      "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.23.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz",
-      "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
+      "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.20",
-        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
         "globals": "^11.1.0"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
-      "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/template": "^7.22.15"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/template": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
-      "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
+      "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
-      "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
-      "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-dynamic-import": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
-      "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
-      "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-export-namespace-from": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
-      "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz",
-      "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
-      "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
+      "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.22.15",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-json-strings": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
-      "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
-      "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
+      "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
-      "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
-      "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
-      "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz",
-      "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
+      "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-simple-access": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz",
-      "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
+      "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-hoist-variables": "^7.24.7",
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
-      "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
-      "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
-      "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
-      "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-numeric-separator": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
-      "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-object-rest-spread": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
-      "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.23.3",
-        "@babel/helper-compilation-targets": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.23.3"
+        "@babel/plugin-transform-parameters": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
-      "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.22.20"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
-      "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-optional-chaining": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
-      "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
-      "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+      "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-private-methods": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
-      "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-private-property-in-object": {
-      "version": "7.23.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
-      "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
-      "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
-      "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "regenerator-transform": "^0.15.2"
       },
       "engines": {
       }
     },
     "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
-      "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
-      "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
-      "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
-      "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
-      "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
-      "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz",
+      "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-typescript": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz",
-      "integrity": "sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz",
+      "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/plugin-syntax-typescript": "^7.24.1"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-typescript": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
-      "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
-      "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
-      "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
-      "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/preset-env": {
-      "version": "7.23.9",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz",
-      "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz",
+      "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.23.5",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.22.5",
-        "@babel/helper-validator-option": "^7.23.5",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
-        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7",
+        "@babel/compat-data": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7",
         "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
         "@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.23.3",
-        "@babel/plugin-syntax-import-attributes": "^7.23.3",
+        "@babel/plugin-syntax-import-assertions": "^7.24.7",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
         "@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",
         "@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.23.3",
-        "@babel/plugin-transform-async-generator-functions": "^7.23.9",
-        "@babel/plugin-transform-async-to-generator": "^7.23.3",
-        "@babel/plugin-transform-block-scoped-functions": "^7.23.3",
-        "@babel/plugin-transform-block-scoping": "^7.23.4",
-        "@babel/plugin-transform-class-properties": "^7.23.3",
-        "@babel/plugin-transform-class-static-block": "^7.23.4",
-        "@babel/plugin-transform-classes": "^7.23.8",
-        "@babel/plugin-transform-computed-properties": "^7.23.3",
-        "@babel/plugin-transform-destructuring": "^7.23.3",
-        "@babel/plugin-transform-dotall-regex": "^7.23.3",
-        "@babel/plugin-transform-duplicate-keys": "^7.23.3",
-        "@babel/plugin-transform-dynamic-import": "^7.23.4",
-        "@babel/plugin-transform-exponentiation-operator": "^7.23.3",
-        "@babel/plugin-transform-export-namespace-from": "^7.23.4",
-        "@babel/plugin-transform-for-of": "^7.23.6",
-        "@babel/plugin-transform-function-name": "^7.23.3",
-        "@babel/plugin-transform-json-strings": "^7.23.4",
-        "@babel/plugin-transform-literals": "^7.23.3",
-        "@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
-        "@babel/plugin-transform-member-expression-literals": "^7.23.3",
-        "@babel/plugin-transform-modules-amd": "^7.23.3",
-        "@babel/plugin-transform-modules-commonjs": "^7.23.3",
-        "@babel/plugin-transform-modules-systemjs": "^7.23.9",
-        "@babel/plugin-transform-modules-umd": "^7.23.3",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
-        "@babel/plugin-transform-new-target": "^7.23.3",
-        "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
-        "@babel/plugin-transform-numeric-separator": "^7.23.4",
-        "@babel/plugin-transform-object-rest-spread": "^7.23.4",
-        "@babel/plugin-transform-object-super": "^7.23.3",
-        "@babel/plugin-transform-optional-catch-binding": "^7.23.4",
-        "@babel/plugin-transform-optional-chaining": "^7.23.4",
-        "@babel/plugin-transform-parameters": "^7.23.3",
-        "@babel/plugin-transform-private-methods": "^7.23.3",
-        "@babel/plugin-transform-private-property-in-object": "^7.23.4",
-        "@babel/plugin-transform-property-literals": "^7.23.3",
-        "@babel/plugin-transform-regenerator": "^7.23.3",
-        "@babel/plugin-transform-reserved-words": "^7.23.3",
-        "@babel/plugin-transform-shorthand-properties": "^7.23.3",
-        "@babel/plugin-transform-spread": "^7.23.3",
-        "@babel/plugin-transform-sticky-regex": "^7.23.3",
-        "@babel/plugin-transform-template-literals": "^7.23.3",
-        "@babel/plugin-transform-typeof-symbol": "^7.23.3",
-        "@babel/plugin-transform-unicode-escapes": "^7.23.3",
-        "@babel/plugin-transform-unicode-property-regex": "^7.23.3",
-        "@babel/plugin-transform-unicode-regex": "^7.23.3",
-        "@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
+        "@babel/plugin-transform-arrow-functions": "^7.24.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.24.7",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.24.7",
+        "@babel/plugin-transform-class-properties": "^7.24.7",
+        "@babel/plugin-transform-class-static-block": "^7.24.7",
+        "@babel/plugin-transform-classes": "^7.24.7",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.7",
+        "@babel/plugin-transform-dotall-regex": "^7.24.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+        "@babel/plugin-transform-dynamic-import": "^7.24.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.24.7",
+        "@babel/plugin-transform-json-strings": "^7.24.7",
+        "@babel/plugin-transform-literals": "^7.24.7",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+        "@babel/plugin-transform-modules-amd": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+        "@babel/plugin-transform-modules-systemjs": "^7.24.7",
+        "@babel/plugin-transform-modules-umd": "^7.24.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-new-target": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-object-super": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.24.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-property-literals": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-reserved-words": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-template-literals": "^7.24.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
-        "babel-plugin-polyfill-corejs2": "^0.4.8",
-        "babel-plugin-polyfill-corejs3": "^0.9.0",
-        "babel-plugin-polyfill-regenerator": "^0.5.5",
+        "babel-plugin-polyfill-corejs2": "^0.4.10",
+        "babel-plugin-polyfill-corejs3": "^0.10.4",
+        "babel-plugin-polyfill-regenerator": "^0.6.1",
         "core-js-compat": "^3.31.0",
         "semver": "^6.3.1"
       },
       }
     },
     "node_modules/@babel/preset-typescript": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz",
-      "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz",
+      "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-validator-option": "^7.23.5",
-        "@babel/plugin-syntax-jsx": "^7.24.1",
-        "@babel/plugin-transform-modules-commonjs": "^7.24.1",
-        "@babel/plugin-transform-typescript": "^7.24.1"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+        "@babel/plugin-transform-typescript": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/register": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz",
-      "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz",
+      "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==",
       "dev": true,
       "dependencies": {
         "clone-deep": "^4.0.1",
       }
     },
     "node_modules/@cypress/vue2": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@cypress/vue2/-/vue2-2.1.0.tgz",
-      "integrity": "sha512-UIzPfn54UgWUf9HVSyQi/GOVWm7/ns6x5clbODd7NcLsau/BiKpdVqYoy4vufdTP7RvXGm3xYfpdUhWGZwz7Gw==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@cypress/vue2/-/vue2-2.1.1.tgz",
+      "integrity": "sha512-8/1Z6XrSdJWU9ybniGKyUe5iztVIi/Y5PwWg6mtsa8IMdtK2ZA8Vrv/ZIZ8jT3XAEUSaMhPBEh6TgUbq03kr8w==",
       "dev": true,
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/@cypress/webpack-preprocessor": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.1.tgz",
-      "integrity": "sha512-WVNeFVSnFKxE3WZNRIriduTgqJRpevaiJIPlfqYTTzfXRD7X1Pv4woDE+G4caPV9bJqVKmVFiwzrXMRNeJxpxA==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.2.tgz",
+      "integrity": "sha512-0+1+4iy4W9PE6R5ywBNKAZoFp8Sf//w3UJ+CKTqkcAjA29b+dtsD0iFT70DsYE0BMqUM1PO7HXFGbXllQ+bRAA==",
       "dev": true,
       "dependencies": {
         "bluebird": "3.7.1",
       }
     },
     "node_modules/@nextcloud/babel-config": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@nextcloud/babel-config/-/babel-config-1.0.0.tgz",
-      "integrity": "sha512-olz7sqPD7xMDP2KcYwODtitH37faR/C5jKX1oxXzdDf+s1FRy6OQTC5ZqZR2LHZA6jTUvmwM/xWBPoEB/HPFRw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@nextcloud/babel-config/-/babel-config-1.2.0.tgz",
+      "integrity": "sha512-QOESlmX99UOfXdPANpoeFtfoRWWfKhBm1wXgF2lLnwpOBq4ZzdtqI+wphhWA/lkdfw/sftZzd1UJF/gcPDpiAw==",
       "dev": true,
+      "engines": {
+        "node": "^20.0.0",
+        "npm": "^10.0.0"
+      },
       "peerDependencies": {
-        "@babel/core": "^7.13.10",
-        "@babel/plugin-proposal-class-properties": "^7.13.0",
+        "@babel/core": "^7.24.5",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3",
-        "@babel/plugin-transform-modules-commonjs": "^7.13.8",
-        "@babel/plugin-transform-shorthand-properties": "^7.12.13",
-        "@babel/preset-env": "^7.13.12"
+        "@babel/preset-env": "^7.24.5"
       }
     },
     "node_modules/@nextcloud/browser-storage": {
         "vue": "^2.7.16"
       }
     },
-    "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/sharing": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.2.2.tgz",
-      "integrity": "sha512-ui0ZoVazroA+cF4+homhFSFAddd/P4uRYMfG3rw3QR8o6igrVFe0f0l21kYtUwXU0oC0K4v3k8j93zCTfz6v3g==",
-      "dependencies": {
-        "@nextcloud/initial-state": "^2.2.0"
-      },
-      "engines": {
-        "node": "^20.0.0",
-        "npm": "^10.0.0"
-      }
-    },
     "node_modules/@nextcloud/eslint-config": {
       "version": "8.4.1",
       "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-8.4.1.tgz",
         "npm": "^10.0.0"
       }
     },
-    "node_modules/@nextcloud/files/node_modules/@nextcloud/sharing": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.2.2.tgz",
-      "integrity": "sha512-ui0ZoVazroA+cF4+homhFSFAddd/P4uRYMfG3rw3QR8o6igrVFe0f0l21kYtUwXU0oC0K4v3k8j93zCTfz6v3g==",
-      "dependencies": {
-        "@nextcloud/initial-state": "^2.2.0"
-      },
-      "engines": {
-        "node": "^20.0.0",
-        "npm": "^10.0.0"
-      }
-    },
     "node_modules/@nextcloud/initial-state": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-2.2.0.tgz",
       }
     },
     "node_modules/@nextcloud/sharing": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.1.0.tgz",
-      "integrity": "sha512-Cv4uc1aFrA18w0dltq7a5om/EbJSXf36rtO0LP3vi42E6l8ZDVCZwHLKrsZZa/TXNLeYErs1g/6tmWx5xiSSow==",
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.2.2.tgz",
+      "integrity": "sha512-ui0ZoVazroA+cF4+homhFSFAddd/P4uRYMfG3rw3QR8o6igrVFe0f0l21kYtUwXU0oC0K4v3k8j93zCTfz6v3g==",
       "dependencies": {
-        "core-js": "^3.6.4"
+        "@nextcloud/initial-state": "^2.2.0"
+      },
+      "engines": {
+        "node": "^20.0.0",
+        "npm": "^10.0.0"
       }
     },
     "node_modules/@nextcloud/stylelint-config": {
       }
     },
     "node_modules/@nextcloud/typings": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.8.0.tgz",
-      "integrity": "sha512-q9goE0wc+1BCI9Ku0MebCHmqOMwz2K7ESKQrcHDs6O+HqbKA8zGiEtXL5XGrMS7Ovtl1YOIwxlP9kEvgvXt52Q==",
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.9.1.tgz",
+      "integrity": "sha512-i0l/L5gKW8EACbXHVxXM6wn3sUhY2qmnL2OijppzU4dENC7/hqySMQDer7/+cJbNSNG7uHF/Z+9JmHtDfRfuGg==",
       "dependencies": {
-        "@types/jquery": "3.5.16",
-        "vue": "^2.7.15",
-        "vue-router": "<4"
+        "@types/jquery": "3.5.16"
       },
       "engines": {
         "node": "^20.0.0",
         "vue": "^2.7.16"
       }
     },
-    "node_modules/@nextcloud/upload/node_modules/@nextcloud/sharing": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.2.2.tgz",
-      "integrity": "sha512-ui0ZoVazroA+cF4+homhFSFAddd/P4uRYMfG3rw3QR8o6igrVFe0f0l21kYtUwXU0oC0K4v3k8j93zCTfz6v3g==",
-      "dependencies": {
-        "@nextcloud/initial-state": "^2.2.0"
-      },
-      "engines": {
-        "node": "^20.0.0",
-        "npm": "^10.0.0"
-      }
-    },
     "node_modules/@nextcloud/upload/node_modules/eventemitter3": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
       }
     },
     "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.4.8",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz",
-      "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==",
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+      "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
       "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.22.6",
-        "@babel/helper-define-polyfill-provider": "^0.5.0",
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
         "semver": "^6.3.1"
       },
       "peerDependencies": {
       }
     },
     "node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz",
-      "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==",
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
+      "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.5.0",
-        "core-js-compat": "^3.34.0"
+        "@babel/helper-define-polyfill-provider": "^0.6.1",
+        "core-js-compat": "^3.36.1"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
     "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz",
-      "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+      "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.5.0"
+        "@babel/helper-define-polyfill-provider": "^0.6.2"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
     "node_modules/commander": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
-      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
       "dev": true,
       "engines": {
         "node": ">= 6"
       }
     },
     "node_modules/core-js-compat": {
-      "version": "3.36.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz",
-      "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==",
+      "version": "3.37.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+      "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
       "dev": true,
       "dependencies": {
-        "browserslist": "^4.22.3"
+        "browserslist": "^4.23.0"
       },
       "funding": {
         "type": "opencollective",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true
     },
-    "node_modules/cypress/node_modules/commander": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/cypress/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
index 94492f06a8e1f70f09adc9ec35361b859b99f601..8139cea9a8594c03ca4e95f32d241c62fb5db3f1 100644 (file)
@@ -13,8 +13,8 @@
     "postbuild": "build/npm-post-build.sh",
     "dev": "webpack --node-env development --progress",
     "watch": "webpack --node-env development --progress --watch",
-    "lint": "eslint $(for appdir in $(ls apps); do if ! $(git check-ignore -q $appdir); then printf \"$appdir \"; fi; done) core --no-error-on-unmatched-pattern",
-    "lint:fix": "eslint $(for appdir in $(ls apps); do if ! $(git check-ignore -q $appdir); then printf \"$appdir \"; fi; done) core --no-error-on-unmatched-pattern --fix",
+    "lint": "eslint $(for appdir in $(ls apps); do if ! $(git check-ignore -q $appdir); then printf \"apps/$appdir \"; fi; done) core --no-error-on-unmatched-pattern",
+    "lint:fix": "eslint $(for appdir in $(ls apps); do if ! $(git check-ignore -q $appdir); then printf \"apps/$appdir \"; fi; done) core --no-error-on-unmatched-pattern --fix",
     "test": "jest",
     "test:watch": "jest --watch",
     "test:coverage": "jest --coverage",
@@ -56,7 +56,7 @@
     "@nextcloud/password-confirmation": "^5.1.1",
     "@nextcloud/paths": "^2.1.0",
     "@nextcloud/router": "^3.0.0",
-    "@nextcloud/sharing": "^0.1.0",
+    "@nextcloud/sharing": "^0.2.2",
     "@nextcloud/upload": "^1.4.1",
     "@nextcloud/vue": "^8.14.0",
     "@simplewebauthn/browser": "^10.0.0",
     "webdav": "^5.6.0"
   },
   "devDependencies": {
-    "@babel/node": "^7.22.10",
-    "@babel/preset-typescript": "^7.24.1",
-    "@cypress/vue2": "^2.1.0",
-    "@cypress/webpack-preprocessor": "^6.0.1",
+    "@babel/node": "^7.24.7",
+    "@babel/preset-typescript": "^7.24.7",
+    "@cypress/vue2": "^2.1.1",
+    "@cypress/webpack-preprocessor": "^6.0.2",
     "@jest/globals": "^29.7.0",
-    "@nextcloud/babel-config": "^1.0.0",
+    "@nextcloud/babel-config": "^1.2.0",
     "@nextcloud/cypress": "^1.0.0-beta.8",
-    "@nextcloud/eslint-config": "^v8.4.1",
+    "@nextcloud/eslint-config": "^8.4.1",
     "@nextcloud/stylelint-config": "^3.0.1",
-    "@nextcloud/typings": "^1.8.0",
+    "@nextcloud/typings": "^1.9.1",
     "@nextcloud/webpack-vue-config": "^6.0.1",
-    "@pinia/testing": "^0.1.2",
+    "@pinia/testing": "^0.1.3",
     "@simplewebauthn/types": "^10.0.0",
     "@testing-library/cypress": "^10.0.2",
     "@testing-library/jest-dom": "^6.4.6",