From 81cfb9580af5b6e2c07377c79413c3e9208b1269 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Tue, 14 Oct 2025 02:25:34 +0200 Subject: [PATCH 1/4] refactor(test): migrate cypress component tests to vitest Signed-off-by: Ferdinand Thiessen --- __tests__/setup-global.js | 1 + __tests__/setup-testing-library.js | 1 + .../src/components/RemoteShareDialog.cy.ts | 123 -------- .../src/components/RemoteShareDialog.spec.ts | 115 +++++++ .../src/components/RemoteShareDialog.vue | 4 +- .../src/composables/useFileListWidth.cy.ts | 55 ---- .../src/composables/useFileListWidth.spec.ts | 80 +++++ .../views/DialogConfirmFileExtension.cy.ts | 162 ---------- .../views/DialogConfirmFileExtension.spec.ts | 132 ++++++++ apps/files/src/views/FilesNavigation.cy.ts | 262 ---------------- apps/files/src/views/FilesNavigation.spec.ts | 286 ++++++++++++++++++ apps/settings/src/components/Markdown.cy.ts | 58 ---- apps/settings/src/components/Markdown.spec.ts | 58 ++++ eslint.config.mjs | 5 +- package-lock.json | 29 ++ package.json | 1 + 16 files changed, 709 insertions(+), 663 deletions(-) delete mode 100644 apps/federatedfilesharing/src/components/RemoteShareDialog.cy.ts create mode 100644 apps/federatedfilesharing/src/components/RemoteShareDialog.spec.ts delete mode 100644 apps/files/src/composables/useFileListWidth.cy.ts create mode 100644 apps/files/src/composables/useFileListWidth.spec.ts delete mode 100644 apps/files/src/views/DialogConfirmFileExtension.cy.ts create mode 100644 apps/files/src/views/DialogConfirmFileExtension.spec.ts delete mode 100644 apps/files/src/views/FilesNavigation.cy.ts create mode 100644 apps/files/src/views/FilesNavigation.spec.ts delete mode 100644 apps/settings/src/components/Markdown.cy.ts create mode 100644 apps/settings/src/components/Markdown.spec.ts diff --git a/__tests__/setup-global.js b/__tests__/setup-global.js index 93230b0deab..df4486751c7 100644 --- a/__tests__/setup-global.js +++ b/__tests__/setup-global.js @@ -2,6 +2,7 @@ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: CC0-1.0 */ + export function setup() { process.env.TZ = 'UTC' } diff --git a/__tests__/setup-testing-library.js b/__tests__/setup-testing-library.js index 190e6f93e7c..2020513d2f5 100644 --- a/__tests__/setup-testing-library.js +++ b/__tests__/setup-testing-library.js @@ -2,5 +2,6 @@ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: CC0-1.0 */ + import '@testing-library/jest-dom/vitest' import 'core-js/stable/index.js' diff --git a/apps/federatedfilesharing/src/components/RemoteShareDialog.cy.ts b/apps/federatedfilesharing/src/components/RemoteShareDialog.cy.ts deleted file mode 100644 index 79b5138327a..00000000000 --- a/apps/federatedfilesharing/src/components/RemoteShareDialog.cy.ts +++ /dev/null @@ -1,123 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import RemoteShareDialog from './RemoteShareDialog.vue' - -describe('RemoteShareDialog', () => { - it('can be mounted', () => { - cy.mount(RemoteShareDialog, { - propsData: { - owner: 'user123', - name: 'my-photos', - remote: 'nextcloud.local', - passwordRequired: false, - }, - }) - - cy.findByRole('dialog') - .should('be.visible') - .and('contain.text', 'user123@nextcloud.local') - .and('contain.text', 'my-photos') - cy.findByRole('button', { name: 'Cancel' }) - .should('be.visible') - cy.findByRole('button', { name: /add remote share/i }) - .should('be.visible') - }) - - it('does not show password input if not enabled', () => { - cy.mount(RemoteShareDialog, { - propsData: { - owner: 'user123', - name: 'my-photos', - remote: 'nextcloud.local', - passwordRequired: false, - }, - }) - - cy.findByRole('dialog') - .should('be.visible') - .find('input[type="password"]') - .should('not.exist') - }) - - it('emits true when accepted', () => { - const onClose = cy.spy().as('onClose') - - cy.mount(RemoteShareDialog, { - listeners: { - close: onClose, - }, - propsData: { - owner: 'user123', - name: 'my-photos', - remote: 'nextcloud.local', - passwordRequired: false, - }, - }) - - cy.findByRole('button', { name: 'Cancel' }).click() - cy.get('@onClose') - .should('have.been.calledWith', false) - }) - - it('show password input if needed', () => { - cy.mount(RemoteShareDialog, { - propsData: { - owner: 'admin', - name: 'secret-data', - remote: 'nextcloud.local', - passwordRequired: true, - }, - }) - - cy.findByRole('dialog') - .should('be.visible') - .find('input[type="password"]') - .should('be.visible') - }) - - it('emits the submitted password', () => { - const onClose = cy.spy().as('onClose') - - cy.mount(RemoteShareDialog, { - listeners: { - close: onClose, - }, - propsData: { - owner: 'admin', - name: 'secret-data', - remote: 'nextcloud.local', - passwordRequired: true, - }, - }) - - cy.get('input[type="password"]') - .type('my password{enter}') - cy.get('@onClose') - .should('have.been.calledWith', true, 'my password') - }) - - it('emits no password if cancelled', () => { - const onClose = cy.spy().as('onClose') - - cy.mount(RemoteShareDialog, { - listeners: { - close: onClose, - }, - propsData: { - owner: 'admin', - name: 'secret-data', - remote: 'nextcloud.local', - passwordRequired: true, - }, - }) - - cy.get('input[type="password"]') - .type('my password') - cy.findByRole('button', { name: 'Cancel' }).click() - cy.get('@onClose') - .should('have.been.calledWith', false) - }) -}) diff --git a/apps/federatedfilesharing/src/components/RemoteShareDialog.spec.ts b/apps/federatedfilesharing/src/components/RemoteShareDialog.spec.ts new file mode 100644 index 00000000000..d4603b06666 --- /dev/null +++ b/apps/federatedfilesharing/src/components/RemoteShareDialog.spec.ts @@ -0,0 +1,115 @@ +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { cleanup, fireEvent, render } from '@testing-library/vue' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import RemoteShareDialog from './RemoteShareDialog.vue' + +describe('RemoteShareDialog', () => { + beforeEach(cleanup) + + it('can be mounted', async () => { + const component = render(RemoteShareDialog, { + props: { + owner: 'user123', + name: 'my-photos', + remote: 'nextcloud.local', + passwordRequired: false, + }, + }) + + await expect(component.findByRole('dialog', { name: 'Remote share' })).resolves.not.toThrow() + expect(component.getByRole('dialog').innerText).toContain(/my-photos from user123@nextcloud.local/) + await expect(component.findByRole('button', { name: 'Cancel' })).resolves.not.toThrow() + await expect(component.findByRole('button', { name: /Add remote share/ })).resolves.not.toThrow() + }) + + it('does not show password input if not enabled', async () => { + const component = render(RemoteShareDialog, { + props: { + owner: 'user123', + name: 'my-photos', + remote: 'nextcloud.local', + passwordRequired: false, + }, + }) + + await expect(component.findByLabelText('Remote share password')).rejects.toThrow() + }) + + it('emits true when accepted', () => { + const onClose = vi.fn() + + const component = render(RemoteShareDialog, { + listeners: { + close: onClose, + }, + props: { + owner: 'user123', + name: 'my-photos', + remote: 'nextcloud.local', + passwordRequired: false, + }, + }) + + component.getByRole('button', { name: 'Cancel' }).click() + expect(onClose).toHaveBeenCalledWith(false) + }) + + it('show password input if needed', async () => { + const component = render(RemoteShareDialog, { + props: { + owner: 'admin', + name: 'secret-data', + remote: 'nextcloud.local', + passwordRequired: true, + }, + }) + + await expect(component.findByLabelText('Remote share password')).resolves.not.toThrow() + }) + + it('emits the submitted password', async () => { + const onClose = vi.fn() + + const component = render(RemoteShareDialog, { + listeners: { + close: onClose, + }, + props: { + owner: 'admin', + name: 'secret-data', + remote: 'nextcloud.local', + passwordRequired: true, + }, + }) + + const input = component.getByLabelText('Remote share password') + await fireEvent.update(input, 'my password') + component.getByRole('button', { name: 'Add remote share' }).click() + expect(onClose).toHaveBeenCalledWith(true, 'my password') + }) + + it('emits no password if cancelled', async () => { + const onClose = vi.fn() + + const component = render(RemoteShareDialog, { + listeners: { + close: onClose, + }, + props: { + owner: 'admin', + name: 'secret-data', + remote: 'nextcloud.local', + passwordRequired: true, + }, + }) + + const input = component.getByLabelText('Remote share password') + await fireEvent.update(input, 'my password') + component.getByRole('button', { name: 'Cancel' }).click() + expect(onClose).toHaveBeenCalledWith(false) + }) +}) diff --git a/apps/federatedfilesharing/src/components/RemoteShareDialog.vue b/apps/federatedfilesharing/src/components/RemoteShareDialog.vue index c7f14d477bf..2c17602fc8f 100644 --- a/apps/federatedfilesharing/src/components/RemoteShareDialog.vue +++ b/apps/federatedfilesharing/src/components/RemoteShareDialog.vue @@ -35,8 +35,8 @@ const buttons = computed(() => [ }, { label: t('federatedfilesharing', 'Add remote share'), - nativeType: props.passwordRequired ? 'submit' : undefined, - type: 'primary', + type: props.passwordRequired ? 'submit' : undefined, + variant: 'primary', callback: () => emit('close', true, password.value), }, ]) diff --git a/apps/files/src/composables/useFileListWidth.cy.ts b/apps/files/src/composables/useFileListWidth.cy.ts deleted file mode 100644 index 5c05afe1a35..00000000000 --- a/apps/files/src/composables/useFileListWidth.cy.ts +++ /dev/null @@ -1,55 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { defineComponent } from 'vue' -import { useFileListWidth } from './useFileListWidth.ts' - -const ComponentMock = defineComponent({ - template: '
{{ fileListWidth }}
', - setup() { - return { - fileListWidth: useFileListWidth(), - } - }, -}) -const FileListMock = defineComponent({ - template: '
', - components: { - ComponentMock, - }, -}) - -describe('composable: fileListWidth', () => { - it('Has initial value', () => { - cy.viewport(600, 400) - - cy.mount(FileListMock, {}) - cy.get('#app-content-vue') - .should('be.visible') - .and('contain.text', '600') - }) - - it('Is reactive to size change', () => { - cy.viewport(600, 400) - cy.mount(FileListMock) - cy.get('#app-content-vue').should('contain.text', '600') - - cy.viewport(800, 400) - cy.screenshot() - cy.get('#app-content-vue').should('contain.text', '800') - }) - - it('Is reactive to style changes', () => { - cy.viewport(600, 400) - cy.mount(FileListMock) - cy.get('#app-content-vue') - .should('be.visible') - .and('contain.text', '600') - .invoke('attr', 'style', 'width: 100px') - - cy.get('#app-content-vue') - .should('contain.text', '100') - }) -}) diff --git a/apps/files/src/composables/useFileListWidth.spec.ts b/apps/files/src/composables/useFileListWidth.spec.ts new file mode 100644 index 00000000000..9432afba243 --- /dev/null +++ b/apps/files/src/composables/useFileListWidth.spec.ts @@ -0,0 +1,80 @@ +/*! + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { cleanup, render } from '@testing-library/vue' +import { configMocks, mockResizeObserver } from 'jsdom-testing-mocks' +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest' +import { defineComponent } from 'vue' +import { nextTick } from 'vue' + +let resizeObserver: ReturnType + +describe('composable: fileListWidth', () => { + configMocks({ beforeAll, afterAll, beforeEach, afterEach }) + + beforeAll(() => { + resizeObserver = mockResizeObserver() + }) + + beforeEach(cleanup) + + it('Has initial value', async () => { + const { component } = await getFileList() + expect(component.textContent).toBe('600') + }) + + it('observes the file list element', async () => { + const { fileList } = await getFileList() + expect(resizeObserver.getObservedElements()).toContain(fileList) + }) + + it('Is reactive to size change', async () => { + const { component, fileList } = await getFileList() + expect(component.textContent).toBe('600') + expect(resizeObserver.getObservedElements()).toHaveLength(1) + + resizeObserver.mockElementSize(fileList, { contentBoxSize: { inlineSize: 800, blockSize: 300 } }) + resizeObserver.resize(fileList) + + // await rending + await nextTick() + expect(component.textContent).toBe('800') + }) +}) + +async function getFileList() { + const { useFileListWidth } = await import('./useFileListWidth.ts') + + const ComponentMock = defineComponent({ + template: '
{{ fileListWidth }}
', + setup() { + return { + fileListWidth: useFileListWidth(), + } + }, + }) + + const FileListMock = defineComponent({ + template: '
', + components: { + ComponentMock, + }, + }) + + const root = render(FileListMock) + const fileList = root.baseElement.querySelector('#app-content-vue') as HTMLElement + + // mock initial size + resizeObserver.mockElementSize(fileList, { contentBoxSize: { inlineSize: 600, blockSize: 200 } }) + resizeObserver.resize() + // await rending + await nextTick() + + return { + root, + component: root.getByTestId('component'), + fileList, + } +} diff --git a/apps/files/src/views/DialogConfirmFileExtension.cy.ts b/apps/files/src/views/DialogConfirmFileExtension.cy.ts deleted file mode 100644 index 50f58a793b1..00000000000 --- a/apps/files/src/views/DialogConfirmFileExtension.cy.ts +++ /dev/null @@ -1,162 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { createTestingPinia } from '@pinia/testing' -import DialogConfirmFileExtension from './DialogConfirmFileExtension.vue' -import { useUserConfigStore } from '../store/userconfig.ts' - -describe('DialogConfirmFileExtension', () => { - it('renders with both extensions', () => { - cy.mount(DialogConfirmFileExtension, { - propsData: { - oldExtension: '.old', - newExtension: '.new', - }, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.findByRole('dialog') - .as('dialog') - .should('be.visible') - cy.get('@dialog') - .findByRole('heading') - .should('contain.text', 'Change file extension') - cy.get('@dialog') - .findByRole('checkbox', { name: /Do not show this dialog again/i }) - .should('exist') - .and('not.be.checked') - cy.get('@dialog') - .findByRole('button', { name: 'Keep .old' }) - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Use .new' }) - .should('be.visible') - }) - - it('renders without old extension', () => { - cy.mount(DialogConfirmFileExtension, { - propsData: { - newExtension: '.new', - }, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.findByRole('dialog') - .as('dialog') - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Keep without extension' }) - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Use .new' }) - .should('be.visible') - }) - - it('renders without new extension', () => { - cy.mount(DialogConfirmFileExtension, { - propsData: { - oldExtension: '.old', - }, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.findByRole('dialog') - .as('dialog') - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Keep .old' }) - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Remove extension' }) - .should('be.visible') - }) - - it('emits correct value on keep old', () => { - cy.mount(DialogConfirmFileExtension, { - propsData: { - oldExtension: '.old', - newExtension: '.new', - }, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }).as('component') - - cy.findByRole('dialog') - .as('dialog') - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Keep .old' }) - .click() - cy.get('@component') - .its('wrapper') - .should((wrapper) => expect(wrapper.emitted('close')).to.eql([[false]])) - }) - - it('emits correct value on use new', () => { - cy.mount(DialogConfirmFileExtension, { - propsData: { - oldExtension: '.old', - newExtension: '.new', - }, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }).as('component') - - cy.findByRole('dialog') - .as('dialog') - .should('be.visible') - cy.get('@dialog') - .findByRole('button', { name: 'Use .new' }) - .click() - cy.get('@component') - .its('wrapper') - .should((wrapper) => expect(wrapper.emitted('close')).to.eql([[true]])) - }) - - it('updates user config when checking the checkbox', () => { - const pinia = createTestingPinia({ - createSpy: cy.spy, - }) - - cy.mount(DialogConfirmFileExtension, { - propsData: { - oldExtension: '.old', - newExtension: '.new', - }, - global: { - plugins: [pinia], - }, - }).as('component') - - cy.findByRole('dialog') - .as('dialog') - .should('be.visible') - cy.get('@dialog') - .findByRole('checkbox', { name: /Do not show this dialog again/i }) - .check({ force: true }) - - cy.wrap(useUserConfigStore()) - .its('update') - .should('have.been.calledWith', 'show_dialog_file_extension', false) - }) -}) diff --git a/apps/files/src/views/DialogConfirmFileExtension.spec.ts b/apps/files/src/views/DialogConfirmFileExtension.spec.ts new file mode 100644 index 00000000000..4fba503767b --- /dev/null +++ b/apps/files/src/views/DialogConfirmFileExtension.spec.ts @@ -0,0 +1,132 @@ +/*! + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { createTestingPinia } from '@pinia/testing' +import { cleanup, fireEvent, render } from '@testing-library/vue' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import DialogConfirmFileExtension from './DialogConfirmFileExtension.vue' +import { useUserConfigStore } from '../store/userconfig.ts' + +describe('DialogConfirmFileExtension', () => { + beforeEach(cleanup) + + it('renders with both extensions', async () => { + const component = render(DialogConfirmFileExtension, { + props: { + oldExtension: '.old', + newExtension: '.new', + }, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await expect(component.findByRole('dialog', { name: 'Change file extension' })).resolves.not.toThrow() + expect((component.getByRole('checkbox', { name: /Do not show this dialog again/i }) as HTMLInputElement).checked).toBe(false) + await expect(component.findByRole('button', { name: 'Keep .old' })).resolves.not.toThrow() + await expect(component.findByRole('button', { name: 'Use .new' })).resolves.not.toThrow() + }) + + it('renders without old extension', async () => { + const component = render(DialogConfirmFileExtension, { + props: { + newExtension: '.new', + }, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await expect(component.findByRole('dialog', { name: 'Change file extension' })).resolves.not.toThrow() + await expect(component.findByRole('button', { name: 'Keep without extension' })).resolves.not.toThrow() + await expect(component.findByRole('button', { name: 'Use .new' })).resolves.not.toThrow() + }) + + it('renders without new extension', async () => { + const component = render(DialogConfirmFileExtension, { + props: { + oldExtension: '.old', + }, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await expect(component.findByRole('dialog', { name: 'Change file extension' })).resolves.not.toThrow() + await expect(component.findByRole('button', { name: 'Keep .old' })).resolves.not.toThrow() + await expect(component.findByRole('button', { name: 'Remove extension' })).resolves.not.toThrow() + }) + + it('emits correct value on keep old', async () => { + const onclose = vi.fn() + const component = render(DialogConfirmFileExtension, { + props: { + oldExtension: '.old', + newExtension: '.new', + }, + listeners: { + close: onclose, + }, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await fireEvent.click(component.getByRole('button', { name: 'Keep .old' })) + expect(onclose).toHaveBeenCalledOnce() + expect(onclose).toHaveBeenCalledWith(false) + }) + + it('emits correct value on use new', async () => { + const onclose = vi.fn() + const component = render(DialogConfirmFileExtension, { + props: { + oldExtension: '.old', + newExtension: '.new', + }, + listeners: { + close: onclose, + }, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await fireEvent.click(component.getByRole('button', { name: 'Use .new' })) + expect(onclose).toHaveBeenCalledOnce() + expect(onclose).toHaveBeenCalledWith(true) + }) + + it('updates user config when checking the checkbox', async () => { + const pinia = createTestingPinia({ + createSpy: vi.fn, + }) + + const component = render(DialogConfirmFileExtension, { + props: { + oldExtension: '.old', + newExtension: '.new', + }, + global: { + plugins: [pinia], + }, + }) + + await fireEvent.click(component.getByRole('checkbox', { name: /Do not show this dialog again/i })) + const store = useUserConfigStore() + expect(store.update).toHaveBeenCalledOnce() + expect(store.update).toHaveBeenCalledWith('show_dialog_file_extension', false) + }) +}) diff --git a/apps/files/src/views/FilesNavigation.cy.ts b/apps/files/src/views/FilesNavigation.cy.ts deleted file mode 100644 index 43013c24954..00000000000 --- a/apps/files/src/views/FilesNavigation.cy.ts +++ /dev/null @@ -1,262 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import type { Folder, Navigation } from '@nextcloud/files' - -import FolderSvg from '@mdi/svg/svg/folder.svg?raw' -import { getNavigation, View } from '@nextcloud/files' -import { createTestingPinia } from '@pinia/testing' -import NavigationView from './FilesNavigation.vue' -import router from '../router/router.ts' -import RouterService from '../services/RouterService.ts' -import { useViewConfigStore } from '../store/viewConfig.ts' - -function resetNavigation() { - const nav = getNavigation() - ;[...nav.views].forEach(({ id }) => nav.remove(id)) - nav.setActive(null) -} - -function createView(id: string, name: string, parent?: string) { - return new View({ - id, - name, - getContents: async () => ({ folder: {} as Folder, contents: [] }), - icon: FolderSvg, - order: 1, - parent, - }) -} - -/** - * - */ -function mockWindow() { - window.OCP ??= {} - window.OCP.Files ??= {} - window.OCP.Files.Router = new RouterService(router) -} - -describe('Navigation renders', () => { - before(async () => { - delete window._nc_navigation - mockWindow() - getNavigation().register(createView('files', 'Files')) - await router.replace({ name: 'filelist', params: { view: 'files' } }) - - cy.mockInitialState('files', 'storageStats', { - used: 1000 * 1000 * 1000, - quota: -1, - }) - }) - - after(() => cy.unmockInitialState()) - - it('renders', () => { - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.get('[data-cy-files-navigation]').should('be.visible') - cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible') - cy.get('[data-cy-files-navigation-settings-button]').should('be.visible') - }) -}) - -describe('Navigation API', () => { - let Navigation: Navigation - - before(async () => { - delete window._nc_navigation - Navigation = getNavigation() - mockWindow() - - await router.replace({ name: 'filelist', params: { view: 'files' } }) - }) - - beforeEach(() => resetNavigation()) - - it('Check API entries rendering', () => { - Navigation.register(createView('files', 'Files')) - console.warn(Navigation.views) - - cy.mount(NavigationView, { - router, - global: { - plugins: [ - createTestingPinia({ - createSpy: cy.spy, - }), - ], - }, - }) - - cy.get('[data-cy-files-navigation]').should('be.visible') - cy.get('[data-cy-files-navigation-item]').should('have.length', 1) - cy.get('[data-cy-files-navigation-item="files"]').should('be.visible') - cy.get('[data-cy-files-navigation-item="files"]').should('contain.text', 'Files') - }) - - it('Adds a new entry and render', () => { - Navigation.register(createView('files', 'Files')) - Navigation.register(createView('sharing', 'Sharing')) - - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.get('[data-cy-files-navigation]').should('be.visible') - cy.get('[data-cy-files-navigation-item]').should('have.length', 2) - cy.get('[data-cy-files-navigation-item="sharing"]').should('be.visible') - cy.get('[data-cy-files-navigation-item="sharing"]').should('contain.text', 'Sharing') - }) - - it('Adds a new children, render and open menu', () => { - Navigation.register(createView('files', 'Files')) - Navigation.register(createView('sharing', 'Sharing')) - Navigation.register(createView('sharingin', 'Shared with me', 'sharing')) - - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.wrap(useViewConfigStore()).as('viewConfigStore') - - cy.get('[data-cy-files-navigation]').should('be.visible') - cy.get('[data-cy-files-navigation-item]').should('have.length', 3) - - // Toggle the sharing entry children - cy.get('[data-cy-files-navigation-item="sharing"] button.icon-collapse').should('exist') - cy.get('[data-cy-files-navigation-item="sharing"] button.icon-collapse').click({ force: true }) - - // Expect store update to be called - cy.get('@viewConfigStore').its('update').should('have.been.calledWith', 'sharing', 'expanded', true) - - // Validate children - cy.get('[data-cy-files-navigation-item="sharingin"]').should('be.visible') - cy.get('[data-cy-files-navigation-item="sharingin"]').should('contain.text', 'Shared with me') - - // Toggle the sharing entry children 🇦again - cy.get('[data-cy-files-navigation-item="sharing"] button.icon-collapse').click({ force: true }) - cy.get('[data-cy-files-navigation-item="sharingin"]').should('not.be.visible') - - // Expect store update to be called - cy.get('@viewConfigStore').its('update').should('have.been.calledWith', 'sharing', 'expanded', false) - }) - - it('Throws when adding a duplicate entry', () => { - Navigation.register(createView('files', 'Files')) - expect(() => Navigation.register(createView('files', 'Files'))) - .to.throw('View id files is already registered') - }) -}) - -describe('Quota rendering', () => { - before(async () => { - delete window._nc_navigation - mockWindow() - getNavigation().register(createView('files', 'Files')) - await router.replace({ name: 'filelist', params: { view: 'files' } }) - }) - - afterEach(() => cy.unmockInitialState()) - - it('Unknown quota', () => { - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.get('[data-cy-files-navigation-settings-quota]').should('not.exist') - }) - - it('Unlimited quota', () => { - cy.mockInitialState('files', 'storageStats', { - used: 1024 * 1024 * 1024, - quota: -1, - total: 50 * 1024 * 1024 * 1024, - }) - - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible') - cy.get('[data-cy-files-navigation-settings-quota]').should('contain.text', '1 GB used') - cy.get('[data-cy-files-navigation-settings-quota] progress').should('not.exist') - }) - - it('Non-reached quota', () => { - cy.mockInitialState('files', 'storageStats', { - used: 1024 * 1024 * 1024, - quota: 5 * 1024 * 1024 * 1024, - total: 5 * 1024 * 1024 * 1024, - relative: 20, // percent - }) - - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible') - cy.get('[data-cy-files-navigation-settings-quota]').should('contain.text', '1 GB of 5 GB used') - cy.get('[data-cy-files-navigation-settings-quota] progress') - .should('exist') - .and('have.attr', 'value', '20') - }) - - it('Reached quota', () => { - cy.mockInitialState('files', 'storageStats', { - used: 5 * 1024 * 1024 * 1024, - quota: 1024 * 1024 * 1024, - total: 1024 * 1024 * 1024, - relative: 500, // percent - }) - - cy.mount(NavigationView, { - router, - global: { - plugins: [createTestingPinia({ - createSpy: cy.spy, - })], - }, - }) - - cy.get('[data-cy-files-navigation-settings-quota]').should('be.visible') - cy.get('[data-cy-files-navigation-settings-quota]').should('contain.text', '5 GB of 1 GB used') - cy.get('[data-cy-files-navigation-settings-quota] progress') - .should('exist') - .and('have.attr', 'value', '100') // progress max is 100 - }) -}) diff --git a/apps/files/src/views/FilesNavigation.spec.ts b/apps/files/src/views/FilesNavigation.spec.ts new file mode 100644 index 00000000000..b476a4fa1a7 --- /dev/null +++ b/apps/files/src/views/FilesNavigation.spec.ts @@ -0,0 +1,286 @@ +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import type { Folder, Navigation } from '@nextcloud/files' + +import FolderSvg from '@mdi/svg/svg/folder.svg?raw' +import { getNavigation, View } from '@nextcloud/files' +import { createTestingPinia } from '@pinia/testing' +import { cleanup, fireEvent, getAllByRole, render } from '@testing-library/vue' +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' +import NavigationView from './FilesNavigation.vue' +import router from '../router/router.ts' +import RouterService from '../services/RouterService.ts' +import { useViewConfigStore } from '../store/viewConfig.ts' + +afterEach(() => removeInitialState()) +beforeAll(async () => { + Object.defineProperty(document.documentElement, 'clientWidth', { value: 1920 }) + await fireEvent.resize(window) +}) + +describe('Navigation', () => { + beforeEach(cleanup) + + beforeEach(async () => { + delete window._nc_navigation + mockWindow() + getNavigation().register(createView('files', 'Files')) + await router.replace({ name: 'filelist', params: { view: 'files' } }) + }) + + it('renders navigation with settings button and search', async () => { + const component = render(NavigationView, { + router, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + // see the navigation + await expect(component.findByRole('navigation', { name: 'Files' })).resolves.not.toThrow() + // see the search box + await expect(component.findByRole('searchbox', { name: /Search here/ })).resolves.not.toThrow() + // see the settings entry + await expect(component.findByRole('link', { name: /Files settings/ })).resolves.not.toThrow() + }) + + it('renders no quota without storage stats', () => { + const component = render(NavigationView, { + router, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + expect(component.baseElement.querySelector('[data-cy-files-navigation-settings-quota]')).toBeNull() + }) + + it('Unlimited quota shows used storage but no progressbar', async () => { + mockInitialState('files', 'storageStats', { + used: 1024 * 1024 * 1024, + quota: -1, + total: 50 * 1024 * 1024 * 1024, + }) + + const component = render(NavigationView, { + router, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + expect(component.baseElement.querySelector('[data-cy-files-navigation-settings-quota]')).not.toBeNull() + + await expect(component.findByText('1 GB used')).resolves.not.toThrow() + await expect(component.findByRole('progressbar')).rejects.toThrow() + }) + + it('Non-reached quota shows stats and progress', async () => { + mockInitialState('files', 'storageStats', { + used: 1024 * 1024 * 1024, + quota: 5 * 1024 * 1024 * 1024, + total: 5 * 1024 * 1024 * 1024, + relative: 20, // percent + }) + + const component = render(NavigationView, { + router, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await expect(component.findByText('1 GB of 5 GB used')).resolves.not.toThrow() + await expect(component.findByRole('progressbar')).resolves.not.toThrow() + expect((component.getByRole('progressbar') as HTMLProgressElement).value).toBe(20) + }) + + it('Reached quota', async () => { + mockInitialState('files', 'storageStats', { + used: 5 * 1024 * 1024 * 1024, + quota: 1024 * 1024 * 1024, + total: 1024 * 1024 * 1024, + relative: 500, // percent + }) + + const component = render(NavigationView, { + router, + global: { + plugins: [createTestingPinia({ + createSpy: vi.fn, + })], + }, + }) + + await expect(component.findByText('5 GB of 1 GB used')).resolves.not.toThrow() + await expect(component.findByRole('progressbar')).resolves.not.toThrow() + expect((component.getByRole('progressbar') as HTMLProgressElement).value).toBe(100) + }) +}) + +describe('Navigation API', () => { + let Navigation: Navigation + + beforeEach(async () => { + delete window._nc_navigation + Navigation = getNavigation() + mockWindow() + + await router.replace({ name: 'filelist', params: { view: 'files' } }) + }) + + beforeEach(resetNavigation) + beforeEach(cleanup) + + it('Check API entries rendering', async () => { + Navigation.register(createView('files', 'Files')) + + const component = render(NavigationView, { + router, + global: { + plugins: [ + createTestingPinia({ + createSpy: vi.fn, + }), + ], + }, + }) + + // see the navigation + await expect(component.findByRole('navigation', { name: 'Files' })).resolves.not.toThrow() + // see the views + await expect(component.findByRole('list', { name: 'Views' })).resolves.not.toThrow() + // see the entry + await expect(component.findByRole('link', { name: 'Files' })).resolves.not.toThrow() + // see that the entry has all props + const entry = component.getByRole('link', { name: 'Files' }) + expect(entry.getAttribute('href')).toMatch(/\/apps\/files\/files$/) + expect(entry.getAttribute('aria-current')).toBe('page') + expect(entry.getAttribute('title')).toBe('Files') + }) + + it('Adds a new entry and render', async () => { + Navigation.register(createView('files', 'Files')) + Navigation.register(createView('sharing', 'Sharing')) + + const component = render(NavigationView, { + router, + global: { + plugins: [ + createTestingPinia({ + createSpy: vi.fn, + }), + ], + }, + }) + + const list = component.getByRole('list', { name: 'Views' }) + expect(getAllByRole(list, 'listitem')).toHaveLength(2) + + await expect(component.findByRole('link', { name: 'Files' })).resolves.not.toThrow() + await expect(component.findByRole('link', { name: 'Sharing' })).resolves.not.toThrow() + // see that the entry has all props + const entry = component.getByRole('link', { name: 'Sharing' }) + expect(entry.getAttribute('href')).toMatch(/\/apps\/files\/sharing$/) + expect(entry.getAttribute('aria-current')).toBeNull() + expect(entry.getAttribute('title')).toBe('Sharing') + }) + + it('Adds a new children, render and open menu', async () => { + Navigation.register(createView('files', 'Files')) + Navigation.register(createView('sharing', 'Sharing')) + Navigation.register(createView('sharingin', 'Shared with me', 'sharing')) + + const component = render(NavigationView, { + router, + global: { + plugins: [ + createTestingPinia({ + createSpy: vi.fn, + }), + ], + }, + }) + const viewConfigStore = useViewConfigStore() + + const list = component.getByRole('list', { name: 'Views' }) + expect(getAllByRole(list, 'listitem')).toHaveLength(3) + + // Toggle the sharing entry children + const entry = component.getByRole('link', { name: 'Sharing' }) + expect(entry.getAttribute('aria-expanded')).toBe('false') + await fireEvent.click(component.getByRole('button', { name: 'Open menu' })) + expect(entry.getAttribute('aria-expanded')).toBe('true') + + // Expect store update to be called + expect(viewConfigStore.update).toHaveBeenCalled() + expect(viewConfigStore.update).toHaveBeenCalledWith('sharing', 'expanded', true) + + // Validate children + await expect(component.findByRole('link', { name: 'Shared with me' })).resolves.not.toThrow() + + await fireEvent.click(component.getByRole('button', { name: 'Collapse menu' })) + // Expect store update to be called + expect(viewConfigStore.update).toHaveBeenCalledWith('sharing', 'expanded', false) + }) +}) + +/** + * Remove the mocked initial state + */ +function removeInitialState(): void { + document.querySelectorAll('input[type="hidden"]').forEach((el) => { + el.remove() + }) + // clear the cache + delete globalThis._nc_initial_state +} + +/** + * Helper to mock an initial state value + * @param app - The app + * @param key - The key + * @param value - The value + */ +function mockInitialState(app: string, key: string, value: unknown): void { + const el = document.createElement('input') + el.value = btoa(JSON.stringify(value)) + el.id = `initial-state-${app}-${key}` + el.type = 'hidden' + + document.head.appendChild(el) +} + +function resetNavigation() { + const nav = getNavigation() + ;[...nav.views].forEach(({ id }) => nav.remove(id)) + nav.setActive(null) +} + +function createView(id: string, name: string, parent?: string) { + return new View({ + id, + name, + getContents: async () => ({ folder: {} as Folder, contents: [] }), + icon: FolderSvg, + order: 1, + parent, + }) +} + +function mockWindow() { + window.OCP ??= {} + window.OCP.Files ??= {} + window.OCP.Files.Router = new RouterService(router) +} diff --git a/apps/settings/src/components/Markdown.cy.ts b/apps/settings/src/components/Markdown.cy.ts deleted file mode 100644 index ccdf43c26df..00000000000 --- a/apps/settings/src/components/Markdown.cy.ts +++ /dev/null @@ -1,58 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import Markdown from './Markdown.vue' - -describe('Markdown component', () => { - it('renders links', () => { - cy.mount(Markdown, { - propsData: { - text: 'This is [a link](http://example.com)!', - }, - }) - - cy.contains('This is') - .find('a') - .should('exist') - .and('have.attr', 'href', 'http://example.com') - .and('contain.text', 'a link') - }) - - it('renders headings', () => { - cy.mount(Markdown, { - propsData: { - text: '# level 1\nText\n## level 2\nText\n### level 3\nText\n#### level 4\nText\n##### level 5\nText\n###### level 6\nText\n', - }, - }) - - for (let level = 1; level <= 6; level++) { - cy.contains(`h${level}`, `level ${level}`) - .should('be.visible') - } - }) - - it('can limit headings', () => { - cy.mount(Markdown, { - propsData: { - text: '# level 1\nText\n## level 2\nText\n### level 3\nText\n#### level 4\nText\n##### level 5\nText\n###### level 6\nText\n', - minHeading: 4, - }, - }) - - cy.get('h1').should('not.exist') - cy.get('h2').should('not.exist') - cy.get('h3').should('not.exist') - cy.get('h4') - .should('exist') - .and('contain.text', 'level 1') - cy.get('h5') - .should('exist') - .and('contain.text', 'level 2') - cy.contains('h6', 'level 3').should('exist') - cy.contains('h6', 'level 4').should('exist') - cy.contains('h6', 'level 5').should('exist') - cy.contains('h6', 'level 6').should('exist') - }) -}) diff --git a/apps/settings/src/components/Markdown.spec.ts b/apps/settings/src/components/Markdown.spec.ts new file mode 100644 index 00000000000..64f5d902279 --- /dev/null +++ b/apps/settings/src/components/Markdown.spec.ts @@ -0,0 +1,58 @@ +/*! + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { cleanup, render } from '@testing-library/vue' +import { beforeEach, describe, expect, it } from 'vitest' +import Markdown from './Markdown.vue' + +describe('Markdown component', () => { + beforeEach(cleanup) + + it('renders links', () => { + const component = render(Markdown, { + props: { + text: 'This is [a link](http://example.com)!', + }, + }) + + const link = component.getByRole('link') + expect(link).toBeInstanceOf(HTMLAnchorElement) + expect(link.getAttribute('href')).toBe('http://example.com') + expect(link.textContent).toBe('a link') + }) + + it('renders headings', () => { + const component = render(Markdown, { + props: { + text: '# level 1\nText\n## level 2\nText\n### level 3\nText\n#### level 4\nText\n##### level 5\nText\n###### level 6\nText\n', + }, + }) + + for (let level = 1; level <= 6; level++) { + const heading = component.getByRole('heading', { level }) + expect(heading.textContent).toBe(`level ${level}`) + } + }) + + it('can limit headings', async () => { + const component = render(Markdown, { + props: { + text: '# level 1\nText\n## level 2\nText\n### level 3\nText\n#### level 4\nText\n##### level 5\nText\n###### level 6\nText\n', + minHeading: 4, + }, + }) + + await expect(component.findByRole('heading', { level: 1 })).rejects.toThrow() + await expect(component.findByRole('heading', { level: 2 })).rejects.toThrow() + await expect(component.findByRole('heading', { level: 3 })).rejects.toThrow() + + expect(component.getByRole('heading', { level: 4 }).textContent).toBe('level 1') + expect(component.getByRole('heading', { level: 5 }).textContent).toBe('level 2') + await expect(component.findByRole('heading', { level: 6, name: 'level 3' })).resolves.not.toThrow() + await expect(component.findByRole('heading', { level: 6, name: 'level 4' })).resolves.not.toThrow() + await expect(component.findByRole('heading', { level: 6, name: 'level 5' })).resolves.not.toThrow() + await expect(component.findByRole('heading', { level: 6, name: 'level 6' })).resolves.not.toThrow() + }) +}) diff --git a/eslint.config.mjs b/eslint.config.mjs index 1261a9738a7..02ecf23e7f3 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -56,7 +56,10 @@ export default defineConfig([ }, }, // Cypress setup - CypressEslint.configs.recommended, + { + ...CypressEslint.configs.recommended, + files: ['cypress/**', '**/*.cy.*'], + }, { name: 'server/cypress', files: ['cypress/**', '**/*.cy.*'], diff --git a/package-lock.json b/package-lock.json index c3e4b1b7628..923111b91ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -128,6 +128,7 @@ "file-loader": "^6.2.0", "handlebars-loader": "^1.7.3", "jsdom": "^27.0.0", + "jsdom-testing-mocks": "^1.16.0", "mime": "^4.1.0", "msw": "^2.11.3", "raw-loader": "^4.0.2", @@ -8068,6 +8069,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/bezier-easing": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", + "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==", + "dev": true, + "license": "MIT" + }, "node_modules/bidi-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", @@ -9566,6 +9574,13 @@ "node": ">=10" } }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", + "dev": true, + "license": "BSD" + }, "node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", @@ -14978,6 +14993,20 @@ } } }, + "node_modules/jsdom-testing-mocks": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/jsdom-testing-mocks/-/jsdom-testing-mocks-1.16.0.tgz", + "integrity": "sha512-wLrulXiLpjmcUYOYGEvz4XARkrmdVpyxzdBl9IAMbQ+ib2/UhUTRCn49McdNfXLff2ysGBUms49ZKX0LR1Q0gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bezier-easing": "^2.1.0", + "css-mediaquery": "^0.1.2" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/jsdom/node_modules/tldts": { "version": "7.0.14", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.14.tgz", diff --git a/package.json b/package.json index 3bd78f7db60..25805c6ecfb 100644 --- a/package.json +++ b/package.json @@ -164,6 +164,7 @@ "file-loader": "^6.2.0", "handlebars-loader": "^1.7.3", "jsdom": "^27.0.0", + "jsdom-testing-mocks": "^1.16.0", "mime": "^4.1.0", "msw": "^2.11.3", "raw-loader": "^4.0.2", From 3f6f277dba828142f682570d8c6bd17061c2a008 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Tue, 14 Oct 2025 13:26:55 +0200 Subject: [PATCH 2/4] refactor(test): migrate component tests in core to vitest Signed-off-by: Ferdinand Thiessen --- core/src/views/Setup.cy.ts | 377 ----------------------------------- core/src/views/Setup.spec.ts | 306 ++++++++++++++++++++++++++++ core/src/views/Setup.vue | 8 + 3 files changed, 314 insertions(+), 377 deletions(-) delete mode 100644 core/src/views/Setup.cy.ts create mode 100644 core/src/views/Setup.spec.ts diff --git a/core/src/views/Setup.cy.ts b/core/src/views/Setup.cy.ts deleted file mode 100644 index 2338116a271..00000000000 --- a/core/src/views/Setup.cy.ts +++ /dev/null @@ -1,377 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import type { SetupConfig, SetupLinks } from '../install.ts' - -import SetupView from './Setup.vue' - -import '../../css/guest.css' - -const defaultConfig = Object.freeze({ - adminlogin: '', - adminpass: '', - dbuser: '', - dbpass: '', - dbname: '', - dbtablespace: '', - dbhost: '', - dbtype: '', - databases: { - sqlite: 'SQLite', - mysql: 'MySQL/MariaDB', - pgsql: 'PostgreSQL', - }, - directory: '', - hasAutoconfig: false, - htaccessWorking: true, - serverRoot: '/var/www/html', - errors: [], -}) as SetupConfig - -const links = { - adminInstall: 'https://docs.nextcloud.com/server/32/go.php?to=admin-install', - adminSourceInstall: 'https://docs.nextcloud.com/server/32/go.php?to=admin-source_install', - adminDBConfiguration: 'https://docs.nextcloud.com/server/32/go.php?to=admin-db-configuration', -} as SetupLinks - -describe('Default setup page', () => { - beforeEach(() => { - cy.mockInitialState('core', 'links', links) - }) - - afterEach(() => cy.unmockInitialState()) - - it('Renders default config', () => { - cy.mockInitialState('core', 'config', defaultConfig) - cy.mount(SetupView) - - cy.get('[data-cy-setup-form]').scrollIntoView() - cy.get('[data-cy-setup-form]').should('be.visible') - - // Single note is the footer help - cy.get('[data-cy-setup-form-note]') - .should('have.length', 1) - .should('be.visible') - cy.get('[data-cy-setup-form-note]').should('contain', 'See the documentation') - - // DB radio selectors - cy.get('[data-cy-setup-form-field^="dbtype"]') - .should('exist') - .find('input') - .should('be.checked') - - cy.get('[data-cy-setup-form-field="dbtype-mysql"]').should('exist') - cy.get('[data-cy-setup-form-field="dbtype-pgsql"]').should('exist') - cy.get('[data-cy-setup-form-field="dbtype-oci"]').should('not.exist') - - // Sqlite warning - cy.get('[data-cy-setup-form-db-note="sqlite"]') - .should('be.visible') - - // admin login, password, data directory and 3 DB radio selectors - cy.get('[data-cy-setup-form-field]') - .should('be.visible') - .should('have.length', 6) - }) - - it('Renders single DB sqlite', () => { - const config = { - ...defaultConfig, - databases: { - sqlite: 'SQLite', - }, - } - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - cy.get('[data-cy-setup-form-field^="dbtype"]') - .should('exist') - .should('not.be.visible') - .find('input') - .should('be.checked') - - cy.get('[data-cy-setup-form-field="dbtype-sqlite"]').should('exist') - - // Two warnings: sqlite and single db support - cy.get('[data-cy-setup-form-db-note="sqlite"]') - .should('be.visible') - cy.get('[data-cy-setup-form-db-note="single-db"]') - .should('be.visible') - - // Admin login, password, data directory and db type - cy.get('[data-cy-setup-form-field]') - .should('be.visible') - .should('have.length', 4) - }) - - it('Renders single DB mysql', () => { - const config = { - ...defaultConfig, - databases: { - mysql: 'MySQL/MariaDB', - }, - } - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - cy.get('[data-cy-setup-form-field^="dbtype"]') - .should('exist') - .should('not.be.visible') - .find('input') - .should('be.checked') - - // Single db support warning - cy.get('[data-cy-setup-form-db-note="single-db"]') - .should('be.visible') - .invoke('html') - .should('contains', links.adminSourceInstall) - - // No SQLite warning - cy.get('[data-cy-setup-form-db-note="sqlite"]') - .should('not.exist') - - // Admin login, password, data directory, db type, db user, - // db password, db name and db host - cy.get('[data-cy-setup-form-field]') - .should('be.visible') - .should('have.length', 8) - }) - - it('Changes fields from sqlite to mysql then oci', () => { - const config = { - ...defaultConfig, - databases: { - sqlite: 'SQLite', - mysql: 'MySQL/MariaDB', - pgsql: 'PostgreSQL', - oci: 'Oracle', - }, - } - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - // SQLite selected - cy.get('[data-cy-setup-form-field="dbtype-sqlite"]') - .should('be.visible') - .find('input') - .should('be.checked') - - // Admin login, password, data directory and 4 DB radio selectors - cy.get('[data-cy-setup-form-field]') - .should('be.visible') - .should('have.length', 7) - - // Change to MySQL - cy.get('[data-cy-setup-form-field="dbtype-mysql"]').click() - cy.get('[data-cy-setup-form-field="dbtype-mysql"] input').should('be.checked') - - // Admin login, password, data directory, db user, db password, - // db name, db host and 4 DB radio selectors - cy.get('[data-cy-setup-form-field]') - .should('be.visible') - .should('have.length', 11) - - // Change to Oracle - cy.get('[data-cy-setup-form-field="dbtype-oci"]').click() - cy.get('[data-cy-setup-form-field="dbtype-oci"] input').should('be.checked') - - // Admin login, password, data directory, db user, db password, - // db name, db table space, db host and 4 DB radio selectors - cy.get('[data-cy-setup-form-field]') - .should('be.visible') - .should('have.length', 12) - cy.get('[data-cy-setup-form-field="dbtablespace"]') - .should('be.visible') - }) -}) - -describe('Setup page with errors and warning', () => { - beforeEach(() => { - cy.mockInitialState('core', 'links', links) - }) - - afterEach(() => cy.unmockInitialState()) - - it('Renders error from backend', () => { - const config = { - ...defaultConfig, - errors: [ - { - error: 'Error message', - hint: 'Error hint', - }, - ], - } - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - // Error message and hint - cy.get('[data-cy-setup-form-note="error"]') - .should('be.visible') - .should('have.length', 1) - .should('contain', 'Error message') - .should('contain', 'Error hint') - }) - - it('Renders errors from backend', () => { - const config = { - ...defaultConfig, - errors: [ - 'Error message 1', - { - error: 'Error message', - hint: 'Error hint', - }, - ], - } - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - // Error message and hint - cy.get('[data-cy-setup-form-note="error"]') - .should('be.visible') - .should('have.length', 2) - cy.get('[data-cy-setup-form-note="error"]').eq(0) - .should('contain', 'Error message 1') - cy.get('[data-cy-setup-form-note="error"]').eq(1) - .should('contain', 'Error message') - .should('contain', 'Error hint') - }) - - it('Renders all the submitted fields on error', () => { - const config = { - ...defaultConfig, - adminlogin: 'admin', - adminpass: 'password', - dbname: 'nextcloud', - dbtype: 'mysql', - dbuser: 'nextcloud', - dbpass: 'password', - dbhost: 'localhost', - directory: '/var/www/html/nextcloud', - } as SetupConfig - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - cy.get('input[data-cy-setup-form-field="adminlogin"]') - .should('have.value', 'admin') - cy.get('input[data-cy-setup-form-field="adminpass"]') - .should('have.value', 'password') - cy.get('[data-cy-setup-form-field="dbtype-mysql"] input') - .should('be.checked') - cy.get('input[data-cy-setup-form-field="dbname"]') - .should('have.value', 'nextcloud') - cy.get('input[data-cy-setup-form-field="dbuser"]') - .should('have.value', 'nextcloud') - cy.get('input[data-cy-setup-form-field="dbpass"]') - .should('have.value', 'password') - cy.get('input[data-cy-setup-form-field="dbhost"]') - .should('have.value', 'localhost') - cy.get('input[data-cy-setup-form-field="directory"]') - .should('have.value', '/var/www/html/nextcloud') - }) - - it('Renders the htaccess warning', () => { - const config = { - ...defaultConfig, - htaccessWorking: false, - } - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - cy.get('[data-cy-setup-form-note="htaccess"]') - .should('be.visible') - .should('contain', 'Security warning') - .invoke('html') - .should('contains', links.adminInstall) - }) -}) - -describe('Setup page with autoconfig', () => { - beforeEach(() => { - cy.mockInitialState('core', 'links', links) - }) - - afterEach(() => cy.unmockInitialState()) - - it('Renders autoconfig', () => { - const config = { - ...defaultConfig, - hasAutoconfig: true, - dbname: 'nextcloud', - dbtype: 'mysql', - dbuser: 'nextcloud', - dbpass: 'password', - dbhost: 'localhost', - directory: '/var/www/html/nextcloud', - } as SetupConfig - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - // Autoconfig info note - cy.get('[data-cy-setup-form-note="autoconfig"]') - .should('be.visible') - .should('contain', 'Autoconfig file detected') - - // Database and storage section is hidden as already set in autoconfig - cy.get('[data-cy-setup-form-advanced-config]').should('be.visible') - .invoke('attr', 'open') - .should('equal', undefined) - - // Oracle tablespace is hidden - cy.get('[data-cy-setup-form-field="dbtablespace"]') - .should('not.exist') - }) -}) - -describe('Submit a full form sends the data', () => { - beforeEach(() => { - cy.mockInitialState('core', 'links', links) - }) - - afterEach(() => cy.unmockInitialState()) - - it('Submits a full form', () => { - const config = { - ...defaultConfig, - adminlogin: 'admin', - adminpass: 'password', - dbname: 'nextcloud', - dbtype: 'mysql', - dbuser: 'nextcloud', - dbpass: 'password', - dbhost: 'localhost', - dbtablespace: 'tablespace', - directory: '/var/www/html/nextcloud', - } as SetupConfig - - cy.intercept('POST', '**', { - delay: 2000, - }).as('setup') - - cy.mockInitialState('core', 'config', config) - cy.mount(SetupView) - - // Not chaining breaks the test as the POST prevents the element from being retrieved twice - // eslint-disable-next-line cypress/unsafe-to-chain-command - cy.get('[data-cy-setup-form-submit]') - .click() - .invoke('attr', 'disabled') - .should('equal', 'disabled', { timeout: 500 }) - - cy.wait('@setup') - .its('request.body') - .should('deep.equal', new URLSearchParams({ - adminlogin: 'admin', - adminpass: 'password', - directory: '/var/www/html/nextcloud', - dbtype: 'mysql', - dbuser: 'nextcloud', - dbpass: 'password', - dbname: 'nextcloud', - dbhost: 'localhost', - }).toString()) - }) -}) diff --git a/core/src/views/Setup.spec.ts b/core/src/views/Setup.spec.ts new file mode 100644 index 00000000000..2db6607a51b --- /dev/null +++ b/core/src/views/Setup.spec.ts @@ -0,0 +1,306 @@ +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import type { SetupConfig, SetupLinks } from '../install.ts' + +import { cleanup, findByRole, fireEvent, getAllByRole, getByRole, render } from '@testing-library/vue' +import { beforeEach, describe, expect, it } from 'vitest' +import SetupView from './Setup.vue' + +import '../../css/guest.css' + +const defaultConfig = Object.freeze({ + adminlogin: '', + adminpass: '', + dbuser: '', + dbpass: '', + dbname: '', + dbtablespace: '', + dbhost: '', + dbtype: '', + databases: { + sqlite: 'SQLite', + mysql: 'MySQL/MariaDB', + pgsql: 'PostgreSQL', + }, + directory: '', + hasAutoconfig: false, + htaccessWorking: true, + serverRoot: '/var/www/html', + errors: [], +}) as SetupConfig + +const links = { + adminInstall: 'https://docs.nextcloud.com/server/32/go.php?to=admin-install', + adminSourceInstall: 'https://docs.nextcloud.com/server/32/go.php?to=admin-source_install', + adminDBConfiguration: 'https://docs.nextcloud.com/server/32/go.php?to=admin-db-configuration', +} as SetupLinks + +describe('Default setup page', () => { + beforeEach(cleanup) + beforeEach(() => { + removeInitialState() + mockInitialState('core', 'links', links) + }) + + it('Renders default config', async () => { + mockInitialState('core', 'config', defaultConfig) + const component = render(SetupView) + + // Single note is the footer help + expect(component.getAllByRole('note')).toHaveLength(1) + expect(component.getByRole('note').textContent).toContain('See the documentation') + + // DB radio selectors + const dbTypes = component.getByRole('group', { name: 'Database type' }) + expect(getAllByRole(dbTypes, 'radio')).toHaveLength(3) + await expect(findByRole(dbTypes, 'radio', { checked: true })).resolves.not.toThrow() + await expect(findByRole(dbTypes, 'radio', { name: /MySQL/ })).resolves.not.toThrow() + await expect(findByRole(dbTypes, 'radio', { name: /PostgreSQL/ })).resolves.not.toThrow() + await expect(findByRole(dbTypes, 'radio', { name: /SQLite/ })).resolves.not.toThrow() + + // Sqlite warning + await expect(component.findByText(/SQLite should only be used for minimal and development instances/)).resolves.not.toThrow() + + // admin login, password, data directory + await expect(component.findByRole('textbox', { name: 'Administration account name' })).resolves.not.toThrow() + await expect(component.findByLabelText('Administration account password')).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: 'Data folder' })).resolves.not.toThrow() + }) + + it('Renders single DB sqlite', async () => { + mockInitialState('core', 'config', { + ...defaultConfig, + databases: { + sqlite: 'SQLite', + }, + }) + const component = render(SetupView) + + const dbTypes = component.getByRole('group', { name: 'Database type' }) + expect(getAllByRole(dbTypes, 'radio', { hidden: true })).toHaveLength(1) + await expect(findByRole(dbTypes, 'radio', { name: /SQLite/, hidden: true })).resolves.not.toThrow() + + // Two warnings: sqlite and single db support + await expect(component.findByText(/Only SQLite is available./)).resolves.not.toThrow() + await expect(component.findByText(/SQLite should only be used for minimal and development instances/)).resolves.not.toThrow() + }) + + it('Renders single DB mysql', async () => { + mockInitialState('core', 'config', { + ...defaultConfig, + databases: { + mysql: 'MySQL/MariaDB', + }, + }) + const component = render(SetupView) + + const dbTypes = component.getByRole('group', { name: 'Database type' }) + expect(getAllByRole(dbTypes, 'radio', { hidden: true })).toHaveLength(1) + await expect(findByRole(dbTypes, 'radio', { name: /MySQL/, hidden: true })).resolves.not.toThrow() + + // Single db support warning + await expect(component.findByText(/Only MySQL.* is available./)).resolves.not.toThrow() + + // No SQLite warning + await expect(component.findByText(/SQLite should only be used for minimal and development instances/)).rejects.toThrow() + + // database config + await expect(component.findByRole('textbox', { name: /Database user/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Database name/ })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: /Database host/ })).resolves.not.toThrow() + await expect(component.findByLabelText(/Database password/)).resolves.not.toThrow() + }) + + it('Changes fields from sqlite to mysql then oci', async () => { + mockInitialState('core', 'config', { + ...defaultConfig, + databases: { + sqlite: 'SQLite', + mysql: 'MySQL/MariaDB', + pgsql: 'PostgreSQL', + oci: 'Oracle', + }, + }) + const component = render(SetupView) + + // SQLite selected + await expect(component.findByRole('radio', { name: /SQLite/, checked: true })).resolves.not.toThrow() + + // 4 db toggles + const dbTypes = component.getByRole('group', { name: 'Database type' }) + expect(getAllByRole(dbTypes, 'radio')).toHaveLength(4) + + // but no database config fields + await expect(findByRole(dbTypes, 'group', { name: /Database connection/ })).rejects.toThrow() + + // Change to MySQL + await fireEvent.click(getByRole(dbTypes, 'radio', { name: /MySQL/, checked: false })) + expect((getByRole(dbTypes, 'radio', { name: /SQLite/, checked: false }) as HTMLInputElement).checked).toBe(false) + expect((getByRole(dbTypes, 'radio', { name: /MySQL/, checked: true }) as HTMLInputElement).checked).toBe(true) + + // now the database config fields are visible + await expect(component.findByRole('group', { name: /Database connection/ })).resolves.not.toThrow() + // but not the Database tablespace + await expect(component.findByRole('textbox', { name: /Database tablespace/ })).rejects.toThrow() + + // Change to Oracle + await fireEvent.click(getByRole(dbTypes, 'radio', { name: /Oracle/, checked: false })) + + // see database config fields are visible and tablespace + await expect(component.findByRole('textbox', { name: /Database tablespace/ })).resolves.not.toThrow() + await expect(component.findByRole('group', { name: /Database connection/ })).resolves.not.toThrow() + }) +}) + +describe('Setup page with errors and warning', () => { + beforeEach(cleanup) + beforeEach(() => { + removeInitialState() + mockInitialState('core', 'links', links) + }) + + it('Renders error from backend', async () => { + mockInitialState('core', 'config', { + ...defaultConfig, + errors: [ + { + error: 'Error message', + hint: 'Error hint', + }, + ], + }) + const component = render(SetupView) + + // Error message and hint + await expect(component.findByText('Error message')).resolves.not.toThrow() + await expect(component.findByText('Error hint')).resolves.not.toThrow() + }) + + it('Renders errors from backend', async () => { + const config = { + ...defaultConfig, + errors: [ + 'Error message 1', + { + error: 'Error message 2', + hint: 'Error hint', + }, + ], + } + mockInitialState('core', 'config', config) + const component = render(SetupView) + + // Error message and hint + await expect(component.findByText('Error message 1')).resolves.not.toThrow() + await expect(component.findByText('Error message 2')).resolves.not.toThrow() + await expect(component.findByText('Error hint')).resolves.not.toThrow() + }) + + it('Renders all the submitted fields on error', async () => { + const config = { + ...defaultConfig, + adminlogin: 'admin', + adminpass: 'password', + dbname: 'nextcloud', + dbtype: 'mysql', + dbuser: 'nextcloud', + dbpass: 'password', + dbhost: 'localhost', + directory: '/var/www/html/nextcloud', + } as SetupConfig + mockInitialState('core', 'config', config) + const component = render(SetupView) + + await expect(component.findByRole('textbox', { name: 'Data folder' })).resolves.not.toThrow() + expect((component.getByRole('textbox', { name: 'Data folder' }) as HTMLInputElement).value).toBe('/var/www/html/nextcloud') + + await expect(component.findByRole('textbox', { name: 'Administration account name' })).resolves.not.toThrow() + expect((component.getByRole('textbox', { name: 'Administration account name' }) as HTMLInputElement).value).toBe('admin') + + await expect(component.findByLabelText('Administration account password')).resolves.not.toThrow() + expect((component.getByLabelText('Administration account password') as HTMLInputElement).value).toBe('password') + + await expect(component.findByRole('radio', { name: /MySQL/, checked: true, hidden: true })).resolves.not.toThrow() + await expect(component.findByRole('textbox', { name: 'Database name' })).resolves.not.toThrow() + expect((component.getByRole('textbox', { name: 'Database name' }) as HTMLInputElement).value).toBe('nextcloud') + await expect(component.findByRole('textbox', { name: 'Database user' })).resolves.not.toThrow() + expect((component.getByRole('textbox', { name: 'Database user' }) as HTMLInputElement).value).toBe('nextcloud') + await expect(component.findByRole('textbox', { name: 'Database host' })).resolves.not.toThrow() + expect((component.getByRole('textbox', { name: 'Database host' }) as HTMLInputElement).value).toBe('localhost') + await expect(component.findByLabelText('Database password')).resolves.not.toThrow() + expect((component.getByLabelText('Database password') as HTMLInputElement).value).toBe('password') + }) + + it('Renders the htaccess warning', async () => { + const config = { + ...defaultConfig, + htaccessWorking: false, + } + mockInitialState('core', 'config', config) + const component = render(SetupView) + + await expect(component.findByText('Security warning')).resolves.not.toThrow() + }) +}) + +describe('Setup page with autoconfig', () => { + beforeEach(cleanup) + beforeEach(() => { + removeInitialState() + mockInitialState('core', 'links', links) + }) + + it('Renders autoconfig', async () => { + const config = { + ...defaultConfig, + hasAutoconfig: true, + dbname: 'nextcloud', + dbtype: 'mysql', + dbuser: 'nextcloud', + dbpass: 'password', + dbhost: 'localhost', + directory: '/var/www/html/nextcloud', + } as SetupConfig + mockInitialState('core', 'config', config) + const component = render(SetupView) + + // Autoconfig info note + await expect(component.findByText('Autoconfig file detected')).resolves.not.toThrow() + + // Oracle tablespace is hidden + await expect(component.findByRole('textbox', { name: 'Database tablespace' })).rejects.toThrow() + + // Database and storage section is hidden as already set in autoconfig + await expect(component.findByText('Storage & database')).resolves.not.toThrow() + expect(component.getByText('Storage & database').closest('details')!.getAttribute('hidden')).toBeNull() + }) +}) + +/** + * Remove the mocked initial state + */ +function removeInitialState(): void { + document.querySelectorAll('input[type="hidden"]').forEach((el) => { + el.remove() + }) + // clear the cache + delete globalThis._nc_initial_state +} + +/** + * Helper to mock an initial state value + * @param app - The app + * @param key - The key + * @param value - The value + */ +function mockInitialState(app: string, key: string, value: unknown): void { + const el = document.createElement('input') + el.value = btoa(JSON.stringify(value)) + el.id = `initial-state-${app}-${key}` + el.type = 'hidden' + + document.head.appendChild(el) +} diff --git a/core/src/views/Setup.vue b/core/src/views/Setup.vue index 259232a3efb..61034cb9919 100644 --- a/core/src/views/Setup.vue +++ b/core/src/views/Setup.vue @@ -89,6 +89,10 @@
+ + {{ t('core', 'Database type') }} + +

+ + {{ t('core', 'Database connection') }} + + Date: Tue, 14 Oct 2025 13:53:20 +0200 Subject: [PATCH 3/4] chore: remove Cypress component testing Signed-off-by: Ferdinand Thiessen --- .github/workflows/cypress.yml | 4 +-- cypress.config.ts | 36 --------------------- cypress/support/component-index.html | 16 ---------- cypress/support/component.ts | 43 -------------------------- cypress/support/cypress-component.d.ts | 17 ---------- cypress/tsconfig.json | 2 +- package-lock.json | 16 ---------- package.json | 5 +-- 8 files changed, 4 insertions(+), 135 deletions(-) delete mode 100644 cypress/support/component-index.html delete mode 100644 cypress/support/component.ts delete mode 100644 cypress/support/cypress-component.d.ts diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index ee69b8e0736..5bb4f44d7b1 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -102,8 +102,8 @@ jobs: matrix: # Run multiple copies of the current job in parallel # Please increase the number or runners as your tests suite grows (0 based index for e2e tests) - containers: ['component', 'setup', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] - # Hack as strategy.job-total includes the component and GitHub does not allow math expressions + containers: ['setup', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] + # Hack as strategy.job-total includes the "setup" and GitHub does not allow math expressions # Always align this number with the total of e2e runners (max. index + 1) total-containers: [10] diff --git a/cypress.config.ts b/cypress.config.ts index df71b69d4e9..cc86e6ff46f 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -134,40 +134,4 @@ export default defineConfig({ return config }, }, - - component: { - specPattern: ['core/**/*.cy.ts', 'apps/**/*.cy.ts'], - devServer: { - framework: 'vue', - bundler: 'webpack', - webpackConfig: async () => { - process.env.npm_package_name = 'NcCypress' - process.env.npm_package_version = '1.0.0' - process.env.NODE_ENV = 'development' - - /** - * Needed for cypress stubbing - * - * @see https://github.com/sinonjs/sinon/issues/1121 - * @see https://github.com/cypress-io/cypress/issues/18662 - */ - // eslint-disable-next-line @typescript-eslint/no-require-imports - const babel = require('./babel.config.js') - babel.plugins.push([ - '@babel/plugin-transform-modules-commonjs', - { - loose: true, - }, - ]) - - const config = webpackConfig - config.module.rules.push({ - test: /\.svg$/, - type: 'asset/source', - }) - - return config - }, - }, - }, }) diff --git a/cypress/support/component-index.html b/cypress/support/component-index.html deleted file mode 100644 index e525b445373..00000000000 --- a/cypress/support/component-index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - Components App - - -
- - \ No newline at end of file diff --git a/cypress/support/component.ts b/cypress/support/component.ts deleted file mode 100644 index 212d3268b1e..00000000000 --- a/cypress/support/component.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { mount } from '@cypress/vue2' - -import '@testing-library/cypress/add-commands' -import 'cypress-axe' -// styles -import '../../apps/theming/css/default.css' -import '../../core/css/server.css' - -Cypress.Commands.add('mount', (component, options = {}) => { - // Setup options object - options.extensions = options.extensions || {} - options.extensions.plugins = options.extensions.plugins || [] - options.extensions.components = options.extensions.components || {} - - return mount(component, options) -}) - -Cypress.Commands.add('mockInitialState', (app: string, key: string, value: unknown) => { - cy.document().then(($document) => { - const input = $document.createElement('input') - input.setAttribute('type', 'hidden') - input.setAttribute('id', `initial-state-${app}-${key}`) - input.setAttribute('value', btoa(JSON.stringify(value))) - $document.body.appendChild(input) - }) -}) - -Cypress.Commands.add('unmockInitialState', (app?: string, key?: string) => { - cy.window().then(($window) => { - // @ts-expect-error internal value - delete $window._nc_initial_state - }) - - cy.document().then(($document) => { - $document.querySelectorAll('body > input[type="hidden"]' + (app ? `[id="initial-state-${app}-${key}"]` : '')) - .forEach((node) => $document.body.removeChild(node)) - }) -}) diff --git a/cypress/support/cypress-component.d.ts b/cypress/support/cypress-component.d.ts deleted file mode 100644 index 3bb811e9f82..00000000000 --- a/cypress/support/cypress-component.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import type { mount } from '@cypress/vue2' - -declare global { - - namespace Cypress { - interface Chainable { - mount: typeof mount - mockInitialState: (app: string, key: string, value: unknown) => Cypress.Chainable - unmockInitialState: (app?: string, key?: string) => Cypress.Chainable - } - } -} diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json index 510c64d633c..62747429d7a 100644 --- a/cypress/tsconfig.json +++ b/cypress/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../tsconfig.json", - "include": ["./**/*.ts", "../**/*.cy.ts", "./cypress-e2e.d.ts", "./cypress-component.d.ts"], + "include": ["./**/*.ts", "./cypress-e2e.d.ts", "./cypress-component.d.ts"], "exclude": [], "compilerOptions": { "types": [ diff --git a/package-lock.json b/package-lock.json index 923111b91ff..085ad26381a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,6 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@codecov/webpack-plugin": "^1.9.1", - "@cypress/vue2": "^2.1.1", "@cypress/webpack-preprocessor": "^7.0.0", "@nextcloud/babel-config": "^1.2.0", "@nextcloud/cypress": "^1.0.0-beta.15", @@ -2268,21 +2267,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/@cypress/vue2": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cypress/vue2/-/vue2-2.1.1.tgz", - "integrity": "sha512-8/1Z6XrSdJWU9ybniGKyUe5iztVIi/Y5PwWg6mtsa8IMdtK2ZA8Vrv/ZIZ8jT3XAEUSaMhPBEh6TgUbq03kr8w==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "cypress": ">=4.5.0", - "vue": "^2.0.0" - } - }, "node_modules/@cypress/webpack-preprocessor": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-7.0.1.tgz", diff --git a/package.json b/package.json index 25805c6ecfb..ca7fe4c5e3c 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,7 @@ "scripts": { "build": "webpack --node-env production --progress", "postbuild": "build/npm-post-build.sh", - "cypress": "npm run cypress:component && npm run cypress:e2e", - "cypress:component": "cypress run --component", - "cypress:e2e": "cypress run --e2e", + "cypress": "cypress run --e2e", "cypress:gui": "cypress open", "cypress:version": "cypress version", "dev": "webpack --node-env development --progress", @@ -128,7 +126,6 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/preset-typescript": "^7.27.1", "@codecov/webpack-plugin": "^1.9.1", - "@cypress/vue2": "^2.1.1", "@cypress/webpack-preprocessor": "^7.0.0", "@nextcloud/babel-config": "^1.2.0", "@nextcloud/cypress": "^1.0.0-beta.15", From e7357dffec83a0f8d8e0aaa2e7921bb898d34666 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Tue, 14 Oct 2025 14:32:51 +0200 Subject: [PATCH 4/4] chore: compile assets Signed-off-by: Ferdinand Thiessen --- dist/core-install.js | 4 ++-- dist/core-install.js.map | 2 +- dist/federatedfilesharing-external.js | 4 ++-- dist/federatedfilesharing-external.js.map | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dist/core-install.js b/dist/core-install.js index c847bee1e6f..2f17d469fa1 100644 --- a/dist/core-install.js +++ b/dist/core-install.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t={79683:(e,t,a)=>{a.d(t,{A:()=>i});var o=a(71354),r=a.n(o),n=a(76314),s=a.n(n)()(r());s.push([e.id,"form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}","",{version:3,sources:["webpack://./core/src/views/Setup.vue"],names:[],mappings:"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA",sourcesContent:["\nform {\n\tpadding: calc(3 * var(--default-grid-baseline));\n\tcolor: var(--color-main-text);\n\tborder-radius: var(--border-radius-container);\n\tbackground-color: var(--color-main-background-blur);\n\tbox-shadow: 0 0 10px var(--color-box-shadow);\n\t-webkit-backdrop-filter: var(--filter-background-blur);\n\tbackdrop-filter: var(--filter-background-blur);\n\n\tmax-width: 300px;\n\tmargin-bottom: 30px;\n\n\t> fieldset:first-child,\n\t> .notecard:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\t> .notecard:last-child {\n\t\tmargin-bottom: 0;\n\t}\n\n\tfieldset,\n\tdetails {\n\t\tmargin-block: 1rem;\n\t}\n\n\t.setup-form__button:not(.setup-form__button--loading) {\n\t\t.material-design-icon {\n\t\t\ttransition: all linear var(--animation-quick);\n\t\t}\n\n\t\t&:hover .material-design-icon {\n\t\t\ttransform: translateX(0.2em);\n\t\t}\n\t}\n\n\t// Db select required styling\n\t.setup-form__database-type-select {\n\t\tdisplay: flex;\n\t\t&--vertical {\n\t\t\tflex-direction: column;\n\t\t}\n\t}\n\n}\n\ncode {\n\tbackground-color: var(--color-background-dark);\n\tmargin-top: 1rem;\n\tpadding: 0 0.3em;\n\tborder-radius: var(--border-radius);\n}\n\n// Various overrides\n.input-field {\n\tmargin-block-start: 1rem !important;\n}\n\n.notecard__heading {\n\tfont-size: inherit !important;\n}\n"],sourceRoot:""}]);const i=s},93766:(e,t,a)=>{var o,r=a(85471),n=a(81222),s=a(53334),i=a(99418),c=a(74095),l=a(32073),d=a(88289),u=a(31133),f=a(16044),p=a(82182),m=a(33691);function g(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const t=new Set(e),a=parseInt(Math.log2(Math.pow(parseInt(t.size.toString()),e.length)).toFixed(2));return a<16?o.VeryWeak:a<31?o.Weak:a<46?o.Moderate:a<61?o.Strong:a<76?o.VeryStrong:o.ExtremelyStrong}!function(e){e[e.VeryWeak=0]="VeryWeak",e[e.Weak=1]="Weak",e[e.Moderate=2]="Moderate",e[e.Strong=3]="Strong",e[e.VeryStrong=4]="VeryStrong",e[e.ExtremelyStrong=5]="ExtremelyStrong"}(o||(o={}));const b=(0,r.pM)({name:"Setup",components:{IconArrowRight:m.A,NcButton:c.A,NcCheckboxRadioSwitch:l.A,NcLoadingIcon:d.A,NcNoteCard:u.A,NcPasswordField:f.A,NcTextField:p.A},setup:()=>({t:s.t}),data:()=>({config:{},links:{},isValidAutoconfig:!1,loading:!1}),computed:{passwordHelperText(){if(""===this.config?.adminpass)return"";switch(g(this.config?.adminpass)){case o.VeryWeak:return(0,s.t)("core","Password is too weak");case o.Weak:return(0,s.t)("core","Password is weak");case o.Moderate:return(0,s.t)("core","Password is average");case o.Strong:return(0,s.t)("core","Password is strong");case o.VeryStrong:return(0,s.t)("core","Password is very strong");case o.ExtremelyStrong:return(0,s.t)("core","Password is extremely strong")}return(0,s.t)("core","Unknown password strength")},passwordHelperType(){return g(this.config?.adminpass)3?"vertical":"horizontal"},htaccessWarning(){const e=[(0,s.t)("core","Your data directory and files are probably accessible from the internet because the .htaccess file does not work."),(0,s.t)("core","For information how to properly configure your server, please {linkStart}see the documentation{linkEnd}",{linkStart:'',linkEnd:""},{escape:!1})].join("
");return i.A.sanitize(e)},errors(){return(this.config?.errors||[]).map(e=>"string"==typeof e?{heading:"",message:e}:""===e.hint?{heading:"",message:e.error}:{heading:e.error,message:e.hint})}},beforeMount(){this.config=(0,n.C)("core","config"),this.links=(0,n.C)("core","links")},mounted(){if(""===this.config.dbtype&&(this.config.dbtype=Object.keys(this.config.databases).at(0)),this.config.hasAutoconfig){const e=this.$refs.form;e.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(e=>{e.removeAttribute("required")}),e.checkValidity()&&0===this.config.errors.length?this.isValidAutoconfig=!0:this.isValidAutoconfig=!1,e.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(e=>{e.setAttribute("required","true")})}},methods:{async onSubmit(){this.loading=!0}}});var A=a(85072),h=a.n(A),v=a(97825),y=a.n(v),_=a(77659),k=a.n(_),C=a(55056),w=a.n(C),x=a(10540),S=a.n(x),N=a(41113),D=a.n(N),O=a(79683),T={};T.styleTagTransform=D(),T.setAttributes=w(),T.insert=k().bind(null,"head"),T.domAPI=y(),T.insertStyleElement=S(),h()(O.A,T),O.A&&O.A.locals&&O.A.locals;const P=(0,a(14486).A)(b,function(){var e=this,t=e._self._c;return e._self._setupProxy,t("form",{ref:"form",staticClass:"setup-form",class:{"setup-form--loading":e.loading},attrs:{action:"","data-cy-setup-form":"",method:"POST"},on:{submit:e.onSubmit}},[e.config.hasAutoconfig?t("NcNoteCard",{attrs:{heading:e.t("core","Autoconfig file detected"),"data-cy-setup-form-note":"autoconfig",type:"success"}},[e._v("\n\t\t"+e._s(e.t("core","The setup form below is pre-filled with the values from the config file."))+"\n\t")]):e._e(),e._v(" "),!1===e.config.htaccessWorking?t("NcNoteCard",{attrs:{heading:e.t("core","Security warning"),"data-cy-setup-form-note":"htaccess",type:"warning"}},[t("p",{domProps:{innerHTML:e._s(e.htaccessWarning)}})]):e._e(),e._v(" "),e._l(e.errors,function(a,o){return t("NcNoteCard",{key:o,attrs:{heading:a.heading,"data-cy-setup-form-note":"error",type:"error"}},[e._v("\n\t\t"+e._s(a.message)+"\n\t")])}),e._v(" "),t("fieldset",{staticClass:"setup-form__administration"},[t("legend",[e._v(e._s(e.t("core","Create administration account")))]),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Administration account name"),"data-cy-setup-form-field":"adminlogin",name:"adminlogin",required:""},model:{value:e.config.adminlogin,callback:function(t){e.$set(e.config,"adminlogin",t)},expression:"config.adminlogin"}}),e._v(" "),t("NcPasswordField",{attrs:{label:e.t("core","Administration account password"),"data-cy-setup-form-field":"adminpass",name:"adminpass",required:""},model:{value:e.config.adminpass,callback:function(t){e.$set(e.config,"adminpass",t)},expression:"config.adminpass"}}),e._v(" "),t("NcNoteCard",{directives:[{name:"show",rawName:"v-show",value:""!==e.config.adminpass,expression:"config.adminpass !== ''"}],attrs:{type:e.passwordHelperType}},[e._v("\n\t\t\t"+e._s(e.passwordHelperText)+"\n\t\t")])],1),e._v(" "),t("details",{attrs:{open:!e.isValidAutoconfig,"data-cy-setup-form-advanced-config":""}},[t("summary",[e._v(e._s(e.t("core","Storage & database")))]),e._v(" "),t("fieldset",{staticClass:"setup-form__data-folder"},[t("NcTextField",{attrs:{label:e.t("core","Data folder"),placeholder:e.config.serverRoot+"/data",required:"",autocomplete:"off",autocapitalize:"none","data-cy-setup-form-field":"directory",name:"directory",spellcheck:"false"},model:{value:e.config.directory,callback:function(t){e.$set(e.config,"directory",t)},expression:"config.directory"}})],1),e._v(" "),t("fieldset",{staticClass:"setup-form__database"},[t("legend",[e._v(e._s(e.t("core","Database configuration")))]),e._v(" "),t("fieldset",{staticClass:"setup-form__database-type"},[t("p",{directives:[{name:"show",rawName:"v-show",value:!e.firstAndOnlyDatabase,expression:"!firstAndOnlyDatabase"}],staticClass:"setup-form__database-type-select",class:`setup-form__database-type-select--${e.DBTypeGroupDirection}`},e._l(e.config.databases,function(a,o){return t("NcCheckboxRadioSwitch",{key:o,attrs:{"button-variant":!0,"data-cy-setup-form-field":`dbtype-${o}`,value:o,"button-variant-grouped":e.DBTypeGroupDirection,name:"dbtype",type:"radio"},model:{value:e.config.dbtype,callback:function(t){e.$set(e.config,"dbtype",t)},expression:"config.dbtype"}},[e._v("\n\t\t\t\t\t\t"+e._s(a)+"\n\t\t\t\t\t")])}),1),e._v(" "),e.firstAndOnlyDatabase?t("NcNoteCard",{attrs:{"data-cy-setup-form-db-note":"single-db",type:"warning"}},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","Only {firstAndOnlyDatabase} is available.",{firstAndOnlyDatabase:e.firstAndOnlyDatabase}))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","Install and activate additional PHP modules to choose other database types."))),t("br"),e._v(" "),t("a",{attrs:{href:e.links.adminSourceInstall,target:"_blank",rel:"noreferrer noopener"}},[e._v("\n\t\t\t\t\t\t"+e._s(e.t("core","For more details check out the documentation."))+" ↗\n\t\t\t\t\t")])]):e._e(),e._v(" "),"sqlite"===e.config.dbtype?t("NcNoteCard",{attrs:{heading:e.t("core","Performance warning"),"data-cy-setup-form-db-note":"sqlite",type:"warning"}},[e._v("\n\t\t\t\t\t"+e._s(e.t("core","You chose SQLite as database."))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","SQLite should only be used for minimal and development instances. For production we recommend a different database backend."))),t("br"),e._v("\n\t\t\t\t\t"+e._s(e.t("core","If you use clients for file syncing, the use of SQLite is highly discouraged."))+"\n\t\t\t\t")]):e._e()],1),e._v(" "),"sqlite"!==e.config.dbtype?t("fieldset",[t("NcTextField",{attrs:{label:e.t("core","Database user"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbuser",name:"dbuser",spellcheck:"false",required:""},model:{value:e.config.dbuser,callback:function(t){e.$set(e.config,"dbuser",t)},expression:"config.dbuser"}}),e._v(" "),t("NcPasswordField",{attrs:{label:e.t("core","Database password"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbpass",name:"dbpass",spellcheck:"false",required:""},model:{value:e.config.dbpass,callback:function(t){e.$set(e.config,"dbpass",t)},expression:"config.dbpass"}}),e._v(" "),t("NcTextField",{attrs:{label:e.t("core","Database name"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbname",name:"dbname",pattern:"[0-9a-zA-Z\\$_\\-]+",spellcheck:"false",required:""},model:{value:e.config.dbname,callback:function(t){e.$set(e.config,"dbname",t)},expression:"config.dbname"}}),e._v(" "),"oci"===e.config.dbtype?t("NcTextField",{attrs:{label:e.t("core","Database tablespace"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbtablespace",name:"dbtablespace",spellcheck:"false"},model:{value:e.config.dbtablespace,callback:function(t){e.$set(e.config,"dbtablespace",t)},expression:"config.dbtablespace"}}):e._e(),e._v(" "),t("NcTextField",{attrs:{"helper-text":e.t("core","Please specify the port number along with the host name (e.g., localhost:5432)."),label:e.t("core","Database host"),placeholder:e.t("core","localhost"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbhost",name:"dbhost",spellcheck:"false"},model:{value:e.config.dbhost,callback:function(t){e.$set(e.config,"dbhost",t)},expression:"config.dbhost"}})],1):e._e()])]),e._v(" "),t("NcButton",{staticClass:"setup-form__button",class:{"setup-form__button--loading":e.loading},attrs:{disabled:e.loading,loading:e.loading,wide:!0,alignment:"center-reverse","data-cy-setup-form-submit":"",type:"submit",variant:"primary"},scopedSlots:e._u([{key:"icon",fn:function(){return[e.loading?t("NcLoadingIcon"):t("IconArrowRight")]},proxy:!0}])},[e._v("\n\t\t"+e._s(e.loading?e.t("core","Installing …"):e.t("core","Install"))+"\n\t")]),e._v(" "),t("NcNoteCard",{attrs:{"data-cy-setup-form-note":"help",type:"info"}},[e._v("\n\t\t"+e._s(e.t("core","Need help?"))+"\n\t\t"),t("a",{attrs:{target:"_blank",rel:"noreferrer noopener",href:e.links.adminInstall}},[e._v(e._s(e.t("core","See the documentation"))+" ↗")])])],2)},[],!1,null,null,null).exports;(new(r.Ay.extend(P))).$mount("#content")}},a={};function o(e){var r=a[e];if(void 0!==r)return r.exports;var n=a[e]={id:e,loaded:!1,exports:{}};return t[e].call(n.exports,n,n.exports,o),n.loaded=!0,n.exports}o.m=t,e=[],o.O=(t,a,r,n)=>{if(!a){var s=1/0;for(d=0;d=n)&&Object.keys(o.O).every(e=>o.O[e](a[c]))?a.splice(c--,1):(i=!1,n0&&e[d-1][2]>n;d--)e[d]=e[d-1];e[d]=[a,r,n]},o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.e=()=>Promise.resolve(),o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),o.j=820,(()=>{o.b=document&&document.baseURI||self.location.href;var e={820:0};o.O.j=t=>0===e[t];var t=(t,a)=>{var r,n,s=a[0],i=a[1],c=a[2],l=0;if(s.some(t=>0!==e[t])){for(r in i)o.o(i,r)&&(o.m[r]=i[r]);if(c)var d=c(o)}for(t&&t(a);lo(93766));r=o.O(r)})(); -//# sourceMappingURL=core-install.js.map?v=20e887abff9075d1c778 \ No newline at end of file +(()=>{"use strict";var t,e={85325:(t,e,a)=>{a.d(e,{A:()=>i});var n=a(71354),o=a.n(n),r=a(76314),s=a.n(r)()(o());s.push([t.id,"form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}","",{version:3,sources:["webpack://./core/src/views/Setup.vue"],names:[],mappings:"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA",sourcesContent:["\nform {\n\tpadding: calc(3 * var(--default-grid-baseline));\n\tcolor: var(--color-main-text);\n\tborder-radius: var(--border-radius-container);\n\tbackground-color: var(--color-main-background-blur);\n\tbox-shadow: 0 0 10px var(--color-box-shadow);\n\t-webkit-backdrop-filter: var(--filter-background-blur);\n\tbackdrop-filter: var(--filter-background-blur);\n\n\tmax-width: 300px;\n\tmargin-bottom: 30px;\n\n\t> fieldset:first-child,\n\t> .notecard:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\t> .notecard:last-child {\n\t\tmargin-bottom: 0;\n\t}\n\n\tfieldset,\n\tdetails {\n\t\tmargin-block: 1rem;\n\t}\n\n\t.setup-form__button:not(.setup-form__button--loading) {\n\t\t.material-design-icon {\n\t\t\ttransition: all linear var(--animation-quick);\n\t\t}\n\n\t\t&:hover .material-design-icon {\n\t\t\ttransform: translateX(0.2em);\n\t\t}\n\t}\n\n\t// Db select required styling\n\t.setup-form__database-type-select {\n\t\tdisplay: flex;\n\t\t&--vertical {\n\t\t\tflex-direction: column;\n\t\t}\n\t}\n\n}\n\ncode {\n\tbackground-color: var(--color-background-dark);\n\tmargin-top: 1rem;\n\tpadding: 0 0.3em;\n\tborder-radius: var(--border-radius);\n}\n\n// Various overrides\n.input-field {\n\tmargin-block-start: 1rem !important;\n}\n\n.notecard__heading {\n\tfont-size: inherit !important;\n}\n"],sourceRoot:""}]);const i=s},95748:(t,e,a)=>{var n,o=a(85471),r=a(81222),s=a(53334),i=a(99418),c=a(74095),l=a(32073),d=a(88289),u=a(31133),f=a(16044),p=a(82182),m=a(33691);function g(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const e=new Set(t),a=parseInt(Math.log2(Math.pow(parseInt(e.size.toString()),t.length)).toFixed(2));return a<16?n.VeryWeak:a<31?n.Weak:a<46?n.Moderate:a<61?n.Strong:a<76?n.VeryStrong:n.ExtremelyStrong}!function(t){t[t.VeryWeak=0]="VeryWeak",t[t.Weak=1]="Weak",t[t.Moderate=2]="Moderate",t[t.Strong=3]="Strong",t[t.VeryStrong=4]="VeryStrong",t[t.ExtremelyStrong=5]="ExtremelyStrong"}(n||(n={}));const b=(0,o.pM)({name:"Setup",components:{IconArrowRight:m.A,NcButton:c.A,NcCheckboxRadioSwitch:l.A,NcLoadingIcon:d.A,NcNoteCard:u.A,NcPasswordField:f.A,NcTextField:p.A},setup:()=>({t:s.t}),data:()=>({config:{},links:{},isValidAutoconfig:!1,loading:!1}),computed:{passwordHelperText(){if(""===this.config?.adminpass)return"";switch(g(this.config?.adminpass)){case n.VeryWeak:return(0,s.t)("core","Password is too weak");case n.Weak:return(0,s.t)("core","Password is weak");case n.Moderate:return(0,s.t)("core","Password is average");case n.Strong:return(0,s.t)("core","Password is strong");case n.VeryStrong:return(0,s.t)("core","Password is very strong");case n.ExtremelyStrong:return(0,s.t)("core","Password is extremely strong")}return(0,s.t)("core","Unknown password strength")},passwordHelperType(){return g(this.config?.adminpass)3?"vertical":"horizontal"},htaccessWarning(){const t=[(0,s.t)("core","Your data directory and files are probably accessible from the internet because the .htaccess file does not work."),(0,s.t)("core","For information how to properly configure your server, please {linkStart}see the documentation{linkEnd}",{linkStart:'',linkEnd:""},{escape:!1})].join("
");return i.A.sanitize(t)},errors(){return(this.config?.errors||[]).map(t=>"string"==typeof t?{heading:"",message:t}:""===t.hint?{heading:"",message:t.error}:{heading:t.error,message:t.hint})}},beforeMount(){this.config=(0,r.C)("core","config"),this.links=(0,r.C)("core","links")},mounted(){if(""===this.config.dbtype&&(this.config.dbtype=Object.keys(this.config.databases).at(0)),this.config.hasAutoconfig){const t=this.$refs.form;t.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(t=>{t.removeAttribute("required")}),t.checkValidity()&&0===this.config.errors.length?this.isValidAutoconfig=!0:this.isValidAutoconfig=!1,t.querySelectorAll('input[name="adminlogin"], input[name="adminpass"]').forEach(t=>{t.setAttribute("required","true")})}},methods:{async onSubmit(){this.loading=!0}}});var A=a(85072),h=a.n(A),v=a(97825),y=a.n(v),_=a(77659),k=a.n(_),C=a(55056),w=a.n(C),x=a(10540),S=a.n(x),N=a(41113),D=a.n(N),O=a(85325),T={};T.styleTagTransform=D(),T.setAttributes=w(),T.insert=k().bind(null,"head"),T.domAPI=y(),T.insertStyleElement=S(),h()(O.A,T),O.A&&O.A.locals&&O.A.locals;const P=(0,a(14486).A)(b,function(){var t=this,e=t._self._c;return t._self._setupProxy,e("form",{ref:"form",staticClass:"setup-form",class:{"setup-form--loading":t.loading},attrs:{action:"","data-cy-setup-form":"",method:"POST"},on:{submit:t.onSubmit}},[t.config.hasAutoconfig?e("NcNoteCard",{attrs:{heading:t.t("core","Autoconfig file detected"),"data-cy-setup-form-note":"autoconfig",type:"success"}},[t._v("\n\t\t"+t._s(t.t("core","The setup form below is pre-filled with the values from the config file."))+"\n\t")]):t._e(),t._v(" "),!1===t.config.htaccessWorking?e("NcNoteCard",{attrs:{heading:t.t("core","Security warning"),"data-cy-setup-form-note":"htaccess",type:"warning"}},[e("p",{domProps:{innerHTML:t._s(t.htaccessWarning)}})]):t._e(),t._v(" "),t._l(t.errors,function(a,n){return e("NcNoteCard",{key:n,attrs:{heading:a.heading,"data-cy-setup-form-note":"error",type:"error"}},[t._v("\n\t\t"+t._s(a.message)+"\n\t")])}),t._v(" "),e("fieldset",{staticClass:"setup-form__administration"},[e("legend",[t._v(t._s(t.t("core","Create administration account")))]),t._v(" "),e("NcTextField",{attrs:{label:t.t("core","Administration account name"),"data-cy-setup-form-field":"adminlogin",name:"adminlogin",required:""},model:{value:t.config.adminlogin,callback:function(e){t.$set(t.config,"adminlogin",e)},expression:"config.adminlogin"}}),t._v(" "),e("NcPasswordField",{attrs:{label:t.t("core","Administration account password"),"data-cy-setup-form-field":"adminpass",name:"adminpass",required:""},model:{value:t.config.adminpass,callback:function(e){t.$set(t.config,"adminpass",e)},expression:"config.adminpass"}}),t._v(" "),e("NcNoteCard",{directives:[{name:"show",rawName:"v-show",value:""!==t.config.adminpass,expression:"config.adminpass !== ''"}],attrs:{type:t.passwordHelperType}},[t._v("\n\t\t\t"+t._s(t.passwordHelperText)+"\n\t\t")])],1),t._v(" "),e("details",{attrs:{open:!t.isValidAutoconfig,"data-cy-setup-form-advanced-config":""}},[e("summary",[t._v(t._s(t.t("core","Storage & database")))]),t._v(" "),e("fieldset",{staticClass:"setup-form__data-folder"},[e("NcTextField",{attrs:{label:t.t("core","Data folder"),placeholder:t.config.serverRoot+"/data",required:"",autocomplete:"off",autocapitalize:"none","data-cy-setup-form-field":"directory",name:"directory",spellcheck:"false"},model:{value:t.config.directory,callback:function(e){t.$set(t.config,"directory",e)},expression:"config.directory"}})],1),t._v(" "),e("fieldset",{staticClass:"setup-form__database"},[e("legend",[t._v(t._s(t.t("core","Database configuration")))]),t._v(" "),e("fieldset",{staticClass:"setup-form__database-type"},[e("legend",{staticClass:"hidden-visually"},[t._v("\n\t\t\t\t\t"+t._s(t.t("core","Database type"))+"\n\t\t\t\t")]),t._v(" "),e("p",{directives:[{name:"show",rawName:"v-show",value:!t.firstAndOnlyDatabase,expression:"!firstAndOnlyDatabase"}],staticClass:"setup-form__database-type-select",class:`setup-form__database-type-select--${t.DBTypeGroupDirection}`},t._l(t.config.databases,function(a,n){return e("NcCheckboxRadioSwitch",{key:n,attrs:{"button-variant":!0,"data-cy-setup-form-field":`dbtype-${n}`,value:n,"button-variant-grouped":t.DBTypeGroupDirection,name:"dbtype",type:"radio"},model:{value:t.config.dbtype,callback:function(e){t.$set(t.config,"dbtype",e)},expression:"config.dbtype"}},[t._v("\n\t\t\t\t\t\t"+t._s(a)+"\n\t\t\t\t\t")])}),1),t._v(" "),t.firstAndOnlyDatabase?e("NcNoteCard",{attrs:{"data-cy-setup-form-db-note":"single-db",type:"warning"}},[t._v("\n\t\t\t\t\t"+t._s(t.t("core","Only {firstAndOnlyDatabase} is available.",{firstAndOnlyDatabase:t.firstAndOnlyDatabase}))),e("br"),t._v("\n\t\t\t\t\t"+t._s(t.t("core","Install and activate additional PHP modules to choose other database types."))),e("br"),t._v(" "),e("a",{attrs:{href:t.links.adminSourceInstall,target:"_blank",rel:"noreferrer noopener"}},[t._v("\n\t\t\t\t\t\t"+t._s(t.t("core","For more details check out the documentation."))+" ↗\n\t\t\t\t\t")])]):t._e(),t._v(" "),"sqlite"===t.config.dbtype?e("NcNoteCard",{attrs:{heading:t.t("core","Performance warning"),"data-cy-setup-form-db-note":"sqlite",type:"warning"}},[t._v("\n\t\t\t\t\t"+t._s(t.t("core","You chose SQLite as database."))),e("br"),t._v("\n\t\t\t\t\t"+t._s(t.t("core","SQLite should only be used for minimal and development instances. For production we recommend a different database backend."))),e("br"),t._v("\n\t\t\t\t\t"+t._s(t.t("core","If you use clients for file syncing, the use of SQLite is highly discouraged."))+"\n\t\t\t\t")]):t._e()],1),t._v(" "),"sqlite"!==t.config.dbtype?e("fieldset",[e("legend",{staticClass:"hidden-visually"},[t._v("\n\t\t\t\t\t"+t._s(t.t("core","Database connection"))+"\n\t\t\t\t")]),t._v(" "),e("NcTextField",{attrs:{label:t.t("core","Database user"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbuser",name:"dbuser",spellcheck:"false",required:""},model:{value:t.config.dbuser,callback:function(e){t.$set(t.config,"dbuser",e)},expression:"config.dbuser"}}),t._v(" "),e("NcPasswordField",{attrs:{label:t.t("core","Database password"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbpass",name:"dbpass",spellcheck:"false",required:""},model:{value:t.config.dbpass,callback:function(e){t.$set(t.config,"dbpass",e)},expression:"config.dbpass"}}),t._v(" "),e("NcTextField",{attrs:{label:t.t("core","Database name"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbname",name:"dbname",pattern:"[0-9a-zA-Z\\$_\\-]+",spellcheck:"false",required:""},model:{value:t.config.dbname,callback:function(e){t.$set(t.config,"dbname",e)},expression:"config.dbname"}}),t._v(" "),"oci"===t.config.dbtype?e("NcTextField",{attrs:{label:t.t("core","Database tablespace"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbtablespace",name:"dbtablespace",spellcheck:"false"},model:{value:t.config.dbtablespace,callback:function(e){t.$set(t.config,"dbtablespace",e)},expression:"config.dbtablespace"}}):t._e(),t._v(" "),e("NcTextField",{attrs:{"helper-text":t.t("core","Please specify the port number along with the host name (e.g., localhost:5432)."),label:t.t("core","Database host"),placeholder:t.t("core","localhost"),autocapitalize:"none",autocomplete:"off","data-cy-setup-form-field":"dbhost",name:"dbhost",spellcheck:"false"},model:{value:t.config.dbhost,callback:function(e){t.$set(t.config,"dbhost",e)},expression:"config.dbhost"}})],1):t._e()])]),t._v(" "),e("NcButton",{staticClass:"setup-form__button",class:{"setup-form__button--loading":t.loading},attrs:{disabled:t.loading,loading:t.loading,wide:!0,alignment:"center-reverse","data-cy-setup-form-submit":"",type:"submit",variant:"primary"},scopedSlots:t._u([{key:"icon",fn:function(){return[t.loading?e("NcLoadingIcon"):e("IconArrowRight")]},proxy:!0}])},[t._v("\n\t\t"+t._s(t.loading?t.t("core","Installing …"):t.t("core","Install"))+"\n\t")]),t._v(" "),e("NcNoteCard",{attrs:{"data-cy-setup-form-note":"help",type:"info"}},[t._v("\n\t\t"+t._s(t.t("core","Need help?"))+"\n\t\t"),e("a",{attrs:{target:"_blank",rel:"noreferrer noopener",href:t.links.adminInstall}},[t._v(t._s(t.t("core","See the documentation"))+" ↗")])])],2)},[],!1,null,null,null).exports;(new(o.Ay.extend(P))).$mount("#content")}},a={};function n(t){var o=a[t];if(void 0!==o)return o.exports;var r=a[t]={id:t,loaded:!1,exports:{}};return e[t].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}n.m=e,t=[],n.O=(e,a,o,r)=>{if(!a){var s=1/0;for(d=0;d=r)&&Object.keys(n.O).every(t=>n.O[t](a[c]))?a.splice(c--,1):(i=!1,r0&&t[d-1][2]>r;d--)t[d]=t[d-1];t[d]=[a,o,r]},n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var a in e)n.o(e,a)&&!n.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},n.e=()=>Promise.resolve(),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),n.j=820,(()=>{n.b=document&&document.baseURI||self.location.href;var t={820:0};n.O.j=e=>0===t[e];var e=(e,a)=>{var o,r,s=a[0],i=a[1],c=a[2],l=0;if(s.some(e=>0!==t[e])){for(o in i)n.o(i,o)&&(n.m[o]=i[o]);if(c)var d=c(n)}for(e&&e(a);ln(95748));o=n.O(o)})(); +//# sourceMappingURL=core-install.js.map?v=79dfd4a2d171c64a6c94 \ No newline at end of file diff --git a/dist/core-install.js.map b/dist/core-install.js.map index 4624fa04941..911e7b12152 100644 --- a/dist/core-install.js.map +++ b/dist/core-install.js.map @@ -1 +1 @@ -{"version":3,"file":"core-install.js?v=20e887abff9075d1c778","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/core/src/views/Setup.vue?vue&type=style&index=0&id=0bf59069&prod&lang=scss","webpack:///nextcloud/core/src/views/Setup.vue","webpack:///nextcloud/core/src/views/Setup.vue?vue&type=script&lang=ts","webpack://nextcloud/./core/src/views/Setup.vue?626b","webpack://nextcloud/./core/src/views/Setup.vue?1b4a","webpack:///nextcloud/core/src/install.ts","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/views/Setup.vue\"],\"names\":[],\"mappings\":\"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA\",\"sourcesContent\":[\"\\nform {\\n\\tpadding: calc(3 * var(--default-grid-baseline));\\n\\tcolor: var(--color-main-text);\\n\\tborder-radius: var(--border-radius-container);\\n\\tbackground-color: var(--color-main-background-blur);\\n\\tbox-shadow: 0 0 10px var(--color-box-shadow);\\n\\t-webkit-backdrop-filter: var(--filter-background-blur);\\n\\tbackdrop-filter: var(--filter-background-blur);\\n\\n\\tmax-width: 300px;\\n\\tmargin-bottom: 30px;\\n\\n\\t> fieldset:first-child,\\n\\t> .notecard:first-child {\\n\\t\\tmargin-top: 0;\\n\\t}\\n\\n\\t> .notecard:last-child {\\n\\t\\tmargin-bottom: 0;\\n\\t}\\n\\n\\tfieldset,\\n\\tdetails {\\n\\t\\tmargin-block: 1rem;\\n\\t}\\n\\n\\t.setup-form__button:not(.setup-form__button--loading) {\\n\\t\\t.material-design-icon {\\n\\t\\t\\ttransition: all linear var(--animation-quick);\\n\\t\\t}\\n\\n\\t\\t&:hover .material-design-icon {\\n\\t\\t\\ttransform: translateX(0.2em);\\n\\t\\t}\\n\\t}\\n\\n\\t// Db select required styling\\n\\t.setup-form__database-type-select {\\n\\t\\tdisplay: flex;\\n\\t\\t&--vertical {\\n\\t\\t\\tflex-direction: column;\\n\\t\\t}\\n\\t}\\n\\n}\\n\\ncode {\\n\\tbackground-color: var(--color-background-dark);\\n\\tmargin-top: 1rem;\\n\\tpadding: 0 0.3em;\\n\\tborder-radius: var(--border-radius);\\n}\\n\\n// Various overrides\\n.input-field {\\n\\tmargin-block-start: 1rem !important;\\n}\\n\\n.notecard__heading {\\n\\tfont-size: inherit !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('form',{ref:\"form\",staticClass:\"setup-form\",class:{ 'setup-form--loading': _vm.loading },attrs:{\"action\":\"\",\"data-cy-setup-form\":\"\",\"method\":\"POST\"},on:{\"submit\":_vm.onSubmit}},[(_vm.config.hasAutoconfig)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Autoconfig file detected'),\"data-cy-setup-form-note\":\"autoconfig\",\"type\":\"success\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'The setup form below is pre-filled with the values from the config file.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.config.htaccessWorking === false)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Security warning'),\"data-cy-setup-form-note\":\"htaccess\",\"type\":\"warning\"}},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.htaccessWarning)}})]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.errors),function(error,index){return _c('NcNoteCard',{key:index,attrs:{\"heading\":error.heading,\"data-cy-setup-form-note\":\"error\",\"type\":\"error\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(error.message)+\"\\n\\t\")])}),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__administration\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Create administration account')))]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Administration account name'),\"data-cy-setup-form-field\":\"adminlogin\",\"name\":\"adminlogin\",\"required\":\"\"},model:{value:(_vm.config.adminlogin),callback:function ($$v) {_vm.$set(_vm.config, \"adminlogin\", $$v)},expression:\"config.adminlogin\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Administration account password'),\"data-cy-setup-form-field\":\"adminpass\",\"name\":\"adminpass\",\"required\":\"\"},model:{value:(_vm.config.adminpass),callback:function ($$v) {_vm.$set(_vm.config, \"adminpass\", $$v)},expression:\"config.adminpass\"}}),_vm._v(\" \"),_c('NcNoteCard',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.config.adminpass !== ''),expression:\"config.adminpass !== ''\"}],attrs:{\"type\":_vm.passwordHelperType}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.passwordHelperText)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('details',{attrs:{\"open\":!_vm.isValidAutoconfig,\"data-cy-setup-form-advanced-config\":\"\"}},[_c('summary',[_vm._v(_vm._s(_vm.t('core', 'Storage & database')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__data-folder\"},[_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Data folder'),\"placeholder\":_vm.config.serverRoot + '/data',\"required\":\"\",\"autocomplete\":\"off\",\"autocapitalize\":\"none\",\"data-cy-setup-form-field\":\"directory\",\"name\":\"directory\",\"spellcheck\":\"false\"},model:{value:(_vm.config.directory),callback:function ($$v) {_vm.$set(_vm.config, \"directory\", $$v)},expression:\"config.directory\"}})],1),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Database configuration')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database-type\"},[_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.firstAndOnlyDatabase),expression:\"!firstAndOnlyDatabase\"}],staticClass:\"setup-form__database-type-select\",class:`setup-form__database-type-select--${_vm.DBTypeGroupDirection}`},_vm._l((_vm.config.databases),function(name,db){return _c('NcCheckboxRadioSwitch',{key:db,attrs:{\"button-variant\":true,\"data-cy-setup-form-field\":`dbtype-${db}`,\"value\":db,\"button-variant-grouped\":_vm.DBTypeGroupDirection,\"name\":\"dbtype\",\"type\":\"radio\"},model:{value:(_vm.config.dbtype),callback:function ($$v) {_vm.$set(_vm.config, \"dbtype\", $$v)},expression:\"config.dbtype\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(name)+\"\\n\\t\\t\\t\\t\\t\")])}),1),_vm._v(\" \"),(_vm.firstAndOnlyDatabase)?_c('NcNoteCard',{attrs:{\"data-cy-setup-form-db-note\":\"single-db\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Only {firstAndOnlyDatabase} is available.', { firstAndOnlyDatabase: _vm.firstAndOnlyDatabase }))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Install and activate additional PHP modules to choose other database types.'))),_c('br'),_vm._v(\" \"),_c('a',{attrs:{\"href\":_vm.links.adminSourceInstall,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'For more details check out the documentation.'))+\" ↗\\n\\t\\t\\t\\t\\t\")])]):_vm._e(),_vm._v(\" \"),(_vm.config.dbtype === 'sqlite')?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Performance warning'),\"data-cy-setup-form-db-note\":\"sqlite\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'You chose SQLite as database.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'SQLite should only be used for minimal and development instances. For production we recommend a different database backend.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'If you use clients for file syncing, the use of SQLite is highly discouraged.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1),_vm._v(\" \"),(_vm.config.dbtype !== 'sqlite')?_c('fieldset',[_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database user'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbuser\",\"name\":\"dbuser\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbuser),callback:function ($$v) {_vm.$set(_vm.config, \"dbuser\", $$v)},expression:\"config.dbuser\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Database password'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbpass\",\"name\":\"dbpass\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbpass),callback:function ($$v) {_vm.$set(_vm.config, \"dbpass\", $$v)},expression:\"config.dbpass\"}}),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database name'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbname\",\"name\":\"dbname\",\"pattern\":\"[0-9a-zA-Z\\\\$_\\\\-]+\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbname),callback:function ($$v) {_vm.$set(_vm.config, \"dbname\", $$v)},expression:\"config.dbname\"}}),_vm._v(\" \"),(_vm.config.dbtype === 'oci')?_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database tablespace'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbtablespace\",\"name\":\"dbtablespace\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbtablespace),callback:function ($$v) {_vm.$set(_vm.config, \"dbtablespace\", $$v)},expression:\"config.dbtablespace\"}}):_vm._e(),_vm._v(\" \"),_c('NcTextField',{attrs:{\"helper-text\":_vm.t('core', 'Please specify the port number along with the host name (e.g., localhost:5432).'),\"label\":_vm.t('core', 'Database host'),\"placeholder\":_vm.t('core', 'localhost'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbhost\",\"name\":\"dbhost\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbhost),callback:function ($$v) {_vm.$set(_vm.config, \"dbhost\", $$v)},expression:\"config.dbhost\"}})],1):_vm._e()])]),_vm._v(\" \"),_c('NcButton',{staticClass:\"setup-form__button\",class:{ 'setup-form__button--loading': _vm.loading },attrs:{\"disabled\":_vm.loading,\"loading\":_vm.loading,\"wide\":true,\"alignment\":\"center-reverse\",\"data-cy-setup-form-submit\":\"\",\"type\":\"submit\",\"variant\":\"primary\"},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading)?_c('NcLoadingIcon'):_c('IconArrowRight')]},proxy:true}])},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.loading ? _vm.t('core', 'Installing …') : _vm.t('core', 'Install'))+\"\\n\\t\")]),_vm._v(\" \"),_c('NcNoteCard',{attrs:{\"data-cy-setup-form-note\":\"help\",\"type\":\"info\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Need help?'))+\"\\n\\t\\t\"),_c('a',{attrs:{\"target\":\"_blank\",\"rel\":\"noreferrer noopener\",\"href\":_vm.links.adminInstall}},[_vm._v(_vm._s(_vm.t('core', 'See the documentation'))+\" ↗\")])])],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=style&index=0&id=0bf59069&prod&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=style&index=0&id=0bf59069&prod&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Setup.vue?vue&type=template&id=0bf59069\"\nimport script from \"./Setup.vue?vue&type=script&lang=ts\"\nexport * from \"./Setup.vue?vue&type=script&lang=ts\"\nimport style0 from \"./Setup.vue?vue&type=style&index=0&id=0bf59069&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport Setup from './views/Setup.vue';\nconst SetupVue = Vue.extend(Setup);\nnew SetupVue().$mount('#content');\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 820;","__webpack_require__.b = (document && document.baseURI) || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t820: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(93766)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","___CSS_LOADER_EXPORT___","push","module","id","PasswordStrength","checkPasswordEntropy","password","arguments","length","undefined","uniqueCharacters","Set","entropy","parseInt","Math","log2","pow","size","toString","toFixed","VeryWeak","Weak","Moderate","Strong","VeryStrong","ExtremelyStrong","defineComponent","name","components","IconArrowRight","NcButton","NcCheckboxRadioSwitch","NcLoadingIcon","NcNoteCard","NcPasswordField","NcTextField","setup","t","data","config","links","isValidAutoconfig","loading","computed","passwordHelperText","adminpass","passwordHelperType","firstAndOnlyDatabase","dbNames","Object","values","databases","DBTypeGroupDirection","keys","htaccessWarning","message","linkStart","adminInstall","linkEnd","escape","join","DomPurify","sanitize","errors","map","error","heading","hint","beforeMount","loadState","mounted","dbtype","at","hasAutoconfig","form","$refs","querySelectorAll","forEach","input","removeAttribute","checkValidity","setAttribute","methods","onSubmit","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","this","_c","_self","_setupProxy","ref","staticClass","class","attrs","on","_v","_s","_e","htaccessWorking","domProps","_l","index","key","model","value","adminlogin","callback","$$v","$set","expression","directives","rawName","serverRoot","directory","db","adminSourceInstall","dbuser","dbpass","dbname","dbtablespace","dbhost","scopedSlots","_u","fn","proxy","Vue","extend","Setup","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"core-install.js?v=79dfd4a2d171c64a6c94","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/core/src/views/Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss","webpack:///nextcloud/core/src/views/Setup.vue","webpack:///nextcloud/core/src/views/Setup.vue?vue&type=script&lang=ts","webpack://nextcloud/./core/src/views/Setup.vue?b4e6","webpack://nextcloud/./core/src/views/Setup.vue?1b4a","webpack:///nextcloud/core/src/install.ts","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `form{padding:calc(3*var(--default-grid-baseline));color:var(--color-main-text);border-radius:var(--border-radius-container);background-color:var(--color-main-background-blur);box-shadow:0 0 10px var(--color-box-shadow);-webkit-backdrop-filter:var(--filter-background-blur);backdrop-filter:var(--filter-background-blur);max-width:300px;margin-bottom:30px}form>fieldset:first-child,form>.notecard:first-child{margin-top:0}form>.notecard:last-child{margin-bottom:0}form fieldset,form details{margin-block:1rem}form .setup-form__button:not(.setup-form__button--loading) .material-design-icon{transition:all linear var(--animation-quick)}form .setup-form__button:not(.setup-form__button--loading):hover .material-design-icon{transform:translateX(0.2em)}form .setup-form__database-type-select{display:flex}form .setup-form__database-type-select--vertical{flex-direction:column}code{background-color:var(--color-background-dark);margin-top:1rem;padding:0 .3em;border-radius:var(--border-radius)}.input-field{margin-block-start:1rem !important}.notecard__heading{font-size:inherit !important}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/views/Setup.vue\"],\"names\":[],\"mappings\":\"AACA,KACC,4CAAA,CACA,4BAAA,CACA,4CAAA,CACA,kDAAA,CACA,2CAAA,CACA,qDAAA,CACA,6CAAA,CAEA,eAAA,CACA,kBAAA,CAEA,qDAEC,YAAA,CAGD,0BACC,eAAA,CAGD,2BAEC,iBAAA,CAIA,iFACC,4CAAA,CAGD,uFACC,2BAAA,CAKF,uCACC,YAAA,CACA,iDACC,qBAAA,CAMH,KACC,6CAAA,CACA,eAAA,CACA,cAAA,CACA,kCAAA,CAID,aACC,kCAAA,CAGD,mBACC,4BAAA\",\"sourcesContent\":[\"\\nform {\\n\\tpadding: calc(3 * var(--default-grid-baseline));\\n\\tcolor: var(--color-main-text);\\n\\tborder-radius: var(--border-radius-container);\\n\\tbackground-color: var(--color-main-background-blur);\\n\\tbox-shadow: 0 0 10px var(--color-box-shadow);\\n\\t-webkit-backdrop-filter: var(--filter-background-blur);\\n\\tbackdrop-filter: var(--filter-background-blur);\\n\\n\\tmax-width: 300px;\\n\\tmargin-bottom: 30px;\\n\\n\\t> fieldset:first-child,\\n\\t> .notecard:first-child {\\n\\t\\tmargin-top: 0;\\n\\t}\\n\\n\\t> .notecard:last-child {\\n\\t\\tmargin-bottom: 0;\\n\\t}\\n\\n\\tfieldset,\\n\\tdetails {\\n\\t\\tmargin-block: 1rem;\\n\\t}\\n\\n\\t.setup-form__button:not(.setup-form__button--loading) {\\n\\t\\t.material-design-icon {\\n\\t\\t\\ttransition: all linear var(--animation-quick);\\n\\t\\t}\\n\\n\\t\\t&:hover .material-design-icon {\\n\\t\\t\\ttransform: translateX(0.2em);\\n\\t\\t}\\n\\t}\\n\\n\\t// Db select required styling\\n\\t.setup-form__database-type-select {\\n\\t\\tdisplay: flex;\\n\\t\\t&--vertical {\\n\\t\\t\\tflex-direction: column;\\n\\t\\t}\\n\\t}\\n\\n}\\n\\ncode {\\n\\tbackground-color: var(--color-background-dark);\\n\\tmargin-top: 1rem;\\n\\tpadding: 0 0.3em;\\n\\tborder-radius: var(--border-radius);\\n}\\n\\n// Various overrides\\n.input-field {\\n\\tmargin-block-start: 1rem !important;\\n}\\n\\n.notecard__heading {\\n\\tfont-size: inherit !important;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c('form',{ref:\"form\",staticClass:\"setup-form\",class:{ 'setup-form--loading': _vm.loading },attrs:{\"action\":\"\",\"data-cy-setup-form\":\"\",\"method\":\"POST\"},on:{\"submit\":_vm.onSubmit}},[(_vm.config.hasAutoconfig)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Autoconfig file detected'),\"data-cy-setup-form-note\":\"autoconfig\",\"type\":\"success\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'The setup form below is pre-filled with the values from the config file.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.config.htaccessWorking === false)?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Security warning'),\"data-cy-setup-form-note\":\"htaccess\",\"type\":\"warning\"}},[_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.htaccessWarning)}})]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.errors),function(error,index){return _c('NcNoteCard',{key:index,attrs:{\"heading\":error.heading,\"data-cy-setup-form-note\":\"error\",\"type\":\"error\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(error.message)+\"\\n\\t\")])}),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__administration\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Create administration account')))]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Administration account name'),\"data-cy-setup-form-field\":\"adminlogin\",\"name\":\"adminlogin\",\"required\":\"\"},model:{value:(_vm.config.adminlogin),callback:function ($$v) {_vm.$set(_vm.config, \"adminlogin\", $$v)},expression:\"config.adminlogin\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Administration account password'),\"data-cy-setup-form-field\":\"adminpass\",\"name\":\"adminpass\",\"required\":\"\"},model:{value:(_vm.config.adminpass),callback:function ($$v) {_vm.$set(_vm.config, \"adminpass\", $$v)},expression:\"config.adminpass\"}}),_vm._v(\" \"),_c('NcNoteCard',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.config.adminpass !== ''),expression:\"config.adminpass !== ''\"}],attrs:{\"type\":_vm.passwordHelperType}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.passwordHelperText)+\"\\n\\t\\t\")])],1),_vm._v(\" \"),_c('details',{attrs:{\"open\":!_vm.isValidAutoconfig,\"data-cy-setup-form-advanced-config\":\"\"}},[_c('summary',[_vm._v(_vm._s(_vm.t('core', 'Storage & database')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__data-folder\"},[_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Data folder'),\"placeholder\":_vm.config.serverRoot + '/data',\"required\":\"\",\"autocomplete\":\"off\",\"autocapitalize\":\"none\",\"data-cy-setup-form-field\":\"directory\",\"name\":\"directory\",\"spellcheck\":\"false\"},model:{value:(_vm.config.directory),callback:function ($$v) {_vm.$set(_vm.config, \"directory\", $$v)},expression:\"config.directory\"}})],1),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database\"},[_c('legend',[_vm._v(_vm._s(_vm.t('core', 'Database configuration')))]),_vm._v(\" \"),_c('fieldset',{staticClass:\"setup-form__database-type\"},[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Database type'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.firstAndOnlyDatabase),expression:\"!firstAndOnlyDatabase\"}],staticClass:\"setup-form__database-type-select\",class:`setup-form__database-type-select--${_vm.DBTypeGroupDirection}`},_vm._l((_vm.config.databases),function(name,db){return _c('NcCheckboxRadioSwitch',{key:db,attrs:{\"button-variant\":true,\"data-cy-setup-form-field\":`dbtype-${db}`,\"value\":db,\"button-variant-grouped\":_vm.DBTypeGroupDirection,\"name\":\"dbtype\",\"type\":\"radio\"},model:{value:(_vm.config.dbtype),callback:function ($$v) {_vm.$set(_vm.config, \"dbtype\", $$v)},expression:\"config.dbtype\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(name)+\"\\n\\t\\t\\t\\t\\t\")])}),1),_vm._v(\" \"),(_vm.firstAndOnlyDatabase)?_c('NcNoteCard',{attrs:{\"data-cy-setup-form-db-note\":\"single-db\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Only {firstAndOnlyDatabase} is available.', { firstAndOnlyDatabase: _vm.firstAndOnlyDatabase }))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Install and activate additional PHP modules to choose other database types.'))),_c('br'),_vm._v(\" \"),_c('a',{attrs:{\"href\":_vm.links.adminSourceInstall,\"target\":\"_blank\",\"rel\":\"noreferrer noopener\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'For more details check out the documentation.'))+\" ↗\\n\\t\\t\\t\\t\\t\")])]):_vm._e(),_vm._v(\" \"),(_vm.config.dbtype === 'sqlite')?_c('NcNoteCard',{attrs:{\"heading\":_vm.t('core', 'Performance warning'),\"data-cy-setup-form-db-note\":\"sqlite\",\"type\":\"warning\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'You chose SQLite as database.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'SQLite should only be used for minimal and development instances. For production we recommend a different database backend.'))),_c('br'),_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'If you use clients for file syncing, the use of SQLite is highly discouraged.'))+\"\\n\\t\\t\\t\\t\")]):_vm._e()],1),_vm._v(\" \"),(_vm.config.dbtype !== 'sqlite')?_c('fieldset',[_c('legend',{staticClass:\"hidden-visually\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.t('core', 'Database connection'))+\"\\n\\t\\t\\t\\t\")]),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database user'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbuser\",\"name\":\"dbuser\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbuser),callback:function ($$v) {_vm.$set(_vm.config, \"dbuser\", $$v)},expression:\"config.dbuser\"}}),_vm._v(\" \"),_c('NcPasswordField',{attrs:{\"label\":_vm.t('core', 'Database password'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbpass\",\"name\":\"dbpass\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbpass),callback:function ($$v) {_vm.$set(_vm.config, \"dbpass\", $$v)},expression:\"config.dbpass\"}}),_vm._v(\" \"),_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database name'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbname\",\"name\":\"dbname\",\"pattern\":\"[0-9a-zA-Z\\\\$_\\\\-]+\",\"spellcheck\":\"false\",\"required\":\"\"},model:{value:(_vm.config.dbname),callback:function ($$v) {_vm.$set(_vm.config, \"dbname\", $$v)},expression:\"config.dbname\"}}),_vm._v(\" \"),(_vm.config.dbtype === 'oci')?_c('NcTextField',{attrs:{\"label\":_vm.t('core', 'Database tablespace'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbtablespace\",\"name\":\"dbtablespace\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbtablespace),callback:function ($$v) {_vm.$set(_vm.config, \"dbtablespace\", $$v)},expression:\"config.dbtablespace\"}}):_vm._e(),_vm._v(\" \"),_c('NcTextField',{attrs:{\"helper-text\":_vm.t('core', 'Please specify the port number along with the host name (e.g., localhost:5432).'),\"label\":_vm.t('core', 'Database host'),\"placeholder\":_vm.t('core', 'localhost'),\"autocapitalize\":\"none\",\"autocomplete\":\"off\",\"data-cy-setup-form-field\":\"dbhost\",\"name\":\"dbhost\",\"spellcheck\":\"false\"},model:{value:(_vm.config.dbhost),callback:function ($$v) {_vm.$set(_vm.config, \"dbhost\", $$v)},expression:\"config.dbhost\"}})],1):_vm._e()])]),_vm._v(\" \"),_c('NcButton',{staticClass:\"setup-form__button\",class:{ 'setup-form__button--loading': _vm.loading },attrs:{\"disabled\":_vm.loading,\"loading\":_vm.loading,\"wide\":true,\"alignment\":\"center-reverse\",\"data-cy-setup-form-submit\":\"\",\"type\":\"submit\",\"variant\":\"primary\"},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [(_vm.loading)?_c('NcLoadingIcon'):_c('IconArrowRight')]},proxy:true}])},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.loading ? _vm.t('core', 'Installing …') : _vm.t('core', 'Install'))+\"\\n\\t\")]),_vm._v(\" \"),_c('NcNoteCard',{attrs:{\"data-cy-setup-form-note\":\"help\",\"type\":\"info\"}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Need help?'))+\"\\n\\t\\t\"),_c('a',{attrs:{\"target\":\"_blank\",\"rel\":\"noreferrer noopener\",\"href\":_vm.links.adminInstall}},[_vm._v(_vm._s(_vm.t('core', 'See the documentation'))+\" ↗\")])])],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=script&lang=ts\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=script&lang=ts\"","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/sass-loader/dist/cjs.js!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./Setup.vue?vue&type=template&id=ae023172\"\nimport script from \"./Setup.vue?vue&type=script&lang=ts\"\nexport * from \"./Setup.vue?vue&type=script&lang=ts\"\nimport style0 from \"./Setup.vue?vue&type=style&index=0&id=ae023172&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport Vue from 'vue';\nimport Setup from './views/Setup.vue';\nconst SetupVue = Vue.extend(Setup);\nnew SetupVue().$mount('#content');\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 820;","__webpack_require__.b = (document && document.baseURI) || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t820: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(95748)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","___CSS_LOADER_EXPORT___","push","module","id","PasswordStrength","checkPasswordEntropy","password","arguments","length","undefined","uniqueCharacters","Set","entropy","parseInt","Math","log2","pow","size","toString","toFixed","VeryWeak","Weak","Moderate","Strong","VeryStrong","ExtremelyStrong","defineComponent","name","components","IconArrowRight","NcButton","NcCheckboxRadioSwitch","NcLoadingIcon","NcNoteCard","NcPasswordField","NcTextField","setup","t","data","config","links","isValidAutoconfig","loading","computed","passwordHelperText","adminpass","passwordHelperType","firstAndOnlyDatabase","dbNames","Object","values","databases","DBTypeGroupDirection","keys","htaccessWarning","message","linkStart","adminInstall","linkEnd","escape","join","DomPurify","sanitize","errors","map","error","heading","hint","beforeMount","loadState","mounted","dbtype","at","hasAutoconfig","form","$refs","querySelectorAll","forEach","input","removeAttribute","checkValidity","setAttribute","methods","onSubmit","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","this","_c","_self","_setupProxy","ref","staticClass","class","attrs","on","_v","_s","_e","htaccessWorking","domProps","_l","index","key","model","value","adminlogin","callback","$$v","$set","expression","directives","rawName","serverRoot","directory","db","adminSourceInstall","dbuser","dbpass","dbname","dbtablespace","dbhost","scopedSlots","_u","fn","proxy","Vue","extend","Setup","$mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/federatedfilesharing-external.js b/dist/federatedfilesharing-external.js index 7c84781e1af..a15a62404f9 100644 --- a/dist/federatedfilesharing-external.js +++ b/dist/federatedfilesharing-external.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,r,t,o={67477:(e,r,t)=>{t.d(r,{A:()=>i});var o=t(71354),a=t.n(o),n=t(76314),s=t.n(n)()(a());s.push([e.id,".remote-share-dialog__password[data-v-1c099237]{margin-block:1em .5em}","",{version:3,sources:["webpack://./apps/federatedfilesharing/src/components/RemoteShareDialog.vue"],names:[],mappings:"AAGC,gDACC,qBAAA",sourcesContent:["\n.remote-share-dialog {\n\n\t&__password {\n\t\tmargin-block: 1em .5em;\n\t}\n}\n"],sourceRoot:""}]);const i=s},98415:(e,r,t)=>{var o=t(65043),a=t(85168),n=t(61338),s=t(81222),i=t(53334),l=t(63814),d=t(85471),c=t(94219),p=t(16044);const u=(0,d.pM)({__name:"RemoteShareDialog",props:{name:null,owner:null,remote:null,passwordRequired:{type:Boolean}},emits:["close"],setup(e,r){let{emit:t}=r;const o=e,a=(0,d.KR)(""),n=(0,d.EW)(()=>[{label:(0,i.t)("federatedfilesharing","Cancel"),callback:()=>t("close",!1)},{label:(0,i.t)("federatedfilesharing","Add remote share"),nativeType:o.passwordRequired?"submit":void 0,type:"primary",callback:()=>t("close",!0,a.value)}]);return{__sfc:!0,props:o,emit:t,password:a,buttons:n,t:i.t,NcDialog:c.A,NcPasswordField:p.A}}});var f=t(85072),m=t.n(f),h=t(97825),w=t.n(h),g=t(77659),b=t.n(g),v=t(55056),y=t.n(v),A=t(10540),O=t.n(A),_=t(41113),C=t.n(_),S=t(67477),k={};k.styleTagTransform=C(),k.setAttributes=y(),k.insert=b().bind(null,"head"),k.domAPI=w(),k.insertStyleElement=O(),m()(S.A,k),S.A&&S.A.locals&&S.A.locals;const P=(0,t(14486).A)(u,function(){var e=this,r=e._self._c,t=e._self._setupProxy;return r(t.NcDialog,{attrs:{buttons:t.buttons,"is-form":e.passwordRequired,name:t.t("federatedfilesharing","Remote share")},on:{submit:function(e){return t.emit("close",!0,t.password)}}},[r("p",[e._v("\n\t\t"+e._s(t.t("federatedfilesharing","Do you want to add the remote share {name} from {owner}@{remote}?",{name:e.name,owner:e.owner,remote:e.remote}))+"\n\t")]),e._v(" "),e.passwordRequired?r(t.NcPasswordField,{staticClass:"remote-share-dialog__password",attrs:{label:t.t("federatedfilesharing","Remote share password"),value:t.password},on:{"update:value":function(e){t.password=e}}}):e._e()],1)},[],!1,null,"1c099237",null).exports,R=(0,t(35947).YK)().setApp("federatedfilesharing").build();function x(){window?.OCP?.Files?.Router?.goToRoute?window.OCP.Files.Router.goToRoute(null,{...window.OCP.Files.Router.params,fileid:void 0},{...window.OCP.Files.Router.query,dir:"/",openfile:void 0}):window.location.reload()}window.OCA.Sharing=window.OCA.Sharing??{},window.OCA.Sharing.showAddExternalDialog=function(e,r,t){const o=e.ownerDisplayName||e.owner;(function(e,r,t){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];const{promise:n,reject:s,resolve:i}=Promise.withResolvers();return(0,a.Ss)(P,{name:e,owner:r,remote:t,passwordRequired:o},(e,r)=>{o&&e?i(r):e?i(void 0):s()}),n})(e.name,o,e.remote.replace(/^https?:\/\//,"").replace(/\/$/,""),r).then(r=>t(!0,{...e,password:r})).catch(()=>t(!1,e))},window.addEventListener("DOMContentLoaded",()=>{!function(){const e=window.OC.Util.History.parseUrlQuery();if(e.remote&&e.token&&e.name){const r=(e,r)=>{!1!==e&&o.Ay.post((0,l.Jv)("apps/federatedfilesharing/askForFederatedShare"),{remote:r.remote,token:r.token,owner:r.owner,ownerDisplayName:r.ownerDisplayName||r.owner,name:r.name,password:r.password||""}).then(e=>{let{data:r}=e;Object.hasOwn(r,"legacyMount")?x():(0,a.cf)(r.message)}).catch(e=>{R.error("Error while processing incoming share",{error:e}),(0,o.F0)(e)&&e.response.data.message?(0,a.Qg)(e.response.data.message):(0,a.Qg)((0,i.t)("federatedfilesharing","Incoming share could not be processed"))})};location.hash="",e.passwordProtected=1===parseInt(e.protected,10),window.OCA.Sharing.showAddExternalDialog(e,e.passwordProtected,r)}}(),!0!==(0,s.C)("federatedfilesharing","notificationsEnabled",!0)&&async function(){const{data:e}=await o.Ay.get((0,l.Jv)("/apps/files_sharing/api/externalShares"));for(let r=0;rx())})}(),(0,n.B1)("notifications:action:executed",e=>{let{action:r,notification:t}=e;"files_sharing"===t.app&&"remote_share"===t.object_type&&"POST"===r.type&&x()})})}},a={};function n(e){var r=a[e];if(void 0!==r)return r.exports;var t=a[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}n.m=o,e=[],n.O=(r,t,o,a)=>{if(!t){var s=1/0;for(c=0;c=a)&&Object.keys(n.O).every(e=>n.O[e](t[l]))?t.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[t,o,a]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>e+"-"+e+".js?v="+{640:"c5cc8d7f0213aa827c54",3564:"29e8338d43e0d4bd3995",5810:"b550a24d46f75f92c2d5",7471:"6423b9b898ffefeb7d1d",7615:"05564da6cf58bf2e44eb"}[e],n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="nextcloud:",n.l=(e,o,a,s)=>{if(r[e])r[e].push(o);else{var i,l;if(void 0!==a)for(var d=document.getElementsByTagName("script"),c=0;c{i.onerror=i.onload=null,clearTimeout(f);var a=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),a&&a.forEach(e=>e(o)),t)return t(o)},f=setTimeout(u.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=u.bind(null,i.onerror),i.onload=u.bind(null,i.onload),l&&document.head.appendChild(i)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),n.j=2299,(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{n.b=document&&document.baseURI||self.location.href;var e={2299:0};n.f.j=(r,t)=>{var o=n.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else{var a=new Promise((t,a)=>o=e[r]=[t,a]);t.push(o[2]=a);var s=n.p+n.u(r),i=new Error;n.l(s,t=>{if(n.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var a=t&&("load"===t.type?"missing":t.type),s=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+a+": "+s+")",i.name="ChunkLoadError",i.type=a,i.request=s,o[1](i)}},"chunk-"+r,r)}},n.O.j=r=>0===e[r];var r=(r,t)=>{var o,a,s=t[0],i=t[1],l=t[2],d=0;if(s.some(r=>0!==e[r])){for(o in i)n.o(i,o)&&(n.m[o]=i[o]);if(l)var c=l(n)}for(r&&r(t);dn(98415));s=n.O(s)})(); -//# sourceMappingURL=federatedfilesharing-external.js.map?v=d8993427c1ae2fa8a378 \ No newline at end of file +(()=>{"use strict";var e,r,t,o={43723:(e,r,t)=>{var o=t(65043),a=t(85168),n=t(61338),s=t(81222),i=t(53334),l=t(63814),d=t(85471),c=t(94219),p=t(16044);const u=(0,d.pM)({__name:"RemoteShareDialog",props:{name:null,owner:null,remote:null,passwordRequired:{type:Boolean}},emits:["close"],setup(e,r){let{emit:t}=r;const o=e,a=(0,d.KR)(""),n=(0,d.EW)(()=>[{label:(0,i.t)("federatedfilesharing","Cancel"),callback:()=>t("close",!1)},{label:(0,i.t)("federatedfilesharing","Add remote share"),type:o.passwordRequired?"submit":void 0,variant:"primary",callback:()=>t("close",!0,a.value)}]);return{__sfc:!0,props:o,emit:t,password:a,buttons:n,t:i.t,NcDialog:c.A,NcPasswordField:p.A}}});var f=t(85072),m=t.n(f),h=t(97825),w=t.n(h),g=t(77659),b=t.n(g),v=t(55056),y=t.n(v),A=t(10540),O=t.n(A),_=t(41113),C=t.n(_),S=t(85994),k={};k.styleTagTransform=C(),k.setAttributes=y(),k.insert=b().bind(null,"head"),k.domAPI=w(),k.insertStyleElement=O(),m()(S.A,k),S.A&&S.A.locals&&S.A.locals;const P=(0,t(14486).A)(u,function(){var e=this,r=e._self._c,t=e._self._setupProxy;return r(t.NcDialog,{attrs:{buttons:t.buttons,"is-form":e.passwordRequired,name:t.t("federatedfilesharing","Remote share")},on:{submit:function(e){return t.emit("close",!0,t.password)}}},[r("p",[e._v("\n\t\t"+e._s(t.t("federatedfilesharing","Do you want to add the remote share {name} from {owner}@{remote}?",{name:e.name,owner:e.owner,remote:e.remote}))+"\n\t")]),e._v(" "),e.passwordRequired?r(t.NcPasswordField,{staticClass:"remote-share-dialog__password",attrs:{label:t.t("federatedfilesharing","Remote share password"),value:t.password},on:{"update:value":function(e){t.password=e}}}):e._e()],1)},[],!1,null,"014832cd",null).exports,R=(0,t(35947).YK)().setApp("federatedfilesharing").build();function x(){window?.OCP?.Files?.Router?.goToRoute?window.OCP.Files.Router.goToRoute(null,{...window.OCP.Files.Router.params,fileid:void 0},{...window.OCP.Files.Router.query,dir:"/",openfile:void 0}):window.location.reload()}window.OCA.Sharing=window.OCA.Sharing??{},window.OCA.Sharing.showAddExternalDialog=function(e,r,t){const o=e.ownerDisplayName||e.owner;(function(e,r,t){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];const{promise:n,reject:s,resolve:i}=Promise.withResolvers();return(0,a.Ss)(P,{name:e,owner:r,remote:t,passwordRequired:o},(e,r)=>{o&&e?i(r):e?i(void 0):s()}),n})(e.name,o,e.remote.replace(/^https?:\/\//,"").replace(/\/$/,""),r).then(r=>t(!0,{...e,password:r})).catch(()=>t(!1,e))},window.addEventListener("DOMContentLoaded",()=>{!function(){const e=window.OC.Util.History.parseUrlQuery();if(e.remote&&e.token&&e.name){const r=(e,r)=>{!1!==e&&o.Ay.post((0,l.Jv)("apps/federatedfilesharing/askForFederatedShare"),{remote:r.remote,token:r.token,owner:r.owner,ownerDisplayName:r.ownerDisplayName||r.owner,name:r.name,password:r.password||""}).then(e=>{let{data:r}=e;Object.hasOwn(r,"legacyMount")?x():(0,a.cf)(r.message)}).catch(e=>{R.error("Error while processing incoming share",{error:e}),(0,o.F0)(e)&&e.response.data.message?(0,a.Qg)(e.response.data.message):(0,a.Qg)((0,i.t)("federatedfilesharing","Incoming share could not be processed"))})};location.hash="",e.passwordProtected=1===parseInt(e.protected,10),window.OCA.Sharing.showAddExternalDialog(e,e.passwordProtected,r)}}(),!0!==(0,s.C)("federatedfilesharing","notificationsEnabled",!0)&&async function(){const{data:e}=await o.Ay.get((0,l.Jv)("/apps/files_sharing/api/externalShares"));for(let r=0;rx())})}(),(0,n.B1)("notifications:action:executed",e=>{let{action:r,notification:t}=e;"files_sharing"===t.app&&"remote_share"===t.object_type&&"POST"===r.type&&x()})})},85994:(e,r,t)=>{t.d(r,{A:()=>i});var o=t(71354),a=t.n(o),n=t(76314),s=t.n(n)()(a());s.push([e.id,".remote-share-dialog__password[data-v-014832cd]{margin-block:1em .5em}","",{version:3,sources:["webpack://./apps/federatedfilesharing/src/components/RemoteShareDialog.vue"],names:[],mappings:"AAGC,gDACC,qBAAA",sourcesContent:["\n.remote-share-dialog {\n\n\t&__password {\n\t\tmargin-block: 1em .5em;\n\t}\n}\n"],sourceRoot:""}]);const i=s}},a={};function n(e){var r=a[e];if(void 0!==r)return r.exports;var t=a[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,n),t.loaded=!0,t.exports}n.m=o,e=[],n.O=(r,t,o,a)=>{if(!t){var s=1/0;for(c=0;c=a)&&Object.keys(n.O).every(e=>n.O[e](t[l]))?t.splice(l--,1):(i=!1,a0&&e[c-1][2]>a;c--)e[c]=e[c-1];e[c]=[t,o,a]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>e+"-"+e+".js?v="+{640:"c5cc8d7f0213aa827c54",3564:"29e8338d43e0d4bd3995",5810:"b550a24d46f75f92c2d5",7471:"6423b9b898ffefeb7d1d",7615:"05564da6cf58bf2e44eb"}[e],n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="nextcloud:",n.l=(e,o,a,s)=>{if(r[e])r[e].push(o);else{var i,l;if(void 0!==a)for(var d=document.getElementsByTagName("script"),c=0;c{i.onerror=i.onload=null,clearTimeout(f);var a=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),a&&a.forEach(e=>e(o)),t)return t(o)},f=setTimeout(u.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=u.bind(null,i.onerror),i.onload=u.bind(null,i.onload),l&&document.head.appendChild(i)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),n.j=2299,(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&(!e||!/^http(s?):/.test(e));)e=t[o--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{n.b=document&&document.baseURI||self.location.href;var e={2299:0};n.f.j=(r,t)=>{var o=n.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else{var a=new Promise((t,a)=>o=e[r]=[t,a]);t.push(o[2]=a);var s=n.p+n.u(r),i=new Error;n.l(s,t=>{if(n.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var a=t&&("load"===t.type?"missing":t.type),s=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+a+": "+s+")",i.name="ChunkLoadError",i.type=a,i.request=s,o[1](i)}},"chunk-"+r,r)}},n.O.j=r=>0===e[r];var r=(r,t)=>{var o,a,s=t[0],i=t[1],l=t[2],d=0;if(s.some(r=>0!==e[r])){for(o in i)n.o(i,o)&&(n.m[o]=i[o]);if(l)var c=l(n)}for(r&&r(t);dn(43723));s=n.O(s)})(); +//# sourceMappingURL=federatedfilesharing-external.js.map?v=04138584cf3093e0199f \ No newline at end of file diff --git a/dist/federatedfilesharing-external.js.map b/dist/federatedfilesharing-external.js.map index 0b536f3a9b9..c2a5540d20b 100644 --- a/dist/federatedfilesharing-external.js.map +++ b/dist/federatedfilesharing-external.js.map @@ -1 +1 @@ -{"version":3,"file":"federatedfilesharing-external.js?v=d8993427c1ae2fa8a378","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/federatedfilesharing/src/components/RemoteShareDialog.vue?vue&type=style&index=0&id=1c099237&prod&scoped=true&lang=scss","webpack:///nextcloud/apps/federatedfilesharing/src/components/RemoteShareDialog.vue","webpack:///nextcloud/apps/federatedfilesharing/src/components/RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/federatedfilesharing/src/components/RemoteShareDialog.vue?1870","webpack://nextcloud/./apps/federatedfilesharing/src/components/RemoteShareDialog.vue?3e58","webpack:///nextcloud/apps/federatedfilesharing/src/services/logger.ts","webpack:///nextcloud/apps/federatedfilesharing/src/external.js","webpack:///nextcloud/apps/federatedfilesharing/src/services/dialogService.ts","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.remote-share-dialog__password[data-v-1c099237]{margin-block:1em .5em}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/federatedfilesharing/src/components/RemoteShareDialog.vue\"],\"names\":[],\"mappings\":\"AAGC,gDACC,qBAAA\",\"sourcesContent\":[\"\\n.remote-share-dialog {\\n\\n\\t&__password {\\n\\t\\tmargin-block: 1em .5em;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcDialog,{attrs:{\"buttons\":_setup.buttons,\"is-form\":_vm.passwordRequired,\"name\":_setup.t('federatedfilesharing', 'Remote share')},on:{\"submit\":function($event){return _setup.emit('close', true, _setup.password)}}},[_c('p',[_vm._v(\"\\n\\t\\t\"+_vm._s(_setup.t('federatedfilesharing', 'Do you want to add the remote share {name} from {owner}@{remote}?', { name: _vm.name, owner: _vm.owner, remote: _vm.remote }))+\"\\n\\t\")]),_vm._v(\" \"),(_vm.passwordRequired)?_c(_setup.NcPasswordField,{staticClass:\"remote-share-dialog__password\",attrs:{\"label\":_setup.t('federatedfilesharing', 'Remote share password'),\"value\":_setup.password},on:{\"update:value\":function($event){_setup.password=$event}}}):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=style&index=0&id=1c099237&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=style&index=0&id=1c099237&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./RemoteShareDialog.vue?vue&type=template&id=1c099237&scoped=true\"\nimport script from \"./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./RemoteShareDialog.vue?vue&type=style&index=0&id=1c099237&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1c099237\",\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getLoggerBuilder } from '@nextcloud/logger';\nconst logger = getLoggerBuilder()\n .setApp('federatedfilesharing')\n .build();\nexport default logger;\n","/**\n * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport { subscribe } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { showRemoteShareDialog } from './services/dialogService.ts'\nimport logger from './services/logger.ts'\n\nwindow.OCA.Sharing = window.OCA.Sharing ?? {}\n\n/**\n * Shows \"add external share\" dialog.\n *\n * @param {object} share the share\n * @param {string} share.remote remote server URL\n * @param {string} share.owner owner name\n * @param {string} share.name name of the shared folder\n * @param {string} share.token authentication token\n * @param {boolean} passwordProtected true if the share is password protected\n * @param {Function} callback the callback\n */\nwindow.OCA.Sharing.showAddExternalDialog = function(share, passwordProtected, callback) {\n\tconst owner = share.ownerDisplayName || share.owner\n\tconst name = share.name\n\n\t// Clean up the remote URL for display\n\tconst remote = share.remote\n\t\t.replace(/^https?:\\/\\//, '') // remove http:// or https://\n\t\t.replace(/\\/$/, '') // remove trailing slash\n\n\tshowRemoteShareDialog(name, owner, remote, passwordProtected)\n\t\t.then((password) => callback(true, { ...share, password }))\n\t\t.catch(() => callback(false, share))\n}\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\tprocessIncomingShareFromUrl()\n\n\tif (loadState('federatedfilesharing', 'notificationsEnabled', true) !== true) {\n\t\t// No notification app, display the modal\n\t\tprocessSharesToConfirm()\n\t}\n\n\tsubscribe('notifications:action:executed', ({ action, notification }) => {\n\t\tif (notification.app === 'files_sharing' && notification.object_type === 'remote_share' && action.type === 'POST') {\n\t\t\t// User accepted a remote share reload\n\t\t\treloadFilesList()\n\t\t}\n\t})\n})\n\n/**\n * Reload the files list to show accepted shares\n */\nfunction reloadFilesList() {\n\tif (!window?.OCP?.Files?.Router?.goToRoute) {\n\t\t// No router, just reload the page\n\t\twindow.location.reload()\n\t\treturn\n\t}\n\n\t// Let's redirect to the root as any accepted share would be there\n\twindow.OCP.Files.Router.goToRoute(\n\t\tnull,\n\t\t{ ...window.OCP.Files.Router.params, fileid: undefined },\n\t\t{ ...window.OCP.Files.Router.query, dir: '/', openfile: undefined },\n\t)\n}\n\n/**\n * Process incoming remote share that might have been passed\n * through the URL\n */\nfunction processIncomingShareFromUrl() {\n\tconst params = window.OC.Util.History.parseUrlQuery()\n\n\t// manually add server-to-server share\n\tif (params.remote && params.token && params.name) {\n\t\tconst callbackAddShare = (result, share) => {\n\t\t\tif (result === false) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\taxios.post(\n\t\t\t\tgenerateUrl('apps/federatedfilesharing/askForFederatedShare'),\n\t\t\t\t{\n\t\t\t\t\tremote: share.remote,\n\t\t\t\t\ttoken: share.token,\n\t\t\t\t\towner: share.owner,\n\t\t\t\t\townerDisplayName: share.ownerDisplayName || share.owner,\n\t\t\t\t\tname: share.name,\n\t\t\t\t\tpassword: share.password || '',\n\t\t\t\t},\n\t\t\t).then(({ data }) => {\n\t\t\t\tif (Object.hasOwn(data, 'legacyMount')) {\n\t\t\t\t\treloadFilesList()\n\t\t\t\t} else {\n\t\t\t\t\tshowInfo(data.message)\n\t\t\t\t}\n\t\t\t}).catch((error) => {\n\t\t\t\tlogger.error('Error while processing incoming share', { error })\n\n\t\t\t\tif (isAxiosError(error) && error.response.data.message) {\n\t\t\t\t\tshowError(error.response.data.message)\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('federatedfilesharing', 'Incoming share could not be processed'))\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\t// clear hash, it is unlikely that it contain any extra parameters\n\t\tlocation.hash = ''\n\t\tparams.passwordProtected = parseInt(params.protected, 10) === 1\n\t\twindow.OCA.Sharing.showAddExternalDialog(\n\t\t\tparams,\n\t\t\tparams.passwordProtected,\n\t\t\tcallbackAddShare,\n\t\t)\n\t}\n}\n\n/**\n * Retrieve a list of remote shares that need to be approved\n */\nasync function processSharesToConfirm() {\n\t// check for new server-to-server shares which need to be approved\n\tconst { data: shares } = await axios.get(generateUrl('/apps/files_sharing/api/externalShares'))\n\tfor (let index = 0; index < shares.length; ++index) {\n\t\twindow.OCA.Sharing.showAddExternalDialog(\n\t\t\tshares[index],\n\t\t\tfalse,\n\t\t\tfunction(result, share) {\n\t\t\t\tif (result === false) {\n\t\t\t\t\t// Delete\n\t\t\t\t\taxios.delete(generateUrl('/apps/files_sharing/api/externalShares/' + share.id))\n\t\t\t\t} else {\n\t\t\t\t\t// Accept\n\t\t\t\t\taxios.post(generateUrl('/apps/files_sharing/api/externalShares'), { id: share.id })\n\t\t\t\t\t\t.then(() => reloadFilesList())\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { spawnDialog } from '@nextcloud/dialogs';\nimport RemoteShareDialog from '../components/RemoteShareDialog.vue';\n/**\n * Open a dialog to ask the user whether to add a remote share.\n *\n * @param name The name of the share\n * @param owner The owner of the share\n * @param remote The remote address\n * @param passwordRequired True if the share is password protected\n */\nexport function showRemoteShareDialog(name, owner, remote, passwordRequired = false) {\n const { promise, reject, resolve } = Promise.withResolvers();\n spawnDialog(RemoteShareDialog, { name, owner, remote, passwordRequired }, (status, password) => {\n if (passwordRequired && status) {\n resolve(password);\n }\n else if (status) {\n resolve(undefined);\n }\n else {\n reject();\n }\n });\n return promise;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \"-\" + chunkId + \".js?v=\" + {\"640\":\"c5cc8d7f0213aa827c54\",\"3564\":\"29e8338d43e0d4bd3995\",\"5810\":\"b550a24d46f75f92c2d5\",\"7471\":\"6423b9b898ffefeb7d1d\",\"7615\":\"05564da6cf58bf2e44eb\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2299;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = (document && document.baseURI) || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2299: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(98415)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","___CSS_LOADER_EXPORT___","push","module","id","_defineComponent","__name","props","name","owner","remote","passwordRequired","type","Boolean","emits","setup","__props","_ref","emit","password","ref","buttons","computed","label","t","callback","nativeType","undefined","value","__sfc","NcDialog","NcPasswordField","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","this","_c","_self","_setup","_setupProxy","attrs","on","$event","_v","_s","staticClass","_e","getLoggerBuilder","setApp","build","reloadFilesList","window","OCP","Files","Router","goToRoute","params","fileid","query","dir","openfile","location","reload","OCA","Sharing","showAddExternalDialog","share","passwordProtected","ownerDisplayName","arguments","length","promise","reject","resolve","Promise","withResolvers","spawnDialog","RemoteShareDialog","status","showRemoteShareDialog","replace","then","catch","addEventListener","OC","Util","History","parseUrlQuery","token","callbackAddShare","result","axios","post","generateUrl","_ref2","data","Object","hasOwn","showInfo","message","error","logger","isAxiosError","response","showError","hash","parseInt","protected","processIncomingShareFromUrl","loadState","async","shares","get","index","delete","processSharesToConfirm","subscribe","action","notification","app","object_type","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","url","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","timeout","doneFns","parentNode","removeChild","forEach","setTimeout","bind","target","head","appendChild","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","tagName","toUpperCase","test","Error","p","b","baseURI","self","href","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"federatedfilesharing-external.js?v=04138584cf3093e0199f","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/webpack/runtime/load script","webpack:///nextcloud/apps/federatedfilesharing/src/components/RemoteShareDialog.vue","webpack:///nextcloud/apps/federatedfilesharing/src/components/RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts","webpack://nextcloud/./apps/federatedfilesharing/src/components/RemoteShareDialog.vue?6f5f","webpack://nextcloud/./apps/federatedfilesharing/src/components/RemoteShareDialog.vue?3e58","webpack:///nextcloud/apps/federatedfilesharing/src/services/logger.ts","webpack:///nextcloud/apps/federatedfilesharing/src/external.js","webpack:///nextcloud/apps/federatedfilesharing/src/services/dialogService.ts","webpack:///nextcloud/apps/federatedfilesharing/src/components/RemoteShareDialog.vue?vue&type=style&index=0&id=014832cd&prod&scoped=true&lang=scss","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/get javascript chunk filename","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/publicPath","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"nextcloud:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var render = function render(){var _vm=this,_c=_vm._self._c,_setup=_vm._self._setupProxy;return _c(_setup.NcDialog,{attrs:{\"buttons\":_setup.buttons,\"is-form\":_vm.passwordRequired,\"name\":_setup.t('federatedfilesharing', 'Remote share')},on:{\"submit\":function($event){return _setup.emit('close', true, _setup.password)}}},[_c('p',[_vm._v(\"\\n\\t\\t\"+_vm._s(_setup.t('federatedfilesharing', 'Do you want to add the remote share {name} from {owner}@{remote}?', { name: _vm.name, owner: _vm.owner, remote: _vm.remote }))+\"\\n\\t\")]),_vm._v(\" \"),(_vm.passwordRequired)?_c(_setup.NcPasswordField,{staticClass:\"remote-share-dialog__password\",attrs:{\"label\":_setup.t('federatedfilesharing', 'Remote share password'),\"value\":_setup.password},on:{\"update:value\":function($event){_setup.password=$event}}}):_vm._e()],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??clonedRuleSet-4.use[1]!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=style&index=0&id=014832cd&prod&scoped=true&lang=scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteShareDialog.vue?vue&type=style&index=0&id=014832cd&prod&scoped=true&lang=scss\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./RemoteShareDialog.vue?vue&type=template&id=014832cd&scoped=true\"\nimport script from \"./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RemoteShareDialog.vue?vue&type=script&setup=true&lang=ts\"\nimport style0 from \"./RemoteShareDialog.vue?vue&type=style&index=0&id=014832cd&prod&scoped=true&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"014832cd\",\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { getLoggerBuilder } from '@nextcloud/logger';\nconst logger = getLoggerBuilder()\n .setApp('federatedfilesharing')\n .build();\nexport default logger;\n","/**\n * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError, showInfo } from '@nextcloud/dialogs'\nimport { subscribe } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { showRemoteShareDialog } from './services/dialogService.ts'\nimport logger from './services/logger.ts'\n\nwindow.OCA.Sharing = window.OCA.Sharing ?? {}\n\n/**\n * Shows \"add external share\" dialog.\n *\n * @param {object} share the share\n * @param {string} share.remote remote server URL\n * @param {string} share.owner owner name\n * @param {string} share.name name of the shared folder\n * @param {string} share.token authentication token\n * @param {boolean} passwordProtected true if the share is password protected\n * @param {Function} callback the callback\n */\nwindow.OCA.Sharing.showAddExternalDialog = function(share, passwordProtected, callback) {\n\tconst owner = share.ownerDisplayName || share.owner\n\tconst name = share.name\n\n\t// Clean up the remote URL for display\n\tconst remote = share.remote\n\t\t.replace(/^https?:\\/\\//, '') // remove http:// or https://\n\t\t.replace(/\\/$/, '') // remove trailing slash\n\n\tshowRemoteShareDialog(name, owner, remote, passwordProtected)\n\t\t.then((password) => callback(true, { ...share, password }))\n\t\t.catch(() => callback(false, share))\n}\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\tprocessIncomingShareFromUrl()\n\n\tif (loadState('federatedfilesharing', 'notificationsEnabled', true) !== true) {\n\t\t// No notification app, display the modal\n\t\tprocessSharesToConfirm()\n\t}\n\n\tsubscribe('notifications:action:executed', ({ action, notification }) => {\n\t\tif (notification.app === 'files_sharing' && notification.object_type === 'remote_share' && action.type === 'POST') {\n\t\t\t// User accepted a remote share reload\n\t\t\treloadFilesList()\n\t\t}\n\t})\n})\n\n/**\n * Reload the files list to show accepted shares\n */\nfunction reloadFilesList() {\n\tif (!window?.OCP?.Files?.Router?.goToRoute) {\n\t\t// No router, just reload the page\n\t\twindow.location.reload()\n\t\treturn\n\t}\n\n\t// Let's redirect to the root as any accepted share would be there\n\twindow.OCP.Files.Router.goToRoute(\n\t\tnull,\n\t\t{ ...window.OCP.Files.Router.params, fileid: undefined },\n\t\t{ ...window.OCP.Files.Router.query, dir: '/', openfile: undefined },\n\t)\n}\n\n/**\n * Process incoming remote share that might have been passed\n * through the URL\n */\nfunction processIncomingShareFromUrl() {\n\tconst params = window.OC.Util.History.parseUrlQuery()\n\n\t// manually add server-to-server share\n\tif (params.remote && params.token && params.name) {\n\t\tconst callbackAddShare = (result, share) => {\n\t\t\tif (result === false) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\taxios.post(\n\t\t\t\tgenerateUrl('apps/federatedfilesharing/askForFederatedShare'),\n\t\t\t\t{\n\t\t\t\t\tremote: share.remote,\n\t\t\t\t\ttoken: share.token,\n\t\t\t\t\towner: share.owner,\n\t\t\t\t\townerDisplayName: share.ownerDisplayName || share.owner,\n\t\t\t\t\tname: share.name,\n\t\t\t\t\tpassword: share.password || '',\n\t\t\t\t},\n\t\t\t).then(({ data }) => {\n\t\t\t\tif (Object.hasOwn(data, 'legacyMount')) {\n\t\t\t\t\treloadFilesList()\n\t\t\t\t} else {\n\t\t\t\t\tshowInfo(data.message)\n\t\t\t\t}\n\t\t\t}).catch((error) => {\n\t\t\t\tlogger.error('Error while processing incoming share', { error })\n\n\t\t\t\tif (isAxiosError(error) && error.response.data.message) {\n\t\t\t\t\tshowError(error.response.data.message)\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('federatedfilesharing', 'Incoming share could not be processed'))\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\t// clear hash, it is unlikely that it contain any extra parameters\n\t\tlocation.hash = ''\n\t\tparams.passwordProtected = parseInt(params.protected, 10) === 1\n\t\twindow.OCA.Sharing.showAddExternalDialog(\n\t\t\tparams,\n\t\t\tparams.passwordProtected,\n\t\t\tcallbackAddShare,\n\t\t)\n\t}\n}\n\n/**\n * Retrieve a list of remote shares that need to be approved\n */\nasync function processSharesToConfirm() {\n\t// check for new server-to-server shares which need to be approved\n\tconst { data: shares } = await axios.get(generateUrl('/apps/files_sharing/api/externalShares'))\n\tfor (let index = 0; index < shares.length; ++index) {\n\t\twindow.OCA.Sharing.showAddExternalDialog(\n\t\t\tshares[index],\n\t\t\tfalse,\n\t\t\tfunction(result, share) {\n\t\t\t\tif (result === false) {\n\t\t\t\t\t// Delete\n\t\t\t\t\taxios.delete(generateUrl('/apps/files_sharing/api/externalShares/' + share.id))\n\t\t\t\t} else {\n\t\t\t\t\t// Accept\n\t\t\t\t\taxios.post(generateUrl('/apps/files_sharing/api/externalShares'), { id: share.id })\n\t\t\t\t\t\t.then(() => reloadFilesList())\n\t\t\t\t}\n\t\t\t},\n\t\t)\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport { spawnDialog } from '@nextcloud/dialogs';\nimport RemoteShareDialog from '../components/RemoteShareDialog.vue';\n/**\n * Open a dialog to ask the user whether to add a remote share.\n *\n * @param name The name of the share\n * @param owner The owner of the share\n * @param remote The remote address\n * @param passwordRequired True if the share is password protected\n */\nexport function showRemoteShareDialog(name, owner, remote, passwordRequired = false) {\n const { promise, reject, resolve } = Promise.withResolvers();\n spawnDialog(RemoteShareDialog, { name, owner, remote, passwordRequired }, (status, password) => {\n if (passwordRequired && status) {\n resolve(password);\n }\n else if (status) {\n resolve(undefined);\n }\n else {\n reject();\n }\n });\n return promise;\n}\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.remote-share-dialog__password[data-v-014832cd]{margin-block:1em .5em}`, \"\",{\"version\":3,\"sources\":[\"webpack://./apps/federatedfilesharing/src/components/RemoteShareDialog.vue\"],\"names\":[],\"mappings\":\"AAGC,gDACC,qBAAA\",\"sourcesContent\":[\"\\n.remote-share-dialog {\\n\\n\\t&__password {\\n\\t\\tmargin-block: 1em .5em;\\n\\t}\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \"-\" + chunkId + \".js?v=\" + {\"640\":\"c5cc8d7f0213aa827c54\",\"3564\":\"29e8338d43e0d4bd3995\",\"5810\":\"b550a24d46f75f92c2d5\",\"7471\":\"6423b9b898ffefeb7d1d\",\"7615\":\"05564da6cf58bf2e44eb\"}[chunkId] + \"\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 2299;","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = (document && document.baseURI) || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t2299: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [4208], () => (__webpack_require__(43723)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","_defineComponent","__name","props","name","owner","remote","passwordRequired","type","Boolean","emits","setup","__props","_ref","emit","password","ref","buttons","computed","label","t","callback","undefined","variant","value","__sfc","NcDialog","NcPasswordField","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","this","_c","_self","_setup","_setupProxy","attrs","on","$event","_v","_s","staticClass","_e","getLoggerBuilder","setApp","build","reloadFilesList","window","OCP","Files","Router","goToRoute","params","fileid","query","dir","openfile","location","reload","OCA","Sharing","showAddExternalDialog","share","passwordProtected","ownerDisplayName","arguments","length","promise","reject","resolve","Promise","withResolvers","spawnDialog","RemoteShareDialog","status","showRemoteShareDialog","replace","then","catch","addEventListener","OC","Util","History","parseUrlQuery","token","callbackAddShare","result","axios","post","generateUrl","_ref2","data","Object","hasOwn","showInfo","message","error","logger","isAxiosError","response","showError","hash","parseInt","protected","processIncomingShareFromUrl","loadState","async","shares","get","index","delete","id","processSharesToConfirm","subscribe","action","notification","app","object_type","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","keys","every","key","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","all","reduce","promises","u","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","l","url","done","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","timeout","doneFns","parentNode","removeChild","forEach","setTimeout","bind","target","head","appendChild","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","tagName","toUpperCase","test","Error","p","b","baseURI","self","href","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file