From 1c1b7015cc9e9bfd1d63a4ea5559eb812a8acea8 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 09:26:42 +0700 Subject: [PATCH 01/28] [TASK] Remove newly introduced Docker, adjust workflows * Docker didn't provide additional value beyond ddev. * Adjust version matrix for PHP and DBMS'. * add JavaScript tests in previously existing ci.yml. * Remove Docker related workflow file. --- .github/workflows/ci.yml | 72 +---- .../workflows/typo3-multi-version-tests.yml | 259 ---------------- Build/Scripts/runTests.sh | 84 ++--- Tests/Docker/README.md | 287 ------------------ Tests/Docker/typo3-v14/Dockerfile | 76 ----- Tests/Docker/typo3-v14/LocalConfiguration.php | 122 -------- Tests/Docker/typo3-v14/additional.php | 55 ---- Tests/Docker/typo3-v14/apache-vhost.conf | 25 -- Tests/Docker/typo3-v14/composer.json | 40 --- Tests/Docker/typo3-v14/docker-compose.yml | 47 --- Tests/Docker/typo3-v14/init-db.sql | 73 ----- package.json | 5 +- 12 files changed, 55 insertions(+), 1090 deletions(-) delete mode 100644 .github/workflows/typo3-multi-version-tests.yml delete mode 100644 Tests/Docker/README.md delete mode 100644 Tests/Docker/typo3-v14/Dockerfile delete mode 100644 Tests/Docker/typo3-v14/LocalConfiguration.php delete mode 100644 Tests/Docker/typo3-v14/additional.php delete mode 100644 Tests/Docker/typo3-v14/apache-vhost.conf delete mode 100644 Tests/Docker/typo3-v14/composer.json delete mode 100644 Tests/Docker/typo3-v14/docker-compose.yml delete mode 100644 Tests/Docker/typo3-v14/init-db.sql diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 780ebbf5..3f629c36 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,7 +99,7 @@ jobs: run: npm ci - name: Run JavaScript tests - run: npm test + run: npm test -- --run --reporter=verbose #--------------------------------------------------------------------------------------------------------------------- # Extended tests - focus on reliability over comprehensive database testing @@ -136,7 +136,7 @@ jobs: timeout-minutes: 15 - name: Run JavaScript tests - run: npm test + run: npm test -- --run --reporter=verbose timeout-minutes: 5 documentation: @@ -163,74 +163,6 @@ jobs: retention-days: 90 overwrite: true - #--------------------------------------------------------------------------------------------------------------------- - # Multi-version compatibility check ensures the extension works across supported TYPO3 versions - # This job triggers the multi-version workflow and waits for its completion - #--------------------------------------------------------------------------------------------------------------------- - multi-version-compatibility: - name: "Multi-version compatibility check" - runs-on: ubuntu-latest - needs: [quick-tests, javascript-tests, tests-extended] - if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/v5-dev' - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Trigger multi-version tests - uses: actions/github-script@v7 - with: - script: | - // Check if multi-version workflow exists and trigger it - try { - const workflow = await github.rest.actions.getWorkflowByFilename({ - owner: context.repo.owner, - repo: context.repo.repo, - filename: 'typo3-multi-version-tests.yml' - }); - - console.log('Multi-version workflow found, it will run automatically based on the same triggers'); - } catch (error) { - console.log('Multi-version workflow not found, skipping multi-version tests'); - } - - - name: Wait for multi-version tests (on PR) - if: github.event_name == 'pull_request' - uses: actions/github-script@v7 - with: - script: | - const maxWaitTime = 30 * 60 * 1000; // 30 minutes - const pollInterval = 30 * 1000; // 30 seconds - const startTime = Date.now(); - - while (Date.now() - startTime < maxWaitTime) { - const runs = await github.rest.actions.listWorkflowRuns({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'typo3-multi-version-tests.yml', - head_sha: context.sha, - per_page: 1 - }); - - if (runs.data.workflow_runs.length > 0) { - const run = runs.data.workflow_runs[0]; - console.log(`Multi-version test status: ${run.status} (${run.conclusion})`); - - if (run.status === 'completed') { - if (run.conclusion === 'success') { - console.log('✅ Multi-version tests passed'); - return; - } else { - throw new Error(`❌ Multi-version tests failed with conclusion: ${run.conclusion}`); - } - } - } - - await new Promise(resolve => setTimeout(resolve, pollInterval)); - } - - throw new Error('⏰ Multi-version tests did not complete within the timeout period'); - # @todo Add unit test execution after use-full tests has been added # @todo Add functional test execution after use-full tests has been added # @todo Add acceptance test execution after use-full tests has been added along with infrastructure and setup diff --git a/.github/workflows/typo3-multi-version-tests.yml b/.github/workflows/typo3-multi-version-tests.yml deleted file mode 100644 index bebbe251..00000000 --- a/.github/workflows/typo3-multi-version-tests.yml +++ /dev/null @@ -1,259 +0,0 @@ -#======================================================================================================================= - -name: TYPO3 Multi-Version Tests -run-name: "TYPO3 Multi-Version Tests requested by @${{ github.actor }}" - -#----------------------------------------------------------------------------------------------------------------------- -# This workflow tests the paste-reference extension against multiple TYPO3 versions to ensure compatibility -# and prevent regressions when making changes. It runs in parallel with the main CI workflow. -#======================================================================================================================= - -on: - push: - branches: [ main, develop, v5-dev ] - paths: - - 'Classes/**' - - 'Resources/**' - - 'Configuration/**' - - 'Tests/**' - - 'composer.json' - - 'ext_emconf.php' - - 'ext_tables.php' - - '.github/workflows/typo3-multi-version-tests.yml' - pull_request: - types: - - opened - - edited - - reopened - - synchronize - - ready_for_review - paths: - - 'Classes/**' - - 'Resources/**' - - 'Configuration/**' - - 'Tests/**' - - 'composer.json' - - 'ext_emconf.php' - - 'ext_tables.php' - - '.github/workflows/typo3-multi-version-tests.yml' - workflow_dispatch: - inputs: - typo3_versions: - description: 'TYPO3 versions to test (comma-separated)' - required: false - default: '14.3' - php_versions: - description: 'PHP versions to test (comma-separated)' - required: false - default: '8.2,8.3,8.4,8.5' - force_full_test: - description: 'Force full test suite (ignore file change detection)' - type: boolean - required: false - default: false - -jobs: - #--------------------------------------------------------------------------------------------------------------------- - # Multi-version compatibility testing ensures the extension works across supported TYPO3 versions - #--------------------------------------------------------------------------------------------------------------------- - multi-version-tests: - name: "TYPO3 v${{ matrix.typo3-version }} | PHP ${{ matrix.php-version }}" - runs-on: ubuntu-latest - continue-on-error: false - # Remove the complex change detection and always run on relevant events - if: | - github.event_name == 'push' || - github.event_name == 'pull_request' || - github.event_name == 'workflow_dispatch' - - strategy: - fail-fast: false - matrix: - typo3-version: ['14.3'] - php-version: ['8.2', '8.3', '8.4', '8.5'] - # exclude: - # TYPO3 v13 doesn't support PHP 8.4+ yet - # - typo3-version: '13.4' - # php-version: '8.4' - - env: - TYPO3_VERSION: ${{ matrix.typo3-version }} - PHP_VERSION: ${{ matrix.php-version }} - EXTENSION_KEY: paste_reference - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker environment variables - run: | - echo "DOCKER_TAG=typo3-v$(echo ${{ matrix.typo3-version }} | cut -d. -f1)" >> $GITHUB_ENV - echo "TEST_CONTAINER_NAME=typo3-test-${{ matrix.typo3-version }}-php${{ matrix.php-version }}-${{ github.run_id }}" >> $GITHUB_ENV - - - name: Cache Docker layers - uses: actions/cache@v4 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-typo3-${{ matrix.typo3-version }}-${{ hashFiles('Tests/Docker/typo3-v*/Dockerfile') }} - restore-keys: | - ${{ runner.os }}-buildx-typo3-${{ matrix.typo3-version }}- - ${{ runner.os }}-buildx- - - - name: Cache Composer dependencies - uses: actions/cache@v4 - with: - path: | - ~/.composer/cache - .Build/.cache/composer - key: ${{ runner.os }}-composer-typo3-${{ matrix.typo3-version }}-php${{ matrix.php-version }}-${{ hashFiles('Tests/Docker/typo3-v*/composer.json') }} - restore-keys: | - ${{ runner.os }}-composer-typo3-${{ matrix.typo3-version }}-php${{ matrix.php-version }}- - ${{ runner.os }}-composer-typo3-${{ matrix.typo3-version }}- - ${{ runner.os }}-composer- - - - name: Cache Node.js dependencies - uses: actions/cache@v4 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '18' - cache: 'npm' - - - name: Install JavaScript dependencies - run: npm ci - - - name: Build TYPO3 test environment - run: | - cd Tests/Docker/${{ env.DOCKER_TAG }} - docker build -t ${{ env.TEST_CONTAINER_NAME }} \ - --build-arg PHP_VERSION=${{ matrix.php-version }} \ - --build-arg TYPO3_VERSION=${{ matrix.typo3-version }} \ - -f Dockerfile ../../../ - - - name: Start TYPO3 test environment - run: | - cd Tests/Docker/${{ env.DOCKER_TAG }} - # Use 'docker compose' instead of 'docker-compose' and bypass rebuilding - docker compose up -d - - # Debug: See if the container is running (Up) or crashed (Exited) - docker compose ps - # Debug: Read internal webserver errors if it fails - docker compose logs web - - # Wait for TYPO3 to be ready - timeout 300 bash -c 'until curl -f http://localhost:8014/typo3/install.php; do sleep 5; done' - - - name: Install container extension (dependency) - run: | - cd Tests/Docker/${{ env.DOCKER_TAG }} - docker exec ${{ env.TEST_CONTAINER_NAME }} composer require "b13/container:^3.0" --no-interaction - docker exec ${{ env.TEST_CONTAINER_NAME }} php vendor/bin/typo3 extension:activate container || true - - - name: Install paste-reference extension - run: | - chmod +x Tests/Scripts/install-extension.sh - Tests/Scripts/install-extension.sh ${{ env.TEST_CONTAINER_NAME }} ${{ matrix.typo3-version }} - - - name: Set up test data (including container elements) - run: | - chmod +x Tests/Scripts/seed-test-data.sh - Tests/Scripts/seed-test-data.sh ${{ env.TEST_CONTAINER_NAME }} ${{ matrix.typo3-version }} - - - name: Run JavaScript unit tests - run: | - npm test -- --run --reporter=verbose - env: - TYPO3_VERSION: ${{ matrix.typo3-version }} - - - name: Run PHP unit tests - run: | - chmod +x Tests/Scripts/run-tests.sh - Tests/Scripts/run-tests.sh unit ${{ env.TEST_CONTAINER_NAME }} ${{ matrix.typo3-version }} - - - name: Run functional tests - run: | - Tests/Scripts/run-tests.sh functional ${{ env.TEST_CONTAINER_NAME }} ${{ matrix.typo3-version }} - - - name: Run container extension compatibility tests - run: | - Tests/Scripts/run-tests.sh container-tests ${{ env.TEST_CONTAINER_NAME }} ${{ matrix.typo3-version }} - - - name: Run integration tests - run: | - Tests/Scripts/run-tests.sh integration ${{ env.TEST_CONTAINER_NAME }} ${{ matrix.typo3-version }} - - - name: Collect test results - if: always() - run: | - mkdir -p test-results/${{ matrix.typo3-version }}-php${{ matrix.php-version }} - # Copy test results and logs - docker cp ${{ env.TEST_CONTAINER_NAME }}:/var/www/html/typo3temp/var/tests/ test-results/${{ matrix.typo3-version }}-php${{ matrix.php-version }}/tests/ || true - docker logs ${{ env.TEST_CONTAINER_NAME }} > test-results/${{ matrix.typo3-version }}-php${{ matrix.php-version }}/container.log 2>&1 || true - - - name: Upload test results - if: always() - uses: actions/upload-artifact@v4 - with: - name: test-results-typo3-${{ matrix.typo3-version }}-php${{ matrix.php-version }} - path: test-results/ - retention-days: 30 - - - name: Clean up test environment - if: always() - run: | - cd Tests/Docker/${{ env.DOCKER_TAG }} - docker-compose down -v || true - docker rm -f ${{ env.TEST_CONTAINER_NAME }} || true - - #--------------------------------------------------------------------------------------------------------------------- - # Aggregate results from all matrix jobs and provide unified status - #--------------------------------------------------------------------------------------------------------------------- - test-results-summary: - name: "Multi-Version Test Results Summary" - runs-on: ubuntu-latest - needs: multi-version-tests - if: always() - - steps: - - name: Check test results - run: | - echo "Multi-version test results:" - echo "==========================" - - # Check if any jobs failed - if [[ "${{ needs.multi-version-tests.result }}" == "failure" ]]; then - echo "❌ Some multi-version tests failed" - echo "Please check the individual job results for details" - exit 1 - elif [[ "${{ needs.multi-version-tests.result }}" == "success" ]]; then - echo "✅ All multi-version tests passed" - else - echo "⚠️ Multi-version tests completed with status: ${{ needs.multi-version-tests.result }}" - fi - - - name: Set status check - uses: actions/github-script@v7 - if: always() - with: - script: | - const status = '${{ needs.multi-version-tests.result }}' === 'success' ? 'success' : 'failure'; - const description = status === 'success' - ? 'All TYPO3 versions tested successfully' - : 'Some TYPO3 version tests failed'; - - github.rest.repos.createCommitStatus({ - owner: context.repo.owner, - repo: context.repo.repo, - sha: context.sha, - state: status, - target_url: `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, - description: description, - context: 'TYPO3 Multi-Version Tests' - }); diff --git a/Build/Scripts/runTests.sh b/Build/Scripts/runTests.sh index 265a8046..2f8d4eae 100755 --- a/Build/Scripts/runTests.sh +++ b/Build/Scripts/runTests.sh @@ -60,8 +60,8 @@ handleDbmsOptions() { echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2 exit 1 fi - [ -z "${DBMS_VERSION}" ] && DBMS_VERSION="10.4" - if ! [[ ${DBMS_VERSION} =~ ^(10.3|10.4|10.5|10.6|10.7|10.8|10.9|10.10|10.11|11.0|11.1)$ ]]; then + [ -z "${DBMS_VERSION}" ] && DBMS_VERSION="11.4" + if ! [[ ${DBMS_VERSION} =~ ^(10.4|10.5|10.6|10.7|10.8|10.9|10.10|10.11|11.0|11.1|11.4|11.8|12.0|12.1|12.2|12.3|13.0)$ ]]; then echo "Invalid combination -d ${DBMS} -i ${DBMS_VERSION}" >&2 echo >&2 echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2 @@ -76,8 +76,8 @@ handleDbmsOptions() { echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2 exit 1 fi - [ -z "${DBMS_VERSION}" ] && DBMS_VERSION="8.0" - if ! [[ ${DBMS_VERSION} =~ ^(8.0|8.1|8.2|8.3)$ ]]; then + [ -z "${DBMS_VERSION}" ] && DBMS_VERSION="8.4" + if ! [[ ${DBMS_VERSION} =~ ^(8.0|8.1|8.2|8.3|8.4|9.7)$ ]]; then echo "Invalid combination -d ${DBMS} -i ${DBMS_VERSION}" >&2 echo >&2 echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2 @@ -91,8 +91,8 @@ handleDbmsOptions() { echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2 exit 1 fi - [ -z "${DBMS_VERSION}" ] && DBMS_VERSION="10" - if ! [[ ${DBMS_VERSION} =~ ^(10|11|12|13|14|15|16)$ ]]; then + [ -z "${DBMS_VERSION}" ] && DBMS_VERSION="16" + if ! [[ ${DBMS_VERSION} =~ ^(10|11|12|13|14|15|16|17|18)$ ]]; then echo "Invalid combination -d ${DBMS} -i ${DBMS_VERSION}" >&2 echo >&2 echo "Use \".Build/Scripts/runTests.sh -h\" to display help and valid options" >&2 @@ -171,35 +171,45 @@ Options: -i version Specify a specific database version With "-d mariadb": - - 10.3 short-term, maintained until 2023-05-25 (default) - - 10.4 short-term, maintained until 2024-06-18 - - 10.5 short-term, maintained until 2025-06-24 - - 10.6 long-term, maintained until 2026-06 - - 10.7 short-term, no longer maintained - - 10.8 short-term, maintained until 2023-05 - - 10.9 short-term, maintained until 2023-08 - - 10.10 short-term, maintained until 2023-11 + - 10.4 short-term, unmaintained since 2024-06-18 + - 10.5 short-term, unmaintained since 2025-06-24 + - 10.6 long-term, unmaintained since 2026-06 + - 10.7 short-term, unmaintained + - 10.8 short-term, unmaintained since 2023-05 + - 10.9 short-term, unmaintained since 2023-08 + - 10.10 short-term, unmaintained since 2023-11 - 10.11 long-term, maintained until 2028-02 - - 11.0 development series - - 11.1 short-term development series + - 11.4 long-term, maintained until 2029-05-29 (default) + - 11.8 long-term, maintained until 2028-06-28 + - 12.0 short-term, unmaintained since 2025-09 + - 12.1 short-term, unmaintained since 2025-12 + - 12.2 short-term, unmaintained since 2026-03 + - 12.3 long-term, maintained until TBC + - 13.0 short-term, maintained until 2026-09 With "-d mysql": - - 8.0 maintained until 2026-04 (default) LTS + - 8.0 unmaintained since 2026-05 - 8.1 unmaintained since 2023-10 - 8.2 unmaintained since 2024-01 - - 8.3 maintained until 2024-04 + - 8.3 unmaintained since 2024-05 + - 8.4 maintained until 2029-04 (default) LTS + - 9.7 maintained until 2031-04 + Versions MySQL 8.1+ are only supported in 64-bit compilation since April 2026. + Please consult the mysql sources for details or contradicting dates. With "-d postgres": - - 10 unmaintained since 2022-11-10 (default) + - 10 unmaintained since 2022-11-10 - 11 unmaintained since 2023-11-09 - - 12 maintained until 2024-11-14 - - 13 maintained until 2025-11-13 + - 12 unmaintained since 2024-11-14 + - 13 unmaintained since 2025-11-13 - 14 maintained until 2026-11-12 - 15 maintained until 2027-11-11 - - 16 maintained until 2028-11-09 + - 16 maintained until 2028-11-09 (default) + - 17 maintained until 2029-11-08 + - 18 maintained until 2030-11-14 -p <8.2|8.3|8.4|8.5> Specifies the PHP minor version to be used - - 8.2: use PHP 8.2 (default) - - 8.3: use PHP 8.3 + - 8.2: use PHP 8.2 + - 8.3: use PHP 8.3 (default) - 8.4: use PHP 8.4 - 8.5: use PHP 8.5 @@ -249,7 +259,7 @@ TEST_SUITE="help" DATABASE_DRIVER="" DBMS="sqlite" DBMS_VERSION="" -PHP_VERSION="8.2" +PHP_VERSION="8.3" PHP_XDEBUG_ON=0 PHP_XDEBUG_PORT=9003 CGLCHECK_DRY_RUN="" @@ -458,21 +468,15 @@ case ${TEST_SUITE} in ;; esac ;; + javascript) + COMMAND="npm test -- --run --reporter=verbose" + SUITE_EXIT_CODE=$? + ;; lintPhp) COMMAND="php -v | grep '^PHP'; find . -name '*.php' ! -path './.Build/*' -print0 | xargs -0 -n1 -P4 php -dxdebug.mode=off -l >/dev/null" ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name lint-php-${SUFFIX} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" SUITE_EXIT_CODE=$? ;; - renderDocumentation) - mkdir -p Documentation-GENERATED-temp - ${CONTAINER_BIN} run --rm --pull always -v ./:/project/ ghcr.io/typo3-documentation/render-guides:latest --no-progress --config=Documentation Documentation - SUITE_EXIT_CODE=$? - ;; - renderDocumentationCheck) - mkdir -p Documentation-GENERATED-temp - ${CONTAINER_BIN} run --rm --pull always -v ./:/project/ ghcr.io/typo3-documentation/render-guides:latest --no-progress --config=Documentation Documentation --minimal-test - SUITE_EXIT_CODE=$? - ;; phpstan) COMMAND=(php -dxdebug.mode=off .Build/bin/phpstan analyse -c Build/phpstan/phpstan.neon --no-progress --no-interaction --memory-limit 4G "$@") ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name phpstan-${SUFFIX} ${IMAGE_PHP} "${COMMAND[@]}" @@ -483,6 +487,16 @@ case ${TEST_SUITE} in ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name phpstan-baseline-${SUFFIX} ${IMAGE_PHP} /bin/sh -c "${COMMAND}" SUITE_EXIT_CODE=$? ;; + renderDocumentation) + mkdir -p Documentation-GENERATED-temp + ${CONTAINER_BIN} run --rm --pull always -v ./:/project/ ghcr.io/typo3-documentation/render-guides:latest --no-progress --config=Documentation Documentation + SUITE_EXIT_CODE=$? + ;; + renderDocumentationCheck) + mkdir -p Documentation-GENERATED-temp + ${CONTAINER_BIN} run --rm --pull always -v ./:/project/ ghcr.io/typo3-documentation/render-guides:latest --no-progress --config=Documentation Documentation --minimal-test + SUITE_EXIT_CODE=$? + ;; unit) COMMAND=(.Build/bin/phpunit -c Build/phpunit/UnitTests.xml ${EXTRA_TEST_OPTIONS} "$@") ${CONTAINER_BIN} run ${CONTAINER_COMMON_PARAMS} --name unit-${SUFFIX} ${XDEBUG_MODE} -e XDEBUG_CONFIG="${XDEBUG_CONFIG}" ${IMAGE_PHP} "${COMMAND[@]}" diff --git a/Tests/Docker/README.md b/Tests/Docker/README.md deleted file mode 100644 index 7c09ffde..00000000 --- a/Tests/Docker/README.md +++ /dev/null @@ -1,287 +0,0 @@ -# TYPO3 Multi-Version Docker Test Environments - -This directory could contain Docker-based test environments for -testing the paste-reference extension across multiple TYPO3 versions. -As each extension version is currently only for one TYPO3 version, -there is only the one according Docker setup. - -## Overview - -The test environments provide isolated, reproducible setups for: -- TYPO3 v14.1 with PHP 8.3 -- MariaDB database -- Pre-configured extension installation -- Test data seeding - -## Directory Structure - -``` -Tests/Docker/ -├── typo3-v14/ # TYPO3 v14.1 environment -│ ├── Dockerfile # Web server container -│ ├── docker-compose.yml # Service orchestration -│ ├── composer.json # TYPO3 v14 dependencies -│ ├── apache-vhost.conf # Apache configuration -│ ├── LocalConfiguration.php # TYPO3 configuration -│ ├── additional.php # Test-specific settings -│ └── init-db.sql # Database initialization -└── README.md # This file -``` - -## Quick Start - -### Prerequisites - -- Docker and Docker Compose installed -- At least 4GB RAM available for containers -- Ports 8014, 3314 available - -### Setup Complete Environment - -```bash -# Setup both TYPO3 versions -./Tests/Scripts/run-tests.sh setup - -# Setup specific version only -./Tests/Scripts/run-tests.sh setup 14 -``` - -### Manual Setup - -```bash -# Setup Docker environments -./Tests/Scripts/setup-typo3-environment.sh setup all - -# Install extensions -./Tests/Scripts/install-extension.sh install all - -# Seed test data -./Tests/Scripts/seed-test-data.sh seed all -``` - -## Environment Details - -### TYPO3 v14 Environment - -- **Web URL**: http://localhost:8014 -- **Backend URL**: http://localhost:8014/typo3 -- **Database**: localhost:3314 -- **PHP Version**: 8.3 -- **TYPO3 Version**: 14.1 -- **Container Extension**: b13/container ^3.0 - -### Default Credentials - -- **Admin User**: admin / password -- **Test Editor**: test_editor / password -- **Test Admin**: test_admin / password -- **Database**: typo3 / typo3 - -## Test Data - -Each environment includes comprehensive test data: - -### Pages Structure -- Test Suite Root (UID: 200) - - Basic Copy Test (UID: 201) - - Container Test (UID: 202) - - Multi-Column Test (UID: 203) - - Nested Container Test (UID: 204) - - Reference Chain Test (UID: 205) - -### Content Elements -- Source elements for copy/paste testing -- Container elements with nested content -- Multi-column layouts -- Reference chains for advanced testing -- Media elements with file references - -### Backend Users -- Test editor with limited permissions -- Test admin with full permissions -- Workspace configurations (if available) - -## Usage Examples - -### Environment Management - -```bash -# Check status -./Tests/Scripts/run-tests.sh status - -# Start environments -./Tests/Scripts/run-tests.sh start - -# Stop environments -./Tests/Scripts/run-tests.sh stop - -# Health check -./Tests/Scripts/run-tests.sh health - -# Complete cleanup -./Tests/Scripts/run-tests.sh cleanup -``` - -### Running Tests - -```bash -# Run all tests on both versions -./Tests/Scripts/run-tests.sh test - -# Run specific test types -./Tests/Scripts/run-tests.sh test all phpunit -./Tests/Scripts/run-tests.sh test all js -./Tests/Scripts/run-tests.sh test all integration - -# Run tests on specific version -./Tests/Scripts/run-tests.sh test 13 -./Tests/Scripts/run-tests.sh test 14 -``` - -### Manual Testing - -Access the TYPO3 backends to manually test paste-reference functionality: - -1. **TYPO3 v14**: http://localhost:8014/typo3 - -Navigate to the test pages and use the paste-reference functionality to verify cross-version compatibility. - -## Configuration - -### Environment Variables - -Each environment supports these environment variables: - -- `TYPO3_VERSION`: Target TYPO3 version -- `PHP_VERSION`: PHP version to use -- `TYPO3_CONTEXT`: TYPO3 application context -- `TYPO3_TEST_DB_HOST`: Database host -- `TYPO3_TEST_DB_NAME`: Database name -- `TYPO3_TEST_DB_USER`: Database user -- `TYPO3_TEST_DB_PASSWORD`: Database password - -### Customization - -To customize the environments: - -1. **Modify Dockerfile**: Add additional PHP extensions or system packages -2. **Update composer.json**: Change TYPO3 or extension versions -3. **Adjust LocalConfiguration.php**: Modify TYPO3 settings -4. **Edit additional.php**: Add test-specific configurations -5. **Update init-db.sql**: Modify initial database structure - -### Volume Mounts - -- Extension source code is mounted read-only from the project root -- Database data persists in named Docker volumes -- TYPO3 var directory persists for file uploads and caches -- Fileadmin directory persists for media files - -## Troubleshooting - -### Common Issues - -1. **Port Conflicts** - ```bash - # Check if ports are in use - netstat -tulpn | grep -E ':(8014|3314)' - - # Modify docker-compose.yml to use different ports - ``` - -2. **Memory Issues** - ```bash - # Increase Docker memory limit - # Check Docker Desktop settings or daemon configuration - ``` - -3. **Permission Problems** - ```bash - # Fix file permissions - docker exec typo3-v14_web_1 chown -R www-data:www-data /var/www/html - ``` - -4. **Database Connection Issues** - ```bash - # Check database container logs - docker logs typo3-v14_db_1 - - # Restart database containers - docker-compose -f Tests/Docker/typo3-v13/docker-compose.yml restart db - ``` - -### Logs and Debugging - -```bash -# View container logs -docker logs typo3-v14_web_1 - -# Access container shell -docker exec -it typo3-v14_web_1 bash - -# Check TYPO3 logs -docker exec typo3-v14_web_1 tail -f var/log/typo3_test.log -``` - -### Performance Optimization - -1. **Enable Docker BuildKit** - ```bash - export DOCKER_BUILDKIT=1 - ``` - -2. **Use Docker Layer Caching** - ```bash - docker-compose build --parallel - ``` - -3. **Optimize Composer** - ```bash - # Use composer cache volume - docker volume create composer_cache - # Mount in docker-compose.yml: composer_cache:/root/.composer - ``` - -## Integration with CI/CD - -These Docker environments are designed to work with GitHub Actions and other CI/CD systems: - -1. **Matrix Strategy**: Test against both TYPO3 versions in parallel -2. **Caching**: Docker layers and Composer dependencies can be cached -3. **Artifacts**: Test results and logs can be collected as artifacts -4. **Status Checks**: Health checks provide reliable status information - -See the GitHub Actions workflow configuration for implementation details. - -## Maintenance - -### Updating TYPO3 Versions - -1. Update `composer.json` files with new version constraints -2. Modify `Dockerfile` if PHP version changes are needed -3. Update `LocalConfiguration.php` for version-specific settings -4. Test the updated environments thoroughly - -### Adding New TYPO3 Versions - -1. Copy existing version directory (e.g., `typo3-v14` → `typo3-v15`) -2. Update all configuration files for the new version -3. Modify scripts to include the new version -4. Update documentation and CI configuration - -### Security Updates - -- Regularly update base Docker images -- Keep TYPO3 and extension dependencies current -- Review and update security configurations -- Monitor for security advisories - -## Contributing - -When contributing to the test environments: - -1. Test changes against both TYPO3 versions -2. Update documentation for any configuration changes -3. Ensure backward compatibility where possible -4. Add appropriate test data for new features -5. Update scripts and automation as needed diff --git a/Tests/Docker/typo3-v14/Dockerfile b/Tests/Docker/typo3-v14/Dockerfile deleted file mode 100644 index 1b5bee79..00000000 --- a/Tests/Docker/typo3-v14/Dockerfile +++ /dev/null @@ -1,76 +0,0 @@ -# TYPO3 v14.1 Test Environment -FROM php:8.3-apache - -# Set environment variables -ENV TYPO3_VERSION=14.1 -ENV PHP_VERSION=8.3 -ENV DEBIAN_FRONTEND=noninteractive - -# Install system dependencies -RUN apt-get update && apt-get install -y \ - git \ - unzip \ - libzip-dev \ - libpng-dev \ - libjpeg-dev \ - libfreetype6-dev \ - libxml2-dev \ - libicu-dev \ - libonig-dev \ - mariadb-client \ - wget \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# Configure and install PHP extensions -RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ - && docker-php-ext-install -j$(nproc) \ - gd \ - zip \ - pdo_mysql \ - mysqli \ - xml \ - intl \ - mbstring \ - opcache - -# Install Composer -COPY --from=composer:2 /usr/bin/composer /usr/bin/composer - -# Configure Apache -RUN a2enmod rewrite -COPY Tests/Docker/typo3-v14/apache-vhost.conf /etc/apache2/sites-available/000-default.conf - -# Set working directory -WORKDIR /var/www/html - -# Copy composer configuration for TYPO3 v14 -COPY Tests/Docker/typo3-v14/composer.json /var/www/html/composer.json - -# Install TYPO3 and dependencies -# Old line: RUN composer install --no-dev --optimize-autoloader -# RUN composer install --no-dev --optimize-autoloader --ignore-platform-req=php+ -# Ensure any old static locks are cleared out so the container resolves dynamically -RUN rm -f composer.lock - -# Run install with relaxed platform matching -RUN composer install --no-dev --optimize-autoloader --ignore-platform-reqs - - -# Copy TYPO3 configuration -COPY Tests/Docker/typo3-v14/LocalConfiguration.php /var/www/html/config/system/LocalConfiguration.php -COPY Tests/Docker/typo3-v14/additional.php /var/www/html/config/system/additional.php - -# Set proper permissions -RUN chown -R www-data:www-data /var/www/html \ - && chmod -R 755 /var/www/html - -# Expose port 80 -EXPOSE 80 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ - CMD curl -f http://localhost/ || exit 1 - -# Start Apache -CMD ["apache2-foreground"] diff --git a/Tests/Docker/typo3-v14/LocalConfiguration.php b/Tests/Docker/typo3-v14/LocalConfiguration.php deleted file mode 100644 index 5443ccdb..00000000 --- a/Tests/Docker/typo3-v14/LocalConfiguration.php +++ /dev/null @@ -1,122 +0,0 @@ - [ - 'debug' => true, - 'installToolPassword' => '$argon2i$v=19$m=65536,t=16,p=1$UnlOcXhBbEFJUWNHWnVOZg$4QWLmPOYhYnx0hdGt4/DbhzFtJF/Z8/xJqKwGqmn4pY', - 'passwordHashing' => [ - 'className' => 'TYPO3\\CMS\\Core\\Crypto\\PasswordHashing\\Argon2iPasswordHash', - 'options' => [], - ], - ], - 'DB' => [ - 'Connections' => [ - 'Default' => [ - 'charset' => 'utf8mb4', - 'driver' => 'pdo_mysql', - 'dbname' => 'typo3_test', - 'host' => 'db', - 'password' => 'typo3', - 'port' => 3306, - 'tableoptions' => [ - 'charset' => 'utf8mb4', - 'collate' => 'utf8mb4_unicode_ci', - ], - 'user' => 'typo3', - ], - ], - ], - 'EXTENSIONS' => [ - 'backend' => [ - 'backendFavicon' => '', - 'backendLogo' => '', - 'loginBackgroundImage' => '', - 'loginFootnote' => '', - 'loginHighlightColor' => '', - 'loginLogo' => '', - ], - 'extensionmanager' => [ - 'automaticInstallation' => '1', - 'offlineMode' => '0', - ], - 'scheduler' => [ - 'maxLifetime' => '1440', - 'showSampleTasks' => '1', - ], - ], - 'FE' => [ - 'debug' => true, - 'passwordHashing' => [ - 'className' => 'TYPO3\\CMS\\Core\\Crypto\\PasswordHashing\\Argon2iPasswordHash', - 'options' => [], - ], - ], - 'GFX' => [ - 'processor' => 'GraphicsMagick', - 'processor_allowTemporaryMasksAsPng' => false, - 'processor_colorspace' => 'RGB', - 'processor_effects' => false, - 'processor_enabled' => true, - 'processor_path' => '/usr/bin/', - 'processor_path_lzw' => '/usr/bin/', - ], - 'LOG' => [ - 'TYPO3' => [ - 'CMS' => [ - 'deprecations' => [ - 'writerConfiguration' => [ - 'notice' => [ - 'TYPO3\\CMS\\Core\\Log\\Writer\\FileWriter' => [ - 'logFile' => 'var/log/deprecations.log', - ], - ], - ], - ], - ], - ], - ], - 'MAIL' => [ - 'transport' => 'sendmail', - 'transport_sendmail_command' => '/usr/sbin/sendmail -t -i', - 'transport_smtp_encrypt' => '', - 'transport_smtp_password' => '', - 'transport_smtp_server' => '', - 'transport_smtp_username' => '', - ], - 'SYS' => [ - 'caching' => [ - 'cacheConfigurations' => [ - 'hash' => [ - 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', - ], - 'imagesizes' => [ - 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', - 'options' => [ - 'compression' => true, - ], - ], - 'pages' => [ - 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', - 'options' => [ - 'compression' => true, - ], - ], - 'rootline' => [ - 'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend', - 'options' => [ - 'compression' => true, - ], - ], - ], - ], - 'devIPmask' => '*', - 'displayErrors' => 1, - 'encryptionKey' => 'test_encryption_key_for_testing_only_not_secure', - 'exceptionalErrors' => 12290, - 'features' => [ - 'unifiedPageTranslationHandling' => true, - ], - 'sitename' => 'TYPO3 v14 Test Environment', - 'systemMaintainers' => [1], - ], -]; diff --git a/Tests/Docker/typo3-v14/additional.php b/Tests/Docker/typo3-v14/additional.php deleted file mode 100644 index 9703c1b1..00000000 --- a/Tests/Docker/typo3-v14/additional.php +++ /dev/null @@ -1,55 +0,0 @@ - [ - \TYPO3\CMS\Core\Log\Writer\FileWriter::class => [ - 'logFile' => 'var/log/typo3_test.log', - ], - ], -]; - -// Disable caching for testing -$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['hash']['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class; -$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['pages']['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class; -$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['pagesection']['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class; -$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['rootline']['backend'] = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class; - -// Configure test database -if (getenv('TYPO3_TEST_DB_HOST')) { - $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['host'] = getenv('TYPO3_TEST_DB_HOST'); -} -if (getenv('TYPO3_TEST_DB_NAME')) { - $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['dbname'] = getenv('TYPO3_TEST_DB_NAME'); -} -if (getenv('TYPO3_TEST_DB_USER')) { - $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['user'] = getenv('TYPO3_TEST_DB_USER'); -} -if (getenv('TYPO3_TEST_DB_PASSWORD')) { - $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['password'] = getenv('TYPO3_TEST_DB_PASSWORD'); -} - -// Enable paste-reference extension for testing -$GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['paste_reference'] = serialize([ - 'enableDebug' => '1', - 'enableLogging' => '1', -]); - -// TYPO3 v14 specific configurations -// Updated log file paths for v14 structure -$GLOBALS['TYPO3_CONF_VARS']['LOG']['TYPO3']['CMS']['deprecations']['writerConfiguration'] = [ - \TYPO3\CMS\Core\Log\LogLevel::NOTICE => [ - \TYPO3\CMS\Core\Log\Writer\FileWriter::class => [ - 'logFile' => 'var/log/deprecations.log', - ], - ], -]; diff --git a/Tests/Docker/typo3-v14/apache-vhost.conf b/Tests/Docker/typo3-v14/apache-vhost.conf deleted file mode 100644 index a93f4dff..00000000 --- a/Tests/Docker/typo3-v14/apache-vhost.conf +++ /dev/null @@ -1,25 +0,0 @@ - - DocumentRoot /var/www/html/public - - - AllowOverride All - Require all granted - - # TYPO3 specific rewrite rules - RewriteEngine On - - # Handle Angular HTML5 mode or similar - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} !^/typo3/ - RewriteRule ^(.+)$ /index.php [QSA,L] - - # Ensure TYPO3 backend access - RewriteCond %{REQUEST_URI} ^/typo3/.*$ - RewriteRule ^typo3/(.*)$ /typo3/index.php [QSA,L] - - - # Logging - ErrorLog ${APACHE_LOG_DIR}/error.log - CustomLog ${APACHE_LOG_DIR}/access.log combined - diff --git a/Tests/Docker/typo3-v14/composer.json b/Tests/Docker/typo3-v14/composer.json deleted file mode 100644 index eef39a91..00000000 --- a/Tests/Docker/typo3-v14/composer.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "typo3/test-environment-v14", - "description": "TYPO3 v14.3 test environment for paste-reference extension", - "type": "project", - "require": { - "php": "^8.3", - "typo3/cms-backend": "^14.3", - "typo3/cms-core": "^14.3", - "typo3/cms-frontend": "^14.3", - "typo3/cms-install": "^14.3", - "typo3/cms-extbase": "^14.3", - "typo3/cms-fluid": "^14.3", - "typo3/cms-fluid-styled-content": "^14.3", - "typo3/testing-framework": "^9.5.0", - "b13/container": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^13.0.2" - }, - "config": { - "vendor-dir": "vendor", - "bin-dir": "vendor/bin", - "allow-plugins": { - "typo3/class-alias-loader": true, - "typo3/cms-composer-installers": true - } - }, - "extra": { - "typo3/cms": { - "web-dir": "public" - } - }, - "autoload": { - "psr-4": { - "EHAERER\\PasteReference\\": "../../Classes/" - } - }, - "minimum-stability": "stable", - "prefer-stable": true -} diff --git a/Tests/Docker/typo3-v14/docker-compose.yml b/Tests/Docker/typo3-v14/docker-compose.yml deleted file mode 100644 index ec9a2c91..00000000 --- a/Tests/Docker/typo3-v14/docker-compose.yml +++ /dev/null @@ -1,47 +0,0 @@ -services: - web: - build: - context: ../../../ - dockerfile: Tests/Docker/typo3-v14/Dockerfile - ports: - - "8014:80" - volumes: - - ../../../:/var/www/html/extensions/paste_reference:ro - - typo3_v14_data:/var/www/html/var - - typo3_v14_fileadmin:/var/www/html/public/fileadmin - environment: - - TYPO3_VERSION=14.1 - - PHP_VERSION=8.3 - - TYPO3_CONTEXT=Development/Testing - - TYPO3_TEST_DB_HOST=db - - TYPO3_TEST_DB_NAME=typo3_test - - TYPO3_TEST_DB_USER=typo3 - - TYPO3_TEST_DB_PASSWORD=typo3 - depends_on: - - db - networks: - - typo3_v14_network - - db: - image: mariadb:11.4 - environment: - - MYSQL_ROOT_PASSWORD=root - - MYSQL_DATABASE=typo3_test - - MYSQL_USER=typo3 - - MYSQL_PASSWORD=typo3 - volumes: - - typo3_v14_db:/var/lib/mysql - - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql:ro - ports: - - "3314:3306" - networks: - - typo3_v14_network - -volumes: - typo3_v14_data: - typo3_v14_fileadmin: - typo3_v14_db: - -networks: - typo3_v14_network: - driver: bridge diff --git a/Tests/Docker/typo3-v14/init-db.sql b/Tests/Docker/typo3-v14/init-db.sql deleted file mode 100644 index a7b12dbe..00000000 --- a/Tests/Docker/typo3-v14/init-db.sql +++ /dev/null @@ -1,73 +0,0 @@ --- Initialize TYPO3 v14 test database --- This script sets up the basic database structure for testing - --- Create test user if not exists -CREATE USER IF NOT EXISTS 'typo3_test'@'%' IDENTIFIED BY 'typo3_test'; -GRANT ALL PRIVILEGES ON typo3_test.* TO 'typo3_test'@'%'; - --- Use the test database -USE typo3_test; - --- Basic TYPO3 tables for testing (minimal structure) --- These will be properly created by TYPO3 installation process - --- Backend users table -CREATE TABLE IF NOT EXISTS be_users ( - uid int(11) NOT NULL AUTO_INCREMENT, - pid int(11) DEFAULT '0' NOT NULL, - tstamp int(11) DEFAULT '0' NOT NULL, - crdate int(11) DEFAULT '0' NOT NULL, - deleted tinyint(4) DEFAULT '0' NOT NULL, - disable tinyint(4) DEFAULT '0' NOT NULL, - username varchar(50) DEFAULT '' NOT NULL, - password varchar(100) DEFAULT '' NOT NULL, - admin tinyint(4) DEFAULT '0' NOT NULL, - PRIMARY KEY (uid), - KEY parent (pid) -); - --- Insert test admin user (password: 'password') -INSERT IGNORE INTO be_users (uid, username, password, admin, tstamp, crdate) VALUES -(1, 'admin', '$argon2i$v=19$m=65536,t=16,p=1$UnlOcXhBbEFJUWNHWnVOZg$4QWLmPOYhYnx0hdGt4/DbhzFtJF/Z8/xJqKwGqmn4pY', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); - --- Pages table for content testing -CREATE TABLE IF NOT EXISTS pages ( - uid int(11) NOT NULL AUTO_INCREMENT, - pid int(11) DEFAULT '0' NOT NULL, - tstamp int(11) DEFAULT '0' NOT NULL, - crdate int(11) DEFAULT '0' NOT NULL, - deleted tinyint(4) DEFAULT '0' NOT NULL, - hidden tinyint(4) DEFAULT '0' NOT NULL, - title varchar(255) DEFAULT '' NOT NULL, - doktype int(11) DEFAULT '1' NOT NULL, - PRIMARY KEY (uid), - KEY parent (pid) -); - --- Insert test pages -INSERT IGNORE INTO pages (uid, pid, title, doktype, tstamp, crdate) VALUES -(1, 0, 'Test Root Page', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), -(2, 1, 'Test Content Page', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); - --- Content elements table -CREATE TABLE IF NOT EXISTS tt_content ( - uid int(11) NOT NULL AUTO_INCREMENT, - pid int(11) DEFAULT '0' NOT NULL, - tstamp int(11) DEFAULT '0' NOT NULL, - crdate int(11) DEFAULT '0' NOT NULL, - deleted tinyint(4) DEFAULT '0' NOT NULL, - hidden tinyint(4) DEFAULT '0' NOT NULL, - CType varchar(255) DEFAULT '' NOT NULL, - header varchar(255) DEFAULT '' NOT NULL, - bodytext mediumtext, - colPos int(11) DEFAULT '0' NOT NULL, - PRIMARY KEY (uid), - KEY parent (pid) -); - --- Insert test content elements -INSERT IGNORE INTO tt_content (uid, pid, CType, header, bodytext, colPos, tstamp, crdate) VALUES -(1, 2, 'text', 'Test Content Element', 'This is a test content element for paste-reference testing.', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), -(2, 2, 'text', 'Another Test Element', 'This is another test content element.', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); - -FLUSH PRIVILEGES; \ No newline at end of file diff --git a/package.json b/package.json index e8b2d4cb..dd3e602a 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,8 @@ }, "engines": { "node": ">=18.0.0" + }, + "allowScripts": { + "esbuild@0.21.5": true } -} \ No newline at end of file +} From f688e593fbc6b87b735f3d20eada88355fd79e96 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 09:38:18 +0700 Subject: [PATCH 02/28] [TASK] fix vite parameter in workflow --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3f629c36..309b8d26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,7 +99,7 @@ jobs: run: npm ci - name: Run JavaScript tests - run: npm test -- --run --reporter=verbose + run: npm test -- --reporter=verbose #--------------------------------------------------------------------------------------------------------------------- # Extended tests - focus on reliability over comprehensive database testing @@ -136,7 +136,7 @@ jobs: timeout-minutes: 15 - name: Run JavaScript tests - run: npm test -- --run --reporter=verbose + run: npm test -- --reporter=verbose timeout-minutes: 5 documentation: From 856ded2673975cbe84dc993343bd86a74a170e84 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 09:46:44 +0700 Subject: [PATCH 03/28] [TASK] raise version for node.js github workflows require at least node.js v24 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd3e602a..d1585b3c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@vitest/ui": "^1.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=24.0.0" }, "allowScripts": { "esbuild@0.21.5": true From a204be66ee484d6f1512f321e6079461ff5a7926 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 15:02:40 +0700 Subject: [PATCH 04/28] [TASK] update dependencies in package.json --- package-lock.json | 2286 +++++++++++++++------------------------------ package.json | 4 +- 2 files changed, 775 insertions(+), 1515 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbc0b934..b85a1405 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,12 @@ "name": "paste-reference-container-tests", "version": "1.0.0", "devDependencies": { - "@vitest/ui": "^1.0.0", + "@vitest/ui": "^4.1.10", "jsdom": "^23.0.0", - "vitest": "^1.0.0" + "vitest": "^4.1.10" }, "engines": { - "node": ">=18.0.0" + "node": ">=24.0.0" } }, "node_modules/@asamuzakjp/css-color": { @@ -130,7 +130,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -154,83 +153,91 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", "cpu": [ "arm64" ], @@ -238,18 +245,18 @@ "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", @@ -258,30 +265,30 @@ "darwin" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "darwin" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", "cpu": [ "x64" ], @@ -292,13 +299,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", "cpu": [ "arm" ], @@ -309,219 +316,171 @@ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", "cpu": [ - "loong64" + "arm64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" + "libc": [ + "musl" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" + "libc": [ + "glibc" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" + "libc": [ + "musl" ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "sunos" + "openharmony" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", "cpu": [ - "arm64" + "wasm32" ], "dev": true, "license": "MIT", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", @@ -530,13 +489,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", "cpu": [ "x64" ], @@ -547,559 +506,192 @@ "win32" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" + "tslib": "^2.4.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "node_modules/@vitest/mocker": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" + "@vitest/spy": "4.1.10", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", "dev": true, "license": "MIT", "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "node_modules/@vitest/runner": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^2.2.0" + "@vitest/utils": "4.1.10", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/ui": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.1.tgz", - "integrity": "sha512-xa57bCPGuzEFqGjPs3vVLyqareG8DX0uMkr5U/v5vLv5/ZUrBrPL7gzxzTJedEyZxFMfsozwTIbbYfEQVo3kgg==", + "node_modules/@vitest/snapshot": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@vitest/utils": "1.6.1", - "fast-glob": "^3.3.2", - "fflate": "^0.8.1", - "flatted": "^3.2.9", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "sirv": "^2.0.4" + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "1.6.1" } }, - "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", + "node_modules/@vitest/spy": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", "dev": true, "license": "MIT", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/@vitest/ui": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.10.tgz", + "integrity": "sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@vitest/utils": "4.1.10", + "fflate": "^0.8.2", + "flatted": "^3.4.2", + "pathe": "^2.0.3", + "sirv": "^3.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.10" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "node_modules/@vitest/utils": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.11.0" + "@vitest/pretty-format": "4.1.10", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/agent-base": { @@ -1112,27 +704,14 @@ "node": ">= 14" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/asynckit": { @@ -1152,29 +731,6 @@ "require-from-string": "^2.0.2" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1190,35 +746,13 @@ } }, "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" + "node": ">=18" } }, "node_modules/combined-stream": { @@ -1234,28 +768,13 @@ "node": ">= 0.8" } }, - "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==", + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -1330,19 +849,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1353,14 +859,14 @@ "node": ">=0.4.0" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, "node_modules/dunder-proto": { @@ -1411,10 +917,17 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -1440,45 +953,6 @@ "node": ">= 0.4" } }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1489,96 +963,60 @@ "@types/estree": "^1.0.0" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=12.0.0" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/fdir": { + "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", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", "dev": true, "license": "MIT" }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "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" }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -1609,16 +1047,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1658,32 +1086,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1727,9 +1129,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -1780,16 +1182,6 @@ "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -1803,39 +1195,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -1843,40 +1202,12 @@ "dev": true, "license": "MIT" }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/jsdom": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", "integrity": "sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@asamuzakjp/dom-selector": "^2.0.1", "cssstyle": "^4.0.1", @@ -1912,31 +1243,277 @@ } } }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lru-cache": { @@ -1963,46 +1540,15 @@ "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } + "license": "CC0-1.0" }, "node_modules/mime-db": { "version": "1.52.0", @@ -2027,39 +1573,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -2078,9 +1591,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ { @@ -2096,65 +1609,18 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.20.0" } }, "node_modules/parse5": { @@ -2170,33 +1636,13 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2205,41 +1651,22 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, "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.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.18.tgz", + "integrity": "sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==", "dev": true, "funding": [ { @@ -2257,7 +1684,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -2265,21 +1692,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -2310,34 +1722,6 @@ "dev": true, "license": "MIT" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -2355,60 +1739,38 @@ "dev": true, "license": "MIT" }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, "node_modules/rrweb-cssom": { @@ -2418,30 +1780,6 @@ "dev": true, "license": "MIT" }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -2462,29 +1800,6 @@ "node": ">=v12.22.7" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -2492,23 +1807,10 @@ "dev": true, "license": "ISC" }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, "license": "MIT", "dependencies": { @@ -2517,7 +1819,7 @@ "totalist": "^3.0.0" }, "engines": { - "node": ">= 10" + "node": ">=18" } }, "node_modules/source-map-js": { @@ -2538,38 +1840,12 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -2584,37 +1860,41 @@ "dev": true, "license": "MIT" }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">=14.0.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">=14.0.0" } }, "node_modules/totalist": { @@ -2656,22 +1936,13 @@ "node": ">=18" } }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ufo": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz", - "integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT" + "license": "0BSD", + "optional": true }, "node_modules/universalify": { "version": "0.2.0", @@ -2695,21 +1966,23 @@ } }, "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -2718,23 +1991,33 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "less": { + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -2751,86 +2034,89 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite-node": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", - "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vitest": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", - "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@vitest/expect": "1.6.1", - "@vitest/runner": "1.6.1", - "@vitest/snapshot": "1.6.1", - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.1", - "why-is-node-running": "^2.2.2" + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.1", - "@vitest/ui": "1.6.1", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { "optional": true }, + "@opentelemetry/api": { + "optional": true + }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { "optional": true }, "@vitest/ui": { @@ -2841,6 +2127,9 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, @@ -2905,22 +2194,6 @@ "node": ">=18" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -2939,9 +2212,9 @@ } }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { @@ -2976,19 +2249,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } } } diff --git a/package.json b/package.json index d1585b3c..cdc88df4 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,9 @@ "validate:workflow": "node Tests/Integration/ContainerWorkflowValidator.js" }, "devDependencies": { - "vitest": "^1.0.0", + "@vitest/ui": "^4.1.10", "jsdom": "^23.0.0", - "@vitest/ui": "^1.0.0" + "vitest": "^4.1.10" }, "engines": { "node": ">=24.0.0" From a5aef42ee27fbdee850aee3c282dd89c11405455 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 15:16:42 +0700 Subject: [PATCH 05/28] [TASK] update .github/workflows/README.md --- .github/workflows/README.md | 45 ++----------------------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 66c3ecd7..23b652a6 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -8,33 +8,12 @@ This directory contains the CI/CD workflows for the TYPO3 paste-reference extens Main CI workflow that runs on every push and pull request. Includes: - Code quality checks (PHP linting, CGL, PHPStan) - Documentation rendering -- Multi-version compatibility check integration **Triggers:** - Push to any branch - Pull request events (opened, edited, reopened, synchronize, ready_for_review) - Manual dispatch -### typo3-multi-version-tests.yml -Multi-version compatibility testing across TYPO3 v13 and v14 with different PHP versions. - -**Triggers:** -- Push to main/develop branches (only when relevant files change) -- Pull request events (only when relevant files change) -- Manual dispatch with configurable parameters - -**File Change Detection:** -- PHP files: `Classes/**`, `ext_emconf.php`, `ext_tables.php`, `composer.json` -- JavaScript files: `Resources/Public/JavaScript/**`, `package.json` -- Configuration files: `Configuration/**`, `ext_conf_template.txt` -- Test files: `Tests/**`, workflow files - -**Conditional Execution:** -- JavaScript tests: Run when JS files or tests change -- PHP unit tests: Run when PHP files, config, or tests change -- Functional tests: Run when PHP files, config, or tests change -- Integration tests: Run when any relevant files change - ### nightly-main.yml Scheduled nightly runs on the main branch. @@ -57,42 +36,22 @@ Handles publishing to TYPO3 Extension Repository (TER). The workflows are designed to work together: 1. **ci.yml** runs basic quality checks and integrates with multi-version testing -2. **typo3-multi-version-tests.yml** provides comprehensive compatibility testing 3. **nightly-main.yml** ensures regular full testing of the main branch 4. **publish.yaml** handles release automation ## Configuration -### Multi-Version Testing Matrix - -Current matrix configuration: -- TYPO3 versions: 13.4, 14.1 -- PHP versions: 8.2, 8.3, 8.4, 8.5 -- Exclusions: - - TYPO3 v13.4 with PHP 8.4+ (not supported) - - TYPO3 v14.1 with PHP 8.5 (compatibility pending verification) - ### Manual Dispatch Parameters The multi-version workflow supports manual execution with parameters: - `typo3_versions`: Comma-separated list of TYPO3 versions to test -- `php_versions`: Comma-separated list of PHP versions to test +- `php_versions`: Comma-separated list of PHP versions to test - `force_full_test`: Boolean to force full test suite execution ### Status Checks Required status checks for pull requests: - Code quality checks (from ci.yml) -- Multi-version compatibility (from typo3-multi-version-tests.yml) - -## Adding New TYPO3 Versions - -To add support for a new TYPO3 version: - -1. Update the matrix in `typo3-multi-version-tests.yml` -2. Create corresponding Docker environment in `Tests/Docker/typo3-vXX/` -3. Update exclusions if needed for PHP version compatibility -4. Test the new configuration manually before merging ## Troubleshooting @@ -112,4 +71,4 @@ To add support for a new TYPO3 version: - Use `workflow_dispatch` with specific parameters to test individual configurations - Check workflow logs for detailed error messages - Review test artifacts uploaded by failed runs -- Use the nightly workflow to test changes on main branch \ No newline at end of file +- Use the nightly workflow to test changes on main branch From cab2574bbf536b46c9530c5eae5c9fd7563659e5 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 15:57:26 +0700 Subject: [PATCH 06/28] [TASK] update github actions --- .github/workflows/ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 309b8d26..ddc67524 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: php: [ '8.2', '8.3' , '8.4' , '8.5' ] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Composer install run: Build/Scripts/runTests.sh -p ${{ matrix.php }} -s composer -- install @@ -63,7 +63,7 @@ jobs: php: [ '8.2', '8.3' ] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Composer install run: Build/Scripts/runTests.sh -p ${{ matrix.php }} -s composer -- install @@ -87,10 +87,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24' cache: 'npm' @@ -114,10 +114,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js for JavaScript tests - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24' cache: 'npm' @@ -148,7 +148,7 @@ jobs: pull-requests: write steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Render documentation run: Build/Scripts/runTests.sh -s renderDocumentation From 20ccd6445a5dfbe1f92e51945f31b603072f7da2 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 16:00:40 +0700 Subject: [PATCH 07/28] [TASK] update github actions --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ddc67524..6ef1049e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -153,7 +153,7 @@ jobs: - name: Render documentation run: Build/Scripts/runTests.sh -s renderDocumentation - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 id: artifact-upload-step with: name: rendered-documentation-folder From 4a9f8bb5728b84db4858d61dee626ba97bf34c60 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 16:08:26 +0700 Subject: [PATCH 08/28] [TASK] update github actions --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ef1049e..cd07d118 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -153,7 +153,7 @@ jobs: - name: Render documentation run: Build/Scripts/runTests.sh -s renderDocumentation - - uses: actions/upload-artifact@v5 + - uses: actions/upload-artifact@v6 id: artifact-upload-step with: name: rendered-documentation-folder From 7e6856352f21ffbfe259e91708cd9760e9b3eede Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Mon, 13 Jul 2026 21:42:07 +0700 Subject: [PATCH 09/28] [BUGFIX] remove outdated workflow from nighly-main.yml --- .github/workflows/nightly-main.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/nightly-main.yml b/.github/workflows/nightly-main.yml index 86029fa9..1faec511 100644 --- a/.github/workflows/nightly-main.yml +++ b/.github/workflows/nightly-main.yml @@ -20,9 +20,3 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh workflow run ci.yml --ref main - - - name: Execute multi-version tests on 'main' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh workflow run typo3-multi-version-tests.yml --ref main -f force_full_test=true From 028654200b3be1c3c254316d5528dabcab6c52df Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 16 Jul 2026 16:05:19 +0700 Subject: [PATCH 10/28] [FEATURE] rename & update included EXT:test_sitepacke * rename * add CE with irre content for testing --- .../TCA/Overrides/tt_content.php | 77 ------------------- .../Resources/Public/Icons/container-2col.svg | 6 -- .../Public/Icons/container-nested.svg | 8 -- .../Extensions/test_container/ext_emconf.php | 20 ----- .../test_container/ext_localconf.php | 8 -- Tests/Extensions/test_sitepackage | 1 + 6 files changed, 1 insertion(+), 119 deletions(-) delete mode 100644 Tests/Extensions/test_container/Configuration/TCA/Overrides/tt_content.php delete mode 100644 Tests/Extensions/test_container/Resources/Public/Icons/container-2col.svg delete mode 100644 Tests/Extensions/test_container/Resources/Public/Icons/container-nested.svg delete mode 100644 Tests/Extensions/test_container/ext_emconf.php delete mode 100644 Tests/Extensions/test_container/ext_localconf.php create mode 160000 Tests/Extensions/test_sitepackage diff --git a/Tests/Extensions/test_container/Configuration/TCA/Overrides/tt_content.php b/Tests/Extensions/test_container/Configuration/TCA/Overrides/tt_content.php deleted file mode 100644 index 29caa183..00000000 --- a/Tests/Extensions/test_container/Configuration/TCA/Overrides/tt_content.php +++ /dev/null @@ -1,77 +0,0 @@ - 'Left Column', 'colPos' => 101], - ['name' => 'Right Column', 'colPos' => 102], - ], - ] // grid configuration - ); - - $containerConfiguration->setIcon('EXT:test_container/Resources/Public/Icons/container-2col.svg'); - $containerConfiguration->setSaveAndCloseInNewContentElementWizard(false); - - $containerRegistry->configureContainer($containerConfiguration); - - // Register a nested container for advanced testing - $nestedContainerConfiguration = new ContainerConfiguration( - 'test_container_nested', // CType - 'Test Nested Container', // label - 'Nested container for testing complex paste-reference scenarios', // description - [ - [ - ['name' => 'Main Area', 'colPos' => 201], - ], - [ - ['name' => 'Sub Left', 'colPos' => 202], - ['name' => 'Sub Right', 'colPos' => 203], - ], - ] // grid configuration - ); - - $nestedContainerConfiguration->setIcon('EXT:test_container/Resources/Public/Icons/container-nested.svg'); - $nestedContainerConfiguration->setSaveAndCloseInNewContentElementWizard(false); - - $containerRegistry->configureContainer($nestedContainerConfiguration); - - // Add containers to content element wizard - \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( - 'tt_content', - 'CType', - [ - 'label' => 'Test Two Columns', - 'value' => 'test_container_2col', - 'icon' => 'content-container-columns-2', - 'group' => 'container', - 'description' => 'Two column container for testing', - ] - ); - - \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( - 'tt_content', - 'CType', - [ - 'label' => 'Test Nested Container', - 'value' => 'test_container_nested', - 'icon' => 'content-container-columns-3', - 'group' => 'container', - 'description' => 'Nested container for testing', - ] - ); -} diff --git a/Tests/Extensions/test_container/Resources/Public/Icons/container-2col.svg b/Tests/Extensions/test_container/Resources/Public/Icons/container-2col.svg deleted file mode 100644 index 24c6ccbe..00000000 --- a/Tests/Extensions/test_container/Resources/Public/Icons/container-2col.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - L - R - \ No newline at end of file diff --git a/Tests/Extensions/test_container/Resources/Public/Icons/container-nested.svg b/Tests/Extensions/test_container/Resources/Public/Icons/container-nested.svg deleted file mode 100644 index b2ec92f1..00000000 --- a/Tests/Extensions/test_container/Resources/Public/Icons/container-nested.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - MAIN - L - R - \ No newline at end of file diff --git a/Tests/Extensions/test_container/ext_emconf.php b/Tests/Extensions/test_container/ext_emconf.php deleted file mode 100644 index 67847500..00000000 --- a/Tests/Extensions/test_container/ext_emconf.php +++ /dev/null @@ -1,20 +0,0 @@ - 'Test Container Extension', - 'description' => 'Minimal container extension for testing paste-reference functionality', - 'category' => 'misc', - 'author' => 'Test Author', - 'author_email' => 'test@example.com', - 'state' => 'stable', - 'version' => '1.0.0', - 'constraints' => [ - 'depends' => [ - 'typo3' => '13.0.0-14.99.99', - 'container' => '3.0.0-3.99.99', - ], - 'conflicts' => [], - 'suggests' => [], - ], -]; diff --git a/Tests/Extensions/test_container/ext_localconf.php b/Tests/Extensions/test_container/ext_localconf.php deleted file mode 100644 index f655fb90..00000000 --- a/Tests/Extensions/test_container/ext_localconf.php +++ /dev/null @@ -1,8 +0,0 @@ - Date: Sat, 18 Jul 2026 11:43:23 +0700 Subject: [PATCH 11/28] rem sitepackage --- Tests/Extensions/test_sitepackage | 1 - 1 file changed, 1 deletion(-) delete mode 160000 Tests/Extensions/test_sitepackage diff --git a/Tests/Extensions/test_sitepackage b/Tests/Extensions/test_sitepackage deleted file mode 160000 index ce9ffff4..00000000 --- a/Tests/Extensions/test_sitepackage +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ce9ffff440c63da92ee330405626991cfee8835f From 86ea46860c6a3e81c711e63cca8953abd65a3069 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 18 Jul 2026 11:49:37 +0700 Subject: [PATCH 12/28] [TASK] re-add sitepackage as dir, not as sub-repo --- .../test_sitepackage/Classes/.gitkeep | 0 .../Classes/Controller/IrreController.php | 32 ++++ .../test_sitepackage/Configuration/Icons.php | 13 ++ .../Configuration/Services.yaml | 8 + .../TCA/Overrides/tt_content.php | 146 ++++++++++++++++++ .../Configuration/TsConfig/Page/.gitkeep | 0 .../TypoScript/constants.typoscript | 13 ++ .../Configuration/TypoScript/setup.typoscript | 96 ++++++++++++ .../Configuration/page.tsconfig | 70 +++++++++ Tests/Extensions/test_sitepackage/README.md | 63 ++++++++ .../Layouts/ContentElements/Default.html | 5 + .../Resources/Private/Layouts/Default.html | 17 ++ .../Private/Layouts/Page/Default.html | 17 ++ .../Templates/ContentElements/Columns2.html | 22 +++ .../TxTestsitepackeParent.html | 9 ++ .../Private/Templates/Page/Default.html | 15 ++ .../Resources/Public/Css/theme.css | 67 ++++++++ .../Resources/Public/Icons/Extension.svg | 1 + .../Resources/Public/Icons/Plugin.svg | 3 + .../Resources/Public/Icons/ce_columns2.svg | 6 + .../Resources/Public/Icons/favicon.ico | Bin 0 -> 16958 bytes .../Public/Icons/tx_testsitepacke_parent.svg | 3 + .../Extensions/test_sitepackage/composer.json | 20 +++ .../test_sitepackage/ext_emconf.php | 19 +++ .../test_sitepackage/ext_localconf.php | 16 ++ .../test_sitepackage/ext_tables.php | 10 ++ .../test_sitepackage/ext_tables.sql | 8 + 27 files changed, 679 insertions(+) create mode 100644 Tests/Extensions/test_sitepackage/Classes/.gitkeep create mode 100644 Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php create mode 100644 Tests/Extensions/test_sitepackage/Configuration/Icons.php create mode 100644 Tests/Extensions/test_sitepackage/Configuration/Services.yaml create mode 100644 Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php create mode 100644 Tests/Extensions/test_sitepackage/Configuration/TsConfig/Page/.gitkeep create mode 100644 Tests/Extensions/test_sitepackage/Configuration/TypoScript/constants.typoscript create mode 100644 Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript create mode 100644 Tests/Extensions/test_sitepackage/Configuration/page.tsconfig create mode 100644 Tests/Extensions/test_sitepackage/README.md create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Default.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Page/Default.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/Columns2.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/TxTestsitepackeParent.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Public/Css/theme.css create mode 100644 Tests/Extensions/test_sitepackage/Resources/Public/Icons/Extension.svg create mode 100644 Tests/Extensions/test_sitepackage/Resources/Public/Icons/Plugin.svg create mode 100644 Tests/Extensions/test_sitepackage/Resources/Public/Icons/ce_columns2.svg create mode 100644 Tests/Extensions/test_sitepackage/Resources/Public/Icons/favicon.ico create mode 100644 Tests/Extensions/test_sitepackage/Resources/Public/Icons/tx_testsitepacke_parent.svg create mode 100644 Tests/Extensions/test_sitepackage/composer.json create mode 100644 Tests/Extensions/test_sitepackage/ext_emconf.php create mode 100644 Tests/Extensions/test_sitepackage/ext_localconf.php create mode 100644 Tests/Extensions/test_sitepackage/ext_tables.php create mode 100644 Tests/Extensions/test_sitepackage/ext_tables.sql diff --git a/Tests/Extensions/test_sitepackage/Classes/.gitkeep b/Tests/Extensions/test_sitepackage/Classes/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php new file mode 100644 index 00000000..62f99c8a --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php @@ -0,0 +1,32 @@ +htmlResponse(); + } + + public function showAction(): ResponseInterface + { + return $this->htmlResponse(); + } + + public function listAction(): ResponseInterface + { + return $this->htmlResponse(); + } +} diff --git a/Tests/Extensions/test_sitepackage/Configuration/Icons.php b/Tests/Extensions/test_sitepackage/Configuration/Icons.php new file mode 100644 index 00000000..ce04318a --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/Icons.php @@ -0,0 +1,13 @@ + [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:test_sitepackage/Resources/Public/Icons/Plugin.svg', + ], + 'tx-testsitepacke-parent-icon' => [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:test_sitepackage/Resources/Public/Icons/tx_testsitepacke_parent.svg', + ], +]; diff --git a/Tests/Extensions/test_sitepackage/Configuration/Services.yaml b/Tests/Extensions/test_sitepackage/Configuration/Services.yaml new file mode 100644 index 00000000..614a06c6 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/Services.yaml @@ -0,0 +1,8 @@ +services: + _defaults: + autowire: true + autoconfigure: true + public: false + + Test\Sitepackage\: + resource: '../Classes/*' \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php b/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php new file mode 100644 index 00000000..c489ba78 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php @@ -0,0 +1,146 @@ + 'Left Column', + 'colPos' => 101, + ], + [ + 'name' => 'Right Column', + 'colPos' => 102, + ], + ], + ] +); +$containerConfiguration->setIcon( + 'EXT:test_sitepackage/Resources/Public/Icons/ce_columns2.svg', +); +$containerConfiguration->setSaveAndCloseInNewContentElementWizard(false); +$containerRegistry->configureContainer($containerConfiguration); + +// Add the container to the content element wizard +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( + 'tt_content', + 'CType', + [ + 'label' => 'Two Columns Container', + 'value' => 'ce_columns2', + 'icon' => 'content-container-columns-2', + 'group' => 'container', + 'description' => 'Container with two columns for content elements', + ], +); + +# ExtensionManagementUtility::addTCAcolumns('tt_content',[ +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns( + 'tt_content', + [ + 'tx_testsitepacke_parent' => [ + 'label' => 'Inline Element parent field', + + # 'description' => 'Group several content elements', + 'config' => [ + 'type' => 'passthrough', + ], + ], + ], +); + +/* +$GLOBALS['TCA']['tt_content']['columns']['bodytext'] = [ +]; +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette( + 'tt_content', + 'general', + 'tx_testsitepacke_parent', + #'before:editlock' + ); +$GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent']['showitem']= + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( + 'fe_users', + 'tx_myextension_options, tx_myextension_special', + '', + 'after:password', +); +*/ +# Relation: 1:n +# https://docs.typo3.org/permalink/t3tca:tca-example-inline-1n-inline-1 +$GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent'] = $GLOBALS['TCA']['tt_content']['types']['text']; +# $GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent']['columnsOverrides']['bodytext'] = + +$inlineConfig = [ + 'type' => 'inline', + 'foreign_table' => 'tt_content', + 'foreign_field' => 'tx_testsitepacke_parent', + 'foreign_table_field' => 'tablenames', + 'appearance' => [ + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + ], +]; + +$versionObj = GeneralUtility::makeInstance(Typo3Version::class); +$currentMajorVersion = (int)explode('.', $versionObj->getVersion())[0]; +#debug($currentMajorVersion); +if ($currentMajorVersion >= 14) { + $inlineConfig['appearance']['hideFieldsWithNoSelectableItems'] = true; +} + +$tcaOverride = [ + 'label' => 'Inline Elements', + 'description' => 'Group several content elements', + 'exclude' => 0, + 'config' => $inlineConfig, +]; +if ($currentMajorVersion < 14){ + $tcaOverride['displayCond'] = 'REC:NEW:false'; +} + +$GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent']['columnsOverrides']['bodytext'] = $tcaOverride; + +ExtensionUtility::registerPlugin( + 'TestSitepackage', + 'InlineRecordsirre', + 'Inline Records (IRRE)', + 'ext-test-sitepackage-plugin', + 'plugins', + 'Simple Content Element with IRRE relations', +); + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( + 'tt_content', + 'CType', + [ + 'label' => 'Content Element with Inline Records (IRRE)', // The label shown to users + 'value' => 'tx_testsitepacke_parent', // Must match your element name + 'icon' => 'tx-testsitepacke-parent-icon', // Optional: An existing core icon + 'group' => 'special' // Dropdown group (default, special, etc.) + ] +); +// Assign your registered icon identifier to the CType for the Backend Layout view +$GLOBALS['TCA']['tt_content']['ctrl']['typeicon_classes']['tx_testsitepacke_parent'] = 'tx-testsitepacke-parent-icon'; diff --git a/Tests/Extensions/test_sitepackage/Configuration/TsConfig/Page/.gitkeep b/Tests/Extensions/test_sitepackage/Configuration/TsConfig/Page/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Tests/Extensions/test_sitepackage/Configuration/TypoScript/constants.typoscript b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/constants.typoscript new file mode 100644 index 00000000..96875ca5 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/constants.typoscript @@ -0,0 +1,13 @@ +# Constants for test sitepackage +styles.content.loginform.pid = 1 + +plugin.tx_testsitepackage_inlinerecordsirre { + view { + templateRootPath = EXT:test_sitepackage/Resources/Private/Templates/ + partialRootPath = EXT:test_sitepackage/Resources/Private/Partials/ + layoutRootPath = EXT:test_sitepackage/Resources/Private/Layouts/ + } + persistence { + storagePid = 0 + } +} diff --git a/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript new file mode 100644 index 00000000..3714593d --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript @@ -0,0 +1,96 @@ +# Basic page configuration +page = PAGE +page { + typeNum = 0 + + 10 = FLUIDTEMPLATE + 10 { + templateName = Default + templateRootPaths { + 0 = EXT:test_sitepackage/Resources/Private/Templates/Page/ + } + partialRootPaths { + 0 = EXT:test_sitepackage/Resources/Private/Partials/Page/ + } + layoutRootPaths { + 0 = EXT:test_sitepackage/Resources/Private/Layouts/Page/ + } + + variables { + content = CONTENT + content { + table = tt_content + select { + orderBy = sorting + where = {#colPos}=0 + } + } + + sidebar = CONTENT + sidebar { + table = tt_content + select { + orderBy = sorting + where = {#colPos}=1 + } + } + } + } + + includeCSS { + theme = EXT:test_sitepackage/Resources/Public/Css/theme.css + } +} + +# Container rendering for ce_columns2 +tt_content.ce_columns2 = FLUIDTEMPLATE +tt_content.ce_columns2 { + templateName = Columns2 + templateRootPaths { + 0 = EXT:test_sitepackage/Resources/Private/Templates/ContentElements/ + } + + dataProcessing { + 100 = B13\Container\DataProcessing\ContainerProcessor + } +} + +plugin.tx_testsitepackage_inlinerecordsirre { + view { + templateRootPaths.0 = EXT:test_sitepackage/Resources/Private/Templates/ + templateRootPaths.10 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.templateRootPath} + partialRootPaths.0 = EXT:test_sitepackage/Resources/Private/Partials/ + partialRootPaths.10 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.partialRootPath} + layoutRootPaths.0 = EXT:test_sitepackage/Resources/Private/Layouts/ + layoutRootPaths.10 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.layoutRootPath} + } + persistence { + storagePid = {$plugin.plugin.tx_testsitepackage_inlinerecordsirre.persistence.storagePid} + } +} +tt_content.tx_testsitepacke_parent = FLUIDTEMPLATE +tt_content.tx_testsitepacke_parent { + templateName = TxTestsitepackeParent + layoutRootPaths { + 10 = EXT:test_sitepackage/Resources/Private/Layouts/ContentElements/ + 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.layoutRootPath} + } + partialRootPaths { + 10 = EXT:test_sitepackage/Resources/Private/Partials/ContentElements/ + 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.partialRootPath} + } + templateRootPaths { + 10 = EXT:test_sitepackage/Resources/Private/Templates/ContentElements/ + 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.templateRootPath} + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 10 { + table = tt_content + where.data = field:uid + where.noTrimWrap = | tx_testsitepacke_parent = | AND tablenames = 'tt_content' | + orderBy = sorting + as = childElements + } + } +} diff --git a/Tests/Extensions/test_sitepackage/Configuration/page.tsconfig b/Tests/Extensions/test_sitepackage/Configuration/page.tsconfig new file mode 100644 index 00000000..c386a321 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/page.tsconfig @@ -0,0 +1,70 @@ +## TCEFORM.tt_content.CType.addItems.tx_testsitepacke_parent = IRRE Element + +mod.wizards.newContentElement.wizardItems { + + container { + header = Container Elements + elements { + ce_columns2 { + iconIdentifier = content-container-columns-2 + title = Two Columns Container + description = Container with two columns for content elements + tt_content_defValues { + CType = ce_columns2 + } + } + } + show = * + } + + tx_testsitepacke_parent { + header = testsitepacke IRRE + elements { + tx_testsitepacke_parent { + iconIdentifier = tx-testsitepacke-parent-icon + title = testsitepacke IRRE + description = Content Element including IRRE Elements + tt_content_defValues { + CType = tx_testsitepacke_parent + } + } + } + show = * + } +} + + +# Page TSconfig for backend layout +mod { + web_layout { + BackendLayouts { + default { + title = Default Layout + config { + backend_layout { + colCount = 2 + rowCount = 1 + rows { + 1 { + columns { + 1 { + name = Main Content + colPos = 0 + colspan = 1 + allowed = * + } + 2 { + name = Sidebar + colPos = 1 + colspan = 1 + allowed = * + } + } + } + } + } + } + } + } + } +} diff --git a/Tests/Extensions/test_sitepackage/README.md b/Tests/Extensions/test_sitepackage/README.md new file mode 100644 index 00000000..e16422a7 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/README.md @@ -0,0 +1,63 @@ +# Test Sitepackage + +A simple TYPO3 sitepackage for testing the paste-reference extension with container elements. + +## Features + +- 2-column backend layout (Main Content + Sidebar) +- Container element `ce_columns2` with two columns (colPos 101 and 102) +- Basic Fluid templates and CSS styling +- Integration with the container extension + +## Installation + +1. Place this extension in your TYPO3 installation +2. Activate the extension in the Extension Manager +3. Include the static TypoScript template "Test Sitepackage" +4. Create a page and set the backend layout to "Default Layout" + +## Container Element + +The `ce_columns2` container element provides: +- Two columns with colPos 101 (left) and 102 (right) +- Responsive layout using flexbox +- Integration with the container extension for proper backend editing + +## Testing with paste-reference + +This sitepackage is designed to test the paste-reference extension functionality with: +- Regular page columns (colPos 0 and 1) +- Container columns (colPos 101 and 102) +- Mixed environments with both types of columns + +## File Structure + +``` +test_sitepackage/ +├── Configuration/ +│ ├── TCA/Overrides/ +│ │ └── tt_content.php # Container registration +│ ├── TsConfig/Page/ +│ │ └── container.tsconfig # Backend layout & container config +│ └── TypoScript/ +│ ├── constants.typoscript +│ └── setup.typoscript # Page & container rendering +├── Resources/ +│ ├── Private/ +│ │ ├── Layouts/ +│ │ │ └── Default.html +│ │ └── Templates/ +│ │ ├── ContentElements/ +│ │ │ └── Columns2.html # Container template +│ │ └── Page/ +│ │ └── Default.html # Page template +│ └── Public/ +│ ├── Css/ +│ │ └── theme.css # Basic styling +│ └── Icons/ +│ └── ce_columns2.svg # Container icon +├── ext_emconf.php +├── ext_localconf.php +├── ext_tables.php +└── composer.json +``` \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html new file mode 100644 index 00000000..57c9e33c --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html @@ -0,0 +1,5 @@ + +
+ +
+ diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Default.html b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Default.html new file mode 100644 index 00000000..c07e8768 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Default.html @@ -0,0 +1,17 @@ + + +
+
+

