diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 2c4a305ee..79bab7734 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -1,70 +1,25 @@ name: Code Quality on: + push: + branches: [main, development, feature/**, bugfix/**, hotfix/**] pull_request: - branches: [main, master, development] - -concurrency: - group: quality-${{ github.head_ref || github.ref }} - cancel-in-progress: true + branches: [main, beta, development] + workflow_dispatch: jobs: - php-checks: - name: ${{ matrix.check.name }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - check: - - { name: "PHP Lint", command: "composer lint" } - - { name: "PHPCS", command: "./vendor/bin/phpcs --standard=phpcs.xml" } - - { name: "PHPMD", command: "./vendor/bin/phpmd lib text phpmd.xml" } - - { name: "Psalm", command: "./vendor/bin/psalm --threads=1 --no-cache --output-format=github" } - - { name: "PHPStan", command: "./vendor/bin/phpstan analyse --memory-limit=1G" } - - { name: "PHPUnit", command: "./vendor/bin/phpunit --colors=always" } - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.1' - extensions: mbstring, xml, ctype, iconv, intl, dom, filter, gd, json, posix, zip, soap - tools: composer:v2 - - - name: Cache Composer dependencies - uses: actions/cache@v4 - with: - path: vendor - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader - - - name: ${{ matrix.check.name }} - run: ${{ matrix.check.command }} - frontend-quality: - name: Frontend Quality - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: ESLint - run: npm run lint - - - name: Stylelint - run: npm run stylelint + quality: + uses: ConductionNL/.github/.github/workflows/quality.yml@main + with: + app-name: openconnector + php-version: "8.3" + nextcloud-test-refs: '["stable32"]' + enable-phpcs: false + enable-psalm: true + enable-phpstan: true + enable-phpmetrics: true + enable-frontend: true + enable-eslint: true + enable-phpunit: true + enable-sbom: true + additional-apps: '[{"repo":"ConductionNL/openregister","app":"openregister"}]' diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index f12a13f12..a610477a0 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -2,52 +2,12 @@ name: Documentation on: push: - branches: - - development + branches: [documentation] pull_request: - branches: - - development + branches: [documentation] jobs: deploy: - name: Deploy Documentation - runs-on: ubuntu-latest - steps: - # https://github.com/marketplace/actions/checkout - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - # Verify directory structure - - name: List directory structure - run: | - ls -la - ls -la docusaurus/ - - # Generate SVG files using PlantUML - - name: plantuml - id: plantuml - uses: grassedge/generate-plantuml-action@v1.5 - with: - message: "Render PlantUML files" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # https://github.com/marketplace/actions/docusaurus-builddeploy-action - - name: Deploy Docusaurus - id: deploy - uses: redkubes/docusaurus-deploy-action@v1.2 - with: - source-folder: docusaurus - git-user: ${{ github.actor }} - git-password: ${{ secrets.GITHUB_TOKEN }} - deployment-branch: gh-pages - - # https://github.com/marketplace/actions/create-an-issue - - name: Create issue on failure - if: failure() - uses: JasonEtco/create-an-issue@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - filename: .github/DOCUMENTATION_ISSUE_TEMPLATE.md \ No newline at end of file + uses: ConductionNL/.github/.github/workflows/documentation.yml@main + with: + cname: conductionnl.github.io diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml deleted file mode 100644 index ac53113d5..000000000 --- a/.github/workflows/sbom.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: SBOM - -on: - push: - branches: [main, development, feature/**, bugfix/**, hotfix/**] - pull_request: - branches: [main, development] - -jobs: - sbom: - runs-on: ubuntu-latest - name: "SBOM Generation & Validation" - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref || github.ref_name }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "8.3" - extensions: mbstring, intl, zip, gd, curl, xml, json - tools: composer:v2 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Cache Composer dependencies - uses: actions/cache@v4 - with: - path: vendor - key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader - - - name: Generate PHP SBOM - run: composer CycloneDX:make-sbom --output-format=JSON --output-file=bom-php.cdx.json --spec-version=1.5 --omit=dev --omit=plugin - - - name: Install npm dependencies - run: npm ci - - - name: Generate npm SBOM - run: npx @cyclonedx/cyclonedx-npm --output-file bom-npm.cdx.json --spec-version 1.5 --omit dev - - - name: Merge PHP + npm SBOMs - run: | - jq -s '.[0] * {components: ([.[].components[]?] | unique_by(.purl // .name))}' bom-php.cdx.json bom-npm.cdx.json > sbom.cdx.json - - - name: Install Grype - uses: anchore/scan-action/download-grype@v5 - - - name: CVE scan SBOM - run: grype sbom:sbom.cdx.json --fail-on critical - - - name: Composer audit - run: composer audit --format=json || true - - - name: npm audit - run: npm audit --audit-level=critical - - - name: Commit SBOM - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add sbom.cdx.json - if git diff --cached --quiet; then - echo "No SBOM changes to commit" - else - git commit -m "chore: update SBOM" - git push - fi - - - name: Upload SBOM artifact - uses: actions/upload-artifact@v4 - with: - name: sbom-openconnector - path: sbom.cdx.json - retention-days: 90 - - - name: Attach SBOM to release - if: ${{ startsWith(github.ref, 'refs/tags/') }} - uses: softprops/action-gh-release@v2 - with: - files: sbom.cdx.json diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 738d3ddb6..000000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: Unit Tests & Coverage - -on: - pull_request: - branches: - # - main - # - master - # - development - # - dev - - never - push: - branches: - # - main - # - master - # - development - # - dev - - never - -jobs: - unit-tests: - name: PHPUnit Tests - runs-on: ubuntu-latest - - strategy: - matrix: - php-versions: ['8.1', '8.2', '8.3'] - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup PHP ${{ matrix.php-versions }} - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - extensions: mbstring, xml, ctype, iconv, intl, pdo, pdo_mysql, dom, filter, gd, json, posix, simplexml, xmlreader, xmlwriter, zip - coverage: xdebug - tools: composer:v2 - - - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-interaction - - - name: Run unit tests - run: composer test:unit - continue-on-error: false - - - name: Run integration tests - run: composer test:integration || echo "Integration tests require Nextcloud environment" - continue-on-error: true - - - name: Generate coverage report - if: matrix.php-versions == '8.1' - run: composer test:coverage || echo "Coverage requires Nextcloud environment" - continue-on-error: true - - - name: Check coverage threshold - if: matrix.php-versions == '8.1' - id: coverage - run: | - if [ -f coverage/clover.xml ]; then - composer coverage:check || true - COVERAGE=$(php -r "$xml = simplexml_load_file('coverage/clover.xml'); $metrics = $xml->project->metrics; $statements = (int)$metrics['statements']; $covered = (int)$metrics['coveredstatements']; $percentage = $statements > 0 ? round(($covered / $statements) * 100, 2) : 0; echo $percentage;") - echo "percentage=$COVERAGE" >> $GITHUB_OUTPUT - echo "### Test Coverage: $COVERAGE%" >> $GITHUB_STEP_SUMMARY - - if (( $(echo "$COVERAGE < 75" | bc -l) )); then - echo "⚠️ Test coverage ($COVERAGE%) is below recommended 75%." >> $GITHUB_STEP_SUMMARY - echo "warning=true" >> $GITHUB_OUTPUT - else - echo "✅ Test coverage meets requirements!" >> $GITHUB_STEP_SUMMARY - echo "warning=false" >> $GITHUB_OUTPUT - fi - else - echo "percentage=0" >> $GITHUB_OUTPUT - echo "warning=true" >> $GITHUB_OUTPUT - echo "⚠️ No coverage report generated (requires Nextcloud environment)." >> $GITHUB_STEP_SUMMARY - fi - continue-on-error: true - - - name: Upload coverage reports - if: matrix.php-versions == '8.1' - uses: actions/upload-artifact@v3 - with: - name: coverage-report - path: coverage/ - retention-days: 30 - - - name: Comment PR with Coverage Report - if: github.event_name == 'pull_request' && matrix.php-versions == '8.1' - uses: actions/github-script@v7 - with: - script: | - const coverage = '${{ steps.coverage.outputs.percentage }}'; - const warning = '${{ steps.coverage.outputs.warning }}' === 'true'; - - if (coverage !== '0') { - const emoji = warning ? '⚠️' : '✅'; - const status = warning ? 'Below recommended threshold' : 'Meets requirements'; - - const body = `## ${emoji} Test Coverage Report - - ### Coverage: **${coverage}%** (${status}) - - | Threshold | Required | Current | Status | - |-----------|----------|---------|--------| - | Minimum | 75% | ${coverage}% | ${warning ? '⚠️ Below threshold' : '✅ Pass'} | - | Recommended | 85% | ${coverage}% | ${parseFloat(coverage) >= 85 ? '✅ Pass' : '⚠️ Below recommended'} | - - ${warning ? - '⚠️ **Warning:** Coverage is below the recommended 75% threshold. Consider adding more tests.' : - '✅ **Success:** Test coverage meets requirements.'} - - 📊 Full coverage report is available in the workflow artifacts. - `; - - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: body - }); - } - continue-on-error: true - diff --git a/.license-overrides.json b/.license-overrides.json new file mode 100644 index 000000000..48452a289 --- /dev/null +++ b/.license-overrides.json @@ -0,0 +1,4 @@ +{ + "@fortawesome/free-solid-svg-icons": "License is (CC-BY-4.0 AND MIT) — both are approved open-source licenses, compound AND expression not parsed by checker", + "apexcharts": "MIT — apexcharts uses MIT license but npm metadata has custom logo URL in license field" +} diff --git a/composer.json b/composer.json index 302c54fc7..7a5036606 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "lint": "find . -name \\*.php -not -path './vendor/*' -not -path './vendor-bin/*' -not -path './build/*' -print0 | xargs -0 -n1 php -l", "cs:check": "./vendor/bin/phpcs --standard=phpcs.xml", "cs:fix": "./vendor/bin/phpcbf --standard=phpcs.xml", - "phpcs": "./vendor/bin/phpcs --standard=phpcs.xml", + "phpcs": "./vendor/bin/phpcs --standard=phpcs.xml --warning-severity=0", "phpcs:fix": "./vendor/bin/phpcbf --standard=phpcs.xml", "phpcs:output": "./vendor/bin/phpcs --standard=phpcs.xml --report=json lib/ 2>/dev/null | tail -1 > phpcs-output.json", "phpmd": "phpmd lib text phpmd.xml || echo 'PHPMD not installed, skipping...'", diff --git a/docusaurus/.gitignore b/docs/.gitignore similarity index 100% rename from docusaurus/.gitignore rename to docs/.gitignore diff --git a/docusaurus/blog/2019-05-28-first-blog-post.md b/docs/blog/2019-05-28-first-blog-post.md similarity index 100% rename from docusaurus/blog/2019-05-28-first-blog-post.md rename to docs/blog/2019-05-28-first-blog-post.md diff --git a/docusaurus/blog/2019-05-29-long-blog-post.md b/docs/blog/2019-05-29-long-blog-post.md similarity index 100% rename from docusaurus/blog/2019-05-29-long-blog-post.md rename to docs/blog/2019-05-29-long-blog-post.md diff --git a/docusaurus/blog/2021-08-01-mdx-blog-post.mdx b/docs/blog/2021-08-01-mdx-blog-post.mdx similarity index 100% rename from docusaurus/blog/2021-08-01-mdx-blog-post.mdx rename to docs/blog/2021-08-01-mdx-blog-post.mdx diff --git a/docusaurus/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg similarity index 100% rename from docusaurus/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg rename to docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg diff --git a/docusaurus/blog/2021-08-26-welcome/index.md b/docs/blog/2021-08-26-welcome/index.md similarity index 100% rename from docusaurus/blog/2021-08-26-welcome/index.md rename to docs/blog/2021-08-26-welcome/index.md diff --git a/docusaurus/blog/authors.yml b/docs/blog/authors.yml similarity index 100% rename from docusaurus/blog/authors.yml rename to docs/blog/authors.yml diff --git a/docusaurus/blog/tags.yml b/docs/blog/tags.yml similarity index 100% rename from docusaurus/blog/tags.yml rename to docs/blog/tags.yml diff --git a/docusaurus/README.md b/docs/docusaurus-README.md similarity index 100% rename from docusaurus/README.md rename to docs/docusaurus-README.md diff --git a/docusaurus/docusaurus.config.js b/docs/docusaurus.config.js similarity index 100% rename from docusaurus/docusaurus.config.js rename to docs/docusaurus.config.js diff --git a/docusaurus/package-lock.json b/docs/package-lock.json similarity index 100% rename from docusaurus/package-lock.json rename to docs/package-lock.json diff --git a/docusaurus/package.json b/docs/package.json similarity index 100% rename from docusaurus/package.json rename to docs/package.json diff --git a/docusaurus/sidebars.js b/docs/sidebars.js similarity index 100% rename from docusaurus/sidebars.js rename to docs/sidebars.js diff --git a/docusaurus/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js similarity index 100% rename from docusaurus/src/components/HomepageFeatures/index.js rename to docs/src/components/HomepageFeatures/index.js diff --git a/docusaurus/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css similarity index 100% rename from docusaurus/src/components/HomepageFeatures/styles.module.css rename to docs/src/components/HomepageFeatures/styles.module.css diff --git a/docusaurus/src/css/custom.css b/docs/src/css/custom.css similarity index 100% rename from docusaurus/src/css/custom.css rename to docs/src/css/custom.css diff --git a/docusaurus/src/pages/index.js b/docs/src/pages/index.js similarity index 100% rename from docusaurus/src/pages/index.js rename to docs/src/pages/index.js diff --git a/docusaurus/src/pages/index.module.css b/docs/src/pages/index.module.css similarity index 100% rename from docusaurus/src/pages/index.module.css rename to docs/src/pages/index.module.css diff --git a/docusaurus/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md similarity index 100% rename from docusaurus/src/pages/markdown-page.md rename to docs/src/pages/markdown-page.md diff --git a/docusaurus/static/.nojekyll b/docs/static/.nojekyll similarity index 100% rename from docusaurus/static/.nojekyll rename to docs/static/.nojekyll diff --git a/docusaurus/static/img/docusaurus-social-card.jpg b/docs/static/img/docusaurus-social-card.jpg similarity index 100% rename from docusaurus/static/img/docusaurus-social-card.jpg rename to docs/static/img/docusaurus-social-card.jpg diff --git a/docusaurus/static/img/docusaurus.png b/docs/static/img/docusaurus.png similarity index 100% rename from docusaurus/static/img/docusaurus.png rename to docs/static/img/docusaurus.png diff --git a/docusaurus/static/img/favicon.ico b/docs/static/img/favicon.ico similarity index 100% rename from docusaurus/static/img/favicon.ico rename to docs/static/img/favicon.ico diff --git a/docusaurus/static/img/logo.svg b/docs/static/img/logo.svg similarity index 100% rename from docusaurus/static/img/logo.svg rename to docs/static/img/logo.svg diff --git a/docusaurus/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg similarity index 100% rename from docusaurus/static/img/undraw_docusaurus_mountain.svg rename to docs/static/img/undraw_docusaurus_mountain.svg diff --git a/docusaurus/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg similarity index 100% rename from docusaurus/static/img/undraw_docusaurus_react.svg rename to docs/static/img/undraw_docusaurus_react.svg diff --git a/docusaurus/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg similarity index 100% rename from docusaurus/static/img/undraw_docusaurus_tree.svg rename to docs/static/img/undraw_docusaurus_tree.svg diff --git a/lib/Controller/DashboardController.php b/lib/Controller/DashboardController.php index ddae50628..69828af8c 100644 --- a/lib/Controller/DashboardController.php +++ b/lib/Controller/DashboardController.php @@ -27,7 +27,6 @@ * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.ExcessiveParameterList) * @SuppressWarnings(PHPMD.MissingImport) - * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ class DashboardController extends Controller { diff --git a/lib/Controller/EventsController.php b/lib/Controller/EventsController.php index 2897d3b95..2e76cfec0 100644 --- a/lib/Controller/EventsController.php +++ b/lib/Controller/EventsController.php @@ -23,7 +23,6 @@ * @SuppressWarnings(PHPMD.ShortVariable) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyPublicMethods) - * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ class EventsController extends Controller diff --git a/lib/Controller/SourcesController.php b/lib/Controller/SourcesController.php index 7d68a6461..ba0f7cc12 100644 --- a/lib/Controller/SourcesController.php +++ b/lib/Controller/SourcesController.php @@ -21,7 +21,6 @@ * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.CamelCaseVariableName) - * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ class SourcesController extends Controller diff --git a/lib/Controller/SynchronizationsController.php b/lib/Controller/SynchronizationsController.php index ba2dc457c..c6de8e0c2 100644 --- a/lib/Controller/SynchronizationsController.php +++ b/lib/Controller/SynchronizationsController.php @@ -27,7 +27,6 @@ * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.MissingImport) * @SuppressWarnings(PHPMD.TooManyPublicMethods) * @SuppressWarnings(PHPMD.UnusedFormalParameter) @@ -341,6 +340,8 @@ public function logs(SearchService $searchService): JSONResponse * "isValid": true, * "validationErrors": [] * } + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $force is a simple toggle to bypass change detection */ public function test(int $id, ?bool $force = false): JSONResponse { diff --git a/lib/Cron/JobTask.php b/lib/Cron/JobTask.php index b57ccc9fc..29215a42d 100644 --- a/lib/Cron/JobTask.php +++ b/lib/Cron/JobTask.php @@ -29,7 +29,6 @@ * scheduled intervals and configurations. * * @psalm-api - * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ class JobTask extends TimedJob { diff --git a/lib/Cron/LogCleanUpTask.php b/lib/Cron/LogCleanUpTask.php index bf5bbc3c1..fe2eda50e 100644 --- a/lib/Cron/LogCleanUpTask.php +++ b/lib/Cron/LogCleanUpTask.php @@ -31,7 +31,6 @@ * from the database to prevent database bloat and maintain performance. * * @psalm-api - * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.LongVariable) */ class LogCleanUpTask extends TimedJob diff --git a/lib/Dashboard/JobQueueWidget.php b/lib/Dashboard/JobQueueWidget.php index d00c72beb..914e6cbc6 100644 --- a/lib/Dashboard/JobQueueWidget.php +++ b/lib/Dashboard/JobQueueWidget.php @@ -8,9 +8,6 @@ use OCP\IURLGenerator; use OCP\Util; -/** - * @SuppressWarnings(PHPMD.StaticAccess) - */ class JobQueueWidget implements IWidget { @@ -75,6 +72,8 @@ public function getUrl(): ?string /** * @inheritDoc + * + * @SuppressWarnings(PHPMD.StaticAccess) — Nextcloud Util API is static by design */ public function load(): void { diff --git a/lib/Dashboard/RecentCallsWidget.php b/lib/Dashboard/RecentCallsWidget.php index 0dac2ca12..cf6582cd8 100644 --- a/lib/Dashboard/RecentCallsWidget.php +++ b/lib/Dashboard/RecentCallsWidget.php @@ -8,9 +8,6 @@ use OCP\IURLGenerator; use OCP\Util; -/** - * @SuppressWarnings(PHPMD.StaticAccess) - */ class RecentCallsWidget implements IWidget { @@ -75,6 +72,8 @@ public function getUrl(): ?string /** * @inheritDoc + * + * @SuppressWarnings(PHPMD.StaticAccess) — Nextcloud Util API is static by design */ public function load(): void { diff --git a/lib/Dashboard/SourceSyncWidget.php b/lib/Dashboard/SourceSyncWidget.php index 474122837..0bd95d217 100644 --- a/lib/Dashboard/SourceSyncWidget.php +++ b/lib/Dashboard/SourceSyncWidget.php @@ -8,9 +8,6 @@ use OCP\IURLGenerator; use OCP\Util; -/** - * @SuppressWarnings(PHPMD.StaticAccess) - */ class SourceSyncWidget implements IWidget { @@ -75,6 +72,8 @@ public function getUrl(): ?string /** * @inheritDoc + * + * @SuppressWarnings(PHPMD.StaticAccess) — Nextcloud Util API is static by design */ public function load(): void { diff --git a/lib/Db/CallLogMapper.php b/lib/Db/CallLogMapper.php index 91bea6428..4e6013877 100644 --- a/lib/Db/CallLogMapper.php +++ b/lib/Db/CallLogMapper.php @@ -14,7 +14,7 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class CallLogMapper extends QBMapper { diff --git a/lib/Db/ConsumerMapper.php b/lib/Db/ConsumerMapper.php index 6f5423c60..ec72c1eb3 100644 --- a/lib/Db/ConsumerMapper.php +++ b/lib/Db/ConsumerMapper.php @@ -19,7 +19,7 @@ */ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class ConsumerMapper extends QBMapper { diff --git a/lib/Db/EndpointMapper.php b/lib/Db/EndpointMapper.php index 245841e75..234e7514d 100644 --- a/lib/Db/EndpointMapper.php +++ b/lib/Db/EndpointMapper.php @@ -14,7 +14,7 @@ * Mapper class for handling Endpoint database operations * * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ diff --git a/lib/Db/EventMapper.php b/lib/Db/EventMapper.php index ae51916f0..b2ba952fa 100644 --- a/lib/Db/EventMapper.php +++ b/lib/Db/EventMapper.php @@ -15,7 +15,7 @@ * Handles database operations for events including CRUD operations * * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class EventMapper extends QBMapper { diff --git a/lib/Db/EventMessageMapper.php b/lib/Db/EventMessageMapper.php index 8edd8ca5d..5bedc0a6a 100644 --- a/lib/Db/EventMessageMapper.php +++ b/lib/Db/EventMessageMapper.php @@ -17,7 +17,7 @@ */ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class EventMessageMapper extends QBMapper { diff --git a/lib/Db/EventSubscriptionMapper.php b/lib/Db/EventSubscriptionMapper.php index d5e9fc9c5..80603b4df 100644 --- a/lib/Db/EventSubscriptionMapper.php +++ b/lib/Db/EventSubscriptionMapper.php @@ -16,7 +16,7 @@ */ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class EventSubscriptionMapper extends QBMapper { diff --git a/lib/Db/JobLogMapper.php b/lib/Db/JobLogMapper.php index 67b4b20e3..7b4783d2a 100644 --- a/lib/Db/JobLogMapper.php +++ b/lib/Db/JobLogMapper.php @@ -14,7 +14,7 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class JobLogMapper extends QBMapper diff --git a/lib/Db/JobMapper.php b/lib/Db/JobMapper.php index bf94b8620..3c942b1df 100644 --- a/lib/Db/JobMapper.php +++ b/lib/Db/JobMapper.php @@ -12,7 +12,7 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class JobMapper extends QBMapper diff --git a/lib/Db/Mapping.php b/lib/Db/Mapping.php index 9103921b7..fbadabf1d 100644 --- a/lib/Db/Mapping.php +++ b/lib/Db/Mapping.php @@ -106,7 +106,7 @@ public function getUpdated(): ?DateTime * @psalm-return non-empty-string * * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Transliterator::create is standard ICU pattern * @SuppressWarnings(PHPMD.ErrorControlOperator) */ public function getSlug(): string diff --git a/lib/Db/MappingMapper.php b/lib/Db/MappingMapper.php index 253a6b078..275eb644b 100644 --- a/lib/Db/MappingMapper.php +++ b/lib/Db/MappingMapper.php @@ -11,7 +11,7 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class MappingMapper extends QBMapper { diff --git a/lib/Db/RuleMapper.php b/lib/Db/RuleMapper.php index 816442818..cf62ef1e0 100644 --- a/lib/Db/RuleMapper.php +++ b/lib/Db/RuleMapper.php @@ -17,7 +17,7 @@ */ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class RuleMapper extends QBMapper { diff --git a/lib/Db/SourceMapper.php b/lib/Db/SourceMapper.php index 48081459d..d2f112d28 100644 --- a/lib/Db/SourceMapper.php +++ b/lib/Db/SourceMapper.php @@ -11,7 +11,7 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ diff --git a/lib/Db/SynchronizationContractLogMapper.php b/lib/Db/SynchronizationContractLogMapper.php index 5c89bfe37..98008a0bd 100644 --- a/lib/Db/SynchronizationContractLogMapper.php +++ b/lib/Db/SynchronizationContractLogMapper.php @@ -23,7 +23,7 @@ */ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class SynchronizationContractLogMapper extends QBMapper { diff --git a/lib/Db/SynchronizationContractMapper.php b/lib/Db/SynchronizationContractMapper.php index b983e463a..15a03488c 100644 --- a/lib/Db/SynchronizationContractMapper.php +++ b/lib/Db/SynchronizationContractMapper.php @@ -26,9 +26,8 @@ */ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.TooManyPublicMethods) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class SynchronizationContractMapper extends QBMapper @@ -75,6 +74,8 @@ public function find(int $id): SynchronizationContract * @return SynchronizationContract|null The found contract or null if not found * @throws MultipleObjectsReturnedException * @throws Exception + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $justByOriginId is a simple query-scope toggle */ public function findSyncContractByOriginId(string $synchronizationId, string $originId, ?bool $justByOriginId = false): ?SynchronizationContract { diff --git a/lib/Db/SynchronizationLogMapper.php b/lib/Db/SynchronizationLogMapper.php index fe0143d92..9e26eddab 100644 --- a/lib/Db/SynchronizationLogMapper.php +++ b/lib/Db/SynchronizationLogMapper.php @@ -14,7 +14,7 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern */ class SynchronizationLogMapper extends QBMapper { diff --git a/lib/Db/SynchronizationMapper.php b/lib/Db/SynchronizationMapper.php index d631861e1..5f24ac46c 100644 --- a/lib/Db/SynchronizationMapper.php +++ b/lib/Db/SynchronizationMapper.php @@ -12,9 +12,8 @@ /** * @SuppressWarnings(PHPMD.ShortVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class SynchronizationMapper extends QBMapper @@ -404,6 +403,7 @@ public function findByConfiguration(string $configurationId): array * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $searchSource/$searchTarget are simple query-scope toggles */ public function getByTarget(?string $registerId = null, ?string $schemaId = null, bool $searchSource = true, bool $searchTarget = true): array { diff --git a/lib/Migration/Version1Date20250826103500.php b/lib/Migration/Version1Date20250826103500.php index df3ad1c92..de3b393f7 100644 --- a/lib/Migration/Version1Date20250826103500.php +++ b/lib/Migration/Version1Date20250826103500.php @@ -41,7 +41,7 @@ * @link https://github.com/OpenConnector/openconnector * * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — migration steps require static Doctrine DBAL patterns * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ diff --git a/lib/Service/AuthenticationService.php b/lib/Service/AuthenticationService.php index 81f489a24..b898109fb 100644 --- a/lib/Service/AuthenticationService.php +++ b/lib/Service/AuthenticationService.php @@ -30,7 +30,7 @@ * @todo We should test the effect of @Authors & @Package(s) in Class doc-blocks. And add them if possible. * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — JWKFactory uses static factory methods by design * @SuppressWarnings(PHPMD.UndefinedVariable) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ diff --git a/lib/Service/AuthorizationService.php b/lib/Service/AuthorizationService.php index 0eb58355d..52983a401 100644 --- a/lib/Service/AuthorizationService.php +++ b/lib/Service/AuthorizationService.php @@ -42,7 +42,7 @@ * Service class for handling authorization on incoming calls. * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — JWKFactory uses static factory methods by design * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ class AuthorizationService diff --git a/lib/Service/CallService.php b/lib/Service/CallService.php index c485f57cd..86afd1ac7 100644 --- a/lib/Service/CallService.php +++ b/lib/Service/CallService.php @@ -43,10 +43,9 @@ * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.LongVariable) * @SuppressWarnings(PHPMD.MissingImport) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.CamelCaseVariableName) * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedLocalVariable) @@ -176,6 +175,8 @@ private function renderConfiguration(array $configuration, Source $source): arra * @param bool $read For GET as default: decides if we are in a list or read (singular) endpoint. * * @return string + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $read is a simple endpoint-type toggle */ private function decideMethod(string $default, array $configuration, bool $read = false): string { @@ -319,6 +320,8 @@ public function removeFiles(array $config): void * @throws LoaderError * @throws SyntaxError * @throws \OCP\DB\Exception + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) Multiple flags control HTTP call behavior */ public function call( Source $source, diff --git a/lib/Service/ConfigurationHandlers/SynchronizationHandler.php b/lib/Service/ConfigurationHandlers/SynchronizationHandler.php index 0b430605e..d200adae5 100644 --- a/lib/Service/ConfigurationHandlers/SynchronizationHandler.php +++ b/lib/Service/ConfigurationHandlers/SynchronizationHandler.php @@ -27,7 +27,7 @@ * @SuppressWarnings(PHPMD.ShortVariable) * @SuppressWarnings(PHPMD.LongVariable) * @SuppressWarnings(PHPMD.MissingImport) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::isValid is standard Symfony UID pattern */ class SynchronizationHandler implements ConfigurationHandlerInterface { diff --git a/lib/Service/ConfigurationService.php b/lib/Service/ConfigurationService.php index 6dbdbb8da..39a190e61 100644 --- a/lib/Service/ConfigurationService.php +++ b/lib/Service/ConfigurationService.php @@ -42,7 +42,6 @@ * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.ExcessiveParameterList) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.LongVariable) * @SuppressWarnings(PHPMD.MissingImport) */ @@ -500,6 +499,8 @@ private function buildRegisterAndSchemaMappings(array $registerIds = [], array $ * @param bool $searchSource Whether to search in source fields for synchronizations (default: true) * @param bool $searchTarget Whether to search in target fields for synchronizations (default: true) * @return array JSON-serializable array containing all connected entities + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) Export-scope toggles for entity types */ public function exportRegister( string $registerId, diff --git a/lib/Service/EndpointCacheService.php b/lib/Service/EndpointCacheService.php index 11e66f02c..136183eaf 100644 --- a/lib/Service/EndpointCacheService.php +++ b/lib/Service/EndpointCacheService.php @@ -23,7 +23,6 @@ * * @SuppressWarnings(PHPMD.ShortVariable) * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.MissingImport) * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedPrivateMethod) @@ -69,6 +68,8 @@ public function __construct( * @param bool $isRetry Internal flag to prevent infinite recursion * @return Endpoint|null Returns the best matching endpoint or null if none found * @throws \Exception When multiple endpoints match (ambiguous routing) + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $isRetry prevents infinite recursion on cache miss */ public function findByPathRegex(string $path, string $method, bool $isRetry = false): ?Endpoint { diff --git a/lib/Service/ExportService.php b/lib/Service/ExportService.php index 520541469..04e8702ee 100644 --- a/lib/Service/ExportService.php +++ b/lib/Service/ExportService.php @@ -28,7 +28,7 @@ * * @SuppressWarnings(PHPMD.ShortVariable) * @SuppressWarnings(PHPMD.ExitExpression) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Yaml::dump is standard Symfony Yaml pattern */ class ExportService { diff --git a/lib/Service/Helper/FlowToken.php b/lib/Service/Helper/FlowToken.php index c80e33170..01a3dd042 100644 --- a/lib/Service/Helper/FlowToken.php +++ b/lib/Service/Helper/FlowToken.php @@ -5,9 +5,6 @@ use OC\AppFramework\Http\Request; use OCP\AppFramework\Http\Response; -/** - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) - */ class FlowToken { private array $requestOriginal; @@ -40,6 +37,9 @@ public function __construct( $this->setSyncOutputAmended($this->getSyncOutputOriginal()); } + /** + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $proxyHeaders is a simple header-filter toggle + */ private function getHeaders(array $server, bool $proxyHeaders = false): array { $headers = array_filter( diff --git a/lib/Service/ImportService.php b/lib/Service/ImportService.php index d3b26e594..134be00cd 100644 --- a/lib/Service/ImportService.php +++ b/lib/Service/ImportService.php @@ -30,7 +30,7 @@ * @SuppressWarnings(PHPMD.ShortVariable) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.EmptyCatchBlock) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Yaml::parse is standard Symfony Yaml pattern */ class ImportService { diff --git a/lib/Service/JobService.php b/lib/Service/JobService.php index 994f323aa..802927112 100644 --- a/lib/Service/JobService.php +++ b/lib/Service/JobService.php @@ -47,9 +47,8 @@ * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.MissingImport) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — DateTime::createFromFormat is standard PHP date pattern * @SuppressWarnings(PHPMD.CamelCaseVariableName) */ class JobService @@ -265,6 +264,8 @@ public function getJobListId(IJob|string $job): int|null * @psalm-return JobLog * @phpstan-param Job $job * @phpstan-return JobLog + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $forceRun is a simple execution-mode toggle */ public function executeJob(Job $job, bool $forceRun = false): ?JobLog { diff --git a/lib/Service/MappingService.php b/lib/Service/MappingService.php index 7d222aec2..03ad0895e 100644 --- a/lib/Service/MappingService.php +++ b/lib/Service/MappingService.php @@ -31,7 +31,6 @@ * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) Mapping execution requires comprehensive handling - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $list parameter clearly indicates list processing mode */ class MappingService { @@ -127,6 +126,7 @@ public function encodeArrayKeys(array $array, string $toReplace, string $replace * @return array The result (output) of the mapping process *@throws LoaderError|SyntaxError Twig Exceptions * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $list is a simple processing-mode toggle */ public function executeMapping(Mapping $mapping, array $input, bool $list = false): array { @@ -163,6 +163,7 @@ public function executeMapping(Mapping $mapping, array $input, bool $list = fals * @throws Exception When mapping fails * * @SuppressWarnings(PHPMD.ElseExpression) + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $list is a simple processing-mode toggle */ private function executeMappingLocal(Mapping $mapping, array $input, bool $list = false): array { diff --git a/lib/Service/ObjectService.php b/lib/Service/ObjectService.php index d716c4165..70cadc857 100644 --- a/lib/Service/ObjectService.php +++ b/lib/Service/ObjectService.php @@ -24,7 +24,7 @@ * @SuppressWarnings(PHPMD.ShortVariable) * @SuppressWarnings(PHPMD.LongVariable) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ class ObjectService diff --git a/lib/Service/RuleService.php b/lib/Service/RuleService.php index a6d1c5cda..5d943d952 100644 --- a/lib/Service/RuleService.php +++ b/lib/Service/RuleService.php @@ -28,7 +28,7 @@ * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.LongVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4/isValid are standard Symfony UID patterns * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ diff --git a/lib/Service/SOAPService.php b/lib/Service/SOAPService.php index 547ea03f5..ccefb28b3 100644 --- a/lib/Service/SOAPService.php +++ b/lib/Service/SOAPService.php @@ -39,7 +39,7 @@ * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — ExtSoapDriver/ExtSoapOptions/Psr18Transport use static factory patterns * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ diff --git a/lib/Service/StorageService.php b/lib/Service/StorageService.php index 2632428c8..c04fe2d1d 100644 --- a/lib/Service/StorageService.php +++ b/lib/Service/StorageService.php @@ -30,7 +30,7 @@ /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.LongVariable) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4 is standard Symfony UID pattern * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ class StorageService diff --git a/lib/Twig/MappingRuntime.php b/lib/Twig/MappingRuntime.php index 7c28d4425..5c47c6fdd 100644 --- a/lib/Twig/MappingRuntime.php +++ b/lib/Twig/MappingRuntime.php @@ -25,9 +25,8 @@ /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.BooleanArgumentFlag) * @SuppressWarnings(PHPMD.CamelCaseMethodName) - * @SuppressWarnings(PHPMD.StaticAccess) + * @SuppressWarnings(PHPMD.StaticAccess) — Uuid::v4/isValid are standard Symfony UID patterns * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ class MappingRuntime implements RuntimeExtensionInterface @@ -93,6 +92,8 @@ public function json_decode(string $input): array * @throws Exception * @throws LoaderError * @throws SyntaxError + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $decode is a simple output-format toggle */ public function callSource(string $sourceId, string $endpoint, string $method='GET', array $configuration=[], bool $decode=true): array|string { @@ -116,6 +117,8 @@ public function callSource(string $sourceId, string $endpoint, string $method='G * @param bool $list Whether the mapping runs on multiple instances of the object. * * @return array + * + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $list is a simple processing-mode toggle */ public function executeMapping(Mapping|array|string|int $mapping, array $input, bool $list = false): array { diff --git a/openspec/specs/method-decomposition/spec.md b/openspec/specs/method-decomposition/spec.md new file mode 100644 index 000000000..3275706d7 --- /dev/null +++ b/openspec/specs/method-decomposition/spec.md @@ -0,0 +1,189 @@ +--- +status: draft +priority: high +estimated_effort: large +--- + +# Method Decomposition — OpenConnector + +## Goal +Eliminate 109 PHPMD complexity suppressions by decomposing complex methods into smaller, focused units. Each suppression represents a method or class that exceeds PHPMD's strict thresholds (CC>10, NPath>200, MethodLength>100, ClassLength>1000). + +## Current State +- **CyclomaticComplexity suppressions:** 36 (methods with >10 branches) +- **NPathComplexity suppressions:** 24 (methods with >200 execution paths) +- **ExcessiveMethodLength suppressions:** 12 (methods >100 lines) +- **ExcessiveClassComplexity suppressions:** 11 (classes with too much logic) +- **ExcessiveClassLength suppressions:** 1 (classes >1000 lines) +- **CouplingBetweenObjects suppressions:** 25 (too many dependencies) +- **TooManyMethods suppressions:** 0 + +## Files Requiring Decomposition + +### Priority 1 — Highest complexity (files with 5+ suppressions) + +**lib/Service/MappingService.php** (6 suppressions) +Data mapping and transformation service executing Twig-based mapping rules, JSONPath expressions, and conditional transformations. Class-level suppressions (6) for coupling, class length, class complexity, CC, NPath, and method length. + +**lib/Db/SynchronizationMapper.php** (6 suppressions) +Database mapper for synchronization entities with complex query building, filtering, and join operations. Class-level suppressions (2) for class complexity and coupling. Method-level suppressions on `findAll` (CC+NPath) and `applyFilters` (CC+NPath). + +**lib/Service/ConfigurationService.php** (5 suppressions) +Configuration import/export service handling source, mapping, synchronization, and endpoint configurations. Class-level suppressions (5) for coupling, class complexity, CC, NPath, and method length. + +**lib/Service/CallService.php** (5 suppressions) +HTTP call service handling REST, GraphQL, and SOAP API calls with authentication, pagination, and error handling. Class-level suppressions (5) for coupling, class complexity, CC, NPath, and method length. + +**lib/Controller/EndpointsController.php** (5 suppressions) +Endpoints REST controller managing API endpoint CRUD. Class-level suppressions (5) for coupling, CC, NPath, class complexity, and method length. + +### Priority 2 — Medium complexity (files with 2-4 suppressions) + +**lib/Service/RuleService.php** (4 suppressions) +Rule execution service applying conditional logic to data flows. Class-level suppressions for coupling, class complexity, CC, and method length. + +**lib/Service/JobService.php** (4 suppressions) +Job scheduling and execution service managing background processing. Class-level suppressions for coupling, CC, NPath, and method length. + +**lib/Service/ConfigurationHandlers/SynchronizationHandler.php** (4 suppressions) +Handler for importing/exporting synchronization configurations. Class-level suppressions for class complexity, CC, NPath, and method length. + +**lib/Db/JobMapper.php** (4 suppressions) +Job database mapper with query building and scheduling logic. Class-level suppression for coupling. Method-level suppressions on `findAll` (CC+NPath) and `findNextJob` (CC). + +**lib/Db/EndpointMapper.php** (4 suppressions) +Endpoint database mapper with complex routing and matching queries. Class-level suppressions (2) for class complexity and coupling. Method-level suppressions on `findAll` (CC+NPath). + +**lib/Controller/SynchronizationsController.php** (4 suppressions) +Synchronizations REST controller. Class-level suppressions for coupling, CC, NPath, and class complexity. + +**lib/Service/UserService.php** (3 suppressions) +User service handling authentication context and permission checks. Class-level suppressions for class complexity, CC, and NPath. + +**lib/Service/SearchService.php** (3 suppressions) +Search service with cross-entity query building. Class-level suppressions for class complexity, CC, and NPath. + +**lib/Service/SettingsService.php** (3 suppressions) +Settings persistence service. Class-level suppressions for CC, NPath, and method length. + +**lib/Controller/SourcesController.php** (3 suppressions) +Sources REST controller. Class-level suppressions for CC, NPath, and method length. + +**lib/Controller/MappingsController.php** (3 suppressions) +Mappings REST controller. Class-level suppressions for coupling, CC, and NPath. + +**lib/Controller/JobsController.php** (3 suppressions) +Jobs REST controller. Class-level suppressions for coupling, CC, and NPath. + +**lib/Migration/Version0Date20240826193657.php** (3 suppressions) +Initial migration with CC, NPath, and method length suppressions. + +**lib/Db/SourceMapper.php** (2 suppressions) +Source database mapper with CC and NPath suppressions. + +**lib/Db/RuleMapper.php** (2 suppressions) +Rule database mapper with CC and NPath suppressions on `findAll`. + +**lib/Db/MappingMapper.php** (2 suppressions) +Mapping database mapper with CC and NPath suppressions on `findAll`. + +**lib/Service/SOAPService.php** (2 suppressions) +SOAP API call service with coupling and CC suppressions. + +**lib/Service/ConfigurationHandlers/EndpointHandler.php** (2 suppressions) +Endpoint configuration handler with CC and NPath suppressions. + +**lib/Controller/UserController.php** (2 suppressions) +User controller with CC and method length suppressions. + +**lib/Controller/SynchronizationContractsController.php** (2 suppressions) +Synchronization contracts controller with CC and NPath suppressions. + +**lib/Migration/Version1Date20250826103500.php** (2 suppressions) +Migration with CC and NPath suppressions. + +### Priority 3 — Single suppressions + +- `lib/Twig/MappingRuntime.php` (1) — CouplingBetweenObjects +- `lib/Service/StorageService.php` (1) — CouplingBetweenObjects +- `lib/Service/ObjectService.php` (1) — CouplingBetweenObjects +- `lib/Service/ImportService.php` (1) — CouplingBetweenObjects +- `lib/Service/EventService.php` (1) — CyclomaticComplexity +- `lib/Service/EndpointCacheService.php` (1) — CyclomaticComplexity +- `lib/Service/ConfigurationHandlers/SourceHandler.php` (1) — CyclomaticComplexity +- `lib/Service/ConfigurationHandlers/RuleHandler.php` (1) — CyclomaticComplexity +- `lib/Service/ConfigurationHandlers/JobHandler.php` (1) — CyclomaticComplexity +- `lib/Service/AuthorizationService.php` (1) — CouplingBetweenObjects +- `lib/Service/AuthenticationService.php` (1) — CouplingBetweenObjects +- `lib/Migration/Version1Date20250109093325.php` (1) — ExcessiveMethodLength +- `lib/Http/XMLResponse.php` (1) — CyclomaticComplexity +- `lib/Db/SynchronizationContractMapper.php` (1) — CouplingBetweenObjects +- `lib/Db/Mapping.php` (1) — CyclomaticComplexity +- `lib/Db/JobLogMapper.php` (1) — CouplingBetweenObjects +- `lib/Controller/SettingsController.php` (1) — CouplingBetweenObjects +- `lib/Controller/LogsController.php` (1) — CyclomaticComplexity +- `lib/Controller/EventsController.php` (1) — CouplingBetweenObjects +- `lib/Controller/DashboardController.php` (1) — CouplingBetweenObjects +- `lib/AppInfo/Application.php` (1) — CouplingBetweenObjects + +## Decomposition Strategy + +### For CyclomaticComplexity (>10 branches) +Extract conditional branches into private helper methods: +- Guard clauses: Extract early-return validation into `validate{Thing}()` methods +- Switch-like logic: Extract case handlers into `handle{Case}()` methods +- Nested conditions: Flatten by extracting inner blocks into descriptive methods + +### For NPathComplexity (>200 paths) +Reduce execution paths by: +- Breaking method into pipeline stages (each stage = private method) +- Extracting independent conditional blocks into separate methods +- Using early returns to eliminate nested paths + +### For ExcessiveMethodLength (>100 lines) +Split long methods into logical phases: +- Validation phase -> `validate{Input}()` +- Preparation phase -> `prepare{Data}()` +- Processing phase -> `process{Thing}()` +- Response phase -> `build{Response}()` + +### For ExcessiveClassComplexity / ExcessiveClassLength +Extract method groups into Handler classes (existing pattern in codebase): +- Create `{ClassName}/{HandlerName}Handler.php` +- Move related methods to the handler +- Inject handler via constructor +- Delegate from original methods (keep public API stable) + +### For CouplingBetweenObjects (>13 dependencies) +Reduce constructor parameters by: +- Grouping related dependencies into a single service +- Using lazy loading for rarely-used dependencies +- Moving methods that use specific deps to handler classes + +## Testing Strategy + +### Before decomposition +1. Run existing unit tests: `docker exec -w /var/www/html/custom_apps/openconnector nextcloud php vendor/bin/phpunit -c phpunit-unit.xml` +2. Note any pre-existing failures +3. Run PHPMD to record current suppression count: `./vendor/bin/phpmd lib/ text phpmd.xml 2>&1 | wc -l` + +### During decomposition (per method) +1. Verify `php -l` passes on all changed files +2. Run unit tests for the specific class: `--filter ClassName` +3. Run PHPMD on the specific file to confirm suppression can be removed + +### After decomposition +1. Full unit test suite passes +2. PHPMD reports 0 violations (no new warnings) +3. Total suppression count reduced by expected amount +4. `composer check:strict` passes +5. Manual smoke test in browser (http://localhost:3000) + +## Acceptance Criteria +- [ ] All CyclomaticComplexity suppressions eliminated or reduced to <=5 +- [ ] All NPathComplexity suppressions eliminated or reduced to <=5 +- [ ] All ExcessiveMethodLength suppressions eliminated or reduced to <=5 +- [ ] ExcessiveClassComplexity reduced by extracting handler classes +- [ ] No new PHPMD violations introduced +- [ ] All existing tests continue to pass +- [ ] No behavioral changes (pure refactoring) diff --git a/package-lock.json b/package-lock.json index e159a10b5..d5ce931e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -155,14 +155,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -445,12 +444,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -1828,9 +1827,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1852,7 +1851,6 @@ "resolved": "https://registry.npmjs.org/@buttercup/fetch/-/fetch-0.2.1.tgz", "integrity": "sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==", "license": "MIT", - "optional": true, "optionalDependencies": { "node-fetch": "^3.3.0" } @@ -1972,18 +1970,581 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "0.1.0-beta.3", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-0.1.0-beta.3.tgz", - "integrity": "sha512-+B02z2vUgN8BTZ0ZRd9mtrIVo55KMETzvEsyt7g0AW50hNU44xd9ILBHjKvZlKQclsLWzT36K0+RWIbcC22QVA==", + "version": "0.1.0-beta.4", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-0.1.0-beta.4.tgz", + "integrity": "sha512-MtcjlnBiR1XXlao8ciculT5k3T0HzD7hw3FNRC9TUVrTaWcG/31Skv1mpm+bKjv/c0SzDyxZSfeZNBLs2Lv41Q==", "license": "EUPL-1.2", + "dependencies": { + "@codemirror/lang-json": "^6.0.2", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/dialogs": "^7.3.0", + "gridstack": "^10.3.1", + "vue-apexcharts": "^1.7.0", + "vue-codemirror6": "^1.4.3" + }, "peerDependencies": { + "@nextcloud/axios": "^2.0.0", "@nextcloud/l10n": "^2.0.0 || ^3.0.0", + "@nextcloud/router": "^2.0.0 || ^3.0.0", "@nextcloud/vue": "^8.0.0", + "bootstrap-vue": "^2.23.1", "pinia": "^2.0.0", "vue": "^2.7.0", + "vue-frag": "^1.4.3", "vue-material-design-icons": "^5.0.0" } }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-7.3.0.tgz", + "integrity": "sha512-pFuM10Dkvip+wSBaElcbSAN7Jynp41HJUh5kndRYpJipYl0SpNfjIe32+uNfOI43/tln4ScTlrfjIX6cK+3uHg==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@mdi/js": "^7.4.47", + "@nextcloud/auth": "^2.5.3", + "@nextcloud/axios": "^2.5.2", + "@nextcloud/browser-storage": "^0.5.0", + "@nextcloud/event-bus": "^3.3.3", + "@nextcloud/files": "^4.0.0", + "@nextcloud/initial-state": "^3.0.0", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.4.0", + "@nextcloud/vue": "^9.5.0", + "@types/toastify-js": "^1.12.4", + "@vueuse/core": "^14.2.1", + "p-queue": "^9.0.1", + "toastify-js": "^1.12.0", + "vue": "^3.5.28", + "webdav": "^5.8.0" + }, + "engines": { + "node": "^20 || ^22 || ^24" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@ckpack/vue-color": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@ckpack/vue-color/-/vue-color-1.6.0.tgz", + "integrity": "sha512-b9kFTKhYbNArfgP1lmnaVm0VNsWdZjqIbyHUYry7mZ+E7JeTQclbjq1+2xWn0SE3wzqRYlXmAVjECPOgteWmMQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.6.0", + "material-colors": "^1.2.6" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@nextcloud/l10n": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-3.4.1.tgz", + "integrity": "sha512-aTFinTcKiK2gEXwLgutXekpZZ8/v/4QiC8C3QCLH5m0o+WtxsBC+fqV142ebC/rfDnzCLhY4ZtswSu8bFbZocg==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/router": "^3.0.1", + "@nextcloud/typings": "^1.9.1", + "@types/escape-html": "^1.0.4", + "dompurify": "^3.2.6", + "escape-html": "^1.0.3" + }, + "engines": { + "node": "^20 || ^22 || ^24" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@nextcloud/router": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.1.0.tgz", + "integrity": "sha512-e4dkIaxRSwdZJlZFpn9x03QgBn/Sa2hN1hp/BA7+AbzykmSAlKuWfdmX8j/8ewrLpQwYmZR23IZO9XwpJXq2Uw==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/typings": "^1.10.0" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@nextcloud/vue": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-9.6.0.tgz", + "integrity": "sha512-RZuMnrNwzajx3AbJcGHC49NUORSPHMRbzhHCBlR0Z5N3BvUmy5d7MPVTqsmJXiO5emSCTanJ+rwDeo6HTAX3ng==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@ckpack/vue-color": "^1.6.0", + "@floating-ui/dom": "^1.7.6", + "@nextcloud/auth": "^2.5.3", + "@nextcloud/axios": "^2.5.2", + "@nextcloud/browser-storage": "^0.5.0", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/event-bus": "^3.3.3", + "@nextcloud/initial-state": "^3.0.0", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/logger": "^3.0.3", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.4.0", + "@vuepic/vue-datepicker": "^11.0.3", + "@vueuse/components": "^14.2.1", + "@vueuse/core": "^14.2.1", + "blurhash": "^2.0.5", + "clone": "^2.1.2", + "debounce": "^3.0.0", + "dompurify": "^3.3.3", + "emoji-mart-vue-fast": "^15.0.5", + "escape-html": "^1.0.3", + "floating-vue": "^5.2.2", + "focus-trap": "^8.0.0", + "linkifyjs": "^4.3.2", + "p-queue": "^9.1.0", + "rehype-external-links": "^3.0.0", + "rehype-highlight": "^7.0.2", + "rehype-react": "^8.0.0", + "remark-breaks": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "remark-unlink-protocols": "^1.0.0", + "splitpanes": "^4.0.4", + "striptags": "^3.2.0", + "tabbable": "^6.4.0", + "tributejs": "^5.1.3", + "ts-md5": "^2.0.1", + "unified": "^11.0.5", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.1.0", + "vue": "^3.5.18", + "vue-router": "^5.0.3", + "vue-select": "^4.0.0-beta.6" + }, + "engines": { + "node": "^20.11.0 || ^22 || ^24" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vue/devtools-kit": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.1.0.tgz", + "integrity": "sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.0", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vuepic/vue-datepicker": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-11.0.3.tgz", + "integrity": "sha512-sb2adwqwK2PizLQOpxCYps2SwhVT6/ic2HMIOqHJXuYa6iAJZWGL5YVlS7O4aW+sk6ZyxlDURLO7kDZPL4HB/w==", + "license": "MIT", + "dependencies": { + "date-fns": "^4.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vue": ">=3.3.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vueuse/components": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-14.2.1.tgz", + "integrity": "sha512-wB0SvwJ22mNm1hWCMI1wTWz4x55nDTugT5RIg/KCwlWc1vITWL6ry5VTU3SQzsMD2XcazJK8Be1siIsrBb/Vcw==", + "license": "MIT", + "dependencies": { + "@vueuse/core": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vueuse/core": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz", + "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/@vueuse/shared": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz", + "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/floating-vue": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-5.2.2.tgz", + "integrity": "sha512-afW+h2CFafo+7Y9Lvw/xsqjaQlKLdJV7h1fCHfcYQ1C4SVMlu7OAekqWgu5d4SgvkBVU0pVpLlVsrSTBURFRkg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "~1.1.1", + "vue-resize": "^2.0.0-alpha.1" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.0", + "vue": "^3.2.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/floating-vue/node_modules/@floating-ui/dom": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", + "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.1.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/splitpanes": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-4.0.4.tgz", + "integrity": "sha512-RbysugZhjbCw5fgplvk3hOXr41stahQDtZhHVkhnnJI6H4wlGDhM2kIpbehy7v92duy9GnMa8zIhHigIV1TWtg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antoniandre" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/vue-resize": { + "version": "2.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-2.0.0-alpha.1.tgz", + "integrity": "sha512-7+iqOueLU7uc9NrMfrzbG8hwMqchfVfSzpVlCMeJQe4pyibqyoifDNbKTZvwxZKDvGkB+PdFeKvnGZMoEb8esg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/vue-router": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.3.tgz", + "integrity": "sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.6", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.1.0.tgz", + "integrity": "sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/dialogs/node_modules/vue-select": { + "version": "4.0.0-beta.6", + "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-4.0.0-beta.6.tgz", + "integrity": "sha512-K+zrNBSpwMPhAxYLTCl56gaMrWZGgayoWCLqe5rWwkB8aUbAUh7u6sXjIR7v4ckp2WKC7zEEUY27g6h1MRsIHw==", + "license": "MIT", + "peerDependencies": { + "vue": "3.x" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@nextcloud/initial-state": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-3.0.0.tgz", + "integrity": "sha512-cV+HBdkQJGm8FxkBI5rFT/FbMNWNBvpbj6OPrg4Ae4YOOsQ15CL8InPOAw1t4XkOkQK2NEdUGQLVUz/19wXbdQ==", + "license": "GPL-3.0-or-later", + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@vue/devtools-shared": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.1.0.tgz", + "integrity": "sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==", + "license": "MIT" + }, + "node_modules/@conduction/nextcloud-vue/node_modules/@vueuse/metadata": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz", + "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/apexcharts": { + "version": "5.10.4", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-5.10.4.tgz", + "integrity": "sha512-gt0VUqZ2+mr25ScbUcKZgJr96jKYm4vjOcxEWCEh/E5F4dWqhyo3dBhPRvNNnkKiWxkMd2cBwj3ZYH3rK39fkA==", + "license": "SEE LICENSE IN LICENSE", + "peer": true + }, + "node_modules/@conduction/nextcloud-vue/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/debounce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/focus-trap": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-8.0.0.tgz", + "integrity": "sha512-Aa84FOGHs99vVwufDMdq2qgOwXPC2e9U66GcqBhn1/jEHPDhJaP8PYhkIbqG9lhfL5Kddk/567lj46LLHYCRUw==", + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/p-queue": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/@conduction/nextcloud-vue/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/rehype-react": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-8.0.0.tgz", + "integrity": "sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@conduction/nextcloud-vue/node_modules/vue-apexcharts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vue-apexcharts/-/vue-apexcharts-1.7.0.tgz", + "integrity": "sha512-QMpvBllJ1XvFsK4dwcbyxKalVpHfJnoqsNWszY55HJk/Sn7WP1f5YUv4JIzugqu4GTQB6gLcCVwwPDQFtwr0oQ==", + "license": "MIT", + "peerDependencies": { + "apexcharts": ">=4.0.0", + "vue": "^2.5.17" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz", @@ -2078,6 +2639,15 @@ "postcss-selector-parser": "^6.0.13" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/@cyclonedx/cyclonedx-npm": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@cyclonedx/cyclonedx-npm/-/cyclonedx-npm-4.2.1.tgz", @@ -2477,28 +3047,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, "node_modules/@fortawesome/fontawesome-common-types": { @@ -3579,7 +4149,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -4062,6 +4631,27 @@ } }, "node_modules/@nextcloud/files": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.0.0.tgz", + "integrity": "sha512-TmecnZIS+PGWGtRh7RpGEboCT4K6iTbHULUcfR6hs3eEzjDVsCc1Ldf8popGY/70lbpdlfYle8xbXnPIo3qaXA==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@nextcloud/auth": "^2.5.3", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/logger": "^3.0.3", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.3.0", + "is-svg": "^6.1.0", + "typescript-event-target": "^1.1.2", + "webdav": "^5.9.0" + }, + "engines": { + "node": "^24.0.0" + } + }, + "node_modules/@nextcloud/files/node_modules/@nextcloud/files": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", @@ -4084,12 +4674,20 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } }, + "node_modules/@nextcloud/files/node_modules/@nextcloud/initial-state": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-3.0.0.tgz", + "integrity": "sha512-cV+HBdkQJGm8FxkBI5rFT/FbMNWNBvpbj6OPrg4Ae4YOOsQ15CL8InPOAw1t4XkOkQK2NEdUGQLVUz/19wXbdQ==", + "license": "GPL-3.0-or-later", + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, "node_modules/@nextcloud/files/node_modules/@nextcloud/l10n": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-3.4.1.tgz", "integrity": "sha512-aTFinTcKiK2gEXwLgutXekpZZ8/v/4QiC8C3QCLH5m0o+WtxsBC+fqV142ebC/rfDnzCLhY4ZtswSu8bFbZocg==", "license": "GPL-3.0-or-later", - "optional": true, "dependencies": { "@nextcloud/router": "^3.0.1", "@nextcloud/typings": "^1.9.1", @@ -4106,7 +4704,6 @@ "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.1.0.tgz", "integrity": "sha512-e4dkIaxRSwdZJlZFpn9x03QgBn/Sa2hN1hp/BA7+AbzykmSAlKuWfdmX8j/8ewrLpQwYmZR23IZO9XwpJXq2Uw==", "license": "GPL-3.0-or-later", - "optional": true, "dependencies": { "@nextcloud/typings": "^1.10.0" }, @@ -4114,6 +4711,22 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } }, + "node_modules/@nextcloud/files/node_modules/@nextcloud/sharing": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", + "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/initial-state": "^3.0.0", + "is-svg": "^6.1.0" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + }, + "optionalDependencies": { + "@nextcloud/files": "^3.12.0" + } + }, "node_modules/@nextcloud/initial-state": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@nextcloud/initial-state/-/initial-state-2.2.0.tgz", @@ -4154,11 +4767,10 @@ } }, "node_modules/@nextcloud/paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-3.0.0.tgz", - "integrity": "sha512-+sTfTkIbVUa2Ue3bkz3R7F1mhddvHPOWUxkSNg7Q5dAsimVFBaTRgiBAJmsAag3JPsxyuS8kUgeb0zdEssRdTA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-3.1.0.tgz", + "integrity": "sha512-vtFYA/kthaUDzu6KejTOL1OwnOy7/yynq5zdB/UBpYacAWjUX5Ddh4OMWx3rEavkBJ9/QGhrFryNJLjNfe8OQA==", "license": "GPL-3.0-or-later", - "optional": true, "engines": { "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } @@ -4178,9 +4790,9 @@ } }, "node_modules/@nextcloud/sharing": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", - "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.4.0.tgz", + "integrity": "sha512-1hUNyc7uJdBpnimOnEshJjEtAPAjzDYVl6qmWqF5ZxoN9wOvbExw0QjX3xFIbHbX2dmvbRNLBj0RzLzipmZyeg==", "license": "GPL-3.0-or-later", "dependencies": { "@nextcloud/initial-state": "^3.0.0", @@ -4190,7 +4802,7 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" }, "optionalDependencies": { - "@nextcloud/files": "^3.12.0" + "@nextcloud/files": "^3.12.2 || ^4.0.0" } }, "node_modules/@nextcloud/sharing/node_modules/@nextcloud/initial-state": { @@ -4218,18 +4830,6 @@ "stylelint-config-recommended-vue": "^1.1.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.10.0", "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.10.0.tgz", @@ -4243,12 +4843,12 @@ } }, "node_modules/@nextcloud/vue": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.35.0.tgz", - "integrity": "sha512-qPm0aaPbnt7n694WQ97T+EMQTxCa3+RPKDzsBVD6vb01N4uGYwjvrEEOLVmBMlEWqkFy+ks3tpeOjkDPOoJbNA==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.37.0.tgz", + "integrity": "sha512-RbK0cc5MKCxFRgTc2Do4xTiI/AwF3ngAi9uphF0A9kwrvXqDxkLNx3Lb+VNA2bfYTmXPyNXIw4IxAcV+1tZbZQ==", "license": "AGPL-3.0-or-later", "dependencies": { - "@floating-ui/dom": "^1.7.4", + "@floating-ui/dom": "^1.7.6", "@linusborg/vue-simple-portal": "^0.1.5", "@nextcloud/auth": "^2.5.3", "@nextcloud/axios": "^2.5.2", @@ -4257,21 +4857,20 @@ "@nextcloud/event-bus": "^3.3.3", "@nextcloud/initial-state": "^2.2.0", "@nextcloud/l10n": "^3.4.1", - "@nextcloud/logger": "^3.0.2", + "@nextcloud/logger": "^3.0.3", "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", - "@nextcloud/timezones": "^0.2.0", + "@nextcloud/sharing": "^0.4.0", "@nextcloud/vue-select": "^3.26.0", "@vueuse/components": "^11.0.0", "@vueuse/core": "^11.0.0", "blurhash": "^2.0.5", "clone": "^2.1.2", "debounce": "^2.2.0", - "dompurify": "^3.3.0", + "dompurify": "^3.3.3", "emoji-mart-vue-fast": "^15.0.5", "escape-html": "^1.0.3", "floating-vue": "^1.0.0-beta.19", - "focus-trap": "^7.6.6", + "focus-trap": "^7.8.0", "linkify-string": "^4.3.2", "md5": "^2.3.0", "p-queue": "^8.1.1", @@ -4281,15 +4880,16 @@ "remark-breaks": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", + "remark-stringify": "^11.0.0", "remark-unlink-protocols": "^1.0.0", "splitpanes": "^2.4.1", "string-length": "^5.0.1", "striptags": "^3.2.0", - "tabbable": "^6.3.0", + "tabbable": "^6.4.0", "tributejs": "^5.1.3", "unified": "^11.0.1", "unist-builder": "^4.0.0", - "unist-util-visit": "^5.0.0", + "unist-util-visit": "^5.1.0", "vue": "^2.7.16", "vue-color": "^2.8.1", "vue-frag": "^1.4.3", @@ -4340,19 +4940,73 @@ "node": "^20.0.0 || ^22.0.0 || ^24.0.0" } }, - "node_modules/@nextcloud/vue/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==", + "node_modules/@nextcloud/vue/node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@nextcloud/vue/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/@nextcloud/vue/node_modules/@vueuse/core/node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@nextcloud/vue/node_modules/@vueuse/core/node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", "license": "MIT", + "peer": true, "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "11.3.0", - "@vueuse/shared": "11.3.0", - "vue-demi": ">=0.14.10" + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@nextcloud/vue/node_modules/@vueuse/core/node_modules/vue-demi": { @@ -4743,12 +5397,12 @@ } }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -4841,12 +5495,12 @@ "license": "ISC" }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6009,6 +6663,12 @@ "integrity": "sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==", "license": "MIT" }, + "node_modules/@types/toastify-js": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/@types/toastify-js/-/toastify-js-1.12.4.tgz", + "integrity": "sha512-zfZHU4tKffPCnZRe7pjv/eFKzTVHozKewFCKaCjZ4gFinKgJRz/t0bkZiMCXJxPhv/ZoeDGNOeRD09R0kQZ/nw==", + "license": "MIT" + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", @@ -6228,13 +6888,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6605,6 +7265,85 @@ ], "peer": true }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue-macros/common/node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, "node_modules/@vue/compiler-sfc": { "version": "2.7.16", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", @@ -6627,6 +7366,16 @@ "node": ">=0.10.0" } }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, "node_modules/@vue/component-compiler-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", @@ -6700,6 +7449,34 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/eslint-config-typescript": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", @@ -6828,6 +7605,43 @@ "eslint": ">=6.0.0" } }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, "node_modules/@vue/test-utils": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.6.tgz", @@ -7320,9 +8134,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7392,9 +8206,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -7443,9 +8257,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -7733,9 +8547,9 @@ } }, "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, "license": "MIT", "peer": true @@ -7755,6 +8569,38 @@ "util": "^0.12.5" } }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -7814,13 +8660,13 @@ } }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -7904,133 +8750,14 @@ } }, "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "node_modules/babel-core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/babel-core/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/babel-core/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/babel-core/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/babel-core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-generator/node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/babel-generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-jest": { @@ -8312,33 +9039,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "node_modules/babel-register/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true - }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -8461,8 +9161,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -8533,6 +9232,15 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -8601,9 +9309,9 @@ "license": "MIT" }, "node_modules/bn.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", + "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", "dev": true, "license": "MIT", "peer": true @@ -9047,8 +9755,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", @@ -9720,6 +10427,12 @@ "node": ">= 6" } }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -9827,6 +10540,23 @@ "license": "MIT", "peer": true }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/core-js": { "version": "3.47.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", @@ -9901,9 +10631,9 @@ } }, "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, "license": "MIT", "peer": true @@ -10323,7 +11053,6 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "license": "MIT", - "optional": true, "engines": { "node": ">= 12" } @@ -10397,7 +11126,17 @@ "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/date-format-parse": { @@ -10744,20 +11483,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -10828,9 +11553,9 @@ } }, "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, "license": "MIT", "peer": true @@ -10973,9 +11698,9 @@ } }, "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -11018,15 +11743,15 @@ "license": "MIT" }, "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", "dev": true, "license": "MIT", "dependencies": { "@one-ini/wasm": "0.1.1", "commander": "^10.0.0", - "minimatch": "9.0.1", + "minimatch": "^9.0.1", "semver": "^7.5.3" }, "bin": { @@ -11047,13 +11772,13 @@ } }, "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -11107,9 +11832,9 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, "license": "MIT", "peer": true @@ -11217,7 +11942,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "devOptional": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -12470,6 +13194,22 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -12666,6 +13406,12 @@ "license": "MIT", "peer": true }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -12752,11 +13498,26 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fast-xml-builder": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", - "devOptional": true, + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.4.tgz", + "integrity": "sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==", + "dev": true, "funding": [ { "type": "github", @@ -12764,8 +13525,9 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "strnum": "^1.1.1" + "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" @@ -12831,7 +13593,6 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -12992,9 +13753,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -13027,12 +13788,12 @@ } }, "node_modules/focus-trap": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.7.0.tgz", - "integrity": "sha512-DJJDHpEgoSbP8ZE1MNeU2IzCpfFyFdNZZRilqmfH2XiQsPK6PtD8AfJqWzEBudUQB2yHwZc5iq54rjTaGQ+ljw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", "license": "MIT", "dependencies": { - "tabbable": "^6.3.0" + "tabbable": "^6.4.0" } }, "node_modules/follow-redirects": { @@ -13121,7 +13882,6 @@ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", - "optional": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -13567,6 +14327,22 @@ "dev": true, "license": "MIT" }, + "node_modules/gridstack": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/gridstack/-/gridstack-10.3.1.tgz", + "integrity": "sha512-Ra82k/88gdeiu3ZP40COS4bI4sGhNQlZAaAQ6szfPfr68zVpsXxiyLKr5zYcTpKX4jjcwyNsNNdcV1tDJc71fA==", + "funding": [ + { + "type": "paypal", + "url": "https://www.paypal.me/alaind831" + }, + { + "type": "venmo", + "url": "https://www.venmo.com/adumesny" + } + ], + "license": "MIT" + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -13805,6 +14581,56 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "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", @@ -13862,20 +14688,11 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" }, "node_modules/hosted-git-info": { "version": "4.1.0", @@ -13917,8 +14734,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/hot-patcher/-/hot-patcher-2.0.1.tgz", "integrity": "sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/hpack.js": { "version": "2.1.6", @@ -14215,12 +15031,6 @@ "node": ">=10.18" } }, - "node_modules/ical.js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.2.1.tgz", - "integrity": "sha512-yK/UlPbEs316igb/tjRgbFA8ZV75rCsBJp/hWOatpyaPNlgw0dGDmU+FoicOcwX4xXkeXOkYiOmCqNPFpNPkQg==", - "license": "MPL-2.0" - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -14267,9 +15077,9 @@ } }, "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, "license": "MIT", "peer": true @@ -14777,20 +15587,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -15181,6 +15977,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -17203,13 +18013,13 @@ } }, "node_modules/js-beautify/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -17308,7 +18118,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -17411,8 +18220,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/layerr/-/layerr-3.0.0.tgz", "integrity": "sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/leven": { "version": "3.1.0", @@ -17476,8 +18284,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/load-plugin": { "version": "6.0.3", @@ -17533,6 +18340,23 @@ "json5": "lib/cli.js" } }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -17550,9 +18374,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -17645,6 +18469,30 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -17946,6 +18794,48 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.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", @@ -18637,9 +19527,9 @@ } }, "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, "license": "MIT", "peer": true @@ -18720,9 +19610,9 @@ "peer": true }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -18921,19 +19811,13 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "optional": true, + "peer": true }, "node_modules/mkdirp-classic": { "version": "0.5.3", @@ -18943,6 +19827,35 @@ "license": "MIT", "optional": true }, + "node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/moo": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", @@ -18957,6 +19870,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -19083,8 +20002,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/nested-property/-/nested-property-4.0.0.tgz", "integrity": "sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/node-abi": { "version": "3.89.0", @@ -19153,7 +20071,6 @@ } ], "license": "MIT", - "optional": true, "engines": { "node": ">=10.5.0" } @@ -19212,9 +20129,9 @@ } }, "node_modules/node-gettext": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/node-gettext/-/node-gettext-3.0.0.tgz", - "integrity": "sha512-/VRYibXmVoN6tnSAY2JWhNRhWYJ8Cd844jrZU/DwLVoI4vBI6ceYbd8i42sYZ9uOgDH3S7vslIKOWV/ZrT2YBA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-gettext/-/node-gettext-3.0.1.tgz", + "integrity": "sha512-foI20qQAV22OlCeFIUZiXZutPbe23nGuDp7hLvK6PanhOYlUJIgLAUZa4MB5pX0J62dubOM/MYVhQ2aYTUPbhA==", "dependencies": { "lodash.get": "^4.4.2" } @@ -19812,38 +20729,16 @@ "word-wrap": "^1.2.5" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } + "peer": true }, "node_modules/own-keys": { "version": "1.0.1", @@ -20116,6 +21011,21 @@ "node": ">=8" } }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -20146,8 +21056,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz", "integrity": "sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==", - "license": "ISC", - "optional": true + "license": "ISC" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -20189,6 +21098,12 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, "node_modules/pbkdf2": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", @@ -20208,6 +21123,14 @@ "node": ">= 0.10" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -20353,6 +21276,17 @@ "node": ">=8" } }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -20394,9 +21328,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "funding": [ { "type": "opencollective", @@ -20621,17 +21555,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/proc-log": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", @@ -20778,9 +21701,9 @@ } }, "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", "dev": true, "license": "MIT", "peer": true @@ -20825,9 +21748,9 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -20841,6 +21764,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -20855,7 +21794,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "devOptional": true, "license": "MIT" }, "node_modules/queue-microtask": { @@ -20920,6 +21858,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -22073,20 +23012,6 @@ "unist-util-visit": "^5.0.0" } }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -22121,7 +23046,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "devOptional": true, "license": "MIT" }, "node_modules/resolve": { @@ -22228,6 +23152,14 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -22517,10 +23449,13 @@ } }, "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "license": "BlueOak-1.0.0" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/saxes": { "version": "6.0.0", @@ -22555,9 +23490,9 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -22599,6 +23534,12 @@ "extend": "^3.0.0" } }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -22677,16 +23618,6 @@ "license": "MIT", "peer": true }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -23080,17 +24011,6 @@ "dev": true, "license": "MIT" }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -23265,17 +24185,6 @@ "urix": "^0.1.0" } }, - "node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", @@ -23387,6 +24296,17 @@ "node": ">= 6" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/splitpanes": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-2.4.1.tgz", @@ -23768,14 +24688,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "devOptional": true, + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/strtok3": { "version": "10.3.4", @@ -23823,6 +24744,30 @@ "license": "ISC", "peer": true }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-js/node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/style-to-js/node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -24095,6 +25040,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -24270,9 +25229,9 @@ "license": "MIT" }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/table": { @@ -24294,9 +25253,9 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "peer": true, @@ -24437,16 +25396,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -24611,7 +25569,6 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -24628,7 +25585,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -24646,7 +25602,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -24794,17 +25749,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", @@ -25037,6 +25981,15 @@ "node": ">=8" } }, + "node_modules/ts-md5": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-2.0.1.tgz", + "integrity": "sha512-yF35FCoEOFBzOclSkMNEUbFQZuv89KEQ+5Xz03HrMSGUGB1+r+El+JiGOFwsP4p9RFNzwlrydYoTLvPOuICl9w==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -25293,11 +26246,16 @@ } }, "node_modules/typescript-event-target": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/typescript-event-target/-/typescript-event-target-1.1.1.tgz", - "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==", - "license": "MIT", - "optional": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/typescript-event-target/-/typescript-event-target-1.1.2.tgz", + "integrity": "sha512-TvkrTUpv7gCPlcnSoEwUVUBwsdheKm+HF5u2tPAKubkIGMfovdSizCTaZRY/NhR8+Ijy8iZZUapbVQAsNrkFrw==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" }, "node_modules/uglify-js": { "version": "3.19.3", @@ -25621,12 +26579,12 @@ } }, "node_modules/unified-engine/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -25822,9 +26780,9 @@ } }, "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==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -25871,6 +26829,60 @@ "node": ">= 0.8" } }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -25975,7 +26987,6 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "license": "MIT", - "optional": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -25984,7 +26995,6 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "devOptional": true, "license": "MIT", "dependencies": { "querystringify": "^2.1.1", @@ -26278,15 +27288,15 @@ } }, "node_modules/vue-codemirror6": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/vue-codemirror6/-/vue-codemirror6-1.4.1.tgz", - "integrity": "sha512-mokK4q89TvxtGXzdEv3YyvfX3RJJs7VxyNjBNpdNbP+jpum/ttLvWB+TEh/ziVZq5mFrQazVPCfUV8TVI/Ji2A==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/vue-codemirror6/-/vue-codemirror6-1.4.3.tgz", + "integrity": "sha512-TLabAapy4vethIEWwPMNtv62/zHjpvTv0kJlGy5RtFavKNlm4NJdT3fPFT2DtVVbQ1ZvHWpHrHM7FCjG2QNGDA==", "license": "MIT", "dependencies": { "vue-demi": "latest" }, "engines": { - "node": ">=18", + "node": "^20.19.0 || >=22.12.0", "pnpm": ">=10.3.0" }, "peerDependencies": { @@ -26685,23 +27695,21 @@ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "license": "MIT", - "optional": true, "engines": { "node": ">= 8" } }, "node_modules/webdav": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webdav/-/webdav-5.8.0.tgz", - "integrity": "sha512-iuFG7NamJ41Oshg4930iQgfIpRrUiatPWIekeznYgEf2EOraTRcDPTjy7gIOMtkdpKTaqPk1E68NO5PAGtJahA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webdav/-/webdav-5.9.0.tgz", + "integrity": "sha512-OMJ6wtK1WvCO++aOLoQgE96S8KT4e5aaClWHmHXfFU369r4eyELN569B7EqT4OOUb99mmO58GkyuiCv/Ag6J0Q==", "license": "MIT", - "optional": true, "dependencies": { "@buttercup/fetch": "^0.2.1", "base-64": "^1.0.0", "byte-length": "^1.0.2", - "entities": "^6.0.0", - "fast-xml-parser": "^4.5.1", + "entities": "^6.0.1", + "fast-xml-parser": "^5.3.4", "hot-patcher": "^2.0.1", "layerr": "^3.0.0", "md5": "^2.3.0", @@ -26721,19 +27729,37 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "optional": true, "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/webdav/node_modules/fast-xml-parser": { + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.7.tgz", + "integrity": "sha512-LteOsISQ2GEiDHZch6L9hB0+MLoYVLToR7xotrzU0opCICBkxOPgHAy1HxAvtxfJNXDJpgAsQN30mkrfpO2Prg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.1.3", + "strnum": "^2.2.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/webdav/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", - "optional": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -26747,7 +27773,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", - "optional": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -26761,6 +27786,18 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/webdav/node_modules/strnum": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.1.tgz", + "integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -27074,6 +28111,12 @@ "node": ">=10.13.0" } }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", diff --git a/phpcs.xml b/phpcs.xml index 6d4ef55dd..ab4d04e11 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -2,10 +2,10 @@ The coding standard for PHP_CodeSniffer itself, for more config -> for https://github.com/squizlabs/PHP_CodeSniffer/wiki/Configuration-Options. - README.md - src + lib + @@ -47,12 +47,13 @@ - + + diff --git a/phpunit.xml b/phpunit.xml index b70789e24..50b9ddef5 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,17 +1,38 @@ + colors="true" + cacheDirectory=".phpunit.cache" + executionOrder="depends,defects" + requireCoverageMetadata="false" + beStrictAboutCoverageMetadata="true" + beStrictAboutOutputDuringTests="true" + failOnRisky="true" + failOnWarning="false" + failOnDeprecation="false"> + - tests/unit + tests/Unit - + lib/ + + + + + + + + + + + + diff --git a/src/views/dashboard/DashboardIndex.vue b/src/views/dashboard/DashboardIndex.vue index 0e94dc819..9b9018c9a 100644 --- a/src/views/dashboard/DashboardIndex.vue +++ b/src/views/dashboard/DashboardIndex.vue @@ -1036,15 +1036,6 @@ body[data-theme-dark] .dashboard-content > .stats > div { display: none; } -/* Add these new styles for the loading state */ -.dashboard-content > .stats > div > .content { - display: flex; - justify-content: center; - align-items: center; - height: calc(100% - 40px); - font-size: 3.5rem; -} - /* Adjust the loading icon size and color to match the theme */ .dashboard-content > .stats .icon-loading { width: 44px; diff --git a/stylelint.config.js b/stylelint.config.js index 3be3a7b11..85785a927 100644 --- a/stylelint.config.js +++ b/stylelint.config.js @@ -1,3 +1,6 @@ module.exports = { extends: 'stylelint-config-recommended-vue', + rules: { + 'no-descending-specificity': null, + }, } diff --git a/tests/Unit/Controller/UserControllerTest.php b/tests/Unit/Controller/UserControllerTest.php index 49f59cfa6..ef7c0b3ea 100644 --- a/tests/Unit/Controller/UserControllerTest.php +++ b/tests/Unit/Controller/UserControllerTest.php @@ -4,7 +4,7 @@ /** * UserControllerTest - * + * * Unit tests for the UserController * * @category Test @@ -20,13 +20,19 @@ use OCA\OpenConnector\Controller\UserController; use OCA\OpenConnector\Service\AuthorizationService; +use OCA\OpenConnector\Service\UserService; +use OCA\OpenConnector\Service\OrganisationBridgeService; use OCP\AppFramework\Http\JSONResponse; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\IL10N; use OCP\IRequest; use OCP\IUserManager; use OCP\IUserSession; use OCP\IUser; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; /** * Unit tests for the UserController @@ -74,6 +80,41 @@ class UserControllerTest extends TestCase */ private MockObject $authorizationService; + /** + * Mock cache factory + * + * @var MockObject|ICacheFactory + */ + private MockObject $cacheFactory; + + /** + * Mock logger + * + * @var MockObject|LoggerInterface + */ + private MockObject $logger; + + /** + * Mock user service + * + * @var MockObject|UserService + */ + private MockObject $userService; + + /** + * Mock organisation bridge service + * + * @var MockObject|OrganisationBridgeService + */ + private MockObject $organisationBridgeService; + + /** + * Mock localization service + * + * @var MockObject|IL10N + */ + private MockObject $l; + /** * Mock user object * @@ -88,7 +129,7 @@ class UserControllerTest extends TestCase * for testing purposes. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -101,15 +142,35 @@ protected function setUp(): void $this->userManager = $this->createMock(IUserManager::class); $this->userSession = $this->createMock(IUserSession::class); $this->authorizationService = $this->createMock(AuthorizationService::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->userService = $this->createMock(UserService::class); + $this->organisationBridgeService = $this->createMock(OrganisationBridgeService::class); + $this->l = $this->createMock(IL10N::class); $this->user = $this->createMock(IUser::class); + // Configure IL10N mock to return the input string as-is (pass-through translation) + $this->l->method('t')->willReturnArgument(0); + + // Configure cache factory to return a proper ICache mock + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $cacheMock = $this->createMock(ICache::class); + $this->cacheFactory->method('createDistributed')->willReturn($cacheMock); + + // Configure request to return a remote address for SecurityService + $this->request->method('getRemoteAddress')->willReturn('127.0.0.1'); + // Initialize the controller with mocked dependencies $this->controller = new UserController( 'openconnector', $this->request, $this->userManager, $this->userSession, - $this->authorizationService + $this->authorizationService, + $this->cacheFactory, + $this->logger, + $this->userService, + $this->organisationBridgeService, + $this->l ); } @@ -120,7 +181,7 @@ protected function setUp(): void * when a user is authenticated. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -129,11 +190,23 @@ public function testMeSuccessful(): void // Setup mock user data $this->setupMockUserData(); - // Mock user session to return the authenticated user - $this->userSession->expects($this->once()) - ->method('getUser') + // Mock user service to return the authenticated user + $this->userService->expects($this->once()) + ->method('getCurrentUser') ->willReturn($this->user); + // Mock user service to return built user data array + $expectedUserData = [ + 'uid' => 'testuser', + 'displayName' => 'Test User', + 'email' => 'test@example.com', + 'enabled' => true, + ]; + $this->userService->expects($this->once()) + ->method('buildUserDataArray') + ->with($this->user) + ->willReturn($expectedUserData); + // Execute the method $response = $this->controller->me(); @@ -156,15 +229,15 @@ public function testMeSuccessful(): void * when no user is logged in. * * @return void - * + * * @psalm-return void * @phpstan-return void */ public function testMeUnauthenticated(): void { - // Mock user session to return null (no authenticated user) - $this->userSession->expects($this->once()) - ->method('getUser') + // Mock user service to return null (no authenticated user) + $this->userService->expects($this->once()) + ->method('getCurrentUser') ->willReturn(null); // Execute the method @@ -183,7 +256,7 @@ public function testMeUnauthenticated(): void * user information when valid data is provided. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -192,9 +265,9 @@ public function testUpdateMeSuccessful(): void // Setup mock user data $this->setupMockUserData(); - // Mock user session to return the authenticated user - $this->userSession->expects($this->once()) - ->method('getUser') + // Mock user service to return the authenticated user + $this->userService->expects($this->once()) + ->method('getCurrentUser') ->willReturn($this->user); // Mock request parameters with update data @@ -207,24 +280,25 @@ public function testUpdateMeSuccessful(): void ->method('getParams') ->willReturn($updateData); - // Mock user update methods - $this->user->expects($this->once()) - ->method('canChangeDisplayName') - ->willReturn(true); - $this->user->expects($this->once()) - ->method('setDisplayName') - ->with('Updated User Name'); - - $this->user->expects($this->once()) - ->method('canChangeMailAddress') - ->willReturn(true); - $this->user->expects($this->once()) - ->method('setEMailAddress') - ->with('updated@example.com'); - - $this->user->expects($this->once()) - ->method('setLanguage') - ->with('en'); + // Mock user service updateUserProperties + $this->userService->expects($this->once()) + ->method('updateUserProperties') + ->with($this->user, $updateData) + ->willReturn([ + 'success' => true, + 'message' => 'User properties updated successfully', + 'organisation_updated' => false + ]); + + // Mock user service buildUserDataArray + $this->userService->expects($this->once()) + ->method('buildUserDataArray') + ->with($this->user) + ->willReturn([ + 'uid' => 'testuser', + 'displayName' => 'Updated User Name', + 'email' => 'updated@example.com', + ]); // Execute the method $response = $this->controller->updateMe(); @@ -241,15 +315,15 @@ public function testUpdateMeSuccessful(): void * when no user is logged in. * * @return void - * + * * @psalm-return void * @phpstan-return void */ public function testUpdateMeUnauthenticated(): void { - // Mock user session to return null (no authenticated user) - $this->userSession->expects($this->once()) - ->method('getUser') + // Mock user service to return null (no authenticated user) + $this->userService->expects($this->once()) + ->method('getCurrentUser') ->willReturn(null); // Execute the method @@ -268,7 +342,7 @@ public function testUpdateMeUnauthenticated(): void * a user with valid credentials. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -297,6 +371,17 @@ public function testLoginSuccessful(): void ->method('setUser') ->with($this->user); + // Mock user service to return built user data array + $expectedUserData = [ + 'uid' => 'testuser', + 'displayName' => 'Test User', + 'email' => 'test@example.com', + ]; + $this->userService->expects($this->once()) + ->method('buildUserDataArray') + ->with($this->user) + ->willReturn($expectedUserData); + // Execute the method $response = $this->controller->login(); @@ -318,7 +403,7 @@ public function testLoginSuccessful(): void * when invalid credentials are provided. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -355,7 +440,7 @@ public function testLoginInvalidCredentials(): void * when required credentials are missing. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -386,7 +471,7 @@ public function testLoginMissingCredentials(): void * when credentials are empty strings. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -417,15 +502,15 @@ public function testLoginEmptyCredentials(): void * and returns appropriate error responses. * * @return void - * + * * @psalm-return void * @phpstan-return void */ public function testMeException(): void { - // Mock user session to throw exception - $this->userSession->expects($this->once()) - ->method('getUser') + // Mock user service to throw exception + $this->userService->expects($this->once()) + ->method('getCurrentUser') ->willThrowException(new \Exception('Test exception')); // Execute the method @@ -434,7 +519,7 @@ public function testMeException(): void // Assert response shows error $this->assertInstanceOf(JSONResponse::class, $response); $this->assertEquals(500, $response->getStatus()); - $this->assertStringContains('Failed to retrieve user information', $response->getData()['error']); + $this->assertStringContainsString('Failed to retrieve user information', $response->getData()['error']); } /** @@ -444,15 +529,15 @@ public function testMeException(): void * and returns appropriate error responses. * * @return void - * + * * @psalm-return void * @phpstan-return void */ public function testUpdateMeException(): void { - // Mock user session to throw exception - $this->userSession->expects($this->once()) - ->method('getUser') + // Mock user service to throw exception + $this->userService->expects($this->once()) + ->method('getCurrentUser') ->willThrowException(new \Exception('Test exception')); // Execute the method @@ -461,7 +546,7 @@ public function testUpdateMeException(): void // Assert response shows error $this->assertInstanceOf(JSONResponse::class, $response); $this->assertEquals(500, $response->getStatus()); - $this->assertStringContains('Failed to update user information', $response->getData()['error']); + $this->assertStringContainsString('Failed to update user information', $response->getData()['error']); } /** @@ -471,7 +556,7 @@ public function testUpdateMeException(): void * and returns appropriate error responses. * * @return void - * + * * @psalm-return void * @phpstan-return void */ @@ -497,7 +582,7 @@ public function testLoginException(): void // Assert response shows error $this->assertInstanceOf(JSONResponse::class, $response); $this->assertEquals(500, $response->getStatus()); - $this->assertStringContains('Login failed', $response->getData()['error']); + $this->assertStringContainsString('Login failed', $response->getData()['error']); } /** @@ -507,29 +592,24 @@ public function testLoginException(): void * test data for use in various test scenarios. * * @return void - * + * * @psalm-return void * @phpstan-return void */ private function setupMockUserData(): void { - // Configure mock user with test data + // Configure mock user with test data (only methods from IUser interface) $this->user->method('getUID')->willReturn('testuser'); $this->user->method('getDisplayName')->willReturn('Test User'); $this->user->method('getEMailAddress')->willReturn('test@example.com'); $this->user->method('isEnabled')->willReturn(true); $this->user->method('getQuota')->willReturn('1 GB'); - $this->user->method('getUsedSpace')->willReturn(524288000); // 500 MB in bytes - $this->user->method('getAvatarScope')->willReturn('contacts'); - $this->user->method('getLastLogin')->willReturn(1640995200); // Unix timestamp + $this->user->method('getLastLogin')->willReturn(1640995200); $this->user->method('getBackendClassName')->willReturn('Database'); - $this->user->method('getLanguage')->willReturn('en'); - $this->user->method('getLocale')->willReturn('en_US'); - - // Configure capability methods + + // Configure capability methods (only those on the IUser interface) $this->user->method('canChangeDisplayName')->willReturn(true); - $this->user->method('canChangeMailAddress')->willReturn(true); $this->user->method('canChangePassword')->willReturn(true); $this->user->method('canChangeAvatar')->willReturn(true); } -} \ No newline at end of file +} diff --git a/tests/Unit/Service/ConfigurationServiceTest.php b/tests/Unit/Service/ConfigurationServiceTest.php index 9bab78891..b4e63dc4c 100644 --- a/tests/Unit/Service/ConfigurationServiceTest.php +++ b/tests/Unit/Service/ConfigurationServiceTest.php @@ -3,18 +3,20 @@ namespace OCA\OpenConnector\Tests\Unit\Service; use OCA\OpenConnector\Service\ConfigurationService; -use OCA\OpenConnector\Db\Source; -use OCA\OpenConnector\Db\Endpoint; -use OCA\OpenConnector\Db\Mapping; -use OCA\OpenConnector\Db\Rule; -use OCA\OpenConnector\Db\Job; -use OCA\OpenConnector\Db\Synchronization; use OCA\OpenConnector\Db\SourceMapper; use OCA\OpenConnector\Db\EndpointMapper; use OCA\OpenConnector\Db\MappingMapper; use OCA\OpenConnector\Db\RuleMapper; use OCA\OpenConnector\Db\JobMapper; use OCA\OpenConnector\Db\SynchronizationMapper; +use OCA\OpenRegister\Db\RegisterMapper; +use OCA\OpenRegister\Db\SchemaMapper; +use OCA\OpenConnector\Service\ConfigurationHandlers\EndpointHandler; +use OCA\OpenConnector\Service\ConfigurationHandlers\SynchronizationHandler; +use OCA\OpenConnector\Service\ConfigurationHandlers\MappingHandler; +use OCA\OpenConnector\Service\ConfigurationHandlers\JobHandler; +use OCA\OpenConnector\Service\ConfigurationHandlers\SourceHandler; +use OCA\OpenConnector\Service\ConfigurationHandlers\RuleHandler; use PHPUnit\Framework\TestCase; /** @@ -39,6 +41,14 @@ class ConfigurationServiceTest extends TestCase private RuleMapper $ruleMapper; private JobMapper $jobMapper; private SynchronizationMapper $synchronizationMapper; + private RegisterMapper $registerMapper; + private SchemaMapper $schemaMapper; + private EndpointHandler $endpointHandler; + private SynchronizationHandler $synchronizationHandler; + private MappingHandler $mappingHandler; + private JobHandler $jobHandler; + private SourceHandler $sourceHandler; + private RuleHandler $ruleHandler; protected function setUp(): void { @@ -48,6 +58,14 @@ protected function setUp(): void $this->ruleMapper = $this->createMock(RuleMapper::class); $this->jobMapper = $this->createMock(JobMapper::class); $this->synchronizationMapper = $this->createMock(SynchronizationMapper::class); + $this->registerMapper = $this->createMock(RegisterMapper::class); + $this->schemaMapper = $this->createMock(SchemaMapper::class); + $this->endpointHandler = $this->createMock(EndpointHandler::class); + $this->synchronizationHandler = $this->createMock(SynchronizationHandler::class); + $this->mappingHandler = $this->createMock(MappingHandler::class); + $this->jobHandler = $this->createMock(JobHandler::class); + $this->sourceHandler = $this->createMock(SourceHandler::class); + $this->ruleHandler = $this->createMock(RuleHandler::class); $this->configurationService = new ConfigurationService( $this->sourceMapper, @@ -55,109 +73,199 @@ protected function setUp(): void $this->mappingMapper, $this->ruleMapper, $this->jobMapper, - $this->synchronizationMapper + $this->synchronizationMapper, + $this->registerMapper, + $this->schemaMapper, + $this->endpointHandler, + $this->synchronizationHandler, + $this->mappingHandler, + $this->jobHandler, + $this->sourceHandler, + $this->ruleHandler ); } - public function testGetEntitiesByConfiguration(): void + public function testGetEntitiesByConfigurationEmpty(): void { $configurationId = 'test-config-1'; - $expectedSources = [new Source()]; - $expectedEndpoints = [new Endpoint()]; - $expectedMappings = [new Mapping()]; - $expectedRules = [new Rule()]; - $expectedJobs = [new Job()]; - $expectedSynchronizations = [new Synchronization()]; $this->sourceMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedSources); + ->willReturn([]); $this->endpointMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedEndpoints); + ->willReturn([]); $this->mappingMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedMappings); + ->willReturn([]); $this->ruleMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedRules); + ->willReturn([]); $this->jobMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedJobs); + ->willReturn([]); $this->synchronizationMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedSynchronizations); + ->willReturn([]); $result = $this->configurationService->getEntitiesByConfiguration($configurationId); - $this->assertEquals($expectedSources, $result['sources']); - $this->assertEquals($expectedEndpoints, $result['endpoints']); - $this->assertEquals($expectedMappings, $result['mappings']); - $this->assertEquals($expectedRules, $result['rules']); - $this->assertEquals($expectedJobs, $result['jobs']); - $this->assertEquals($expectedSynchronizations, $result['synchronizations']); + $this->assertEquals([], $result['sources']); + $this->assertEquals([], $result['endpoints']); + $this->assertEquals([], $result['mappings']); + $this->assertEquals([], $result['rules']); + $this->assertEquals([], $result['jobs']); + $this->assertEquals([], $result['synchronizations']); } - public function testExportConfiguration(): void + public function testGetEntitiesByConfigurationWithSluggedEntities(): void + { + $configurationId = 'test-config-1'; + + // The indexBySlug helper in getEntitiesByConfiguration expects entities + // with array access and a 'slug' key. Use arrays to simulate serialized entities. + $sourceArray = ['slug' => 'source-one', 'name' => 'Source One']; + $endpointArray = ['slug' => 'endpoint-one', 'name' => 'Endpoint One']; + $mappingArray = ['slug' => 'mapping-one', 'name' => 'Mapping One']; + $ruleArray = ['slug' => 'rule-one', 'name' => 'Rule One']; + $jobArray = ['slug' => 'job-one', 'name' => 'Job One']; + $syncArray = ['slug' => 'sync-one', 'name' => 'Sync One']; + + $this->sourceMapper->expects($this->once()) + ->method('findByConfiguration') + ->with($configurationId) + ->willReturn([$sourceArray]); + + $this->endpointMapper->expects($this->once()) + ->method('findByConfiguration') + ->with($configurationId) + ->willReturn([$endpointArray]); + + $this->mappingMapper->expects($this->once()) + ->method('findByConfiguration') + ->with($configurationId) + ->willReturn([$mappingArray]); + + $this->ruleMapper->expects($this->once()) + ->method('findByConfiguration') + ->with($configurationId) + ->willReturn([$ruleArray]); + + $this->jobMapper->expects($this->once()) + ->method('findByConfiguration') + ->with($configurationId) + ->willReturn([$jobArray]); + + $this->synchronizationMapper->expects($this->once()) + ->method('findByConfiguration') + ->with($configurationId) + ->willReturn([$syncArray]); + + $result = $this->configurationService->getEntitiesByConfiguration($configurationId); + + $this->assertEquals(['source-one' => $sourceArray], $result['sources']); + $this->assertEquals(['endpoint-one' => $endpointArray], $result['endpoints']); + $this->assertEquals(['mapping-one' => $mappingArray], $result['mappings']); + $this->assertEquals(['rule-one' => $ruleArray], $result['rules']); + $this->assertEquals(['job-one' => $jobArray], $result['jobs']); + $this->assertEquals(['sync-one' => $syncArray], $result['synchronizations']); + } + + public function testGetEntitiesByConfigurationReturnsCorrectKeys(): void + { + $configurationId = 'test-config-1'; + + $this->sourceMapper->method('findByConfiguration')->willReturn([]); + $this->endpointMapper->method('findByConfiguration')->willReturn([]); + $this->mappingMapper->method('findByConfiguration')->willReturn([]); + $this->ruleMapper->method('findByConfiguration')->willReturn([]); + $this->jobMapper->method('findByConfiguration')->willReturn([]); + $this->synchronizationMapper->method('findByConfiguration')->willReturn([]); + + $result = $this->configurationService->getEntitiesByConfiguration($configurationId); + + $this->assertArrayHasKey('sources', $result); + $this->assertArrayHasKey('endpoints', $result); + $this->assertArrayHasKey('mappings', $result); + $this->assertArrayHasKey('rules', $result); + $this->assertArrayHasKey('jobs', $result); + $this->assertArrayHasKey('synchronizations', $result); + } + + public function testExportConfigurationEmpty(): void { $configurationId = 'test-config-1'; - $expectedSources = [new Source()]; - $expectedEndpoints = [new Endpoint()]; - $expectedMappings = [new Mapping()]; - $expectedRules = [new Rule()]; - $expectedJobs = [new Job()]; - $expectedSynchronizations = [new Synchronization()]; $this->sourceMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedSources); + ->willReturn([]); $this->endpointMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedEndpoints); + ->willReturn([]); $this->mappingMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedMappings); + ->willReturn([]); $this->ruleMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedRules); + ->willReturn([]); $this->jobMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedJobs); + ->willReturn([]); $this->synchronizationMapper->expects($this->once()) ->method('findByConfiguration') ->with($configurationId) - ->willReturn($expectedSynchronizations); + ->willReturn([]); + + $result = $this->configurationService->exportConfiguration($configurationId); + + $this->assertArrayHasKey('components', $result); + $this->assertArrayHasKey('sources', $result['components']); + $this->assertArrayHasKey('endpoints', $result['components']); + $this->assertArrayHasKey('mappings', $result['components']); + $this->assertArrayHasKey('rules', $result['components']); + $this->assertArrayHasKey('jobs', $result['components']); + $this->assertArrayHasKey('synchronizations', $result['components']); + } + + public function testExportConfigurationReturnsComponentsStructure(): void + { + $configurationId = 'test-config-1'; + + $this->sourceMapper->method('findByConfiguration')->willReturn([]); + $this->endpointMapper->method('findByConfiguration')->willReturn([]); + $this->mappingMapper->method('findByConfiguration')->willReturn([]); + $this->ruleMapper->method('findByConfiguration')->willReturn([]); + $this->jobMapper->method('findByConfiguration')->willReturn([]); + $this->synchronizationMapper->method('findByConfiguration')->willReturn([]); $result = $this->configurationService->exportConfiguration($configurationId); - $this->assertEquals($configurationId, $result['configurationId']); - $this->assertArrayHasKey('exportDate', $result); - $this->assertEquals($expectedSources, $result['entities']['sources']); - $this->assertEquals($expectedEndpoints, $result['entities']['endpoints']); - $this->assertEquals($expectedMappings, $result['entities']['mappings']); - $this->assertEquals($expectedRules, $result['entities']['rules']); - $this->assertEquals($expectedJobs, $result['entities']['jobs']); - $this->assertEquals($expectedSynchronizations, $result['entities']['synchronizations']); + // exportConfiguration now returns a components-based structure + $this->assertIsArray($result); + $this->assertCount(1, $result); + $this->assertArrayHasKey('components', $result); + $components = $result['components']; + $this->assertCount(6, $components); } -} \ No newline at end of file +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 000000000..9561a8d94 --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,45 @@ + + * @copyright 2025 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://OpenConnector.app + */ + +declare(strict_types=1); + +// Define that we're running PHPUnit. +define('PHPUNIT_RUN', 1); + +// Include Composer's autoloader. +require_once __DIR__ . '/../vendor/autoload.php'; + +// Bootstrap Nextcloud if not already done. +if (!defined('OC_CONSOLE')) { + // Try to include the main Nextcloud bootstrap. + if (file_exists(__DIR__ . '/../../../lib/base.php')) { + require_once __DIR__ . '/../../../lib/base.php'; + } + + // Load Test\TestCase and other NC test classes (NC convention). + if (file_exists(__DIR__ . '/../../../tests/autoload.php')) { + require_once __DIR__ . '/../../../tests/autoload.php'; + } + + // Load all enabled apps. + \OC_App::loadApps(); + + // Load our specific app. + \OC_App::loadApp('openconnector'); + + // Clear hooks for testing. + OC_Hook::clear(); +}