diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml deleted file mode 100644 index 1a4b752f..00000000 --- a/.github/workflows/cypress.yml +++ /dev/null @@ -1,158 +0,0 @@ -# This workflow is provided via the organization template repository -# -# https://github.com/nextcloud/.github -# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization -# -# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors -# SPDX-License-Identifier: MIT - -name: Cypress - -on: pull_request - -concurrency: - group: cypress-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - # Adjust APP_NAME if your repository name is different - APP_NAME: ${{ github.event.repository.name }} - - # This represents the server branch to checkout. - # Usually it's the base branch of the PR, but for pushes it's the branch itself. - # e.g. 'main', 'stable27' or 'feature/my-feature' - # n.b. server will use head_ref, as we want to test the PR branch. - BRANCH: ${{ github.base_ref || github.ref_name }} - - -permissions: - contents: read - -jobs: - init: - runs-on: ubuntu-latest - outputs: - nodeVersion: ${{ steps.versions.outputs.nodeVersion }} - npmVersion: ${{ steps.versions.outputs.npmVersion }} - - env: - PUPPETEER_SKIP_DOWNLOAD: true - - steps: - - name: Disabled on forks - if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} - run: | - echo 'Can not run cypress on forks' - exit 1 - - - name: Checkout app - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - persist-credentials: false - - - name: Check composer.json - id: check_composer - uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0 - with: - files: "composer.json" - - - name: Install composer dependencies - if: steps.check_composer.outputs.files_exists == 'true' - run: composer install --no-dev - - - name: Read package.json node and npm engines version - uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3 - id: versions - with: - fallbackNode: "^20" - fallbackNpm: "^10" - - - name: Set up node ${{ steps.versions.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ steps.versions.outputs.nodeVersion }} - - - name: Set up npm ${{ steps.versions.outputs.npmVersion }} - run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}' - - - name: Install node dependencies & build app - run: | - npm ci - TESTING=true npm run build --if-present - - - name: Save context - uses: buildjet/cache/save@v4 - with: - key: cypress-context-${{ github.run_id }} - path: ./ - - cypress: - runs-on: ubuntu-latest - needs: init - - strategy: - fail-fast: false - matrix: - # Run multiple copies of the current job in parallel - # Please increase the number or runners as your tests suite grows - containers: ['component'] - - name: runner ${{ matrix.containers }} - - steps: - - name: Restore context - uses: buildjet/cache/restore@v4 - with: - fail-on-cache-miss: true - key: cypress-context-${{ github.run_id }} - path: ./ - - - name: Set up node ${{ needs.init.outputs.nodeVersion }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - with: - node-version: ${{ needs.init.outputs.nodeVersion }} - - - name: Set up npm ${{ needs.init.outputs.npmVersion }} - run: npm i -g 'npm@${{ needs.init.outputs.npmVersion }}' - - - name: Run ${{ startsWith(matrix.containers, 'component') && 'component' || 'E2E' }} cypress tests - uses: cypress-io/github-action@6c143abc292aa835d827652c2ea025d098311070 # v6.10.1 - with: - record: ${{ secrets.CYPRESS_RECORD_KEY && true }} - parallel: ${{ secrets.CYPRESS_RECORD_KEY && true }} - # cypress run type - component: ${{ startsWith(matrix.containers, 'component') }} - group: ${{ secrets.CYPRESS_RECORD_KEY && env.CYPRESS_GROUP }} - # cypress env - ci-build-id: ${{ secrets.CYPRESS_RECORD_KEY && env.CYPRESS_BUILD_ID }} - tag: ${{ secrets.CYPRESS_RECORD_KEY && github.event_name }} - env: - # Needs to be prefixed with CYPRESS_ - CYPRESS_BRANCH: ${{ env.BRANCH }} - # https://github.com/cypress-io/github-action/issues/124 - COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }} - # Needed for some specific code workarounds - TESTING: true - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} - CYPRESS_BUILD_ID: ${{ github.sha }}-${{ github.run_number }} - CYPRESS_GROUP: Run ${{ startsWith(matrix.containers, 'component') && 'component' || 'E2E' }} - - - name: Upload snapshots - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 - if: always() - with: - name: snapshots_${{ matrix.containers }} - path: cypress/snapshots - - summary: - runs-on: ubuntu-latest - needs: [init, cypress] - - if: always() - - name: cypress-summary - - steps: - - name: Summary status - run: if ${{ needs.init.result != 'success' || ( needs.cypress.result != 'success' && needs.cypress.result != 'skipped' ) }}; then exit 1; fi diff --git a/.gitignore b/.gitignore index 833cc867..d513c7e7 100644 --- a/.gitignore +++ b/.gitignore @@ -226,6 +226,3 @@ tmp/ temp/ # End of https://www.gitignore.io/api/node,macos,intellij+all - -cypress/videos -cypress/screenshots diff --git a/CHANGELOG.md b/CHANGELOG.md index fec0287f..bd1f0aba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ --> # Changelog +## [v2.0.0-rc.0](https://github.com/nextcloud-libraries/nextcloud-upload/tree/next) \(UNRELEASED\) + +### 💥 BREAKING CHANGES + +This library is now a pure uploading API library and no longer contains Vue-related functions and components. +- `UploadPicker` Vue component will be available in `@nextcloud/vue` +- `openConflictPicker` and `uploadConflictHandler` will be available in `@nextcloud/dialogs` + ## [v1.10.0](https://github.com/nextcloud-libraries/nextcloud-upload/tree/v1.10.0) \(2025-05-05\) ### Added diff --git a/REUSE.toml b/REUSE.toml index a3a43142..c6609501 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -18,17 +18,11 @@ SPDX-FileCopyrightText = "2022 Nextcloud GmbH and Nextcloud contributors" SPDX-License-Identifier = "AGPL-3.0-or-later" [[annotations]] -path = [".eslintrc.json", "typedoc.json", "tsconfig.json", "cypress/tsconfig.json"] +path = [".eslintrc.json", "typedoc.json", "tsconfig.json"] precedence = "aggregate" SPDX-FileCopyrightText = "2023 Nextcloud GmbH and Nextcloud contributors" SPDX-License-Identifier = "AGPL-3.0-or-later" -[[annotations]] -path = ["cypress/fixtures/image.jpg"] -precedence = "aggregate" -SPDX-FileCopyrightText = "2016 pixabay " -SPDX-License-Identifier = "CC0-1.0" - [[annotations]] path = [".env.development"] precedence = "aggregate" diff --git a/__tests__/utils/conflicts-handler.spec.ts b/__tests__/utils/conflicts-handler.spec.ts deleted file mode 100644 index 96eef0be..00000000 --- a/__tests__/utils/conflicts-handler.spec.ts +++ /dev/null @@ -1,143 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { describe, expect, it, vi, beforeEach } from 'vitest' -import { uploadConflictHandler } from '../../lib/dialogs/utils/uploadConflictHandler.ts' -import { InvalidFilenameError, InvalidFilenameErrorReason, File as NcFile } from '@nextcloud/files' - -const validateFilename = vi.hoisted(() => vi.fn(() => true)) -const openConflictPicker = vi.hoisted(() => vi.fn()) -const showInvalidFilenameDialog = vi.hoisted(() => vi.fn()) - -vi.mock('../../lib/dialogs/openConflictPicker.ts', () => ({ openConflictPicker })) -vi.mock('../../lib/dialogs/utils/dialog.ts', () => ({ showInvalidFilenameDialog })) -vi.mock('@nextcloud/files', async (getModule) => { - const original = await getModule() - return { - ...original as any, - validateFilename, - } -}) - -describe('uploadConflictHandler', () => { - const callback = vi.fn() - const handler = uploadConflictHandler(callback) - - const file1 = new File([], 'image.jpg') - const ncFile1 = new NcFile({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/image.jpg', mime: 'image/jpeg' }) - const file2 = new File([], 'document.md') - const ncFile2 = new NcFile({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/document.md', mime: 'text/plain' }) - - beforeEach(() => { - vi.resetAllMocks() - callback.mockRestore() - }) - - it('no conflicts on single file', async () => { - callback.mockImplementationOnce(async () => []) - const result = await handler([file1], '/') - - expect(callback).toBeCalledTimes(1) - expect(callback).toBeCalledWith('/') - - expect(validateFilename).toBeCalledWith('image.jpg') - expect(result).toEqual([file1]) - }) - - it('conflicts on files - select new', async () => { - callback.mockImplementationOnce(async () => [ - ncFile1, - ncFile2 - ]) - openConflictPicker.mockImplementationOnce(() => ({ - selected: [file1, file2], - renamed: [], - })) - const result = await handler([file1, file2], '/') - - expect(callback).toBeCalledTimes(1) - expect(callback).toBeCalledWith('/') - - expect(result).toEqual([file1, file2]) - }) - - it('conflicts on files - select one new', async () => { - callback.mockImplementationOnce(async () => [ - ncFile1, - ncFile2 - ]) - openConflictPicker.mockImplementationOnce(() => ({ - selected: [file1], - renamed: [], - })) - const result = await handler([file1, file2], '/') - - expect(callback).toBeCalledTimes(1) - expect(callback).toBeCalledWith('/') - - expect(result).toEqual([file1]) - }) - - it('conflicts on files - rename', async () => { - const renamedFile = new File([], 'image new name.jpg') - - callback.mockImplementationOnce(async () => [ - new NcFile({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/image.jpg', mime: 'image/jpeg' }), - ]) - openConflictPicker.mockImplementationOnce(() => ({ - selected: [], - renamed: [renamedFile], - })) - - const result = await handler([file1, file2], '/') - - expect(callback).toBeCalledTimes(1) - expect(callback).toBeCalledWith('/') - - expect(result).toEqual([renamedFile, file2]) - }) - - it('invalid filename - skip', async () => { - const invalidFilename = new File([], '#some file.jpg') - const exception = new InvalidFilenameError({ filename: invalidFilename.name, reason: InvalidFilenameErrorReason.Character, segment: '#' }) - - callback.mockImplementationOnce(async () => []) - validateFilename.mockImplementationOnce(() => { - throw exception - }) - showInvalidFilenameDialog.mockImplementationOnce(() => false) - const result = await handler([invalidFilename], '/') - - expect(callback).toBeCalledTimes(1) - expect(callback).toBeCalledWith('/') - expect(validateFilename).toBeCalledTimes(1) - expect(validateFilename).toBeCalledWith(invalidFilename.name) - expect(showInvalidFilenameDialog).toBeCalledTimes(1) - expect(showInvalidFilenameDialog).toBeCalledWith(exception) - - expect(result).toHaveLength(0) - }) - - it('invalid filename - rename', async () => { - const invalidFilename = new File(['CONTENT'], '#some file.jpg') - const exception = new InvalidFilenameError({ filename: invalidFilename.name, reason: InvalidFilenameErrorReason.Character, segment: '#' }) - - callback.mockImplementationOnce(async () => []) - validateFilename.mockImplementationOnce(() => { - throw exception - }) - showInvalidFilenameDialog.mockImplementationOnce(() => 'valid filename.jpg') - const result = await handler([invalidFilename], '/') - - expect(callback).toBeCalledTimes(1) - expect(callback).toBeCalledWith('/') - expect(validateFilename).toBeCalledTimes(1) - expect(validateFilename).toBeCalledWith('#some file.jpg') - expect(showInvalidFilenameDialog).toBeCalledTimes(1) - expect(showInvalidFilenameDialog).toBeCalledWith(exception) - - expect(result).toEqual([new File(['CONTENT'], 'valid filename.jpg')]) - }) -}) diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index d9d871ff..00000000 --- a/cypress.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -import { defineConfig } from 'cypress' -import { createAppConfig } from '@nextcloud/vite-config' - -const viteConfig = await createAppConfig({}, { - inlineCSS: true, - nodePolyfills: true, - emptyOutputDirectory: false, - replace: { - __TRANSLATIONS__: '[]', - }, -})({ mode: 'development', command: 'serve' }) - -viteConfig.build!.rollupOptions = undefined - -export default defineConfig({ - projectId: 'v24ts6', - - // faster video processing - videoCompression: false, - - component: { - devServer: { - framework: 'vue', - bundler: 'vite', - viteConfig, - }, - }, -}) diff --git a/cypress/components/ConflictPicker.cy.ts b/cypress/components/ConflictPicker.cy.ts deleted file mode 100644 index 08eb2faa..00000000 --- a/cypress/components/ConflictPicker.cy.ts +++ /dev/null @@ -1,290 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -import { File as NcFile } from '@nextcloud/files' -import ConflictPicker from '../../lib/dialogs/components/ConflictPicker.vue' - -describe('ConflictPicker rendering', { testIsolation: true }, () => { - let image: File - - before(() => { - cy.fixture('image.jpg', null).then((content: Buffer) => { - image = new File([content], 'image.jpg', { type: 'image/jpeg' }) - }) - }) - - it('Renders default ConflictPicker', () => { - const oldImage = new NcFile({ - id: 1, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - - cy.mount(ConflictPicker, { - propsData: { - dirname: 'Pictures', - content: [oldImage], - conflicts: [image], - }, - }) - - cy.get('[data-cy-conflict-picker]').should('exist') - cy.get('[data-cy-conflict-picker] h2').should('have.text', '1 file conflict in Pictures') - cy.get('[data-cy-conflict-picker-form]').should('be.visible') - - cy.get('[data-cy-conflict-picker-fieldset]').should('have.length', 2) - cy.get('[data-cy-conflict-picker-fieldset="all"]').should('exist') - cy.get('[data-cy-conflict-picker-fieldset="image.jpg"]').should('exist') - - cy.get('[data-cy-conflict-picker-skip]').scrollIntoView().should('be.visible') - cy.get('[data-cy-conflict-picker-submit]').should('be.visible') - - // Force close and cancel - cy.get('[data-cy-conflict-picker-skip]').click({ force: true }) - }) -}) - -describe('ConflictPicker resolving', () => { - let images: File[] = [] - - beforeEach(() => { - images = [] - cy.fixture('image.jpg', null).then((content) => { - images.push(new File([content], 'image1.jpg', { type: 'image/jpeg' })) - images.push(new File([content], 'image2.jpg', { type: 'image/jpeg' })) - }) - }) - - it('Pick all incoming files', () => { - const old1 = new NcFile({ - id: 1, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image1.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - const old2 = new NcFile({ - id: 2, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image2.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - - const onSubmit = cy.spy().as('onSubmitSpy') - const onCancel = cy.spy().as('onCancelSpy') - cy.mount(ConflictPicker, { - propsData: { - dirname: 'Pictures', - content: [old1, old2], - conflicts: images, - }, - listeners: { - submit: onSubmit, - cancel: onCancel, - }, - }) - - cy.get('[data-cy-conflict-picker-form]').should('be.visible') - cy.get('[data-cy-conflict-picker-fieldset]').should('have.length', 3) - cy.get('[data-cy-conflict-picker-input-incoming="all"] input').check({ force: true }) - cy.get('[data-cy-conflict-picker-submit]').click() - - cy.get('@onSubmitSpy').should('have.been.calledOnce').then((onSubmit) => { - const results = (onSubmit as unknown as sinon.SinonSpy).firstCall.args[0] - expect(results.selected).to.deep.equal(images) - expect(results.renamed).to.have.length(0) - }) - cy.get('@onCancelSpy').should('not.have.been.called') - }) - - it('Pick all existing files', () => { - const old1 = new NcFile({ - id: 1, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image1.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - const old2 = new NcFile({ - id: 2, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image2.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - - const onSubmit = cy.spy().as('onSubmitSpy') - const onCancel = cy.spy().as('onCancelSpy') - cy.mount(ConflictPicker, { - propsData: { - dirname: 'Pictures', - content: [old1, old2], - conflicts: images, - }, - listeners: { - submit: onSubmit, - cancel: onCancel, - }, - }) - - cy.get('[data-cy-conflict-picker-form]').should('be.visible') - cy.get('[data-cy-conflict-picker-fieldset]').should('have.length', 3) - cy.get('[data-cy-conflict-picker-input-existing="all"] input').check({ force: true }) - cy.get('[data-cy-conflict-picker-submit]').click() - - cy.get('@onSubmitSpy').should('have.been.calledOnce').then((onSubmit) => { - const results = (onSubmit as unknown as sinon.SinonSpy).firstCall.args[0] - expect(results.selected).to.have.length(0) - expect(results.renamed).to.have.length(0) - }) - cy.get('@onCancelSpy').should('not.have.been.called') - }) - - it('Pick one existing and one new file', () => { - const old1 = new NcFile({ - id: 1, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image1.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - const old2 = new NcFile({ - id: 2, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image2.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - - const onSubmit = cy.spy().as('onSubmitSpy') - const onCancel = cy.spy().as('onCancelSpy') - cy.mount(ConflictPicker, { - propsData: { - dirname: 'Pictures', - content: [old1, old2], - conflicts: images, - }, - listeners: { - submit: onSubmit, - cancel: onCancel, - }, - }) - - cy.get('[data-cy-conflict-picker-form]').should('be.visible') - cy.get('[data-cy-conflict-picker-fieldset]').should('have.length', 3) - cy.get('[data-cy-conflict-picker-input-incoming="image1.jpg"] input').check({ force: true }) - cy.get('[data-cy-conflict-picker-input-existing="image2.jpg"] input').check({ force: true }) - cy.get('[data-cy-conflict-picker-submit]').click() - - // We only return the files to handle - cy.get('@onSubmitSpy').should('have.been.calledOnce').then((onSubmit) => { - const results = (onSubmit as unknown as sinon.SinonSpy).firstCall.args[0] - expect(results.selected).to.deep.equal([images[0]]) - expect(results.renamed).to.have.length(0) - }) - cy.get('@onCancelSpy').should('not.have.been.called') - }) - - it('Pick both versions files (rename existing)', () => { - const old1 = new NcFile({ - id: 1, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image1.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - const old2 = new NcFile({ - id: 2, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image2.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - - const onSubmit = cy.spy().as('onSubmitSpy') - const onCancel = cy.spy().as('onCancelSpy') - cy.mount(ConflictPicker, { - propsData: { - dirname: 'Pictures', - content: [old1, old2], - conflicts: images, - }, - listeners: { - submit: onSubmit, - cancel: onCancel, - }, - }) - - cy.get('[data-cy-conflict-picker-form]').should('be.visible') - cy.get('[data-cy-conflict-picker-fieldset]').should('have.length', 3) - cy.get('[data-cy-conflict-picker-input-incoming="all"] input').check({ force: true }) - cy.get('[data-cy-conflict-picker-input-existing="all"] input').check({ force: true }) - cy.get('[data-cy-conflict-picker-submit]').click() - - cy.get('@onSubmitSpy').should('have.been.calledOnce').then((onSubmit) => { - const results = (onSubmit as unknown as sinon.SinonSpy).firstCall.args[0] - expect(results.selected).to.have.length(0) - expect(results.renamed).to.have.length(2) - expect((results.renamed[0] as File).name).to.equal('image1 (1).jpg') - expect((results.renamed[1] as File).name).to.equal('image2 (1).jpg') - }) - cy.get('@onCancelSpy').should('not.have.been.called') - }) - - it('Skip all conflicts', () => { - const old1 = new NcFile({ - id: 1, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image1.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - const old2 = new NcFile({ - id: 2, - source: 'http://cloud.domain.com/remote.php/dav/files/user/image2.jpg', - mime: 'image/jpeg', - size: 1000, - owner: 'user', - mtime: new Date('2021-01-01T00:00:00.000Z'), - }) - - const onSubmit = cy.spy().as('onSubmitSpy') - const onCancel = cy.spy().as('onCancelSpy') - cy.mount(ConflictPicker, { - propsData: { - dirname: 'Pictures', - content: [old1, old2], - conflicts: images, - }, - listeners: { - submit: onSubmit, - cancel: onCancel, - }, - }) - - cy.get('[data-cy-conflict-picker-form]').should('be.visible') - cy.get('[data-cy-conflict-picker-fieldset]').should('have.length', 3) - cy.get('[data-cy-conflict-picker-skip]').click() - - cy.get('@onSubmitSpy').should('have.been.calledOnce').then((onSubmit) => { - const results = (onSubmit as unknown as sinon.SinonSpy).firstCall.args[0] - expect(results.selected).to.have.length(0) - expect(results.renamed).to.have.length(0) - }) - cy.get('@onCancelSpy').should('not.have.been.called') - }) -}) diff --git a/cypress/components/UploadPicker/UploadPicker.cy.ts b/cypress/components/UploadPicker/UploadPicker.cy.ts deleted file mode 100644 index 943c667c..00000000 --- a/cypress/components/UploadPicker/UploadPicker.cy.ts +++ /dev/null @@ -1,487 +0,0 @@ -/* eslint-disable no-unused-expressions */ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -import { Folder, Permission } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { UploadPicker, UploadStatus, getUploader } from '../../../lib/index.ts' - -let state: string | undefined -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -const resetDocument = () => { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -describe('UploadPicker rendering', () => { - afterEach(() => resetDocument()) - - it('Renders default UploadPicker', () => { - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user/Folder'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - cy.mount(UploadPicker, { propsData }) - cy.get('[data-cy-upload-picker]').should('be.visible') - cy.get('[data-cy-upload-picker]').should('contain.text', 'New') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').should('not.be.visible') - }) - - it('Does NOT render without a destination', () => { - cy.mount(UploadPicker) - cy.get('[data-cy-upload-picker]').should('not.exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').should('not.exist') - }) -}) - -describe('UploadPicker valid uploads', () => { - beforeEach(() => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker]') - .contains('button', 'New') - .should('be.visible') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - }) - - afterEach(() => resetDocument()) - - it('Uploads a file', () => { - const { promise, resolve } = Promise.withResolvers() - cy.intercept('PUT', '/remote.php/dav/files/*/*', (req) => { - req.reply({ statusCode: 201 }) - req.on('response', async () => await promise) - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('@progress').should('be.visible') - cy.get('[data-cy-upload-picker]') - .within(() => { - // Label gets hidden during upload - cy.contains('button', 'New').should('not.exist') - // but the button exists - cy.get('button[data-cy-upload-picker-add]') - .should('be.visible') - .and('have.attr', 'aria-label', 'New') - }) - .then(() => resolve()) - - cy.wait('@upload').then(() => { - cy.get('@progress') - .should('not.be.visible') - - // Label is displayed again after upload - cy.get('[data-cy-upload-picker] button').should('contain.text', 'New') - }) - }) -}) - -describe('UploadPicker valid uploads', () => { - beforeEach(() => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - }) - - afterEach(() => resetDocument()) - - it('Uploads a file with chunking', () => { - // Intercept tmp upload chunks folder creation - cy.intercept('MKCOL', '/remote.php/dav/uploads/*/web-file-upload*', { - statusCode: 201, - }).as('init') - - // Intercept chunks upload - cy.intercept({ - method: 'PUT', - url: '/remote.php/dav/uploads/*/web-file-upload*/*', - }, (req) => { - req.reply({ - statusCode: 201, - }) - }).as('chunks') - - // Intercept final assembly request - cy.intercept('MOVE', '/remote.php/dav/uploads/*/web-file-upload*/.file', (req) => { - req.reply({ - statusCode: 204, - // Fake assembling chunks - delay: 2000, - }) - }).as('assembly') - - // Start upload - cy.get('@input').attachFile({ - // Fake file of 256 MB - fileContent: new Blob([new ArrayBuffer(256 * 1024 * 1024)]), - fileName: 'photos.zip', - mimeType: 'application/zip', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.wait('@init').then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('be.visible') - }) - cy.wait('@chunks').then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('be.visible') - cy.get('@progress') - .children('progress') - .should('not.have.value', '0') - }) - cy.wait('@assembly', { timeout: 60000 }).then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - cy.get('@chunks.all').should('have.lengthOf', 26) - }) - }) - - it('Uploads a file without chunking', () => { - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/*', { - statusCode: 201, - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - cy.wait('@upload').then(() => { - cy.get('@progress') - .children('progress') - .should('not.have.value', '0') - }) - }) -}) - -describe('Destination management', () => { - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - afterEach(() => resetDocument()) - - it('Upload then changes the destination', () => { - // Mount picker - cy.mount(UploadPicker, { propsData }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/**', { - statusCode: 201, - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.wait('@upload').then((upload) => { - expect(upload.request.url).to.have.string( - '/remote.php/dav/files/user/image.jpg', - ) - }) - - cy.mount(UploadPicker, { propsData }).then(({ component }) => { - const instance = component as InstanceType - instance.setDestination(new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user/Photos'), - permissions: Permission.ALL, - root: '/files/user', - })) - // Wait for prop propagation - expect(instance.uploadManager.root).to.have.string('/remote.php/dav/files/user/Photos') - }) - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.wait('@upload').then((upload) => { - expect(upload.request.url).to.have.string( - '/remote.php/dav/files/user/Photos/image.jpg', - ) - }) - }) -}) - -describe('Root management', () => { - const propsData = { - root: null, - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - afterEach(() => resetDocument()) - - it('Upload then changes the root', () => { - // Mount picker - cy.mount(UploadPicker, { propsData }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/**', { - statusCode: 201, - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.wait('@upload').then((upload) => { - expect(upload.request.url).to.have.string( - '/remote.php/dav/files/user/image.jpg', - ) - }) - - cy.mount(UploadPicker, { propsData }).then(({ component }) => { - const instance = component as InstanceType - instance.setDestination(new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/photos/user/albums/2022 Summer Vacations'), - permissions: Permission.ALL, - root: '/photos/user', - })) - // Wait for prop propagation - expect(instance.uploadManager.root).to.have.string('/remote.php/dav/photos/user/albums/2022 Summer Vacations') - }) - - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/photos/user/albums/*/*', { - statusCode: 201, - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.wait('@upload').then((upload) => { - expect(upload.request.url).to.have.string( - '/remote.php/dav/photos/user/albums/2022%20Summer%20Vacations/image.jpg', - ) - }) - }) -}) - -describe('UploadPicker notify testing', () => { - const listeners = { - uploaded: () => {}, - failed: () => {}, - } - - beforeEach(() => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - cy.spy(listeners, 'uploaded') - cy.spy(listeners, 'failed') - - // Mount picker - cy.mount(UploadPicker, { - propsData, - listeners, - }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - }) - - afterEach(() => resetDocument()) - - it('Uploads a file without chunking', () => { - const notify = cy.spy() - const uploader = getUploader() - uploader.addNotifier(notify) - - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/*', { - statusCode: 201, - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - cy.wait('@upload').then(() => { - cy.get('@progress') - .children('progress') - .should('not.have.value', '0') - expect(notify).to.be.calledTwice - // The image upload - expect(notify.getCall(0).args[0].file.name).to.eq('image.jpg') - expect(notify.getCall(0).args[0].status).to.eq(UploadStatus.FINISHED) - // The meta upload - expect(notify.getCall(1).args[0].status).to.eq(UploadStatus.FINISHED) - expect(notify.getCall(1).args[0].file.name).to.eq('') - expect(notify.getCall(1).args[0].file.type).to.eq('httpd/unix-directory') - // the listeners - expect(listeners.failed).to.not.be.called - expect(listeners.uploaded).to.be.calledTwice - }) - }) - - it('Fails a file without chunking', () => { - const notify = cy.spy() - const uploader = getUploader() - uploader.addNotifier(notify) - - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/*', { - statusCode: 403, - }).as('upload') - - cy.get('@input').attachFile({ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - cy.wait('@upload').then(() => { - cy.get('@progress') - .children('progress') - .should('not.have.value', '0') - expect(notify).to.be.calledTwice - // The image upload - expect(notify.getCall(0).args[0].file.name).to.eq('image.jpg') - expect(notify.getCall(0).args[0].status).to.eq(UploadStatus.FAILED) - // The meta upload - expect(notify.getCall(1).args[0].status).to.eq(UploadStatus.FAILED) - expect(notify.getCall(1).args[0].file.name).to.eq('') - expect(notify.getCall(1).args[0].file.type).to.eq('httpd/unix-directory') - // the listeners - expect(listeners.uploaded).to.not.be.called - expect(listeners.failed).to.be.calledTwice - }) - }) -}) diff --git a/cypress/components/UploadPicker/cancel.cy.ts b/cypress/components/UploadPicker/cancel.cy.ts deleted file mode 100644 index 304afcfd..00000000 --- a/cypress/components/UploadPicker/cancel.cy.ts +++ /dev/null @@ -1,191 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -import { File, Folder, Permission } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { UploadPicker, UploadStatus, getUploader } from '../../../lib/index.ts' - -let state: string | undefined - -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -/** - * Reset the inner body of the document to remove any previous state of the uploader. - */ -function resetDocument(): void { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -describe('UploadPicker: progress handling', () => { - let dirContent: File[] = [] - - afterEach(() => { - resetDocument() - }) - - beforeEach(() => { - dirContent = [] - - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - content: () => dirContent, - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Start paused - getUploader(false, true) - .pause() - - // Mount picker - cy.mount(UploadPicker, { - propsData, - }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress-label]').as('progressLabel').should('exist') - }) - - it('cancels single file upload', () => { - const notify = cy.spy() - getUploader() - .addNotifier(notify) - - cy.get('@input').attachFile({ - // file of 5 MiB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', { statusCode: 201, delay: 2000 }) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - cy.get('@progress', { timeout: 2000 }) - .should((el) => expect(el.val()).to.be.greaterThan(10)) - .and((el) => expect(el.val()).to.be.lessThan(95)) - - // Now cancel the upload - cy.get('[data-cy-upload-picker-cancel]') - .should('be.visible') - .click() - cy.get('@progress') - .should('not.be.visible') - .then(() => { - // eslint-disable-next-line no-unused-expressions - expect(notify).to.be.calledOnce - expect(notify.getCall(0).args[0].status).to.eq(UploadStatus.CANCELLED) - }) - }) - - it('cancels single chunked file upload', () => { - const notify = cy.spy() - getUploader() - .addNotifier(notify) - - cy.get('@input').attachFile({ - fileContent: new Blob([new ArrayBuffer(15 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.intercept('MKCOL', '/remote.php/dav/uploads/user/*', { statusCode: 201 }) - cy.intercept('DELETE', '/remote.php/dav/uploads/user/*', { statusCode: 201 }) - cy.intercept('PUT', '/remote.php/dav/uploads/user/web-file-upload-*/*', { statusCode: 201, delay: 2000 }) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - cy.get('@progress', { timeout: 2000 }) - .should((el) => expect(el.val()).to.be.greaterThan(10)) - .and((el) => expect(el.val()).to.be.lessThan(95)) - - // Now cancel the upload - cy.get('[data-cy-upload-picker-cancel]') - .should('be.visible') - .click() - cy.get('@progress') - .should('not.be.visible') - .then(() => { - // eslint-disable-next-line no-unused-expressions - expect(notify).to.be.calledTwice - expect(notify.getCall(0).args[0].status).to.eq(UploadStatus.CANCELLED) - expect(notify.getCall(1).args[0].status).to.eq(UploadStatus.CANCELLED) - }) - }) - - it('cancels single file conflict', () => { - dirContent.push(new File({ owner: 'test', source: 'http://example.com/remote.php/dav/files/test/file.txt', mime: 'text/plain' })) - const notify = cy.spy() - getUploader() - .addNotifier(notify) - - cy.get('@input').attachFile({ - // file of 5 MiB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', { statusCode: 409, delay: 2000 }) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - // start the uploader - .then(() => getUploader().start()) - - cy.get('[role="dialog"]') - .should('be.visible') - .find('[data-cy-conflict-picker-cancel]') - .click() - - cy.contains('.toast-warning', 'Upload has been cancelled').should('be.visible') - - cy.get('@progress') - .should('not.be.visible') - .then(() => { - // eslint-disable-next-line no-unused-expressions - expect(notify).to.be.calledOnce - expect(notify.getCall(0).args[0].status).to.eq(UploadStatus.CANCELLED) - }) - }) -}) diff --git a/cypress/components/UploadPicker/hotkeys.cy.ts b/cypress/components/UploadPicker/hotkeys.cy.ts deleted file mode 100644 index e32a7883..00000000 --- a/cypress/components/UploadPicker/hotkeys.cy.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable no-unused-expressions */ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -// dist file might not be built when running eslint only -// eslint-disable-next-line import/no-unresolved,n/no-missing-import -import { Folder, Permission, addNewFileMenuEntry, type Entry } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { UploadPicker } from '../../../lib/index.ts' - -describe('UploadPicker: hotkeys testing', () => { - const propsData = { - content: () => [], - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user/Folder'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - before(() => { - addNewFileMenuEntry({ - id: 'test', - displayName: 'Test', - iconSvgInline: '', - handler: (...args) => console.debug(args), - } as Entry) - }) - - it('opens the upload menu when pressing shift+u', () => { - cy.mount(UploadPicker, { propsData }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - cy.get('[role="menu"]').should('not.exist') - - cy.get('body').type('{shift}u') - cy.get('[role="menu"]').should('be.visible') - }) - - it('closes the upload menu when pressing escape', () => { - cy.mount(UploadPicker, { propsData }) - .then(({ component }) => { - // force the menu to be opened - component.openedMenu = true - }) - - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - cy.get('[role="menu"]').should('be.visible') - - cy.get('body').type('{esc}') - cy.get('[role="menu"]').should('not.be.visible') - }) -}) diff --git a/cypress/components/UploadPicker/invalid-filenames.cy.ts b/cypress/components/UploadPicker/invalid-filenames.cy.ts deleted file mode 100644 index 90949d2b..00000000 --- a/cypress/components/UploadPicker/invalid-filenames.cy.ts +++ /dev/null @@ -1,473 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -// dist file might not be built when running eslint only -// eslint-disable-next-line import/no-unresolved,n/no-missing-import -import { Folder, Permission } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { UploadPicker, getUploader } from '../../../lib/index.ts' -import { basename } from 'path' - -let state: string | undefined -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -const resetDocument = () => { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -describe('UploadPicker: invalid filenames (legacy prop)', { testIsolation: true }, () => { - - // Cypress shares the module state between tests, we need to reset it - // ref: https://github.com/cypress-io/cypress/issues/25441 - beforeEach(() => { - getUploader(false, true) - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/*', (req) => { - req.reply({ - statusCode: 201, - delay: 2000, - }) - }).as('upload') - }) - - afterEach(() => resetDocument()) - - it('Fails a file if forbidden character', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - forbiddenCharacters: ['$', '#', '~', '&'], - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-add]').should('contain.text', 'New') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Upload 2 files - cy.get('@input').attachFile([{ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'invalid-image$.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, { - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'valid-image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }]) - - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - - // There is the dialog for the invalid filename - cy.contains('[role="dialog"]', 'Invalid filename') - .should('be.visible') - .and('contain.text', '"$" is not allowed') - // And upload was not called yet - cy.get('@upload.all').should('have.length', 0) - }) - - it('Can skip invalid files', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - forbiddenCharacters: ['$', '#', '~', '&'], - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - cy.wait(4000) - - // Label is displayed before upload - cy.get('[data-cy-upload-picker]').contains('New').should('be.visible') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Upload 2 files - cy.get('@input').attachFile([{ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'invalid-image$.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, { - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'valid-image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }]) - - // See there is the skip option - cy.contains('[role="dialog"]', 'Invalid filename') - .should('be.visible') - .contains('button', 'Skip') - .click() - - cy.wait('@upload') - // Should have been called only once - cy.get('@upload.all').should('have.length', 1) - }) -}) - -describe.only('UploadPicker: invalid filenames (server capabilities)', { testIsolation: true }, () => { - - afterEach(() => resetDocument()) - - // Cypress shares the module state between tests, we need to reset it - // ref: https://github.com/cypress-io/cypress/issues/25441 - beforeEach(() => { - getUploader(false, true) - - // @ts-expect-error This is a private variable but we need to mock it - window._oc_capabilities = { - files: { - forbidden_filenames: ['.htaccess'], - forbidden_filename_characters: [':'], - forbidden_filename_extensions: ['.exe'], - }, - } - - // Intercept single upload - cy.intercept('PUT', '/remote.php/dav/files/*/*', (req) => { - req.reply({ - statusCode: 201, - delay: 2000, - }) - }).as('upload') - }) - - it('reports invalid filename for a file with forbidden character', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-add]').should('contain.text', 'New') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - - // Upload - cy.get('@input').attachFile({ - fileContent: new Blob([new ArrayBuffer(1024 * 1024)]), - fileName: 'invalid: character.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('@progress') - .should('not.be.visible') - - cy.contains('[role="dialog"]', 'Invalid filename') - .should('contain.text', '":" is not allowed') - .should('be.visible') - }) - - it('reports invalid filename for a file with reserved name', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-add]').should('contain.text', 'New') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - - // Upload - cy.get('@input').attachFile({ - fileContent: new Blob([new ArrayBuffer(1024 * 1024)]), - fileName: '.htaccess', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('@progress') - .should('not.be.visible') - - cy.contains('[role="dialog"]', 'Invalid filename') - .should('contain.text', '".htaccess" is a forbidden') - .should('be.visible') - }) - - it('reports invalid filename for a file with forbidden extension', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-add]').should('contain.text', 'New') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - - // Upload - cy.get('@input').attachFile({ - fileContent: new Blob([new ArrayBuffer(1024 * 1024)]), - fileName: 'bad.exe', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.get('@progress') - .should('not.be.visible') - - cy.contains('[role="dialog"]', 'Invalid filename') - .should('contain.text', '".exe" is a forbidden file type') - .should('be.visible') - }) - - it('Can skip invalid files', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker]').contains('New').should('be.visible') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Upload 2 files - cy.get('@input').attachFile([{ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'invalid: image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, { - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'valid-image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }]) - - // See there is the skip option - cy.contains('[role="dialog"]', 'Invalid filename') - .should('be.visible') - .contains('button', 'Skip') - .click() - - cy.wait('@upload') - // Should have been called only once - cy.get('@upload.all').should('have.length', 1) - }) - - it('Can cancel upload when encounter invalid files', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker]').contains('New').should('be.visible') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Upload two files - cy.get('@input').attachFile([{ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'invalid: image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, { - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'valid-image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }]) - - cy.get('@progress') - .should('not.be.visible') - - cy.contains('[role="dialog"]', 'Invalid filename') - .should('be.visible') - .contains('button', 'Cancel') - .click() - - cy.get('@upload.all').should('have.length', 0) - }) - - it('Can rename invalid files', () => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - cy.mount(UploadPicker, { propsData }).as('uploadPicker') - - // Label is displayed before upload - cy.get('[data-cy-upload-picker]').contains('New').should('be.visible') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - - // Upload two files - cy.get('@input').attachFile([{ - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'invalid: image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, { - // Fake file of 5 MB - fileContent: new Blob([new ArrayBuffer(2 * 1024 * 1024)]), - fileName: 'valid-image.jpg', - mimeType: 'image/jpeg', - encoding: 'utf8', - lastModified: new Date().getTime(), - }]) - - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - - cy.contains('[role="dialog"]', 'Invalid filename') - .should('be.visible') - .contains('button', 'Rename') - .should('be.disabled') - - cy.contains('[role="dialog"]', 'Invalid filename') - .find('input') - .should('have.value', 'invalid: image.jpg') - .type('{selectAll}now-valid.jpg') - - cy.contains('[role="dialog"]', 'Invalid filename') - .should('be.visible') - .contains('button', 'Rename') - .click() - - cy.wait('@upload') - // Should have been called two times with an valid name now - cy.get('@upload.all').should('have.length', 2).then((array): void => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const requests = (array as unknown as any[]).map(({ request }) => basename(request.url)) - // The valid one is included - expect(requests).to.contain('valid-image.jpg') - // The invalid is NOT included - expect(requests).to.not.contain('invalid: image.jpg') - // The invalid was made valid - expect(requests).to.contain('now-valid.jpg') - }) - }) -}) diff --git a/cypress/components/UploadPicker/new-menu.cy.ts b/cypress/components/UploadPicker/new-menu.cy.ts deleted file mode 100644 index e4b0b36a..00000000 --- a/cypress/components/UploadPicker/new-menu.cy.ts +++ /dev/null @@ -1,191 +0,0 @@ -/* eslint-disable no-unused-expressions */ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -// dist file might not be built when running eslint only -// eslint-disable-next-line import/no-unresolved,n/no-missing-import -import { Folder, Permission, addNewFileMenuEntry, type Entry } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { UploadPicker } from '../../../lib/index.ts' - -let state: string | undefined -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -const resetDocument = () => { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -describe('UploadPicker: "new"-menu', () => { - const propsData = { - content: () => [], - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user/Folder'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - afterEach(() => resetDocument()) - - it('without folder-upload enabled no menu is shown', () => { - cy.mount(UploadPicker, { propsData }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - cy.get('[data-cy-upload-picker]') - .contains('button', 'New') - .should('be.visible') - // Directly trigger upload - .and('have.attr', 'data-cy-upload-picker-menu-entry', 'upload-file') - .click() - - cy.get('[role="menu"]').should('not.exist') - }) - - it('with folder-upload enabled a menu is shown', () => { - cy.mount(UploadPicker, { propsData: { ...propsData, allowFolders: true } }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - cy.get('[data-cy-upload-picker]') - .contains('button', 'New') - .should('be.visible') - // Directly no trigger - .and('not.have.attr', 'data-cy-upload-picker-menu-entry', 'upload-file') - // click should open the menu - .click() - - cy.get('[role="menu"]') - .should('be.visible') - .get('[role="menuitem"]') - // two entries: uploader folder + upload files - .should('have.length', 2) - }) - - describe('With new-menu entries', () => { - const entry = { - id: 'empty-file', - displayName: 'Create empty file', - templateName: 'New file', - iconClass: 'icon-file', - enabled: (folder: Folder) => (folder.permissions & Permission.CREATE) !== 0, - handler() {}, - } as Entry - - before(() => addNewFileMenuEntry(entry)) - beforeEach(() => cy.spy(entry, 'handler')) - afterEach(() => resetDocument()) - - it('With "noMenu" prop no menu is shown', () => { - // Mount picker - cy.mount(UploadPicker, { propsData: { ...propsData, noMenu: true } }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - cy.get('[data-cy-upload-picker]') - .contains('button', 'Upload') - .should('be.visible') - // Directly trigger upload - .and('have.attr', 'data-cy-upload-picker-menu-entry', 'upload-file') - .click() - - cy.get('[role="menu"]').should('not.exist') - }) - - it('With "noMenu" prop and allowed folder-upload only the upload menu is shown', () => { - // Mount picker - cy.mount(UploadPicker, { propsData: { ...propsData, noMenu: true, allowFolders: true } }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - cy.get('[data-cy-upload-picker]') - .contains('button', 'Upload') - .should('be.visible') - // Directly no trigger - .and('not.have.attr', 'data-cy-upload-picker-menu-entry', 'upload-file') - // click should open the menu - .click() - - cy.get('[role="menu"]') - .should('be.visible') - .get('[role="menuitem"]') - // only two (!) entries: uploader folder + upload files - .should('have.length', 2) - // Not the custom entry - cy.get('[data-cy-upload-picker-menu-entry="empty-file"]').should('not.exist') - }) - - it('Open the New File Menu', () => { - // Mount picker - cy.mount(UploadPicker, { propsData }) - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - cy.get('[data-cy-upload-picker] .action-item__menutoggle').should('exist') - - cy.get('[data-cy-upload-picker] .action-item__menutoggle').click() - cy.get('[data-cy-upload-picker-menu-entry="upload-file"]').should('have.length', 1) - cy.get('[data-cy-upload-picker-menu-entry="empty-file"]').should('have.length', 1) - - cy.get('[data-cy-upload-picker-menu-entry="empty-file"]') - .click() - .then(() => { - expect(entry.handler).to.be.called - }) - }) - - it.only('Changes the context', () => { - // Mount picker - cy.mount(UploadPicker, { propsData }).then(({ component }) => { - const instance = component as InstanceType - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - cy.get('[data-cy-upload-picker] .action-item__menutoggle').should('exist') - - cy.get('[data-cy-upload-picker] .action-item__menutoggle').click() - cy.get('[data-cy-upload-picker-menu-entry="upload-file"]').should('have.length', 1) - cy.get('[data-cy-upload-picker-menu-entry="empty-file"]').should('have.length', 1) - - // Close menu - cy.get('body').click() - cy.get('[data-cy-upload-picker-menu-entry="upload-file"]').should('not.be.visible') - cy.get('[data-cy-upload-picker-menu-entry="empty-file"]').should('not.be.visible') - - // Change context when we're sure the menu is closed - cy.get('[role="menu"]').should('not.be.visible') - .then(() => { - instance.setDestination(new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user/Folder'), - permissions: Permission.NONE, - root: '/files/user', - })) - }) - - // Menu should not be visible anymore - cy.get('[data-cy-upload-picker] .action-item__menutoggle').should('not.exist') - cy.get('[data-cy-upload-picker-menu-entry="upload-file"]').should('have.length', 1) - cy.get('[data-cy-upload-picker-menu-entry="empty-file"]').should('not.exist') - }) - }) - }) -}) diff --git a/cypress/components/UploadPicker/progress.cy.ts b/cypress/components/UploadPicker/progress.cy.ts deleted file mode 100644 index 6fabbd4d..00000000 --- a/cypress/components/UploadPicker/progress.cy.ts +++ /dev/null @@ -1,461 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -import { Folder, Permission } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { UploadPicker, getUploader } from '../../../lib/index.ts' - -let state: string | undefined - -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -/** - * Reset the inner body of the document to remove any previous state of the uploader. - */ -function resetDocument(): void { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -/** - * Throttle the upload speed using browser API. - * @param speed upload speed in bytes per second. -1 for unlimited. - */ -function throttleUpload(speed: number) { - Cypress.automation('remote:debugger:protocol', { - command: 'Network.emulateNetworkConditions', - params: { - offline: speed === 0, - latency: 0, - downloadThroughput: -1, - uploadThroughput: Math.max(speed, -1), - }, - }) -} - -describe('UploadPicker: progress handling', () => { - afterEach(() => { - resetDocument() - throttleUpload(-1) - }) - - beforeEach(() => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Start paused - getUploader(false, true).pause() - - // Mount picker - cy.mount(UploadPicker, { - propsData, - }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress-label]').as('progressLabel').should('exist') - }) - - it('has upload speed information', () => { - cy.get('@input').attachFile({ - // file of 9 MiB - fileContent: new Blob([new ArrayBuffer(9 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', { statusCode: 201 }) - - // 128 KB/s - throttleUpload(128 * 1024) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - // See the upload has started - cy.get('@progressLabel', { timeout: 10000 }) - .should((el) => expect(el.text()).to.match(/\d+(\.\d+)?\s?KB∕s/)) - // increase speed to 1MiB/s - .then(() => throttleUpload(1024 * 1024)) - cy.get('@progressLabel') - .children('span') - .first({ timeout: 9000 }) - .should((el) => { - expect(el.text().trim()).to.equal('a few seconds left') - expect(el.attr('title')).to.match(/\d+(\.\d+)?\s?KB∕s/) - }) - }) - - it('has increasing progress bar during non-chunked upload', () => { - cy.get('@input').attachFile({ - // file of 5 MiB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - // promise used to time request response - const { promise, resolve } = Promise.withResolvers() - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', (rq) => { - rq.reply({ statusCode: 201 }) - rq.on('response', async () => { - await promise - }) - }).as('upload') - - // 1 MiB/s meaning upload will take 5 seconds - throttleUpload(1024 * 1024) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - // See the upload has started - cy.get('@progressLabel') - .should('contain.text', 'estimating time') - - cy.get('@progress', { timeout: 2000 }) - .should((el) => expect(el.val()).to.be.greaterThan(10)) - .and((el) => expect(el.val()).to.be.lessThan(30)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(30)) - .and((el) => expect(el.val()).to.be.lessThan(50)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(50)) - .and((el) => expect(el.val()).to.be.lessThan(70)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(70)) - .and((el) => expect(el.val()).to.be.lessThan(90)) - - cy.get('@progress') - .should('have.value', 90) - .then(() => resolve()) // resolve the promise - // now the progress should be 100 meaning the progress bar is hidden - cy.get('@progress') - .should('not.be.visible') - }) - - it('has increasing progress bar for chunked upload', () => { - // Maximum the responses can take - Cypress.config({ defaultCommandTimeout: 7000 }) - - const { promise: promiseChunk1, resolve: resolveChunk1 } = Promise.withResolvers() - const { promise: promiseChunk2, resolve: resolveChunk2 } = Promise.withResolvers() - cy.intercept('MKCOL', '/remote.php/dav/uploads/user/*', (rq) => { - rq.reply({ statusCode: 201 }) - }).as('mkdir') - cy.intercept('PUT', '/remote.php/dav/uploads/user/*/*', (rq) => { - rq.reply({ statusCode: 201 }) - rq.on('response', async () => await (rq.url.endsWith('/1') ? promiseChunk1 : promiseChunk2)) - }).as('uploadBig') - cy.intercept('MOVE', '/remote.php/dav/uploads/user/*/.file', (rq) => { - rq.reply({ statusCode: 201 }) - }).as('move') - - // 3 MiB/s meaning upload will take 5 seconds - throttleUpload(3 * 1024 * 1024) - - cy.get('@input').attachFile({ - // file of 15 MiB so it is chunked in 10MiB and 5 MiB - fileContent: new Blob([new ArrayBuffer(15 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - // See the upload has started - cy.get('@progressLabel') - .should((el) => expect(el.text()).to.match(/(estimating time|few seconds left)/)) - - // MKCOL was successfully so the upload can begin - cy.wait('@mkdir') - - // ~20% per second - cy.get('@progress', { timeout: 2000 }) - .should((el) => expect(el.val()).to.be.greaterThan(10)) - .and((el) => expect(el.val()).to.be.lessThan(30)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(30)) - .and((el) => expect(el.val()).to.be.lessThan(50)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(50)) - .and((el) => expect(el.val()).to.be.lessThan(70)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(70)) - .and((el) => expect(el.val()).to.be.lessThan(90)) - - cy.get('@progress') - .should('have.value', 90) - // Now the upload (sending) is done - if we trigger the resolve the value will increase to 96% (or 95 if we resolve only chunk2) - .then(() => resolveChunk1()) - cy.get('@progress') - .should((e) => expect(Math.round(e.val() as number)).to.be.eq(97)) - .then(() => resolveChunk2()) - // now the progress should be 100 meaning the progress bar is hidden - cy.get('@progress') - .should('not.be.visible') - }) - - it('shows the progress bar while assembling', () => { - // Maximum the responses can take - Cypress.config({ defaultCommandTimeout: 7000 }) - - const { promise, resolve } = Promise.withResolvers() - - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', { statusCode: 201 }).as('upload') - cy.intercept('MKCOL', '/remote.php/dav/uploads/user/*', { statusCode: 201 }).as('mkdir') - cy.intercept('PUT', '/remote.php/dav/uploads/user/*/*', (rq) => { - rq.reply({ statusCode: 201 }) - if (rq.url.endsWith('/2')) { - rq.on('response', async () => await promise) - } - }).as('uploadBig') - cy.intercept('MOVE', '/remote.php/dav/uploads/user/*/.file', { statusCode: 201, delay: 1000 }).as('move') - - // Start in paused mode - const uploader = getUploader() - - cy.get('@input').attachFile([ - { - // file of 5 MiB so it is not chunked - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, - { - // file of 15 MiB so it is chunked in 10MiB and 5 MiB - fileContent: new Blob([new ArrayBuffer(15 * 1024 * 1024)]), - fileName: 'big-file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }, - ]) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => uploader.start()) - - // MKCOL was successfully so the upload can begin - cy.wait('@mkdir') - - cy.get('@progress', { timeout: 2000 }) - .should((el) => expect(el.val()).to.be.greaterThan(10)) - .and((el) => expect(el.val()).to.be.lessThan(95)) - - cy.wait('@upload') - cy.wait('@uploadBig') - .then(() => resolve()) - - cy.get('@progressLabel') - .should('be.visible') - .and('contain.text', 'assembling') - - cy.wait('@move') - - cy.get('@progress') - .should('not.be.visible') - }) -}) - -describe('UploadPicker: reset progress on retry', () => { - afterEach(() => { - resetDocument() - throttleUpload(-1) - }) - - beforeEach(() => { - cy.window() - .then((win) => { - // Internal global variable - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (win as any)._oc_capabilities = { files: { chunked_upload: { max_parallel_count: 1 } } } - }) - - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Start the uploader paused - getUploader(false, true).pause() - - // Mount picker - cy.mount(UploadPicker, { - propsData, - }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress]').as('progress').should('exist') - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-progress-label]').as('progressLabel').should('exist') - }) - - it('non chunked request', () => { - let destroyRequest = true - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', (rq) => { - if (destroyRequest) { - rq.reply({ statusCode: 504 }) - destroyRequest = false - } else { - rq.reply({ statusCode: 201 }) - } - }).as('upload') - - throttleUpload(2 * 1024 * 1024) - - cy.get('@input').attachFile({ - // file of 5 MiB - fileContent: new Blob([new ArrayBuffer(5 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - // See the upload has started - cy.get('@progressLabel') - .should('contain.text', 'estimating time') - - cy.get('@progress', { timeout: 2000 }) - .should((el) => expect(el.val()).to.be.greaterThan(10)) - .and((el) => expect(el.val()).to.be.lessThan(40)) - cy.get('@progress', { timeout: 1500 }) - .should((el) => expect(el.val()).to.be.greaterThan(50)) - - cy.wait('@upload') - - // see progress is reset - cy.get('@progress', { timeout: 1000 }) - .should((el) => expect(el.val()).to.be.lessThan(25)) - - cy.get('@progress', { timeout: 4000 }) - // see second request / retry is increasing the progress again - .should((el) => expect(el.val()).to.be.greaterThan(26)) - }) - - it('only failed chunk is reset on retry', () => { - let retryChunk = true - cy.intercept('MKCOL', '/remote.php/dav/uploads/user/*', (rq) => { - rq.reply({ statusCode: 201 }) - }).as('mkdir') - cy.intercept('MOVE', '/remote.php/dav/uploads/user/*/.file', (rq) => { - rq.reply({ statusCode: 201 }) - }).as('move') - cy.intercept('PUT', '/remote.php/dav/uploads/user/*/*', (rq) => { - if (rq.url.endsWith('/2')) { - if (retryChunk) { - rq.reply({ statusCode: 504, delay: 1000 }) - retryChunk = false - return - } - } - rq.reply({ statusCode: 201, delay: 500 }) - }).as('upload') - - cy.get('@input').attachFile({ - // file of 25 MiB so that we get 3 chunks - fileContent: new Blob([new ArrayBuffer(25 * 1024 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - throttleUpload(6 * 1024 * 1024) - - // See there is no progress yet - cy.get('@progress') - .should('be.visible') - .should('have.value', 0) - cy.get('@progressLabel') - .should('contain.text', 'paused') - // start the uploader - .then(() => getUploader().start()) - - // chunks: 40% 40% 20% - // See we get progress of chunk 1 - cy.get('@progress') - .should('have.value', 40) - // See we get some progress on chunk 2 - cy.get('@progress') - .should((el) => expect(el.val()).to.be.greaterThan(75)) - // See the progress is reset to 40% (first chunk) - cy.get('@progress') - .should('have.value', 40) - // See we succeed with uploading - cy.get('@progress', { timeout: 5000 }) - .should((el) => expect(el.val()).to.be.greaterThan(75)) - // And suceed - cy.get('@progress') - .should('not.be.visible') - cy.get('@upload.all') - .should('have.length', 4) // 3 chunks + 1 retry - }) -}) diff --git a/cypress/components/UploadPicker/retry.cy.ts b/cypress/components/UploadPicker/retry.cy.ts deleted file mode 100644 index 956acd77..00000000 --- a/cypress/components/UploadPicker/retry.cy.ts +++ /dev/null @@ -1,92 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import { Folder, Permission } from '@nextcloud/files' -import { getUploader, UploadPicker } from '../../../lib/index.ts' -import { generateRemoteUrl } from '@nextcloud/router' - -let state: string | undefined - -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -const resetDocument = () => { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -describe('UploadPicker: retry requests', () => { - - beforeEach(() => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - getUploader(false, true).pause() - - // Mount picker - cy.mount(UploadPicker, { - propsData, - }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - }) - - afterEach(() => resetDocument()) - - const testCases: [string, Parameters[2], number][] = [ - ['retries on network error', { forceNetworkError: true }, 2], - ['retries on timeout', { statusCode: 504 }, 2], - ['retries when locked', { statusCode: 423 }, 2], - ['does not retry when insufficient storage', { statusCode: 507 }, 1], - ] - for (const [testCase, response, requests] of testCases) { - it(testCase, () => { - let request = 0 - cy.intercept('PUT', '/remote.php/dav/files/user/file.txt', (rq) => { - if (request++ === 0) { - rq.reply(response) - } else { - rq.reply({ statusCode: 201 }) - } - }).as('uploadRequest') - - // Start upload - cy.get('@input') - .attachFile({ - fileContent: new Blob([new ArrayBuffer(256 * 1024)]), - fileName: 'file.txt', - mimeType: 'text/plain', - }) - .then(() => getUploader().start()) - - cy.wait('@uploadRequest') - - // wait finished - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - - cy.get('@uploadRequest.all') - .should('have.length', requests) - }) - } -}) diff --git a/cypress/components/UploadPicker/status.cy.ts b/cypress/components/UploadPicker/status.cy.ts deleted file mode 100644 index a1ae39ba..00000000 --- a/cypress/components/UploadPicker/status.cy.ts +++ /dev/null @@ -1,143 +0,0 @@ -/* eslint-disable no-unused-expressions */ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -// dist file might not be built when running eslint only -// eslint-disable-next-line import/no-unresolved,n/no-missing-import -import { Folder, Permission } from '@nextcloud/files' -import { generateRemoteUrl } from '@nextcloud/router' -import { getUploader, UploadPicker } from '../../../lib/index.ts' - -let state: string | undefined -before(() => { - cy.window().then((win) => { - state = win.document.body.innerHTML - }) -}) - -const resetDocument = () => { - if (state) { - cy.window().then((win) => { - win.document.body.innerHTML = state! - }) - } -} - -describe('UploadPicker: status testing', () => { - beforeEach(() => { - // Make sure we reset the destination - // so other tests do not interfere - const propsData = { - destination: new Folder({ - id: 56, - owner: 'user', - source: generateRemoteUrl('dav/files/user'), - permissions: Permission.ALL, - root: '/files/user', - }), - } - - // Mount picker - const onPause = cy.spy().as('pausedListener') - const onResume = cy.spy().as('resumedListener') - cy.mount(UploadPicker, { - propsData, - listeners: { - paused: onPause, - resumed: onResume, - }, - }).as('uploadPicker') - - // Check and init aliases - cy.get('[data-cy-upload-picker] [data-cy-upload-picker-input]').as('input').should('exist') - cy.get('[data-cy-upload-picker] .upload-picker__progress').as('progress').should('exist') - }) - - afterEach(() => resetDocument()) - - it('shows paused status on pause', () => { - // Intercept tmp upload chunks folder creation - cy.intercept('MKCOL', '/remote.php/dav/uploads/*/web-file-upload*', { - statusCode: 201, - }).as('init') - - // Intercept chunks upload - cy.intercept({ - method: 'PUT', - url: '/remote.php/dav/uploads/*/web-file-upload*/*', - }, (req) => { - req.reply({ - statusCode: 201, - }) - }).as('chunks') - - // Intercept final assembly request - const assemblyStartStub = cy.stub().as('assemblyStart') - cy.intercept('MOVE', '/remote.php/dav/uploads/*/web-file-upload*/.file', (req) => { - assemblyStartStub() - req.reply({ - statusCode: 204, - // Fake assembling chunks - delay: 5000, - }) - }).as('assemblyEnd') - - // Start upload - cy.get('@input').attachFile({ - // Fake file of 256MB - fileContent: new Blob([new ArrayBuffer(256 * 1024 * 1024)]), - fileName: 'photos.zip', - mimeType: 'application/zip', - encoding: 'utf8', - lastModified: new Date().getTime(), - }) - - cy.wait('@init').then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('be.visible') - }) - - cy.wait('@chunks').then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('be.visible') - cy.get('@progress') - .children('progress') - .should('not.have.value', '0') - cy.get('[data-cy-upload-picker-progress-label]').should('not.contain', 'estimating time left') - cy.get('[data-cy-upload-picker-progress-label]').should('not.contain', 'paused') - - cy.wait(1000).then(() => { - getUploader().pause() - }) - - cy.get('[data-cy-upload-picker-progress-label]').should('contain', 'paused') - cy.get('@pausedListener').should('have.been.calledOnce') - - cy.wait(1000).then(() => { - getUploader().start() - }) - - cy.get('[data-cy-upload-picker-progress-label]').should('not.contain', 'paused') - cy.get('@resumedListener').should('have.been.calledOnce') - }) - - // Should will retry until success or timeout - cy.get('@assemblyStart', { timeout: 30000 }).should('have.been.calledOnce').then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('be.visible') - - cy.get('[data-cy-upload-picker-progress-label]').should('not.contain', 'paused') - cy.get('[data-cy-upload-picker-progress-label]').should('contain', 'assembling') - }) - - cy.wait('@assemblyEnd', { timeout: 60000 }).then(() => { - cy.get('[data-cy-upload-picker] .upload-picker__progress') - .as('progress') - .should('not.be.visible') - }) - }) -}) diff --git a/cypress/cypress.d.ts b/cypress/cypress.d.ts deleted file mode 100644 index 2365c5a1..00000000 --- a/cypress/cypress.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 { mount } from 'cypress/vue' - -// Augment the Cypress namespace to include type definitions for -// your custom command. -// Alternatively, can be defined in cypress/support/component.d.ts -// with a at the top of your spec. -declare global { - namespace Cypress { - interface Chainable { - mount: typeof mount - } - } -} diff --git a/cypress/fixtures/image.jpg b/cypress/fixtures/image.jpg deleted file mode 100644 index 2b1c3bd5..00000000 Binary files a/cypress/fixtures/image.jpg and /dev/null differ diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts deleted file mode 100644 index 772f5e75..00000000 --- a/cypress/support/commands.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -import 'cypress-file-upload' diff --git a/cypress/support/component-index.html b/cypress/support/component-index.html deleted file mode 100644 index 2e24f170..00000000 --- a/cypress/support/component-index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - Components App - - - - - - - - - -
-
-
-
-
- - diff --git a/cypress/support/component.ts b/cypress/support/component.ts deleted file mode 100644 index 66061a24..00000000 --- a/cypress/support/component.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -// *********************************************************** -// This example support/component.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** -/* eslint-disable @typescript-eslint/no-namespace */ -/* eslint-disable @typescript-eslint/no-this-alias */ - -import './commands' - -// Ensure Cypress' browser has same polyfills as server -// eslint-disable-next-line n/no-extraneous-import -import 'core-js/stable/index.js' - -import { mount } from '@cypress/vue2' - -// @ts-expect-error Mock window so this is an internal property -window._oc_capabilities = { files: {} } -// @ts-expect-error Mock window so this is an internal property -window._oc_debug = true - -// Example use: -// cy.mount(MyComponent) -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) -}) diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json deleted file mode 100644 index 73d30021..00000000 --- a/cypress/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": [ - "@tsconfig/cypress/tsconfig.json", - "../tsconfig.json" - ], - "include": [ - "./**/*.ts", - "./cypress.d.ts" - ], - "compilerOptions": { - "types": ["cypress"], - "rootDir": "..", - } -} diff --git a/l10n/messages.pot b/l10n/messages.pot index 045f0686..e8528e02 100644 --- a/l10n/messages.pot +++ b/l10n/messages.pot @@ -2,25 +2,6 @@ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" -msgid "\"{segment}\" is a forbidden file or folder name." -msgstr "" - -msgid "\"{segment}\" is a forbidden file type." -msgstr "" - -msgid "\"{segment}\" is not allowed inside a file or folder name." -msgstr "" - -msgid "{count} file conflict" -msgid_plural "{count} files conflict" -msgstr[0] "" -msgstr[1] "" - -msgid "{count} file conflict in {dirname}" -msgid_plural "{count} file conflicts in {dirname}" -msgstr[0] "" -msgstr[1] "" - msgid "{seconds} seconds left" msgid_plural "{seconds} seconds left" msgstr[0] "" @@ -33,124 +14,14 @@ msgstr "" msgid "a few seconds left" msgstr "" -msgid "assembling" -msgstr "" - -msgid "Cancel" -msgstr "" - -msgid "Cancel the entire operation" -msgstr "" - -msgid "Cancel uploads" -msgstr "" - -msgid "Continue" -msgstr "" - -msgid "Create new" -msgstr "" - msgid "estimating time left" msgstr "" -msgid "Existing version" -msgstr "" - msgid "Failed to assemble the chunks together" msgstr "" msgid "Failed to upload the file" msgstr "" -msgid "Filenames must not end with \"{segment}\"." -msgstr "" - -msgid "If you select both versions, the incoming file will have a number added to its name." -msgstr "" - -msgid "Invalid filename" -msgstr "" - -msgid "Last modified date unknown" -msgstr "" - -msgid "New" -msgstr "" - -msgid "New filename" -msgstr "" - -msgid "New version" -msgstr "" - -msgid "paused" -msgstr "" - -msgid "Preview image" -msgstr "" - -msgid "Rename" -msgstr "" - -msgid "Select all checkboxes" -msgstr "" - -msgid "Select all existing files" -msgstr "" - -msgid "Select all new files" -msgstr "" - -msgid "Skip" -msgstr "" - -msgid "Skip {count} file" -msgid_plural "Skip {count} files" -msgstr[0] "" -msgstr[1] "" - -msgid "Skip this file" -msgstr "" - -msgid "Unknown size" -msgstr "" - -msgid "Upload" -msgstr "" - -msgid "Upload files" -msgstr "" - -msgid "Upload folders" -msgstr "" - -msgid "Upload from device" -msgstr "" - msgid "Upload has been cancelled" msgstr "" - -msgid "Upload has been skipped" -msgstr "" - -msgid "Upload of \"{folder}\" has been skipped" -msgstr "" - -msgid "Upload progress" -msgstr "" - -msgid "When an incoming folder is selected, any conflicting files within it will also be overwritten." -msgstr "" - -msgid "When an incoming folder is selected, the content is written into the existing folder and a recursive conflict resolution is performed." -msgstr "" - -msgid "Which files do you want to keep?" -msgstr "" - -msgid "You can either rename the file, skip this file or cancel the whole operation." -msgstr "" - -msgid "You need to select at least one version of each file to continue." -msgstr "" diff --git a/lib/dialogs/components/ConflictPicker.vue b/lib/dialogs/components/ConflictPicker.vue deleted file mode 100644 index 6a5b644d..00000000 --- a/lib/dialogs/components/ConflictPicker.vue +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - diff --git a/lib/dialogs/components/InvalidFilenameDialog.vue b/lib/dialogs/components/InvalidFilenameDialog.vue deleted file mode 100644 index 60bc583e..00000000 --- a/lib/dialogs/components/InvalidFilenameDialog.vue +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - diff --git a/lib/dialogs/components/NodesPicker.vue b/lib/dialogs/components/NodesPicker.vue deleted file mode 100644 index 9564b2aa..00000000 --- a/lib/dialogs/components/NodesPicker.vue +++ /dev/null @@ -1,348 +0,0 @@ - - - - - - diff --git a/lib/dialogs/openConflictPicker.ts b/lib/dialogs/openConflictPicker.ts deleted file mode 100644 index f976f772..00000000 --- a/lib/dialogs/openConflictPicker.ts +++ /dev/null @@ -1,74 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import type { Node } from '@nextcloud/files' -import type { AsyncComponent } from 'vue' - -import Vue, { defineAsyncComponent } from 'vue' - -export type ConflictResolutionResult = { - selected: T[], - renamed: T[], -} - -export interface ConflictPickerOptions { - /** - * When this is set to true a hint is shown that conflicts in directories are handles recursively - * You still need to call this function for each directory separately. - */ - recursive?: boolean -} - -/** - * Open the conflict resolver - * @param {string} dirname the directory name - * @param {(File|Node)[]} conflicts the incoming files - * @param {Node[]} content all the existing files in the directory - * @param {ConflictPickerOptions} options Optional settings for the conflict picker - * @return {Promise} the selected and renamed files - */ -export async function openConflictPicker( - dirname: string | undefined, - conflicts: T[], - content: Node[], - options?: ConflictPickerOptions, -): Promise> { - const ConflictPicker = defineAsyncComponent(() => import('./components/ConflictPicker.vue')) as AsyncComponent - return new Promise((resolve, reject) => { - const picker = new Vue({ - name: 'ConflictPickerRoot', - render: (h) => h(ConflictPicker, { - props: { - dirname, - conflicts, - content, - recursiveUpload: options?.recursive === true, - }, - on: { - submit(results: ConflictResolutionResult) { - // Return the results - resolve(results) - - // Destroy the component - picker.$destroy() - picker.$el?.parentNode?.removeChild(picker.$el) - }, - cancel(error?: Error) { - // Reject the promise - reject(error ?? new Error('Canceled')) - - // Destroy the component - picker.$destroy() - picker.$el?.parentNode?.removeChild(picker.$el) - }, - }, - }), - }) - - // Mount the component - picker.$mount() - document.body.appendChild(picker.$el) - }) -} diff --git a/lib/dialogs/utils/dialog.ts b/lib/dialogs/utils/dialog.ts deleted file mode 100644 index d2eb6466..00000000 --- a/lib/dialogs/utils/dialog.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import type { InvalidFilenameError } from '@nextcloud/files' - -import { spawnDialog } from '@nextcloud/dialogs' -import { validateFilename } from '@nextcloud/files' -import { defineAsyncComponent } from 'vue' - -/** - * Show a dialog to let the user decide how to proceed with invalid filenames. - * The returned promise resolves to false if the file should be skipped, and resolves to a string if it should be renamed. - * The promise rejects when the user want to abort the operation. - * - * @param error the validation error - */ -export function showInvalidFilenameDialog(error: InvalidFilenameError): Promise { - const InvalidFilenameDialog = defineAsyncComponent(() => import('../components/InvalidFilenameDialog.vue')) - - const { promise, reject, resolve } = Promise.withResolvers() - spawnDialog( - InvalidFilenameDialog, - { - error, - validateFilename, - }, - (...rest) => { - const [{ skip, rename }] = rest as [{ cancel?: true, skip?: true, rename?: string }] - if (skip) { - resolve(false) - } else if (rename) { - resolve(rename) - } else { - reject() - } - }, - ) - return promise -} diff --git a/lib/dialogs/utils/uploadConflictHandler.ts b/lib/dialogs/utils/uploadConflictHandler.ts deleted file mode 100644 index c30125bb..00000000 --- a/lib/dialogs/utils/uploadConflictHandler.ts +++ /dev/null @@ -1,80 +0,0 @@ -/*! - * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -import type { Node } from '@nextcloud/files' -import type { IDirectory } from '../../utils/fileTree.ts' - -import { showInfo, showWarning } from '@nextcloud/dialogs' -import { getUniqueName, InvalidFilenameError, validateFilename } from '@nextcloud/files' -import { basename } from '@nextcloud/paths' - -import { getConflicts } from '../../utils/conflicts.ts' -import { openConflictPicker } from '../openConflictPicker.ts' -import { showInvalidFilenameDialog } from './dialog.ts' -import { t } from '../../utils/l10n.ts' -import logger from '../../utils/logger.ts' - -/** - * Helper function to create a conflict resolution callback for the `Uploader.batchUpload` method. - * - * This creates a callback that will open the conflict picker to resolve the conflicts. - * In case of a rename the new name is validated and the invalid filename dialog is shown an error happens there. - * - * @param contentsCallback Callback to retrieve contents of a given path - */ -export function uploadConflictHandler(contentsCallback: (path: string) => Promise) { - return async (nodes: Array, path: string): Promise|false> => { - try { - const content = await contentsCallback(path).catch(() => []) - const conflicts = getConflicts(nodes, content) - - // First handle conflicts as this might already remove invalid files - if (conflicts.length > 0) { - const { selected, renamed } = await openConflictPicker(path, conflicts, content, { recursive: true }) - nodes = [ - ...nodes.filter((node) => !conflicts.includes(node)), - ...selected, - ...renamed, - ] - } - - // We need to check all files for invalid characters - const filesToUpload: Array = [] - for (const file of nodes) { - try { - validateFilename(file.name) - // No invalid name used on this file, so just continue - filesToUpload.push(file) - } catch (error) { - // do not handle other errors - if (!(error instanceof InvalidFilenameError)) { - logger.error(`Unexpected error while validating ${file.name}`, { error }) - throw error - } - // Handle invalid path - let newName = await showInvalidFilenameDialog(error) - if (newName !== false) { - // create a new valid path name - newName = getUniqueName(newName, nodes.map((node) => node.name)) - Object.defineProperty(file, 'name', { value: newName }) - filesToUpload.push(file) - } - } - } - if (filesToUpload.length === 0 && nodes.length > 0) { - const folder = basename(path) - showInfo(folder - ? t('Upload of "{folder}" has been skipped', { folder }) - : t('Upload has been skipped'), - ) - } - return filesToUpload - } catch (error) { - logger.debug('Upload has been cancelled', { error }) - showWarning(t('Upload has been cancelled')) - return false - } - } -} diff --git a/lib/index.ts b/lib/index.ts index dc23fd58..9458fab2 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -10,10 +10,3 @@ export { getUploader, upload } from './getUploader.ts' export { Upload, Status as UploadStatus } from './upload.ts' export { Uploader, UploaderStatus, EtaStatus, } from './uploader/index.ts' export { getConflicts, hasConflict } from './utils/conflicts.ts' - -export type { ConflictResolutionResult, ConflictPickerOptions } from './dialogs/openConflictPicker.ts' - -export { openConflictPicker } from './dialogs/openConflictPicker.ts' -export { uploadConflictHandler } from './dialogs/utils/uploadConflictHandler.ts' - -export { default as UploadPicker } from './vue/components/UploadPicker.vue' diff --git a/lib/vue-shim.d.ts b/lib/vue-shim.d.ts deleted file mode 100644 index 9bdea902..00000000 --- a/lib/vue-shim.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -declare module '*.vue' { - import Vue from 'vue' - export default Vue -} - -declare module '@nextcloud/vue/dist/Components/*.js' { - import Vue from 'vue' - export default Vue -} diff --git a/lib/vue/components/UploadPicker.vue b/lib/vue/components/UploadPicker.vue deleted file mode 100644 index b5044053..00000000 --- a/lib/vue/components/UploadPicker.vue +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - diff --git a/package-lock.json b/package-lock.json index 928d52ad..0f5f4206 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@nextcloud/auth": "^2.5.1", "@nextcloud/axios": "^2.5.1", "@nextcloud/capabilities": "^1.2.0", - "@nextcloud/dialogs": "^6.1.1", "@nextcloud/files": "^3.10.2", "@nextcloud/l10n": "^3.3.0", "@nextcloud/logger": "^3.0.2", @@ -28,17 +27,12 @@ }, "devDependencies": { "@codecov/vite-plugin": "^1.9.1", - "@cypress/vue2": "^2.1.1", "@nextcloud/eslint-config": "^8.4.2", "@nextcloud/vite-config": "^1.5.2", - "@nextcloud/vue": "^8.27.0", "@tsconfig/cypress": "^1.0.3", "@types/node": "^24.0.4", "@vitest/coverage-v8": "^3.2.4", - "@vue/tsconfig": "^0.5.1", "blob-polyfill": "^9.0.20240710", - "cypress": "^14.5.0", - "cypress-file-upload": "^5.0.8", "gettext-extractor": "^3.8.0", "gettext-parser": "^8.0.0", "jsdom": "^26.1.0", @@ -46,16 +40,11 @@ "typescript": "^5.8.3", "vite": "^6.3.5", "vitest": "^3.2.0", - "vue-material-design-icons": "^5.3.1", "webdav": "^5.8.0" }, "engines": { "node": "^20.0.0", "npm": "^10.0.0" - }, - "peerDependencies": { - "@nextcloud/vue": "^8.0.0", - "vue": "^2.7.16" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -310,6 +299,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -318,6 +308,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -352,6 +343,7 @@ "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.26.9" @@ -363,18 +355,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", @@ -415,6 +395,7 @@ "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -600,68 +581,6 @@ "node": ">=18" } }, - "node_modules/@cypress/request": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz", - "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.0", - "http-signature": "~1.4.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.14.0", - "safe-buffer": "^5.1.2", - "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "cypress": ">=4.5.0", - "vue": "^2.0.0" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/@es-joy/jsdoccomment": { "version": "0.39.4", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", @@ -1214,31 +1133,6 @@ "node": ">=14" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, "node_modules/@gerrit0/mini-shiki": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.2.2.tgz", @@ -1454,59 +1348,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@linusborg/vue-simple-portal": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@linusborg/vue-simple-portal/-/vue-simple-portal-0.1.5.tgz", - "integrity": "sha512-dq+oubEVW4UabBoQxmH97GiDa+F6sTomw4KcXFHnXEpw69rdkXFCxo1WzwuvWjoLiUVYJTyN1dtlUvTa50VcXg==", - "license": "Apache-2.0", - "dependencies": { - "nanoid": "^3.1.20" - }, - "peerDependencies": { - "vue": "^2.6.6" - } - }, - "node_modules/@mapbox/hast-util-table-cell-style": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz", - "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==", - "license": "BSD-2-Clause", - "dependencies": { - "unist-util-visit": "^1.4.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", - "license": "MIT" - }, - "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "license": "MIT", - "dependencies": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "license": "MIT", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, - "node_modules/@mdi/js": { - "version": "7.4.47", - "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.4.47.tgz", - "integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==" - }, "node_modules/@microsoft/api-extractor": { "version": "7.50.0", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.50.0.tgz", @@ -1704,39 +1545,6 @@ "npm": "^10.0.0" } }, - "node_modules/@nextcloud/dialogs": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-6.1.1.tgz", - "integrity": "sha512-RrvFPt8SgCkg8rC0PtMC0fvyEu77kKbY2cJ/j+6RLse3rFWcNGwgNZNuRkA/Nn4GgzQ7QNhKTqWknsy0ld6rNQ==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@mdi/js": "^7.4.47", - "@nextcloud/auth": "^2.4.0", - "@nextcloud/axios": "^2.5.1", - "@nextcloud/event-bus": "^3.3.1", - "@nextcloud/files": "^3.9.0", - "@nextcloud/initial-state": "^2.2.0", - "@nextcloud/l10n": "^3.1.0", - "@nextcloud/router": "^3.0.1", - "@nextcloud/sharing": "^0.2.4", - "@nextcloud/typings": "^1.9.1", - "@types/toastify-js": "^1.12.3", - "@vueuse/core": "^11.2.0", - "cancelable-promise": "^4.3.1", - "p-queue": "^8.1.0", - "toastify-js": "^1.12.0", - "vue-frag": "^1.4.3", - "webdav": "^5.7.1" - }, - "engines": { - "node": "^20.0.0", - "npm": "^10.0.0" - }, - "peerDependencies": { - "@nextcloud/vue": "^8.16.0", - "vue": "^2.7.16" - } - }, "node_modules/@nextcloud/eslint-config": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-8.4.2.tgz", @@ -1917,18 +1725,6 @@ "npm": "^10.0.0" } }, - "node_modules/@nextcloud/timezones": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@nextcloud/timezones/-/timezones-0.2.0.tgz", - "integrity": "sha512-1mwQ+asTFOgv9rxPoAMEbDF8JfnenIa2EGNS+8MATCyi6WXxYh0Lhkaq1d3l2+xNbUPHgMnk4cRYsvIo319lkA==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "ical.js": "^2.1.0" - }, - "engines": { - "node": "^20 || ^22" - } - }, "node_modules/@nextcloud/typings": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.9.1.tgz", @@ -1982,77 +1778,6 @@ "spdx-license-ids": "^3.0.0" } }, - "node_modules/@nextcloud/vue": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.27.0.tgz", - "integrity": "sha512-v9aTv5G5zVKN8PJVAP/WTcTspDXr6yxZtgGyQ4El5pZzMWk2+3wANT+VU4mdNCIpiJ2xyYorLs/Gg0Z9y73Anw==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@floating-ui/dom": "^1.1.0", - "@linusborg/vue-simple-portal": "^0.1.5", - "@nextcloud/auth": "^2.4.0", - "@nextcloud/axios": "^2.5.0", - "@nextcloud/browser-storage": "^0.4.0", - "@nextcloud/capabilities": "^1.2.0", - "@nextcloud/event-bus": "^3.3.2", - "@nextcloud/initial-state": "^2.2.0", - "@nextcloud/l10n": "^3.2.0", - "@nextcloud/logger": "^3.0.2", - "@nextcloud/router": "^3.0.1", - "@nextcloud/sharing": "^0.2.3", - "@nextcloud/timezones": "^0.2.0", - "@nextcloud/vue-select": "^3.25.1", - "@vueuse/components": "^11.0.0", - "@vueuse/core": "^11.0.0", - "blurhash": "^2.0.5", - "clone": "^2.1.2", - "debounce": "^2.2.0", - "dompurify": "^3.2.4", - "emoji-mart-vue-fast": "^15.0.4", - "escape-html": "^1.0.3", - "floating-vue": "^1.0.0-beta.19", - "focus-trap": "^7.4.3", - "linkify-string": "^4.0.0", - "md5": "^2.3.0", - "p-queue": "^8.1.0", - "rehype-external-links": "^3.0.0", - "rehype-highlight": "^7.0.2", - "rehype-react": "^7.1.2", - "remark-breaks": "^4.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "remark-unlink-protocols": "^1.0.0", - "splitpanes": "^2.4.1", - "string-length": "^5.0.1", - "striptags": "^3.2.0", - "tabbable": "^6.2.0", - "tributejs": "^5.1.3", - "unified": "^11.0.1", - "unist-builder": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vue": "^2.7.16", - "vue-color": "^2.8.1", - "vue-frag": "^1.4.3", - "vue-router": "^3.6.5", - "vue2-datepicker": "^3.11.0" - }, - "engines": { - "node": "^20.0.0", - "npm": "^10.0.0" - } - }, - "node_modules/@nextcloud/vue-select": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/@nextcloud/vue-select/-/vue-select-3.25.1.tgz", - "integrity": "sha512-jqCi4G+Q0H6+Hm8wSN3vRX2+eXG2jXR2bwBX/sErVEsH5UaxT4Nb7KqgdeIjVfeF7ccIdRqpmIb4Pkf0lao67w==", - "license": "MIT", - "engines": { - "node": "^20.0.0" - }, - "peerDependencies": { - "vue": "2.x" - } - }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -2875,7 +2600,10 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/ms": "*" } @@ -2923,6 +2651,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" @@ -2943,15 +2672,6 @@ "dev": true, "peer": true }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -2961,7 +2681,10 @@ "node_modules/@types/ms": { "version": "0.7.33", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.33.tgz", - "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==" + "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==", + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/node": { "version": "24.0.4", @@ -2979,38 +2702,17 @@ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==", "dev": true }, - "node_modules/@types/react": { - "version": "19.0.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", - "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.0.2" - } - }, "node_modules/@types/semver": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", "license": "MIT" }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" }, - "node_modules/@types/toastify-js": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@types/toastify-js/-/toastify-js-1.12.3.tgz", - "integrity": "sha512-9RjLlbAHMSaae/KZNHGv19VG4gcLIm3YjvacCXBtfMfYn26h76YP5oxXI8k26q4iKXCB9LNfv18lsoS0JnFPTg==" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -3021,22 +2723,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.9.0", @@ -3286,7 +2974,9 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "peer": true }, "node_modules/@vitejs/plugin-vue2": { "version": "2.3.3", @@ -3519,6 +3209,8 @@ "version": "2.7.16", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "dev": true, + "peer": true, "dependencies": { "@babel/parser": "^7.23.5", "postcss": "^8.4.14", @@ -3622,136 +3314,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@vue/tsconfig": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", - "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", - "dev": true - }, - "node_modules/@vueuse/components": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-11.3.0.tgz", - "integrity": "sha512-sqaGtWPgobXvZmv3atcjW8YW0ypecFuB286OEKFXaPrLsA5b2Y+xAvHvq5V7d+VJRKt705gCK3BNBjxu3g1PdQ==", - "license": "MIT", - "dependencies": { - "@vueuse/core": "11.3.0", - "@vueuse/shared": "11.3.0", - "vue-demi": ">=0.14.10" - } - }, - "node_modules/@vueuse/components/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/core": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.3.0.tgz", - "integrity": "sha512-7OC4Rl1f9G8IT6rUfi9JrKiXy4bfmHhZ5x2Ceojy0jnd3mHNEvV4JaRygH362ror6/NZ+Nl+n13LPzGiPN8cKA==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "11.3.0", - "@vueuse/shared": "11.3.0", - "vue-demi": ">=0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.3.0.tgz", - "integrity": "sha512-pwDnDspTqtTo2HwfLw4Rp6yywuuBdYnPYDq+mO38ZYKGebCUQC/nVj/PXSiK9HX5otxLz8Fn7ECPbjiRz2CC3g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.3.0.tgz", - "integrity": "sha512-P8gSSWQeucH5821ek2mn/ciCk+MS/zoRKqdQIM3bHq6p7GXDAJLmnRRKmF5F65sAVJIfzQlwR3aDzwCn10s8hA==", - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -3795,19 +3357,6 @@ "node": ">= 14" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3874,37 +3423,13 @@ "dev": true, "license": "MIT" }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -3937,26 +3462,6 @@ "node": ">= 8" } }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/are-docs-informative": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", @@ -4069,16 +3574,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -4108,16 +3603,6 @@ "util": "^0.12.5" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -4157,35 +3642,11 @@ "dev": true, "license": "MIT" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4201,23 +3662,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" - }, "node_modules/axios": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", @@ -4240,16 +3684,6 @@ "axios": "0.x || 1.x" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4280,16 +3714,6 @@ } ] }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -4313,24 +3737,6 @@ "integrity": "sha512-DPUO/EjNANCgSVg0geTy1vmUpu5hhp9tV2F7xUSTUd1jwe4XpwupGB+lt5PhVUqpqAk+zK1etqp6Pl/HVf71Ug==", "dev": true }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/blurhash": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", - "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==", - "license": "MIT" - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -4573,15 +3979,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4676,15 +4073,6 @@ "node": ">=8" } }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -4768,13 +4156,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chai": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", @@ -4822,24 +4203,6 @@ "node": ">=8" } }, - "node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -4858,15 +4221,6 @@ "node": ">= 16" } }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4892,22 +4246,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/ci-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", - "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -4917,73 +4255,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/clamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "1.4.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5004,23 +4275,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5032,26 +4286,6 @@ "node": ">= 0.8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/comment-parser": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", @@ -5069,15 +4303,6 @@ "dev": true, "license": "MIT" }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/compare-versions": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", @@ -5297,239 +4522,63 @@ "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true, + "peer": true + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } }, - "node_modules/cypress": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.5.0.tgz", - "integrity": "sha512-1HOnKvWep0LkWuFwPeWkZ0TDl7ivi2/Mz+WNU4dfkeLJaFndS3Ow6TXT7YjuTqLFI2peJKzPKljVUFdymI2K5g==", + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, - "hasInstallScript": true, - "license": "MIT", "dependencies": { - "@cypress/request": "^3.0.8", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.7.1", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "ci-info": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-table3": "0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "hasha": "5.2.2", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.7.1", - "supports-color": "^8.1.1", - "tmp": "~0.2.3", - "tree-kill": "1.2.2", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": ">=18" } }, - "node_modules/cypress-file-upload": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", - "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=8.2.1" + "node": ">=6.0" }, - "peerDependencies": { - "cypress": ">3.0.0" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/cypress/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/cypress/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cypress/node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true - }, - "node_modules/cypress/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/date-format-parse": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/date-format-parse/-/date-format-parse-0.2.7.tgz", - "integrity": "sha512-/+lyMUKoRogMuTeOVii6lUwjbVlesN9YRYLzZT/g3TEZ3uD9QnpjResujeEqUW+OSNbT7T1+SYdyEkTcRv+KDQ==" - }, - "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", - "dev": true - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debounce": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", - "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", "dev": true, "license": "MIT" }, - "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -5595,15 +4644,6 @@ "dev": true, "license": "ISC" }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/des.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", @@ -5613,19 +4653,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -5709,17 +4736,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.5.102", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", @@ -5747,19 +4763,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/emoji-mart-vue-fast": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.4.tgz", - "integrity": "sha512-OjuxqoMJRTTG7Vevz0mR1ZnqY1DI8gGnmoskuuC8qL8VwwTjrGdwAO4WRWtAUN8P6Di7kxvY6cUgNETNFmbP4A==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.18.6", - "core-js": "^3.23.5" - }, - "peerDependencies": { - "vue": ">2.0.0" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5775,15 +4778,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -5799,18 +4793,6 @@ "node": ">=10.13.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -6008,15 +4990,6 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", @@ -6736,12 +5709,6 @@ "node": ">=6" } }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -6760,41 +5727,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/expect-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", @@ -6805,41 +5737,6 @@ "node": ">=12.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6926,15 +5823,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -6957,21 +5845,6 @@ "node": "^12.20 || >= 14.13" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -7035,43 +5908,6 @@ "dev": true, "peer": true }, - "node_modules/floating-vue": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-1.0.0-beta.19.tgz", - "integrity": "sha512-OcM7z5Ua4XAykqolmvPj3l1s+KqUKj6Xz2t66eqjgaWfNBjtuifmxO5+4rRXakIch/Crt8IH+vKdKcR3jOUaoQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^0.1.10", - "vue-resize": "^1.0.0" - }, - "peerDependencies": { - "vue": "^2.6.10" - } - }, - "node_modules/floating-vue/node_modules/@floating-ui/core": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.3.1.tgz", - "integrity": "sha512-ensKY7Ub59u16qsVIFEo2hwTCqZ/r9oZZFh51ivcLGHfUwTn8l1Xzng8RJUe91H/UP8PeqeBronAGx0qmzwk2g==", - "license": "MIT" - }, - "node_modules/floating-vue/node_modules/@floating-ui/dom": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.1.10.tgz", - "integrity": "sha512-4kAVoogvQm2N0XE0G6APQJuCNuErjOfPW8Ux7DFxh8+AfugWflwVJ5LDlHOwrwut7z/30NUvdtHzQ3zSip4EzQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^0.3.0" - } - }, - "node_modules/focus-trap": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", - "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } - }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -7134,16 +5970,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", @@ -7287,21 +6113,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -7333,29 +6144,10 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/gettext-extractor": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/gettext-extractor/-/gettext-extractor-3.8.0.tgz", - "integrity": "sha512-i/3mDQufQoJd2/EKm/B+VlaYrt3yGjVfLZu8DQpESKH29klNiW6z2S89FVCIEB85bDNgtGCeM/3A/yR1njr/Lw==", + "node_modules/gettext-extractor": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/gettext-extractor/-/gettext-extractor-3.8.0.tgz", + "integrity": "sha512-i/3mDQufQoJd2/EKm/B+VlaYrt3yGjVfLZu8DQpESKH29klNiW6z2S89FVCIEB85bDNgtGCeM/3A/yR1njr/Lw==", "dev": true, "dependencies": { "@types/glob": "5 - 7", @@ -7434,21 +6226,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7627,33 +6404,6 @@ "minimalistic-assert": "^1.0.1" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -7665,69 +6415,6 @@ "node": ">= 0.4" } }, - "node_modules/hast-to-hyperscript": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.3.tgz", - "integrity": "sha512-NuBoUStp4fRwmvlfbidlEiRSTk0gSHm+97q4Xn9CJ10HO+Py7nlTuDi6RhM1qLOureukGrCXLG7AAxaGqqyslQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-to-hyperscript/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7738,15 +6425,6 @@ "he": "bin/he" } }, - "node_modules/highlight.js": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -7793,21 +6471,6 @@ "node": ">= 14" } }, - "node_modules/http-signature": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", - "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.18.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -7828,21 +6491,6 @@ "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/ical.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.1.0.tgz", - "integrity": "sha512-BOVfrH55xQ6kpS3muGvIXIg2l7p+eoe12/oS7R5yrO3TL/j/bLsR0PR+tYQESFbyTbvGgPHn9zQ6tI4FWyuSaQ==", - "license": "MPL-2.0" - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -7929,15 +6577,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -7953,21 +6592,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT" - }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -7983,18 +6607,6 @@ "node": ">= 0.4" } }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-arguments": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", @@ -8206,22 +6818,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -8283,22 +6879,11 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -8348,18 +6933,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -8421,25 +6994,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -8474,13 +7028,6 @@ "node": ">=10" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -8596,13 +7143,6 @@ "dev": true, "peer": true }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", @@ -8688,13 +7228,6 @@ "node": ">=6" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8709,13 +7242,6 @@ "dev": true, "peer": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -8741,22 +7267,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", @@ -8769,15 +7279,6 @@ "resolved": "https://registry.npmjs.org/layerr/-/layerr-3.0.0.tgz", "integrity": "sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==" }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8801,49 +7302,6 @@ "uc.micro": "^2.0.0" } }, - "node_modules/linkify-string": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-4.2.0.tgz", - "integrity": "sha512-LqOKk0+RlqibFkxjPAGOL7Mfssqj6/SdG9QWGvzeVDpoWXhaw9OXxseCtFanjIl7C6UyTTZizhyGr4IWLfijiw==", - "license": "MIT", - "peerDependencies": { - "linkifyjs": "^4.0.0" - } - }, - "node_modules/linkifyjs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", - "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", - "license": "MIT", - "peer": true - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, "node_modules/local-pkg": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", @@ -8889,82 +7347,6 @@ "dev": true, "peer": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loupe": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", @@ -8972,21 +7354,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lowlight": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", - "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.0.0", - "highlight.js": "~11.11.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -9075,11 +7442,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/material-colors": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", - "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -9109,120 +7471,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-6.0.0.tgz", - "integrity": "sha512-6NDbJPTg0M0Ye+TlYwX1KJ1LFbp515P2immRJyJQhc9Na9cetHzSoHNYIQcXpANEAP1sm9yd/CTZU2uHqR5A+w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-newline-to-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", - "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-find-and-replace": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -9241,464 +7489,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", - "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9749,15 +7549,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -9785,6 +7576,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9824,7 +7616,8 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/muggle-string": { "version": "0.4.1", @@ -9837,6 +7630,7 @@ "version": "3.3.8", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, "funding": [ { "type": "github", @@ -9985,18 +7779,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -10100,21 +7882,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -10140,12 +7907,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true - }, "node_modules/p-cancelable": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", @@ -10196,21 +7957,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-queue": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", @@ -10461,23 +8207,11 @@ "inherits": "^2.0.1" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -10493,15 +8227,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", @@ -10546,6 +8271,7 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10598,7 +8324,9 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, "optional": true, + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -10609,18 +8337,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -10635,16 +8351,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -10668,16 +8374,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -10790,12 +8486,6 @@ "node": ">=8.10.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", @@ -10814,229 +8504,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rehype-external-links": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", - "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-is-element": "^3.0.0", - "is-absolute-url": "^4.0.0", - "space-separated-tokens": "^2.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-highlight": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", - "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-text": "^4.0.0", - "lowlight": "^3.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-react": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.2.0.tgz", - "integrity": "sha512-MHYyCHka+3TtzBMKtcuvVOBAbI1HrfoYA+XH9m7/rlrQQATCPwtJnPdkxKKcIGF8vc9mxqQja9r9f+FHItQeWg==", - "license": "MIT", - "dependencies": { - "@mapbox/hast-util-table-cell-style": "^0.2.0", - "@types/hast": "^2.0.0", - "hast-to-hyperscript": "^10.0.0", - "hast-util-whitespace": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=17" - } - }, - "node_modules/rehype-react/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/rehype-react/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/rehype-react/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/rehype-react/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-react/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-react/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-react/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-breaks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", - "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-newline-to-break": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", - "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-unlink-protocols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remark-unlink-protocols/-/remark-unlink-protocols-1.0.0.tgz", - "integrity": "sha512-5j/F28jhFmxeyz8nuJYYIWdR4nNpKWZ8A+tVwnK/0pq7Rjue33CINEYSckSq2PZvedhKUwbn08qyiuGoPLBung==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-squeeze-paragraphs": "^6.0.0", - "unist-util-visit": "^5.0.0" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -11110,19 +8577,6 @@ "node": ">=10" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -11134,12 +8588,6 @@ "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11347,15 +8795,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -11577,12 +9016,6 @@ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -11593,24 +9026,11 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11619,21 +9039,12 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/spdx-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", @@ -11697,44 +9108,13 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/splitpanes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.4.1.tgz", - "integrity": "sha512-kpEo1WuMXuc6QfdQdO2V/fl/trONlkUKp+pputsLTiW9RMtwEvjb4/aYGm2m3+KAzjmb+zLwr4A4SYZu74+pgQ==" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/stable-hash": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", @@ -11798,46 +9178,6 @@ "node": ">=0.6.19" } }, - "node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11940,15 +9280,6 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -11981,25 +9312,11 @@ "dev": true, "license": "MIT" }, - "node_modules/striptags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", - "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" - }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -12034,12 +9351,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12160,18 +9471,6 @@ "dev": true, "peer": true }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -12191,11 +9490,6 @@ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -12296,15 +9590,6 @@ "integrity": "sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==", "dev": true }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, "node_modules/to-buffer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", @@ -12338,11 +9623,6 @@ "node": ">=8.0" } }, - "node_modules/toastify-js": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", - "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" - }, "node_modules/tough-cookie": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", @@ -12369,40 +9649,6 @@ "node": ">=18" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tributejs": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/tributejs/-/tributejs-5.1.3.tgz", - "integrity": "sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ==" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -12452,12 +9698,6 @@ "node": ">=4" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -12475,26 +9715,6 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12508,18 +9728,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -12686,120 +9894,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-builder": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", - "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universal-user-agent": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", @@ -12830,15 +9924,6 @@ "node": ">=14.0.0" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", @@ -12936,59 +10021,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", @@ -13273,22 +10305,13 @@ "version": "2.7.16", "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "dev": true, + "peer": true, "dependencies": { "@vue/compiler-sfc": "2.7.16", "csstype": "^3.1.0" } }, - "node_modules/vue-color": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/vue-color/-/vue-color-2.8.1.tgz", - "integrity": "sha512-BoLCEHisXi2QgwlhZBg9UepvzZZmi4176vbr+31Shen5WWZwSLVgdScEPcB+yrAtuHAz42309C0A4+WiL9lNBw==", - "dependencies": { - "clamp": "^1.0.1", - "lodash.throttle": "^4.0.0", - "material-colors": "^1.0.0", - "tinycolor2": "^1.1.2" - } - }, "node_modules/vue-eslint-parser": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", @@ -13367,52 +10390,6 @@ "node": ">=10" } }, - "node_modules/vue-frag": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/vue-frag/-/vue-frag-1.4.3.tgz", - "integrity": "sha512-pQZj03f/j9LRhzz9vKaXTCXUHVYHuAXicshFv76VFqwz4MG3bcb+sPZMAbd0wmw7THjkrTPuoM0EG9TbG8CgMQ==", - "funding": { - "url": "https://github.com/privatenumber/vue-frag?sponsor=1" - }, - "peerDependencies": { - "vue": "^2.6.0" - } - }, - "node_modules/vue-material-design-icons": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.3.1.tgz", - "integrity": "sha512-6UNEyhlTzlCeT8ZeX5WbpUGFTTPSbOoTQeoASTv7X4Ylh0pe8vltj+36VMK56KM0gG8EQVoMK/Qw/6evalg8lA==", - "dev": true - }, - "node_modules/vue-resize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", - "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "vue": "^2.6.0" - } - }, - "node_modules/vue-router": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", - "license": "MIT" - }, - "node_modules/vue2-datepicker": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/vue2-datepicker/-/vue2-datepicker-3.11.1.tgz", - "integrity": "sha512-6PU/+pnp2mgZAfnSXmbdwj9516XsEvTiw61Q5SNrvvdy8W/FCxk1GAe9UZn/m9YfS5A47yK6XkcjMHbp7aFApA==", - "dependencies": { - "date-format-parse": "^0.2.7" - }, - "peerDependencies": { - "vue": "^2.5.0" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -13434,16 +10411,6 @@ "node": ">=18" } }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -13631,23 +10598,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", @@ -13740,16 +10690,6 @@ "node": ">= 14" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/zod": { "version": "3.25.7", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.7.tgz", diff --git a/package.json b/package.json index 75190a86..40e3ee7e 100644 --- a/package.json +++ b/package.json @@ -37,12 +37,10 @@ "build": "vite --mode production build", "build:doc": "typedoc --out dist/doc lib && touch dist/doc/.nojekyll", "prerelease:format-changelog": "node build/format-changelog.mjs", - "cypress": "cypress run --component", - "cypress:gui": "cypress open --component", "dev": "vite --mode development build", "l10n:extract": "node build/extract-l10n.js", - "lint": "eslint --ext .js,.ts,.vue .", - "lint:fix": "eslint --ext .js,.ts,.vue --fix .", + "lint": "eslint --ext .js,.ts .", + "lint:fix": "eslint --ext .js,.ts --fix .", "test": "vitest run", "test:coverage": "vitest run --coverage", "test:watch": "vitest watch", @@ -52,7 +50,6 @@ "@nextcloud/auth": "^2.5.1", "@nextcloud/axios": "^2.5.1", "@nextcloud/capabilities": "^1.2.0", - "@nextcloud/dialogs": "^6.1.1", "@nextcloud/files": "^3.10.2", "@nextcloud/l10n": "^3.3.0", "@nextcloud/logger": "^3.0.2", @@ -68,17 +65,12 @@ }, "devDependencies": { "@codecov/vite-plugin": "^1.9.1", - "@cypress/vue2": "^2.1.1", "@nextcloud/eslint-config": "^8.4.2", "@nextcloud/vite-config": "^1.5.2", - "@nextcloud/vue": "^8.27.0", "@tsconfig/cypress": "^1.0.3", "@types/node": "^24.0.4", "@vitest/coverage-v8": "^3.2.4", - "@vue/tsconfig": "^0.5.1", "blob-polyfill": "^9.0.20240710", - "cypress": "^14.5.0", - "cypress-file-upload": "^5.0.8", "gettext-extractor": "^3.8.0", "gettext-parser": "^8.0.0", "jsdom": "^26.1.0", @@ -86,13 +78,8 @@ "typescript": "^5.8.3", "vite": "^6.3.5", "vitest": "^3.2.0", - "vue-material-design-icons": "^5.3.1", "webdav": "^5.8.0" }, - "peerDependencies": { - "@nextcloud/vue": "^8.0.0", - "vue": "^2.7.16" - }, "engines": { "node": "^20.0.0", "npm": "^10.0.0" diff --git a/tsconfig.json b/tsconfig.json index 93884b3c..a8aec9e5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,22 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@vue/tsconfig/tsconfig.json", "compilerOptions": { "allowImportingTsExtensions": true, "allowSyntheticDefaultImports": true, "declaration": true, - "esModuleInterop": true, "emitDeclarationOnly": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", "moduleResolution": "Bundler", "noEmit": false, + "noImplicitThis": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "useDefineForClassFields": true, + "verbatimModuleSyntax": true, "lib": ["DOM", "ESNext"], "outDir": "./dist", "rootDir": "lib/", @@ -21,8 +29,5 @@ "build", "dist", "node_modules" - ], - "vueCompilerOptions": { - "target": 2.7 - } + ] } diff --git a/vite.config.ts b/vite.config.ts index 34170d48..f3f7de8a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -29,13 +29,6 @@ export default defineConfig((env) => { index: 'lib/index.ts', }, { libraryFormats: ['es', 'cjs'], - nodeExternalsOptions: { - // for subpath imports like '@nextcloud/l10n/gettext' - include: [/^@nextcloud\//], - // we should externalize vue SFC dependencies - exclude: [/^vue-material-design-icons\//], - }, - inlineCSS: true, replace: { __TRANSLATIONS__: JSON.stringify(translations),