Test Sitepackage

+
+ +
+ +
+ +
+

© 2024 Test Sitepackage

+
+
+ + diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Page/Default.html b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Page/Default.html new file mode 100644 index 00000000..c07e8768 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/Page/Default.html @@ -0,0 +1,17 @@ + + +
+
+

Test Sitepackage

+
+ +
+ +
+ +
+

© 2024 Test Sitepackage

+
+
+ + diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/Columns2.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/Columns2.html new file mode 100644 index 00000000..36f3649a --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/Columns2.html @@ -0,0 +1,22 @@ + + +
+
+
+ + + + + +
+
+ + + + + +
+
+
+ + \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/TxTestsitepackeParent.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/TxTestsitepackeParent.html new file mode 100644 index 00000000..5f3f4e82 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/TxTestsitepackeParent.html @@ -0,0 +1,9 @@ + + +{_all} + +
+

txTestsitepackeParent

+
+Main + diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html new file mode 100644 index 00000000..a5d12805 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html @@ -0,0 +1,15 @@ + + + + +
+ {content} +
+ + +
+ + + diff --git a/Tests/Extensions/test_sitepackage/Resources/Public/Css/theme.css b/Tests/Extensions/test_sitepackage/Resources/Public/Css/theme.css new file mode 100644 index 00000000..c62c5537 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Public/Css/theme.css @@ -0,0 +1,67 @@ +/* Basic styling for test sitepackage */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +header { + background-color: #f8f9fa; + padding: 20px; + margin-bottom: 20px; + border-radius: 5px; +} + +.main-content { + display: flex; + gap: 20px; + margin-bottom: 20px; +} + +.content-area { + flex: 2; +} + +.sidebar { + flex: 1; + background-color: #f8f9fa; + padding: 20px; + border-radius: 5px; +} + +/* Container element styling */ +.ce-columns2 { + margin: 20px 0; +} + +.ce-columns2 .row { + display: flex; + gap: 20px; +} + +.ce-columns2 .col-md-6 { + flex: 1; + padding: 15px; + background-color: #f8f9fa; + border-radius: 5px; + min-height: 100px; +} + +footer { + background-color: #343a40; + color: white; + padding: 20px; + text-align: center; + border-radius: 5px; +} + +/* Backend styling hints */ +.t3-page-ce-wrapper { + border: 1px dashed #ccc; + margin: 5px 0; + padding: 10px; +} + +.t3-page-ce-wrapper:hover { + border-color: #007cba; +} \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Resources/Public/Icons/Extension.svg b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/Extension.svg new file mode 100644 index 00000000..bca7a175 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/Extension.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Resources/Public/Icons/Plugin.svg b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/Plugin.svg new file mode 100644 index 00000000..e35be03c --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/Plugin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Resources/Public/Icons/ce_columns2.svg b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/ce_columns2.svg new file mode 100644 index 00000000..ab6429f0 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/ce_columns2.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/Resources/Public/Icons/favicon.ico b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..90fdfe18b68aec23a129f42e06c7d0f48b664498 GIT binary patch literal 16958 zcmdU1S%@7)6z%6kqbBA}VvI}Fr${8m=!c*pq7#i8R9rA5ia(-83=zfcBjU#!5xj0F zZp1`fZ~;Gpgybg*;(!w40)`+4!RUxe#0BGqqsCm%>3TKxdo$Cox?WZHIN{Fis;)Zs zoZJ0+x|WwDso~$EMG1Z%lgvLiN#-O;G9QMjWDv&s^k-3$%$jD*R7CtOT1!OxVJl$o z!}hf7J^0&TvtfM^8B_~xG=2$fwNIJH1mB|Z%AS;qeSgCx5J2ea9A-O zXrfP5pxx$xe-o;EKN3B=LhUvOmw8;ZFkSrL?Jf6E{_rq@3ZRHyhim`$B)I;};Rmq& z3b603spxdX+d4_KQ$NSexArEgKyT5-lSsS$4DAM|xdl}CHRXLKx@(f?=R6w6M$f}u zgWcjMsz5K%n-Rz6yh?u!c+}gNiyqWg4qXu47cr~8_M9I(HncP+Jkc8vyUJ(&cZh$c z6W7pf%qxnk{0oVmtmC|cI|cD(!RY2?1TxnR*b6<&KjZ)e1~ zq|TV4Ybw-#p)=1I4f!`#^v8tQN+2&*YeO-ym-BYj56Bn&|rvEX(gtlus+11JO%6aI%;& zkMH#0+7GU;=kVn-?5sk#qMLH?V(H&qh$9=Damh;#Tt7maerNo0=d^7;mpk*b4MkTw zXt($e*lxLA^r`}w7Q0u!4Kb(Z^6ES(dXWdu?qev?jUKqY>R;U{FSpG3f4}kg_Aar|H=~eZyb&5av=I)ByP_F*X*qmEmQwFF0#`$q9;Vs&U@x#*vwX(^7K24 zM?=v^BkJe7-VrVRS451H{d~S$L_RphUUxjTrGI`&`j-*XKg+9KkrJrNU z&m+eo_oE8v=l;Uj*wXca`sHS~DEeQkq(m&#gy8c#p# z_@+$mleN6C7g_&dLy3(5g_}q~}&Oa1AGC;iU+WDOw z*B^6Fa=qaz7{_of_}Mo1xP}7uau57$EZ5`W`%BFHGx>2$&bfQnSZmSNb<97v0IqBN z&US-{;r2Wp@4|8H#BnUwS&*8EvwcGz{{S9KV71P$LCT^R z1N&hZ^T9P;u0h&4>s2`Jo^$SL4EKFHen*8IcED~7qR|z^JUK1NNo;Uk&jt75^&+muvotXAGY$=TOw98?9X7C-B z-_7ZVxxH&bxZ-O}n*QubnyDX222wwq)Kfo{Ol|qT)Z_mXpx>Kz{?G40xrzD__<@#h zz;kt*K=cF}&UgY2p-jNRj3*-$$u9LXOc>%aEaNa7Pt&uz^$br~dWOq}Cyim$H}qcP z_tsKBfE2L4Ig&K3A7XiTGC+@$1B1pl;A`Mqw;t7f;Ld%?^ju%+1LxF(EB#b>KKre& zqs-?|9h~VKoqnWMpY?-i2Q9UsmdEh`%V?8&V5A-#j2|}bk%$J`Atl3g_y#gnN1rBA Ift>Z}zoG#Le*gdg literal 0 HcmV?d00001 diff --git a/Tests/Extensions/test_sitepackage/Resources/Public/Icons/tx_testsitepacke_parent.svg b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/tx_testsitepacke_parent.svg new file mode 100644 index 00000000..e35be03c --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Public/Icons/tx_testsitepacke_parent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/composer.json b/Tests/Extensions/test_sitepackage/composer.json new file mode 100644 index 00000000..734833df --- /dev/null +++ b/Tests/Extensions/test_sitepackage/composer.json @@ -0,0 +1,20 @@ +{ + "name": "test/sitepackage", + "type": "typo3-cms-extension", + "description": "Simple sitepackage for testing paste-reference with container extension", + "license": "GPL-2.0-or-later", + "require": { + "typo3/cms-core": "^12.0 || ^13.0 || ^14.0", + "b13/container": "^3.0" + }, + "autoload": { + "psr-4": { + "Test\\Sitepackage\\": "Classes/" + } + }, + "extra": { + "typo3/cms": { + "extension-key": "test_sitepackage" + } + } +} diff --git a/Tests/Extensions/test_sitepackage/ext_emconf.php b/Tests/Extensions/test_sitepackage/ext_emconf.php new file mode 100644 index 00000000..cc8baf03 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/ext_emconf.php @@ -0,0 +1,19 @@ + 'Test Sitepackage', + 'description' => 'Simple sitepackage for testing paste-reference with container extension', + 'category' => 'templates', + 'author' => 'David Bruchmann', + 'author_email' => 'david.bruchmann@gmail.com', + 'state' => 'stable', + 'version' => '1.1.0', + 'constraints' => [ + 'depends' => [ + 'typo3' => '12.0.0-14.99.99', + 'container' => '3.0.0-3.99.99', + ], + 'conflicts' => [], + 'suggests' => [], + ], +]; diff --git a/Tests/Extensions/test_sitepackage/ext_localconf.php b/Tests/Extensions/test_sitepackage/ext_localconf.php new file mode 100644 index 00000000..2657e484 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/ext_localconf.php @@ -0,0 +1,16 @@ + 'index, list, show', + ], + [ + IrreController::class => '', + ], + ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT, +); \ No newline at end of file diff --git a/Tests/Extensions/test_sitepackage/ext_tables.php b/Tests/Extensions/test_sitepackage/ext_tables.php new file mode 100644 index 00000000..643d2b28 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/ext_tables.php @@ -0,0 +1,10 @@ + Date: Thu, 23 Jul 2026 15:56:05 +0700 Subject: [PATCH 13/28] [TASK] improve included EXT:test_sitepackage --- .../Classes/Controller/IrreController.php | 29 +++++ .../Classes/Domain/Model/Irre.php | 72 ++++++++++ .../Domain/Repository/IrreRepository.php | 45 +++++++ .../Extbase/Persistence/Classes.php | 29 +++++ .../Configuration/Services.yaml | 10 +- .../TCA/Overrides/tt_content.php | 123 ++++++------------ .../Configuration/TsConfig/Page/.gitkeep | 0 .../Configuration/TypoScript/setup.typoscript | 58 +++++---- .../Layouts/ContentElements/Default.html | 1 + .../Private/Templates/Irre/Index.fluid.html | 22 ++++ .../Private/Templates/Irre/List.fluid.html | 22 ++++ .../Show.fluid.html} | 0 .../Private/Templates/Page/Default.html | 2 + .../test_sitepackage/ext_localconf.php | 12 +- .../test_sitepackage/ext_tables.sql | 1 + 15 files changed, 317 insertions(+), 109 deletions(-) create mode 100644 Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php create mode 100644 Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php create mode 100644 Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php delete mode 100644 Tests/Extensions/test_sitepackage/Configuration/TsConfig/Page/.gitkeep create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/Index.fluid.html create mode 100644 Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/List.fluid.html rename Tests/Extensions/test_sitepackage/Resources/Private/Templates/{ContentElements/TxTestsitepackeParent.html => Irre/Show.fluid.html} (100%) diff --git a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php index 62f99c8a..7a2b91f1 100644 --- a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php +++ b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php @@ -11,22 +11,51 @@ namespace Test\Sitepackage\Controller; use Psr\Http\Message\ResponseInterface; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; +use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; +use Test\Sitepackage\Domain\Repository\IrreRepository; class IrreController extends ActionController { + public function __construct( + private readonly IrreRepository $irreRepository + ) { + } + public function indexAction(): ResponseInterface { + //$pageId = $this->request->getAttributes()['routing']->getPageId(); + $cObj = $this->request->getAttribute('currentContentObject'); + $data = $cObj->data; + $currentRecord = $this->irreRepository->findByUid((int) $data['uid']); + $childRecords = $this->irreRepository->getChildRecords((int) $data['uid']); + $this->view->assign('data', $data); + $this->view->assign('childRecords', $childRecords); return $this->htmlResponse(); } public function showAction(): ResponseInterface { + //$pageId = $this->request->getAttributes()['routing']->getPageId(); + $cObj = $this->request->getAttribute('currentContentObject'); + $data = $cObj->data; + $currentRecord = $this->irreRepository->findByUid((int) $data['uid']); + $childRecords = $this->irreRepository->getChildRecords((int) $data['uid']); + $this->view->assign('data', $data); + $this->view->assign('childRecords', $childRecords); return $this->htmlResponse(); } public function listAction(): ResponseInterface { + //$pageId = $this->request->getAttributes()['routing']->getPageId(); + $cObj = $this->request->getAttribute('currentContentObject'); + $data = $cObj->data; + $currentRecord = $this->irreRepository->findByUid((int) $data['uid']); + $childRecords = $this->irreRepository->getChildRecords((int) $data['uid']); + $this->view->assign('data', $data); + $this->view->assign('childRecords', $childRecords); return $this->htmlResponse(); } } diff --git a/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php b/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php new file mode 100644 index 00000000..887c1d4a --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php @@ -0,0 +1,72 @@ + + */ + protected ?ObjectStorage $childRecords = null; + + public function __construct() + { + $this->initializeObject(); + } + + public function initializeObject(): void + { + $this->childRecords = new ObjectStorage(); + } + + public function getTxTestsitepackeParent(): int + { + return $this->txTestsitepackeParent; + } + + public function setTxTestsitepackeParent(int $txTestsitepackeParent): void + { + $this->txTestsitepackeParent = $txTestsitepackeParent; + } + + + /** + * @return ObjectStorage + */ + public function getChildRecords(): ObjectStorage + { + return $this->childRecords; // ?? new ObjectStorage(); + } + + /** + * @param ObjectStorage $childRecords + */ + public function setChildRecords(ObjectStorage $childRecords): void + { + $this->childRecords = $childRecords; + } + + public function addChildRecord(Irre $childRecord): void + { + $this->childRecords->attach($childRecord); + } + + public function removeChildRecord(Irre $childRecord): void + { + $this->childRecords->detach($childRecord); + } +} diff --git a/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php b/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php new file mode 100644 index 00000000..a63356b5 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php @@ -0,0 +1,45 @@ +createQuery()->getQuerySettings(); + // Show comments from all pages + $querySettings->setRespectStoragePage(false); + $this->setDefaultQuerySettings($querySettings); + } + + public function getChildRecords(int $uid): QueryResultInterface + { + $currentRecord = $this->findByUid($uid); + $childRecords = []; + $query = $this->createQuery(); + $childRecords = $query + ->matching( + $query->logicalAnd( + $query->equals('tablenames', 'tt_content'), + $query->equals('tx_testsitepacke_parent', $uid), + ), + ) + ->execute(); + return $childRecords; + } +} diff --git a/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php b/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php new file mode 100644 index 00000000..2a1794b0 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php @@ -0,0 +1,29 @@ + [ + 'tableName' => 'tt_content', + 'properties' => [ + // Map property 'txTestsitepackeParent' to database field 'tx_testsitepacke_parent' + #'txTestsitepackeParent' => [ + # 'fieldName' => 'tx_testsitepacke_parent', + #], + // CRITICAL: Map property 'childRecords' to your IRRE relation tracking field 'bodytext' + 'childRecords' => [ + 'fieldName' => 'bodytext', + ], + ], + ], +]; +/* +return [ + \WDB\MrSitepackage\Domain\Model\Teaser::class => [ + 'tableName' => 'tt_content', + ], + \WDB\MrSitepackage\Domain\Model\Jobbox::class => [ + 'tableName' => 'tt_content', + ], +]; +*/ diff --git a/Tests/Extensions/test_sitepackage/Configuration/Services.yaml b/Tests/Extensions/test_sitepackage/Configuration/Services.yaml index 614a06c6..693ce0c1 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/Services.yaml +++ b/Tests/Extensions/test_sitepackage/Configuration/Services.yaml @@ -4,5 +4,13 @@ services: autoconfigure: true public: false + Test\Sitepackage\Controller\: + resource: '../Classes/Controller' + + Test\Sitepackage\Domain\Repository\: + resource: '../Classes/Domain/Repository' + Test\Sitepackage\: - resource: '../Classes/*' \ No newline at end of file + resource: '../Classes/*' + exclude: + - '../Classes/Domain/Model/*' diff --git a/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php b/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php index c489ba78..0a3c0e2f 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php +++ b/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php @@ -1,6 +1,7 @@ configureContainer($containerConfiguration); // Add the container to the content element wizard -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( +ExtensionManagementUtility::addTcaSelectItem( 'tt_content', 'CType', [ @@ -54,8 +53,9 @@ ], ); -# ExtensionManagementUtility::addTCAcolumns('tt_content',[ -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns( + + +ExtensionManagementUtility::addTCAcolumns( 'tt_content', [ 'tx_testsitepacke_parent' => [ @@ -66,81 +66,42 @@ 'type' => 'passthrough', ], ], + 'tx_testsitepacke_kids' => [ + 'label' => 'Inline Elements', + 'description' => 'Group several content elements', + 'exclude' => 0, + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tt_content', + 'foreign_field' => 'tx_testsitepacke_parent', + 'foreign_table_field' => 'tablenames', + 'appearance' => [ + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + ], + ], + ] ], ); -/* -$GLOBALS['TCA']['tt_content']['columns']['bodytext'] = [ -]; -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette( - 'tt_content', - 'general', - 'tx_testsitepacke_parent', - #'before:editlock' - ); -$GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent']['showitem']= - -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( - 'fe_users', - 'tx_myextension_options, tx_myextension_special', - '', - 'after:password', -); -*/ -# Relation: 1:n -# https://docs.typo3.org/permalink/t3tca:tca-example-inline-1n-inline-1 -$GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent'] = $GLOBALS['TCA']['tt_content']['types']['text']; -# $GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent']['columnsOverrides']['bodytext'] = - -$inlineConfig = [ - 'type' => 'inline', - 'foreign_table' => 'tt_content', - 'foreign_field' => 'tx_testsitepacke_parent', - 'foreign_table_field' => 'tablenames', - 'appearance' => [ - 'showSynchronizationLink' => true, - 'showAllLocalizationLink' => true, - 'showPossibleLocalizationRecords' => true, - ], -]; - -$versionObj = GeneralUtility::makeInstance(Typo3Version::class); -$currentMajorVersion = (int)explode('.', $versionObj->getVersion())[0]; -#debug($currentMajorVersion); -if ($currentMajorVersion >= 14) { - $inlineConfig['appearance']['hideFieldsWithNoSelectableItems'] = true; -} - -$tcaOverride = [ - 'label' => 'Inline Elements', - 'description' => 'Group several content elements', - 'exclude' => 0, - 'config' => $inlineConfig, -]; -if ($currentMajorVersion < 14){ - $tcaOverride['displayCond'] = 'REC:NEW:false'; +$tmpConfig = $GLOBALS['TCA']['tt_content']['types']['text']; +$tmpConfigArray = explode(',', $tmpConfig['showitem']); +foreach ($tmpConfigArray as $count => $tmpConfigValue) { + if (trim($tmpConfigValue) == 'bodytext') { + $tmpConfigArray[$count] = 'tx_testsitepacke_kids'; + } } - -$GLOBALS['TCA']['tt_content']['types']['tx_testsitepacke_parent']['columnsOverrides']['bodytext'] = $tcaOverride; +$GLOBALS['TCA']['tt_content']['types']['testsitepackage_inlinerecordsirre']['showitem'] = implode(',', $tmpConfigArray); ExtensionUtility::registerPlugin( - 'TestSitepackage', - 'InlineRecordsirre', - 'Inline Records (IRRE)', - 'ext-test-sitepackage-plugin', - 'plugins', - 'Simple Content Element with IRRE relations', + 'TestSitepackage', // extensionName or extension_key + 'InlineRecordsIrre', // pluginName + 'Inline Records (IRRE)', // pluginTitle + 'tx-testsitepacke-parent-icon', // pluginIcon + 'plugins', // group + 'Simple Content Element with IRRE relations' // pluginDescription + // $$flexForm // Either a reference to a flex-form XML file or the XML directly ); -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( - 'tt_content', - 'CType', - [ - 'label' => 'Content Element with Inline Records (IRRE)', // The label shown to users - 'value' => 'tx_testsitepacke_parent', // Must match your element name - 'icon' => 'tx-testsitepacke-parent-icon', // Optional: An existing core icon - 'group' => 'special' // Dropdown group (default, special, etc.) - ] -); -// Assign your registered icon identifier to the CType for the Backend Layout view -$GLOBALS['TCA']['tt_content']['ctrl']['typeicon_classes']['tx_testsitepacke_parent'] = 'tx-testsitepacke-parent-icon'; +$GLOBALS['TCA']['tt_content']['ctrl']['typeicon_classes']['testsitepackage_inlinerecordsirre'] = 'tx-testsitepacke-parent-icon'; diff --git a/Tests/Extensions/test_sitepackage/Configuration/TsConfig/Page/.gitkeep b/Tests/Extensions/test_sitepackage/Configuration/TsConfig/Page/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript index 3714593d..b7826d35 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript +++ b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript @@ -56,33 +56,33 @@ tt_content.ce_columns2 { } plugin.tx_testsitepackage_inlinerecordsirre { + extensionName = TestSitepackage + pluginName = InlineRecordsIrre + vendorName = Test + + #settings.detailPid = 42 + mvc.callDefaultActionIfActionCantBeResolved = 1 + settings.foo = bar view { - templateRootPaths.0 = EXT:test_sitepackage/Resources/Private/Templates/ - templateRootPaths.10 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.templateRootPath} - partialRootPaths.0 = EXT:test_sitepackage/Resources/Private/Partials/ - partialRootPaths.10 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.partialRootPath} - layoutRootPaths.0 = EXT:test_sitepackage/Resources/Private/Layouts/ - layoutRootPaths.10 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.layoutRootPath} + layoutRootPaths { + 10 = EXT:test_sitepackage/Resources/Private/Layouts/ContentElements/ + 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.layoutRootPath} + } + partialRootPaths { + 10 = EXT:test_sitepackage/Resources/Private/Partials/ContentElements/ + 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.partialRootPath} + } + templateRootPaths { + 10 = EXT:test_sitepackage/Resources/Private/Templates/ + 20 = EXT:test_sitepackage/Resources/Private/Templates/ContentElements/ + 30 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.templateRootPath} + } } persistence { - storagePid = {$plugin.plugin.tx_testsitepackage_inlinerecordsirre.persistence.storagePid} - } -} -tt_content.tx_testsitepacke_parent = FLUIDTEMPLATE -tt_content.tx_testsitepacke_parent { - templateName = TxTestsitepackeParent - layoutRootPaths { - 10 = EXT:test_sitepackage/Resources/Private/Layouts/ContentElements/ - 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.layoutRootPath} - } - partialRootPaths { - 10 = EXT:test_sitepackage/Resources/Private/Partials/ContentElements/ - 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.partialRootPath} - } - templateRootPaths { - 10 = EXT:test_sitepackage/Resources/Private/Templates/ContentElements/ - 20 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.templateRootPath} + storagePid = 226 + # {$plugin.plugin.tx_testsitepackage_inlinerecordsirre.persistence.storagePid} } + /* dataProcessing { 10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor 10 { @@ -93,4 +93,16 @@ tt_content.tx_testsitepacke_parent { as = childElements } } + stdWrap { + debug = 1 + } + */ +} + +tt_content.testsitepackage_inlinerecordsirre = EXTBASEPLUGIN +tt_content.testsitepackage_inlinerecordsirre { + extensionName = TestSitepackage + pluginName = InlineRecordsIrre + vendorName = Test } + diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html index 57c9e33c..f4a3d1e7 100644 --- a/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Layouts/ContentElements/Default.html @@ -1,4 +1,5 @@ +

CEs Layout Default

diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/Index.fluid.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/Index.fluid.html new file mode 100644 index 00000000..552c1a7e --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/Index.fluid.html @@ -0,0 +1,22 @@ + + + + + +

IRRE Template index

+
+ {_all} + + + + + + {data} + +
+
+ + diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/List.fluid.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/List.fluid.html new file mode 100644 index 00000000..5a086b74 --- /dev/null +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/List.fluid.html @@ -0,0 +1,22 @@ + + + + + +

IRRE Template List

+
+ {_all} + + + + + + {data} + +
+
+ + diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/TxTestsitepackeParent.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/Show.fluid.html similarity index 100% rename from Tests/Extensions/test_sitepackage/Resources/Private/Templates/ContentElements/TxTestsitepackeParent.html rename to Tests/Extensions/test_sitepackage/Resources/Private/Templates/Irre/Show.fluid.html diff --git a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html index a5d12805..abac9343 100644 --- a/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html +++ b/Tests/Extensions/test_sitepackage/Resources/Private/Templates/Page/Default.html @@ -1,6 +1,8 @@ +

Page Template Default

+
{content} diff --git a/Tests/Extensions/test_sitepackage/ext_localconf.php b/Tests/Extensions/test_sitepackage/ext_localconf.php index 2657e484..11d7ed32 100644 --- a/Tests/Extensions/test_sitepackage/ext_localconf.php +++ b/Tests/Extensions/test_sitepackage/ext_localconf.php @@ -1,16 +1,20 @@ 'index, list, show', + IrreController::class => 'index, list, show', //'index, list, show', ], [ IrreController::class => '', ], ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT, -); \ No newline at end of file +); diff --git a/Tests/Extensions/test_sitepackage/ext_tables.sql b/Tests/Extensions/test_sitepackage/ext_tables.sql index 61205b60..03fdc60a 100644 --- a/Tests/Extensions/test_sitepackage/ext_tables.sql +++ b/Tests/Extensions/test_sitepackage/ext_tables.sql @@ -3,6 +3,7 @@ # CREATE TABLE tt_content ( tx_testsitepacke_parent int(11) DEFAULT '0' NOT NULL, + tx_testsitepacke_kids int(11) DEFAULT '0' NOT NULL, tablenames varchar(255) DEFAULT '' NOT NULL, KEY tx_testsitepacke_parent (tx_testsitepacke_parent) ); From d4ae322a6ab10907ea808254525091b6fae9166b Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 16:20:54 +0700 Subject: [PATCH 14/28] [TASK] fix CGL issues --- Tests/Extensions/test_container.zip | Bin 0 -> 3427 bytes .../Classes/Controller/IrreController.php | 24 +++++++++--------- .../Classes/Domain/Model/Irre.php | 1 - .../Domain/Repository/IrreRepository.php | 5 +--- .../Extbase/Persistence/Classes.php | 17 +------------ .../test_sitepackage/Configuration/Icons.php | 1 + .../TCA/Overrides/tt_content.php | 10 ++------ .../test_sitepackage/ext_localconf.php | 6 ++--- 8 files changed, 20 insertions(+), 44 deletions(-) create mode 100644 Tests/Extensions/test_container.zip diff --git a/Tests/Extensions/test_container.zip b/Tests/Extensions/test_container.zip new file mode 100644 index 0000000000000000000000000000000000000000..53b24c9359770541b44329eeaaf565b349751439 GIT binary patch literal 3427 zcmbW33p~^N8^@PvljPRQE!T3X+|N{W$mW)#w2&g~&x}^Hxr{C@nQKZYmyVE2Oa8)K zBbVwp6Xh<7Hl|W&xr9X%0oF)Bdl8T*JdWUq!J$3X5UWm>TsheQk8{DedV4w&FnHV=uCo8;YGnXh!+rOU zxF7LBdwOD=(O!QEaRGP$IIUs3#t)fgR4xGEDK7w^{c}QurNp3d1XcG_?v2On@z2#E z{>|i3poIk{J;$GMqBTnaib0;f0%*mIze#GS_Lie!jtefPF#NPIv+J-2`*ub(>rOk+ zz220LT(6~gh=$m4P0$8!P?H`~WeemYgI{WUBwGQ`U!g7#BXL zDWjzzZ?{><64U?-+)IUBba+F~A_+CXZaSS&@151$K1#bxA0pHV)XILY%+^crkFjja z@lpT%Io@5iBwZ6grfdQc(`>1zV#CgsvX7y{jr|b-r-TA&id;&)t(PqSz`A-fDnPk?Bin+mbz#C=(8K7#W|N7Vv zr|^eCf{=8Yg5$}D^cbPh~Nj0b(?h;f0cyRwn_#^ zS#Aj&?#UDg0^46{@8<2Lp09dwrLG1VUU+DLt7(Ts#EIKdWJgR5(e{8yV&8$W5i1Qf z65OC-z@l^^A1k!W?fm{ioJc8UE76T7q%gDueCD_P;ZY72z1r_^5y<|IW5p-E1FCXE zE#AVgjdSg7<^1{Rn#qU}Q(}-H3>yE$i_^nR@MAN(WB21kZ3m+FU}Ay2p+-rU?XcwR3C+^q$Dt{Q8I>9rDlZTXY5t@|~?Lb>x zNM@e55H=K|buTbld>a&@1nlFhuz?nZSO%{bkK2}hYR8D(3HdBZn)Y_(cubYIin6re ziFJa~2-%lL)`;FHu+yOz1bH>JaaX6IX%CLd zfca;1baO;vvd0T$55l6{MNY^Vc3&4RGe%gPy=)Oz?&=n)&&V<4>FYM)#o~I*%zRyw zQ!BcBbxo$^JLk>xJ^eOVtHIimQ|>4an8?NPSSF`nZzqd%GVW`6-uEA67}R8TseK?& zk959`%*`ZcrG8&1S*Uv2OI9x2S%sqWf8+$mx_Z&hU$WBHdiqZp2&i{Xx8^lX@n-Qx z#wB9z@z7im-{9+IN<}&in8w*jt({_o$!vQg!(VGhzy%+tR3=ZN_7g7;%q12G!o^+w zJE2mq-LLE;^Ra}FoF`I8G_a;bbO0$wFW79Rz{5s=$%E}By}?DLk#Ji!C=2S9XmI5g z38!x#c}RMEp}(rQnDAs~5So~`y+Snq^CqQ*E+p-#VpsIS^MM1#&uo6v@xKI*Qjd$h znj1gCRa%aTOm1tM|G-3-sCKn1fN!Nb=p7-K(p9T%0xIS;p1vEsmc9M^boJA1p9;oFB}-+N}=FaZyl@==NBLYel~&9PGXwctYT zQz$ES9*?_Op;kwD?5!2;b)sjL+hZ#~4a?UNw;c~Vyf=RFUPfB}*(Xs8HZjg(eh^B; zg6E6bL1Fxkpg^t@wLFxTIBI1;#0#3UD@h#?7oa+OxRu4T#4#dcZVNwZnbF(xcv{R*jX$-a6< zWjGqFkqIkVQ-(wO)z#Rn=NJ<<@dIic@_#*=e_}sJvzWLSwAMzKR=A|O@+RPW|6>(NT31POLwPyf;kM-#X0st->*#G_q4YUV# literal 0 HcmV?d00001 diff --git a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php index 7a2b91f1..2c98d402 100644 --- a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php +++ b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php @@ -8,28 +8,28 @@ * For the full copyright and license information, please read the * LICENSE file that was distributed with this source code. */ + namespace Test\Sitepackage\Controller; use Psr\Http\Message\ResponseInterface; +use Test\Sitepackage\Domain\Repository\IrreRepository; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; -use Test\Sitepackage\Domain\Repository\IrreRepository; class IrreController extends ActionController { public function __construct( private readonly IrreRepository $irreRepository - ) { - } + ) {} public function indexAction(): ResponseInterface { - //$pageId = $this->request->getAttributes()['routing']->getPageId(); + // $pageId = $this->request->getAttributes()['routing']->getPageId(); $cObj = $this->request->getAttribute('currentContentObject'); $data = $cObj->data; - $currentRecord = $this->irreRepository->findByUid((int) $data['uid']); - $childRecords = $this->irreRepository->getChildRecords((int) $data['uid']); + $currentRecord = $this->irreRepository->findByUid((int)$data['uid']); + $childRecords = $this->irreRepository->getChildRecords((int)$data['uid']); $this->view->assign('data', $data); $this->view->assign('childRecords', $childRecords); return $this->htmlResponse(); @@ -37,11 +37,11 @@ public function indexAction(): ResponseInterface public function showAction(): ResponseInterface { - //$pageId = $this->request->getAttributes()['routing']->getPageId(); + // $pageId = $this->request->getAttributes()['routing']->getPageId(); $cObj = $this->request->getAttribute('currentContentObject'); $data = $cObj->data; - $currentRecord = $this->irreRepository->findByUid((int) $data['uid']); - $childRecords = $this->irreRepository->getChildRecords((int) $data['uid']); + $currentRecord = $this->irreRepository->findByUid((int)$data['uid']); + $childRecords = $this->irreRepository->getChildRecords((int)$data['uid']); $this->view->assign('data', $data); $this->view->assign('childRecords', $childRecords); return $this->htmlResponse(); @@ -49,11 +49,11 @@ public function showAction(): ResponseInterface public function listAction(): ResponseInterface { - //$pageId = $this->request->getAttributes()['routing']->getPageId(); + // $pageId = $this->request->getAttributes()['routing']->getPageId(); $cObj = $this->request->getAttribute('currentContentObject'); $data = $cObj->data; - $currentRecord = $this->irreRepository->findByUid((int) $data['uid']); - $childRecords = $this->irreRepository->getChildRecords((int) $data['uid']); + $currentRecord = $this->irreRepository->findByUid((int)$data['uid']); + $childRecords = $this->irreRepository->getChildRecords((int)$data['uid']); $this->view->assign('data', $data); $this->view->assign('childRecords', $childRecords); return $this->htmlResponse(); diff --git a/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php b/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php index 887c1d4a..e668c4fb 100644 --- a/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php +++ b/Tests/Extensions/test_sitepackage/Classes/Domain/Model/Irre.php @@ -43,7 +43,6 @@ public function setTxTestsitepackeParent(int $txTestsitepackeParent): void $this->txTestsitepackeParent = $txTestsitepackeParent; } - /** * @return ObjectStorage */ diff --git a/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php b/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php index a63356b5..884a785d 100644 --- a/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php +++ b/Tests/Extensions/test_sitepackage/Classes/Domain/Repository/IrreRepository.php @@ -8,17 +8,14 @@ * For the full copyright and license information, please read the * LICENSE file that was distributed with this source code. */ + namespace Test\Sitepackage\Domain\Repository; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser; use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; use TYPO3\CMS\Extbase\Persistence\Repository; -use TYPO3\CMS\Extbase\Utility\DebuggerUtility; class IrreRepository extends Repository { - public function initializeObject(): void { $querySettings = $this->createQuery()->getQuerySettings(); diff --git a/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php b/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php index 2a1794b0..7dbb935c 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php +++ b/Tests/Extensions/test_sitepackage/Configuration/Extbase/Persistence/Classes.php @@ -6,24 +6,9 @@ \Test\Sitepackage\Domain\Model\Irre::class => [ 'tableName' => 'tt_content', 'properties' => [ - // Map property 'txTestsitepackeParent' to database field 'tx_testsitepacke_parent' - #'txTestsitepackeParent' => [ - # 'fieldName' => 'tx_testsitepacke_parent', - #], - // CRITICAL: Map property 'childRecords' to your IRRE relation tracking field 'bodytext' 'childRecords' => [ - 'fieldName' => 'bodytext', + 'fieldName' => 'tx_testsitepacke_kids', ], ], ], ]; -/* -return [ - \WDB\MrSitepackage\Domain\Model\Teaser::class => [ - 'tableName' => 'tt_content', - ], - \WDB\MrSitepackage\Domain\Model\Jobbox::class => [ - 'tableName' => 'tt_content', - ], -]; -*/ diff --git a/Tests/Extensions/test_sitepackage/Configuration/Icons.php b/Tests/Extensions/test_sitepackage/Configuration/Icons.php index ce04318a..3a5b80d1 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/Icons.php +++ b/Tests/Extensions/test_sitepackage/Configuration/Icons.php @@ -1,6 +1,7 @@ [ 'provider' => SvgIconProvider::class, diff --git a/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php b/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php index 0a3c0e2f..0f8d12f8 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php +++ b/Tests/Extensions/test_sitepackage/Configuration/TCA/Overrides/tt_content.php @@ -4,10 +4,8 @@ use B13\Container\Tca\ContainerConfiguration; use B13\Container\Tca\Registry; -use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; -#use TYPO3\CMS\Core\Utility\VersionNumberUtility; use TYPO3\CMS\Extbase\Utility\ExtensionUtility; defined('TYPO3') or die(); @@ -53,15 +51,11 @@ ], ); - - ExtensionManagementUtility::addTCAcolumns( 'tt_content', [ 'tx_testsitepacke_parent' => [ - 'label' => 'Inline Element parent field', - - # 'description' => 'Group several content elements', + 'label' => 'Inline Element parent field', 'config' => [ 'type' => 'passthrough', ], @@ -81,7 +75,7 @@ 'showPossibleLocalizationRecords' => true, ], ], - ] + ], ], ); diff --git a/Tests/Extensions/test_sitepackage/ext_localconf.php b/Tests/Extensions/test_sitepackage/ext_localconf.php index 11d7ed32..ab11bebd 100644 --- a/Tests/Extensions/test_sitepackage/ext_localconf.php +++ b/Tests/Extensions/test_sitepackage/ext_localconf.php @@ -1,17 +1,17 @@ 'index, list, show', //'index, list, show', + IrreController::class => 'index, list, show', ], [ IrreController::class => '', From 19dc101814a0037dd07c541f76bd9c4cad73a4bd Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 16:24:10 +0700 Subject: [PATCH 15/28] [TASK] fix CGL issues --- .../test_sitepackage/Classes/Controller/IrreController.php | 2 -- Tests/Extensions/test_sitepackage/ext_localconf.php | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php index 2c98d402..0fc666c7 100644 --- a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php +++ b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php @@ -13,9 +13,7 @@ use Psr\Http\Message\ResponseInterface; use Test\Sitepackage\Domain\Repository\IrreRepository; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\Controller\ActionController; -use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; class IrreController extends ActionController { diff --git a/Tests/Extensions/test_sitepackage/ext_localconf.php b/Tests/Extensions/test_sitepackage/ext_localconf.php index ab11bebd..12e4f175 100644 --- a/Tests/Extensions/test_sitepackage/ext_localconf.php +++ b/Tests/Extensions/test_sitepackage/ext_localconf.php @@ -2,8 +2,8 @@ declare(strict_types=1); -use TYPO3\CMS\Extbase\Utility\ExtensionUtility; use Test\Sitepackage\Controller\IrreController; +use TYPO3\CMS\Extbase\Utility\ExtensionUtility; defined('TYPO3') or die; From c8ac0c819d4fe61253f6eb1259777da21f73733d Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 16:27:46 +0700 Subject: [PATCH 16/28] [TASK] fix PHPstan issue --- Tests/Extensions/test_sitepackage/ext_emconf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Extensions/test_sitepackage/ext_emconf.php b/Tests/Extensions/test_sitepackage/ext_emconf.php index cc8baf03..3f0eb157 100644 --- a/Tests/Extensions/test_sitepackage/ext_emconf.php +++ b/Tests/Extensions/test_sitepackage/ext_emconf.php @@ -1,4 +1,4 @@ - 'Test Sitepackage', From 4e5c6780da48f5346263b512986536318f781f35 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 16:29:55 +0700 Subject: [PATCH 17/28] [TASK] fix PHPstan issue --- Tests/Extensions/test_sitepackage/ext_emconf.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/Extensions/test_sitepackage/ext_emconf.php b/Tests/Extensions/test_sitepackage/ext_emconf.php index 3f0eb157..88054829 100644 --- a/Tests/Extensions/test_sitepackage/ext_emconf.php +++ b/Tests/Extensions/test_sitepackage/ext_emconf.php @@ -1,5 +1,6 @@ - 'Test Sitepackage', 'description' => 'Simple sitepackage for testing paste-reference with container extension', From 50ae0972b781f0882492ca4fec8c357f7a8f6855 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 16:34:09 +0700 Subject: [PATCH 18/28] [TASK] fix PHPstan issue --- Tests/Extensions/test_sitepackage/ext_emconf.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Tests/Extensions/test_sitepackage/ext_emconf.php b/Tests/Extensions/test_sitepackage/ext_emconf.php index 88054829..5f3d08ef 100644 --- a/Tests/Extensions/test_sitepackage/ext_emconf.php +++ b/Tests/Extensions/test_sitepackage/ext_emconf.php @@ -1,6 +1,12 @@ - 'Test Sitepackage', 'description' => 'Simple sitepackage for testing paste-reference with container extension', From 4d31014b4239f78a6239e61018410bb4d36b592e Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 16:40:00 +0700 Subject: [PATCH 19/28] [TASK] fix PHPstan issue --- Tests/Extensions/test_sitepackage/ext_emconf.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/Extensions/test_sitepackage/ext_emconf.php b/Tests/Extensions/test_sitepackage/ext_emconf.php index 5f3d08ef..ad269102 100644 --- a/Tests/Extensions/test_sitepackage/ext_emconf.php +++ b/Tests/Extensions/test_sitepackage/ext_emconf.php @@ -1,4 +1,6 @@ - Date: Thu, 23 Jul 2026 16:55:39 +0700 Subject: [PATCH 20/28] [TASK] fix PHPstan issue --- Tests/Extensions/test_sitepackage/ext_emconf.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/Extensions/test_sitepackage/ext_emconf.php b/Tests/Extensions/test_sitepackage/ext_emconf.php index ad269102..580d9b61 100644 --- a/Tests/Extensions/test_sitepackage/ext_emconf.php +++ b/Tests/Extensions/test_sitepackage/ext_emconf.php @@ -1,7 +1,5 @@ 'Test Sitepackage', 'description' => 'Simple sitepackage for testing paste-reference with container extension', From ccc04fc3bc83f71924331376a2deccb3eb9d5dc3 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Thu, 23 Jul 2026 17:38:17 +0700 Subject: [PATCH 21/28] [TASK] clean TypoScript of test extension --- .../Configuration/TypoScript/setup.typoscript | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript index b7826d35..0fdf736a 100644 --- a/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript +++ b/Tests/Extensions/test_sitepackage/Configuration/TypoScript/setup.typoscript @@ -60,9 +60,16 @@ plugin.tx_testsitepackage_inlinerecordsirre { pluginName = InlineRecordsIrre vendorName = Test - #settings.detailPid = 42 - mvc.callDefaultActionIfActionCantBeResolved = 1 - settings.foo = bar + mvc { + callDefaultActionIfActionCantBeResolved = 1 + } + persistence { + storagePid = {$plugin.plugin.tx_testsitepackage_inlinerecordsirre.persistence.storagePid} + } + settings { + detailPid = {$plugin.plugin.tx_testsitepackage_inlinerecordsirre.persistence.storagePid} + settings.foo = bar + } view { layoutRootPaths { 10 = EXT:test_sitepackage/Resources/Private/Layouts/ContentElements/ @@ -78,25 +85,6 @@ plugin.tx_testsitepackage_inlinerecordsirre { 30 = {$plugin.tx_testsitepackage_inlinerecordsirre.view.templateRootPath} } } - persistence { - storagePid = 226 - # {$plugin.plugin.tx_testsitepackage_inlinerecordsirre.persistence.storagePid} - } - /* - dataProcessing { - 10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor - 10 { - table = tt_content - where.data = field:uid - where.noTrimWrap = | tx_testsitepacke_parent = | AND tablenames = 'tt_content' | - orderBy = sorting - as = childElements - } - } - stdWrap { - debug = 1 - } - */ } tt_content.testsitepackage_inlinerecordsirre = EXTBASEPLUGIN From 16913fecfbed2896144c5c986f8b599b77d0837a Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 12:00:44 +0700 Subject: [PATCH 22/28] [BUGFIX] refactor: Use resolved record hydration in ShortcutPreviewRenderer Fixes a crash where extensions (like EXT:powermail) using strict inline PHPDoc type-hinting or native type checks (e.g., expecting LazyRecordCollection) fail with a TypeError when rendered inside shortcuts or containers. The issue occurred because ShortcutPreviewRenderer manually fetched referenced records and instantiated them using createFromDatabaseRow(). This bypassed TYPO3 v14's native RecordFieldTransformer, causing complex TCA types like FlexForms or relations to be passed down as flat, common PHP arrays instead of fully-cast Core object structures. Changes: - Replace shallow createFromDatabaseRow() with createResolvedRecordFromDatabaseRow() - Guarantee full object hydration across the shortcut rendering pipeline fix #94, close https://github.com/in2code-pro/powermail/pull/169 --- Classes/PageLayoutView/ShortcutPreviewRenderer.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Classes/PageLayoutView/ShortcutPreviewRenderer.php b/Classes/PageLayoutView/ShortcutPreviewRenderer.php index f0eed86e..9d88ef06 100644 --- a/Classes/PageLayoutView/ShortcutPreviewRenderer.php +++ b/Classes/PageLayoutView/ShortcutPreviewRenderer.php @@ -172,8 +172,8 @@ protected function addShortcutRenderItems(GridColumnItem $gridColumnItem): array $dataRow['shortcutItems'] = []; foreach ($collectedItems as $item) { if ($item) { - $itemObj = $this->recordFactory->createFromDatabaseRow('tt_content', $item); - $renderItems[] = $itemObj; // $this->prepareRecord($itemObj); + $itemObj = $this->recordFactory->createResolvedRecordFromDatabaseRow('tt_content', $item); + $renderItems[] = $itemObj; } } } @@ -251,9 +251,8 @@ protected function getFakeItemForPreview(GridColumnItem $gridColumnItem): GridCo $rawRecord->getComputedProperties(), $rawRecord->getFullType() ); - $fakeRecord = GeneralUtility::makeInstance( - Record::class, - $rawFakeRecord, + $fakeRecord = $this->recordFactory->createResolvedRecordFromDatabaseRow( + 'tt_content', $fakeRecordDataRow ); $gridColumnItem->setRecord($fakeRecord); From 28eac78ee436f845550ba90032a710fa3e437f89 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 20:07:20 +0700 Subject: [PATCH 23/28] [TASK] resolve Issues listed in InstallTool - resolve deprecated Issues - leave comment beside false positives, which can be seen directly in the installTool, so that the items never have to be checked several times. --- Classes/DataHandler/ProcessCmdmap.php | 2 +- .../Domain/Repository/TtContentRepository.php | 25 ++++++++++--------- .../ShortcutPreviewRenderer.php | 2 +- .../Classes/Controller/IrreController.php | 6 ++--- .../VersionSpecificCompatibilityTest.php | 2 +- Tests/Unit/DeprecatedApiDetectionTest.php | 2 +- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Classes/DataHandler/ProcessCmdmap.php b/Classes/DataHandler/ProcessCmdmap.php index a38f07f0..5909babd 100644 --- a/Classes/DataHandler/ProcessCmdmap.php +++ b/Classes/DataHandler/ProcessCmdmap.php @@ -86,7 +86,7 @@ public function execute_processCmdmap( $clipBoard = $queryParams['CB'] ??= null; if (!empty($clipBoard)) { - $updateArray = $clipBoard['update']; + $updateArray = $clipBoard['update']; // false positive of #99586 / #100963 in Extension Scanner if (!empty($updateArray)) { $dataArray = array_merge($dataArray, $updateArray); } diff --git a/Classes/Domain/Repository/TtContentRepository.php b/Classes/Domain/Repository/TtContentRepository.php index 77db37e1..6d497d42 100644 --- a/Classes/Domain/Repository/TtContentRepository.php +++ b/Classes/Domain/Repository/TtContentRepository.php @@ -29,6 +29,7 @@ use Doctrine\DBAL\Exception as DBALException; use Doctrine\DBAL\Exception\DriverException as DBALDriverException; use EHAERER\PasteReference\Helper\BackendHelper; +use TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; @@ -59,6 +60,7 @@ public function __construct() $emConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('paste_reference') ?? []; $this->extensionConfiguration = $emConf; $this->backendHelper = GeneralUtility::makeInstance(BackendHelper::class); + $this->localizationRepository = GeneralUtility::makeInstance(LocalizationRepository::class); } /** @@ -77,7 +79,7 @@ public function collectContentDataFromPages( string $shortcutItem, array &$collectedItems, int $parentUid = 0, - int $language = 0, + int $languageId = 0, int $recursive = 0 // TODO: $recursive never seems being used ): void { $itemList = str_replace('pages_', '', $shortcutItem); @@ -113,10 +115,11 @@ public function collectContentDataFromPages( /** @ var array|false $item */ while ($item = $result->fetchAssociative()) { - if (!empty($this->extensionConfiguration['overlayShortcutTranslation']) && $language > 0) { - $translatedItem = BackendUtility::getRecordLocalization('tt_content', (int)($item['uid'] ?? 0), $language) ?: []; - if (is_array($translatedItem) && $translatedItem !== []) { + if (!empty($this->extensionConfiguration['overlayShortcutTranslation']) && (int)$languageId > 0) { + $translatedItem = $this->localizationRepository->getRecordTranslation($this->table, (int)($item['uid'] ?? 0), (int)$languageId); + if (is_array($translatedItem) && !empty($translatedItem)) { $item = array_shift($translatedItem); + //$translation = $translations[0]; } } if ($this->backendHelper->getBackendUser()->workspace > 0) { @@ -144,7 +147,7 @@ public function collectContentData( string $shortcutItem, array &$collectedItems, int $parentUid, - int $language + int $languageId ): void { $shortcutItem = str_replace('tt_content_', '', $shortcutItem); if ((int)$shortcutItem !== $parentUid) { @@ -167,10 +170,11 @@ public function collectContentData( ->setMaxResults(1) ->executeQuery() ->fetchAssociative(); - if (!empty($this->extensionConfiguration['overlayShortcutTranslation']) && $language > 0) { - $translatedItem = BackendUtility::getRecordLocalization('tt_content', (int)($item['uid'] ?? 0), $language) ?: []; - if (is_array($translatedItem) && $translatedItem !== []) { + if (!empty($this->extensionConfiguration['overlayShortcutTranslation']) && (int)$languageId > 0) { + $translatedItem = $this->localizationRepository->getRecordTranslation($this->table, (int)($item['uid'] ?? 0), (int)$languageId); + if (is_array($translatedItem) && !empty($translatedItem)) { $item = array_shift($translatedItem); + //$translation = $translations[0]; } } @@ -235,10 +239,6 @@ public function cleanupWorkspacesAfterFinalizing(): void ->executeStatement(); } - /** - * @param string $table - * @return QueryBuilder - */ public function getQueryBuilder(string $table = 'tt_content'): QueryBuilder { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) @@ -257,3 +257,4 @@ public function getConnection(): Connection ->getConnectionForTable($this->table); } } + diff --git a/Classes/PageLayoutView/ShortcutPreviewRenderer.php b/Classes/PageLayoutView/ShortcutPreviewRenderer.php index 9d88ef06..02eebd00 100644 --- a/Classes/PageLayoutView/ShortcutPreviewRenderer.php +++ b/Classes/PageLayoutView/ShortcutPreviewRenderer.php @@ -103,7 +103,7 @@ public function renderPageModulePreviewContent(GridColumnItem $gridColumnItem): foreach ($shortCutRenderItems as $shortcutRecord) { $shortcutItem = GeneralUtility::makeInstance( GridColumnItem::class, - $gridColumnItem->getContext(), + $gridColumnItem->getContext(), // false positive of #102621 in Extension Scanner $gridColumnItem->getColumn(), $shortcutRecord ); diff --git a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php index 0fc666c7..9705dd3a 100644 --- a/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php +++ b/Tests/Extensions/test_sitepackage/Classes/Controller/IrreController.php @@ -25,7 +25,7 @@ public function indexAction(): ResponseInterface { // $pageId = $this->request->getAttributes()['routing']->getPageId(); $cObj = $this->request->getAttribute('currentContentObject'); - $data = $cObj->data; + $data = $cObj->data; // false positive of #101995 in Extension Scanner $currentRecord = $this->irreRepository->findByUid((int)$data['uid']); $childRecords = $this->irreRepository->getChildRecords((int)$data['uid']); $this->view->assign('data', $data); @@ -37,7 +37,7 @@ public function showAction(): ResponseInterface { // $pageId = $this->request->getAttributes()['routing']->getPageId(); $cObj = $this->request->getAttribute('currentContentObject'); - $data = $cObj->data; + $data = $cObj->data; // false positive of #101995 in Extension Scanner $currentRecord = $this->irreRepository->findByUid((int)$data['uid']); $childRecords = $this->irreRepository->getChildRecords((int)$data['uid']); $this->view->assign('data', $data); @@ -49,7 +49,7 @@ public function listAction(): ResponseInterface { // $pageId = $this->request->getAttributes()['routing']->getPageId(); $cObj = $this->request->getAttribute('currentContentObject'); - $data = $cObj->data; + $data = $cObj->data; // false positive of #101995 in Extension Scanner $currentRecord = $this->irreRepository->findByUid((int)$data['uid']); $childRecords = $this->irreRepository->getChildRecords((int)$data['uid']); $this->view->assign('data', $data); diff --git a/Tests/Functional/VersionSpecificCompatibilityTest.php b/Tests/Functional/VersionSpecificCompatibilityTest.php index 5ea0d98f..a6fe23bc 100644 --- a/Tests/Functional/VersionSpecificCompatibilityTest.php +++ b/Tests/Functional/VersionSpecificCompatibilityTest.php @@ -129,7 +129,7 @@ public function contextMenuItemProviderWorksInCurrentVersion(): void $majorVersion = $this->typo3Version->getMajorVersion(); // Test that priority method returns expected type - $priority = $provider->getPriority(); + $priority = $provider->getPriority(); // false positive of #94107, #100963 in Extension Scanner self::assertGreaterThan(0, $priority); } diff --git a/Tests/Unit/DeprecatedApiDetectionTest.php b/Tests/Unit/DeprecatedApiDetectionTest.php index d5fe2f45..9640c800 100644 --- a/Tests/Unit/DeprecatedApiDetectionTest.php +++ b/Tests/Unit/DeprecatedApiDetectionTest.php @@ -139,7 +139,7 @@ public function extensionDoesNotUseRemovedConstants(): void { $extensionFiles = $this->getExtensionPhpFiles(); $removedConstants = [ - 'TYPO3_MODE', // Removed in TYPO3 v11 + 'TYPO3_MODE', // Removed in TYPO3 v11 // false positive of #92947, #96107 in Extension Scanner 'TYPO3_version', // Use Typo3Version class instead 'TYPO3_branch', // Use Typo3Version class instead ]; From fb26975b2ad7022e9658255e34e1e4dc4e86b8cf Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 20:17:12 +0700 Subject: [PATCH 24/28] [TASK] add static variable for LocalizationRepository in TtContentRepository ... to avoid deprecation notice in TYPO3 and CI pipeline --- Classes/Domain/Repository/TtContentRepository.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Classes/Domain/Repository/TtContentRepository.php b/Classes/Domain/Repository/TtContentRepository.php index 6d497d42..261ec88b 100644 --- a/Classes/Domain/Repository/TtContentRepository.php +++ b/Classes/Domain/Repository/TtContentRepository.php @@ -53,6 +53,7 @@ class TtContentRepository implements SingletonInterface protected bool $showHidden = true; protected BackendHelper $backendHelper; protected string $table = 'tt_content'; + protected LocalizationRepository $localizationRepository; public function __construct() { From 3e8582cba3b29e10d2e4f8ce83dddd5f843d65a0 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 20:21:54 +0700 Subject: [PATCH 25/28] [TASK] remove linebreak from TtContentRepository for php-cs-fixer --- Classes/Domain/Repository/TtContentRepository.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Classes/Domain/Repository/TtContentRepository.php b/Classes/Domain/Repository/TtContentRepository.php index 261ec88b..38149c18 100644 --- a/Classes/Domain/Repository/TtContentRepository.php +++ b/Classes/Domain/Repository/TtContentRepository.php @@ -258,4 +258,3 @@ public function getConnection(): Connection ->getConnectionForTable($this->table); } } - From 35376e5a86fb429e2ae5f7117f0f495d7cee255e Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 20:26:49 +0700 Subject: [PATCH 26/28] [TASK] fix changed variable name in annotations of TtContentRepository --- Classes/Domain/Repository/TtContentRepository.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Classes/Domain/Repository/TtContentRepository.php b/Classes/Domain/Repository/TtContentRepository.php index 38149c18..34559746 100644 --- a/Classes/Domain/Repository/TtContentRepository.php +++ b/Classes/Domain/Repository/TtContentRepository.php @@ -72,7 +72,7 @@ public function __construct() * @param string $shortcutItem The single page to be used as the tree root * @param-out array $collectedItems The collected item data rows ordered by parent position, column position and sorting * @param int $parentUid uid of the referencing tt_content record - * @param int $language sys_language_uid of the referencing tt_content record + * @param int $languageId sys_language_uid of the referencing tt_content record * @param int $recursive The number of levels for the recursion * @throws DBALException */ @@ -141,7 +141,7 @@ public function collectContentDataFromPages( * @param string $shortcutItem The tt_content element to fetch the data fromom * @param-out array $collectedItems The collected item data row * @param int $parentUid uid of the referencing tt_content record - * @param int $language sys_language_uid of the referencing tt_content record + * @param int $languageId sys_language_uid of the referencing tt_content record * @throws DBALException */ public function collectContentData( From 7898c65edd239daa7e535ea7721926a0103e50e8 Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 20:33:31 +0700 Subject: [PATCH 27/28] [TASK] remove 'dead' code from TtContentRepository The code would evaluate always to false. --- Classes/Domain/Repository/TtContentRepository.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Classes/Domain/Repository/TtContentRepository.php b/Classes/Domain/Repository/TtContentRepository.php index 34559746..2ddb7a78 100644 --- a/Classes/Domain/Repository/TtContentRepository.php +++ b/Classes/Domain/Repository/TtContentRepository.php @@ -118,10 +118,6 @@ public function collectContentDataFromPages( while ($item = $result->fetchAssociative()) { if (!empty($this->extensionConfiguration['overlayShortcutTranslation']) && (int)$languageId > 0) { $translatedItem = $this->localizationRepository->getRecordTranslation($this->table, (int)($item['uid'] ?? 0), (int)$languageId); - if (is_array($translatedItem) && !empty($translatedItem)) { - $item = array_shift($translatedItem); - //$translation = $translations[0]; - } } if ($this->backendHelper->getBackendUser()->workspace > 0) { unset($item['inSet']); @@ -173,10 +169,6 @@ public function collectContentData( ->fetchAssociative(); if (!empty($this->extensionConfiguration['overlayShortcutTranslation']) && (int)$languageId > 0) { $translatedItem = $this->localizationRepository->getRecordTranslation($this->table, (int)($item['uid'] ?? 0), (int)$languageId); - if (is_array($translatedItem) && !empty($translatedItem)) { - $item = array_shift($translatedItem); - //$translation = $translations[0]; - } } if ($this->backendHelper->getBackendUser()->workspace > 0) { From 858d73e11cddbbf3e17aa3ee4827fd5e4c5fa44c Mon Sep 17 00:00:00 2001 From: David Bruchmann Date: Sat, 29 Aug 2026 20:50:54 +0700 Subject: [PATCH 28/28] [TASK] update README concerning branches and releases --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d7e3ec7b..a4d4eafc 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,8 @@ Paste reference uses [**semantic versioning**][5], which means, that #### 4.3.1 Releases -* for TYPO3 v13: [4.0.3](https://github.com/Kephson/paste_reference/releases/tag/4.0.3) +* for TYPO3 v14: [5.0.0](https://github.com/Kephson/paste_reference/releases/tag/5.0.0) +* for TYPO3 v13: [4.0.5](https://github.com/Kephson/paste_reference/releases/tag/4.0.5) * for TYPO3 v12: [3.0.5](https://github.com/Kephson/paste_reference/releases/tag/3.0.5) * for TYPO3 v11: [2.0.5](https://github.com/Kephson/paste_reference/releases/tag/2.0.5) * for TYPO3 v10: [1.0.3](https://github.com/Kephson/paste_reference/releases/tag/1.0.3) @@ -76,21 +77,23 @@ Paste reference uses [**semantic versioning**][5], which means, that To get the most recent development for the branch 4, consider installing the branch instead of the release. The branch [v4-dev](https://github.com/Kephson/paste_reference/tree/v4-dev) supports also -TYPO3 v14 up to v14.1 and includes unreleased bug-fixes. +TYPO3 v14 up to v14.1 and includes unreleased bug-fixes. +The sub-versions above might not be always the newest, so please check the +[RELEASES](https://github.com/Kephson/paste_reference/releases) instead of relying on the list above. #### 4.3.2 Branches The following branches are of interest: -* for TYPO3 v13 and v14: [v4-dev](https://github.com/Kephson/paste_reference/tree/v4-dev) +* for TYPO3 v14: [v5-dev](https://github.com/Kephson/paste_reference/tree/v5-dev) +* for TYPO3 v13: [v4-dev](https://github.com/Kephson/paste_reference/tree/v4-dev) + for TYPO3 v12: [TYPO3_12](https://github.com/Kephson/paste_reference/tree/TYPO3_12) * for TYPO3 v11: [TYPO3_11-5](https://github.com/Kephson/paste_reference/tree/TYPO3_11-5) * for TYPO3 v10: [TYPO3_10-4](https://github.com/Kephson/paste_reference/tree/TYPO3_10-4) Note, that releases are usually to prefer, if possible. -The branch [v4-dev](https://github.com/Kephson/paste_reference/tree/v4-dev) is -ahead of the releases currently, so in this case using the branch is better and -gives you most recent development changes. +If it's advisable to install a branch instead of a release, according info can be found in +the issues of the repository. ### 4.4 Contribution