From 96a353041433bf7d4f788299ba167a64181b46ef Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:31:42 +0100 Subject: [PATCH 1/9] fix: replace legacy /etc/issue with /etc/os-release Signed-off-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- bin/ncp-diag | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/ncp-diag b/bin/ncp-diag index 3ee634d86..16cbbd0ab 100644 --- a/bin/ncp-diag +++ b/bin/ncp-diag @@ -15,7 +15,12 @@ source /usr/local/etc/library.sh # Distro, NCP version and tag echo "NextcloudPi version|$( cat /usr/local/etc/ncp-version )" [[ -f /usr/local/etc/ncp-baseimage ]] && echo "NextcloudPi image|$( cat /usr/local/etc/ncp-baseimage )" -echo "OS|$(sed 's| \\n \\l||' /etc/issue). $(uname -r) ($(uname -m))" +if [[ -r /etc/os-release ]]; then + . /etc/os-release + echo "OS|$PRETTY_NAME. $(uname -r) ($(uname -m))" +else + echo "OS|unknown. $(uname -r) ($(uname -m))" +fi # Data DATADIR="$( grep datadirectory /var/www/nextcloud/config/config.php | From 62ce5cc7f81f5f0e8d405c5e446ac3eaf06fdcdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Kn=C3=B6ppler?= <6317548+theCalcaholic@users.noreply.github.com> Date: Fri, 3 Apr 2026 19:02:02 +0200 Subject: [PATCH 2/9] Add support for NC 33 + fixes (#2100) * Add support for NC 33 + Set supported NC version to 33.0.2 + nextcloud_tests.py: Ignore warning about missing 2fa enforcement + 1.57.0.sh: Configure NC serverid + 1.57.0.sh, lamp.sh: Install php-apcu * Pipeline fixes/changes + vm-tests.yml: Fix invalid htz server type + nextcloud_tests.py: Fix error filter for NC 33 + build-lxd.yml, build-sd-images.yml: Run apt-get update before installing packages + vm-tests.yml: Disable dist-upgrade-test and enable update-test * Preview improvements + Remove custom fork of previewgenerator app + nc-previews.sh, 1.57.0.sh: Run preview generation in background, avoid running migration to new preview setup more than once + 1.57.0.sh: Remove old nc-preview-auto cronjob * nextcloud.conf.sh: Respect trusted proxies in apache config. --- .../actions/create-test-instance/action.yml | 2 +- .github/workflows/build-lxd.yml | 18 +- .github/workflows/build-sd-images.yml | 2 + .github/workflows/vm-tests.yml | 695 +++++++------ bin/ncp-update-nc.d/update-nc.sh | 7 +- bin/ncp/CONFIG/nc-init.sh | 20 +- bin/ncp/CONFIG/nc-previews-auto.sh | 51 +- bin/ncp/NETWORKING/nc-trusted-proxies.sh | 12 + bin/ncp/TOOLS/nc-previews.sh | 116 ++- build/docker/Dockerfile | 222 ---- build/docker/debian-ncp/run-parts.sh | 93 -- build/docker/docker-compose-ncpdev.yml | 18 - build/docker/docker-compose.yml | 22 - build/docker/lamp/010lamp | 48 - build/docker/nextcloud/020nextcloud | 85 -- build/docker/nextcloudpi/000ncp | 39 - etc/library.sh | 4 +- etc/ncp-config.d/nc-nextcloud.cfg | 2 +- .../cron.hourly/ncp-previewgenerator | 28 + etc/ncp-templates/nextcloud.conf.sh | 21 + etc/ncp.cfg | 2 +- lamp.sh | 3 +- ncp-app/appinfo/info.xml | 2 +- ncp-app/package-lock.json | 955 +++--------------- .../ncp-previewgenerator-nc20/.travis.yml | 45 - .../ncp-previewgenerator-nc20/CHANGELOG.md | 82 -- .../ncp-previewgenerator-nc20/LICENSE | 661 ------------ .../ncp-previewgenerator-nc20/Makefile | 36 - .../ncp-previewgenerator-nc20/README.md | 96 -- .../ncp-previewgenerator-nc20/appinfo/app.php | 23 - .../appinfo/info.xml | 35 - .../composer/autoload.php | 7 - .../composer/composer.json | 13 - .../composer/composer/ClassLoader.php | 445 -------- .../composer/composer/LICENSE | 21 - .../composer/composer/autoload_classmap.php | 18 - .../composer/composer/autoload_namespaces.php | 9 - .../composer/composer/autoload_psr4.php | 10 - .../composer/composer/autoload_real.php | 43 - .../composer/composer/autoload_static.php | 44 - .../composer/composer/installed.json | 1 - .../lib/AppInfo/Application.php | 52 - .../lib/Command/DeleteOld.php | 97 -- .../lib/Command/Generate.php | 250 ----- .../lib/Command/PreGenerate.php | 221 ---- .../lib/Command/TimestampFormatter.php | 120 --- .../Version020000Date20180823071939.php | 62 -- .../Version020200Date20190608205303.php | 53 - .../lib/SizeHelper.php | 101 -- .../ncp-previewgenerator-nc20/lib/Watcher.php | 77 -- .../tests/WatcherTest.php | 98 -- .../tests/bootstrap.php | 30 - .../tests/phpunit.xml | 24 - .../.github/workflows/lint.yml | 54 - .../.nextcloudignore | 19 - .../ncp-previewgenerator-nc21/.php_cs.dist | 17 - .../ncp-previewgenerator-nc21/CHANGELOG.md | 111 -- .../ncp-previewgenerator-nc21/LICENSE | 661 ------------ .../ncp-previewgenerator-nc21/README.md | 96 -- .../appinfo/info.xml | 36 - .../ncp-previewgenerator-nc21/composer.json | 18 - .../ncp-previewgenerator-nc21/krankerl.toml | 3 - .../lib/AppInfo/Application.php | 47 - .../lib/Command/DeleteOld.php | 96 -- .../lib/Command/Generate.php | 256 ----- .../lib/Command/PreGenerate.php | 219 ---- .../lib/Command/TimestampFormatter.php | 120 --- .../lib/Listeners/PostWriteListener.php | 85 -- .../Version020000Date20180823071939.php | 63 -- .../Version020200Date20190608205303.php | 53 - .../lib/SizeHelper.php | 101 -- .../tests/WatcherTest.php | 98 -- .../tests/bootstrap.php | 30 - .../tests/phpunit.xml | 24 - tests/nextcloud_tests.py | 7 +- update.sh | 5 - updates/1.13.6.sh | 14 +- updates/1.20.0.sh | 16 +- updates/1.57.0.sh | 43 + 79 files changed, 779 insertions(+), 6754 deletions(-) delete mode 100644 build/docker/Dockerfile delete mode 100755 build/docker/debian-ncp/run-parts.sh delete mode 100644 build/docker/docker-compose-ncpdev.yml delete mode 100644 build/docker/docker-compose.yml delete mode 100755 build/docker/lamp/010lamp delete mode 100755 build/docker/nextcloud/020nextcloud delete mode 100755 build/docker/nextcloudpi/000ncp create mode 100644 etc/ncp-templates/cron.hourly/ncp-previewgenerator delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/.travis.yml delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/CHANGELOG.md delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/LICENSE delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/Makefile delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/README.md delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/app.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/info.xml delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/autoload.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer.json delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/ClassLoader.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/LICENSE delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_classmap.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_namespaces.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_psr4.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_real.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_static.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/installed.json delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/AppInfo/Application.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/DeleteOld.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/Generate.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/PreGenerate.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/TimestampFormatter.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020000Date20180823071939.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020200Date20190608205303.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/SizeHelper.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Watcher.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/tests/WatcherTest.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/tests/bootstrap.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc20/tests/phpunit.xml delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/.github/workflows/lint.yml delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/.nextcloudignore delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/.php_cs.dist delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/CHANGELOG.md delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/LICENSE delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/README.md delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/appinfo/info.xml delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/composer.json delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/krankerl.toml delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/AppInfo/Application.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/DeleteOld.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/Generate.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/PreGenerate.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/TimestampFormatter.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Listeners/PostWriteListener.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020000Date20180823071939.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020200Date20190608205303.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/lib/SizeHelper.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/tests/WatcherTest.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/tests/bootstrap.php delete mode 100644 ncp-previewgenerator/ncp-previewgenerator-nc21/tests/phpunit.xml create mode 100644 updates/1.57.0.sh diff --git a/.github/actions/create-test-instance/action.yml b/.github/actions/create-test-instance/action.yml index 26b1a7303..ed9ac771d 100644 --- a/.github/actions/create-test-instance/action.yml +++ b/.github/actions/create-test-instance/action.yml @@ -13,7 +13,7 @@ inputs: server_type: description: Server type to use for hetzner servers required: true - default: "cx22" + default: "cx23" outputs: server_address: diff --git a/.github/workflows/build-lxd.yml b/.github/workflows/build-lxd.yml index 971cd2887..5e0d9dce8 100644 --- a/.github/workflows/build-lxd.yml +++ b/.github/workflows/build-lxd.yml @@ -73,6 +73,7 @@ jobs: - name: Setup incus if: ${{ needs.determine-runner.outputs.runner_label != 'ubuntu-20.04-arm64' }} run: | + sudo apt-get update sudo apt-get install -y incus qemu-system incus-tools sudo iptables -I DOCKER-USER -i incusbr0 -j ACCEPT sudo iptables -I DOCKER-USER -o incusbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT @@ -356,6 +357,7 @@ jobs: - name: Setup incus if: ${{ needs.determine-runner.outputs.runner_label != 'ubuntu-20.04-arm64' }} run: | + sudo apt-get update sudo apt-get install -y incus qemu-system incus-tools sudo iptables -I DOCKER-USER -i incusbr0 -j ACCEPT sudo iptables -I DOCKER-USER -o incusbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT @@ -372,7 +374,6 @@ jobs: - name: Setup Firefox from packages if: ${{ runner.arch == 'ARM64' || steps.setup-firefox-browser-action.outcome == 'failure' }} run: | - sudo apt-get update sudo apt-get install -y --no-install-recommends firefox - name: Setup GeckoDriver env: @@ -432,7 +433,7 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true exit 1 } ../.venv/bin/python nextcloud_tests.py --skip-release-check --no-gui "nextcloudpi.local" 443 4443 || { @@ -441,7 +442,7 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " datadir="$(sudo "$LXC" exec ncp -- ncc config:system:get datadirectory)" @@ -451,7 +452,7 @@ jobs: USE_INCUS="$USE_INCUS" ../.venv/bin/python system_tests.py --non-interactive --skip-update-test || { echo "System test failed!" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " datadir="$(sudo "$LXC" exec ncp -- ncc config:system:get datadirectory)" @@ -520,7 +521,7 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " datadir="$(sudo "$LXC" exec ncp -- ncc config:system:get datadirectory)" @@ -603,7 +604,7 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " datadir="$(sudo "$LXC" exec ncp -- ncc config:system:get datadirectory)" @@ -636,6 +637,7 @@ jobs: - name: Setup incus if: ${{ needs.determine-runner.outputs.runner_label != 'ubuntu-20.04-arm64' }} run: | + sudo apt-get update sudo apt-get install -y incus qemu-system incus-tools sudo iptables -I DOCKER-USER -i incusbr0 -j ACCEPT sudo iptables -I DOCKER-USER -o incusbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT @@ -711,7 +713,7 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" @@ -724,7 +726,7 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - sudo "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + sudo "$LXC" exec ncp -- bash -c "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " datadir="$(sudo "$LXC" exec ncp -- ncc config:system:get datadirectory)" diff --git a/.github/workflows/build-sd-images.yml b/.github/workflows/build-sd-images.yml index 61770a0ed..9f8356d70 100644 --- a/.github/workflows/build-sd-images.yml +++ b/.github/workflows/build-sd-images.yml @@ -155,12 +155,14 @@ jobs: run: | set -ex mkdir -p output + sudo apt-get update sudo apt-get install -y pv wget -nv "${{ inputs.test_image_url }}" -O - | pv -n --bytes --rate --timer -i 3 > "output/${ARTIFACT_FILE?}" - name: Prepare test run: | set -x mv "output/${ARTIFACT_FILE?}" ncp.img + sudo apt-get update sudo apt-get install -y systemd-container python3 -m venv ./.venv . ./.venv/bin/activate diff --git a/.github/workflows/vm-tests.yml b/.github/workflows/vm-tests.yml index 09e1121d0..667e359ae 100644 --- a/.github/workflows/vm-tests.yml +++ b/.github/workflows/vm-tests.yml @@ -25,6 +25,7 @@ jobs: env: HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" UID: "${{ github.run_id }}-install" + SERVER_TYPE: "cx23" outputs: server_address: ${{ steps.create-test-instance.outputs.server_address }} snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }} @@ -64,7 +65,7 @@ jobs: version: ${{ env.VERSION }} uid: "${{ env.UID }}" hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} - server_type: "cx22" + server_type: "cx23" - name: set instance variables run: | echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV" @@ -103,79 +104,240 @@ jobs: } echo "test_result=success" >> "$GITHUB_OUTPUT"; -# update-test: + update-test: + runs-on: ubuntu-latest + container: + image: thecalcaholic/ncp-test-automation:bookworm + env: + HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" + UID: "${{ github.run_id }}-update" + SERVER_TYPE: "cx23" + defaults: + run: + shell: bash + outputs: + server_address: ${{ steps.create-test-instance.outputs.server_address }} + snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }} + test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }} + previous_version: ${{ steps.find-version.outputs.previous_version }} + version: ${{ env.VERSION }} + test_result: ${{ steps.final_test.outputs.test_result }} + ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }} + env: + VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" + HOME: /root + SSH_ARTIFACT_NAME: "${{ github.run_id }}-update-ssh" + UID: "${{ github.run_id }}-update" + steps: + - uses: actions/checkout@v3 + with: + path: /__w/nextcloudpi/nextcloudpi + fetch-depth: 99 + - name: find reference version + working-directory: /__w/nextcloudpi/nextcloudpi + shell: bash + id: find-version + run: | + chown -R "$(id -u):$(id -g)" . + set -e + if [[ -n "${{ github.base_ref }}" ]] + then + version="${{ github.base_ref }}" + elif [[ "${{ github.ref }}" == "refs/heads/devel" ]] + then + version="master" + else + git fetch -fu --tags origin ${{ github.ref }}:${{ github.ref }} + version="$(git describe --tags)" + [[ "$version" =~ .*-.*-.* ]] || { + git checkout HEAD~1 + version="$(git describe --tags)" + } + version="${version%-*-*}" + fi + echo "Previous version is '$version'" + #TODO: Revert to dynamically found version + echo "PREVIOUS_VERSION=${version}" >> "$GITHUB_ENV" +# echo "PREVIOUS_VERSION=v1.53.3" >> "$GITHUB_ENV" + - name: Generate ssh key + run: | + set -x + mkdir -p /__w/nextcloudpi/nextcloudpi/.ssh + ssh-keygen -t ed25519 -f "/__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key" + . /ncp-test-automation/bin/entrypoint.sh + - name: upload ssh private key to artifact store + uses: actions/upload-artifact@v4 + with: + name: "${{ env.SSH_ARTIFACT_NAME }}" + path: /__w/nextcloudpi/nextcloudpi/.ssh + if-no-files-found: error + include-hidden-files: true + - id: create-test-instance + uses: ./.github/actions/create-test-instance + with: + version: "${{ env.PREVIOUS_VERSION }}" + uid: "${{ env.UID }}" + hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} + server_type: "cx23" + - name: Set instance variables + run: | + echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV" + echo "SNAPSHOT_ID=${{ steps.create-test-instance.outputs.snapshot_id }}" >> "$GITHUB_ENV" + - name: Activate and Test postinstall VM + working-directory: /ncp-test-automation/bin + run: | + set -e + echo "Setup ssh" + chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key + eval "$(ssh-agent)" + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key + + source ./library.sh + + trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 + + setup-ssh-port-forwarding "$SERVER_ADDRESS" + + echo "Run integration tests" + ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg + test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" --nc-test-args "--skip-release-check" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { + + echo "Integration tests failed" + echo "Here are the last lines of ncp-install.log:" + echo "===========================================" + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; + echo "===========================================" + echo "and ncp.log:" + echo "===========================================" + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; + echo "===========================================" + exit 1 + } + - name: perform update + working-directory: /ncp-test-automation/bin + shell: bash + run: | + set -ex + apk add jq + + echo "Setup ssh" + chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key + eval "$(ssh-agent)" + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key + + source ./library.sh + + echo "Updating from $PREVIOUS_VERSION to $VERSION" + ssh-keygen -f "$HOME/.ssh/known_hosts" -R "${SERVER_ADDRESS}" 2> /dev/null || true + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "DBG=x ncp-update '$VERSION'" + echo "Updating Nextcloud" + + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncc status" | grep "version:" | awk '{ print $3 }' + latest_nc_version="$(cat /__w/nextcloudpi/nextcloudpi/etc/ncp.cfg | jq -r '.nextcloud_version')" + + for i in {1..10}; + do + echo "running nc update $i/10..." + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "DBG=x ncp-update-nc ${latest_nc_version?}" + + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" /usr/local/bin/ncc status + current_nc_version_new="$(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncc status" | grep "version:" | awk '{ print $3 }')" + if [[ "$current_nc_version_new" =~ "$latest_nc_version".* ]] + then + break + fi + if [[ "$current_nc_version" == "$current_nc_version_new" ]] + then + echo "failed to update to $latest_nc_version" + exit 1 + fi + current_nc_version="$current_nc_version_new" + done + - name: Run integration tests after update + id: final_test + working-directory: /ncp-test-automation/bin + run: | + set -e + + echo "Setup ssh" + eval "$(ssh-agent)" + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key + + source ./library.sh + + trap '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 + + echo "Run integration tests" + setup-ssh-port-forwarding "$SERVER_ADDRESS" + NC_TEST_ARGS=() + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep VERSION_ID=12 || NC_TEST_ARGS+=("--skip-release-check") + set -x + test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --nc-test-args "$NC_TEST_ARGS" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { + + echo "Integration tests failed" + echo "Here are the last lines of ncp-install.log:" + echo "===========================================" + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; + echo "===========================================" + echo "and ncp.log:" + echo "===========================================" + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; + echo "===========================================" + exit 1 + } + + echo "test_result=success" >> "$GITHUB_OUTPUT"; + +# dist-upgrade-test: # runs-on: ubuntu-latest # container: # image: thecalcaholic/ncp-test-automation:bullseye # env: # HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" -# UID: "${{ github.run_id }}-update" +# UID: "${{ github.run_id }}-distupgrade" # defaults: # run: # shell: bash # outputs: +# test_result: ${{ steps.final_test.outputs.test_result }} +# ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }} # server_address: ${{ steps.create-test-instance.outputs.server_address }} # snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }} # test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }} -# previous_version: ${{ steps.find-version.outputs.previous_version }} +# previous_version: ${{ env.PREVIOUS_VERSION }} # version: ${{ env.VERSION }} -# test_result: ${{ steps.final_test.outputs.test_result }} -# ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }} # env: +# PREVIOUS_VERSION: "v1.53.3" # VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" # HOME: /root -# SSH_ARTIFACT_NAME: "${{ github.run_id }}-update-ssh" -# UID: "${{ github.run_id }}-update" +# SSH_ARTIFACT_NAME: "${{ github.run_id }}-distupgrade-ssh" +# UID: "${{ github.run_id }}-distupgrade" # steps: # - uses: actions/checkout@v3 # with: # fetch-depth: 0 # path: /__w/nextcloudpi/nextcloudpi -# - name: find reference version -# working-directory: /__w/nextcloudpi/nextcloudpi -# shell: bash -# id: find-version -# run: | -# chown -R "$(id -u):$(id -g)" . -# set -e -# if [[ -n "${{ github.base_ref }}" ]] -# then -# version="${{ github.base_ref }}" -# elif [[ "${{ github.ref }}" == "refs/heads/devel" ]] -# then -# version="master" -# else -# git fetch -fu --tags origin ${{ github.ref }}:${{ github.ref }} -# version="$(git describe --tags)" -# [[ "$version" =~ .*-.*-.* ]] || { -# git checkout HEAD~1 -# version="$(git describe --tags)" -# } -# version="${version%-*-*}" -# fi -# echo "Previous version is '$version'" -# #TODO: Revert to dynamically found version -# #echo "PREVIOUS_VERSION=${version}" >> "$GITHUB_ENV" -# echo "PREVIOUS_VERSION=v1.53.3" >> "$GITHUB_ENV" # - name: Generate ssh key # run: | # set -x +# chown -R "$(id -u):$(id -g)" /__w/nextcloudpi/nextcloudpi # mkdir -p /__w/nextcloudpi/nextcloudpi/.ssh # ssh-keygen -t ed25519 -f "/__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key" # . /ncp-test-automation/bin/entrypoint.sh # - name: upload ssh private key to artifact store -# uses: actions/upload-artifact@v3 +# uses: actions/upload-artifact@v4 # with: # name: "${{ env.SSH_ARTIFACT_NAME }}" # path: /__w/nextcloudpi/nextcloudpi/.ssh # if-no-files-found: error +# include-hidden-files: true # - id: create-test-instance # uses: ./.github/actions/create-test-instance-bullseye # with: # version: "${{ env.PREVIOUS_VERSION }}" # uid: "${{ env.UID }}" # hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} -# server_type: "cx11" +# server_type: "cx23" # - name: Set instance variables # run: | # echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV" @@ -202,7 +364,7 @@ jobs: # # echo "Run integration tests" # ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg -# test-ncp-instance -a -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" --nc-test-args "--skip-release-check" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { +# test-ncp-instance -a -f "$SNAPSHOT_ID" -b "v1.54.3" --systemtest-args "--skip-update-test" --nc-test-args "--skip-release-check" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { # # echo "Integration tests failed" # echo "Here are the last lines of ncp-install.log:" @@ -231,7 +393,6 @@ jobs: # ssh-keygen -f "$HOME/.ssh/known_hosts" -R "${SERVER_ADDRESS}" 2> /dev/null || true # ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncp-update '$VERSION'" # - name: Run integration tests after update -# id: final_test # working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin # run: | # set -e @@ -242,14 +403,14 @@ jobs: # # source ./library.sh # -# trap '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 +# trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 # # echo "Run integration tests" # setup-ssh-port-forwarding "$SERVER_ADDRESS" # NC_TEST_ARGS=() # ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep VERSION_ID=12 || NC_TEST_ARGS+=("--skip-release-check") # set -x -# test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --nc-test-args "$NC_TEST_ARGS" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { +# test-ncp-instance -f "$SNAPSHOT_ID" -b "v1.54.3" --nc-test-args "$NC_TEST_ARGS" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { # # echo "Integration tests failed" # echo "Here are the last lines of ncp-install.log:" @@ -263,241 +424,156 @@ jobs: # exit 1 # } # -# echo "test_result=success" >> "$GITHUB_OUTPUT"; +# - name: NCP distupgrade +# id: distupgrade +# working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin +# run: | +# set -e +# +# echo "Setup ssh" +# eval "$(ssh-agent)" +# ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key +# +# source ./library.sh +# +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep 'VERSION_ID="11"' || { +# echo "Can't upgrade from Debian $(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" grep 'VERSION_ID=' /etc/os-release)" +# echo "skipped=yes" | tee -a $GITHUB_OUTPUT +# exit 1 +# } +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" DEBIAN_FRONTEND=noninteractive ncp-dist-upgrade +# echo "skipped=no" | tee -a $GITHUB_OUTPUT +# - name: Update Nextcloud +# working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin +# run: | +# set -ex +# apk add jq +# +# echo "Setup ssh" +# eval "$(ssh-agent)" +# ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key +# +# source ./library.sh +# +# current_nc_version="$(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncc status" | grep "version:" | awk '{ print $3 }')" +# latest_nc_version="$(cat ../../etc/ncp.cfg | jq -r '.nextcloud_version')" +# +# if [[ "$current_nc_version" =~ "$latest_nc_version".* ]] +# then +# echo "Nextcloud is up to date - skipping NC update test." +# else +# for i in {1..10}; +# do +# echo "running nc update ($i/10)..." +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "bash -c 'DBG=x ncp-update-nc ${latest_nc_version?}'" +# +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" /usr/local/bin/ncc status +# +# current_nc_version_new="$(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncc status" | grep "version:" | awk '{ print $3 }')" +# if [[ "$current_nc_version_new" =~ "$latest_nc_version".* ]] +# then +# break +# fi +# if [[ "$current_nc_version" == "$current_nc_version_new" ]] +# then +# echo "failed to update to $latest_nc_version" +# exit 1 +# fi +# current_nc_version="$current_nc_version_new" +# done +# fi +# +# - name: Run integration tests after dist-upgrade +# id: final_test +# working-directory: /ncp-test-automation/bin +# run: | +# set -e +# +# echo "Setup ssh" +# eval "$(ssh-agent)" +# ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key +# +# source ./library.sh +# +# trap '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 +# +# echo "Run integration tests" +# setup-ssh-port-forwarding "$SERVER_ADDRESS" +# +# test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { +# +# echo "Integration tests failed" +# echo "Here are the last lines of ncp-install.log:" +# echo "===========================================" +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; +# echo "===========================================" +# echo "ncp.log:" +# echo "===========================================" +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; +# echo "===========================================" +# echo "nextcloud.log:" +# ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /opt/ncdata/data/nextcloud.log; +# exit 1 +# } +# echo "test_result=success" >> "$GITHUB_OUTPUT" - dist-upgrade-test: + install-postactivation-snapshot: + if: ${{ always() }} + needs: + - installation-test runs-on: ubuntu-latest container: - image: thecalcaholic/ncp-test-automation:bullseye + image: thecalcaholic/ncp-test-automation:latest env: HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" - UID: "${{ github.run_id }}-distupgrade" - defaults: - run: - shell: bash - outputs: - test_result: ${{ steps.final_test.outputs.test_result }} - ssh_artifact_name: ${{ env.SSH_ARTIFACT_NAME }} - server_address: ${{ steps.create-test-instance.outputs.server_address }} - snapshot_id: ${{ steps.create-test-instance.outputs.snapshot_id }} - test_server_id: ${{ steps.create-test-instance.outputs.test_server_id }} - previous_version: ${{ env.PREVIOUS_VERSION }} - version: ${{ env.VERSION }} + env: - PREVIOUS_VERSION: "v1.53.3" - VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" - HOME: /root - SSH_ARTIFACT_NAME: "${{ github.run_id }}-distupgrade-ssh" - UID: "${{ github.run_id }}-distupgrade" + TEST_TYPE: install + SERVER_ADDRESS: ${{ needs.installation-test.outputs.server_address }} + TEST_RESULT: ${{ needs.installation-test.test_result }} + TEST_SERVER_ID: ${{ needs.installation-test.outputs.test_server_id }} + VERSION: ${{ needs.installation-test.outputs.version }} + SSH_ARTIFACT_NAME: "${{ needs.installation-test.outputs.ssh_artifact_name }}" + UID: ${{ github.run_id }}-install steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - path: /__w/nextcloudpi/nextcloudpi - - name: Generate ssh key - run: | - set -x - chown -R "$(id -u):$(id -g)" /__w/nextcloudpi/nextcloudpi - mkdir -p /__w/nextcloudpi/nextcloudpi/.ssh - ssh-keygen -t ed25519 -f "/__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key" - . /ncp-test-automation/bin/entrypoint.sh - - name: upload ssh private key to artifact store - uses: actions/upload-artifact@v4 - with: - name: "${{ env.SSH_ARTIFACT_NAME }}" - path: /__w/nextcloudpi/nextcloudpi/.ssh - if-no-files-found: error - include-hidden-files: true - - id: create-test-instance - uses: ./.github/actions/create-test-instance-bullseye - with: - version: "${{ env.PREVIOUS_VERSION }}" - uid: "${{ env.UID }}" - hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} - server_type: "cx22" - - name: Set instance variables - run: | - echo "SERVER_ADDRESS=${{ steps.create-test-instance.outputs.server_address }}" >> "$GITHUB_ENV" - echo "SNAPSHOT_ID=${{ steps.create-test-instance.outputs.snapshot_id }}" >> "$GITHUB_ENV" - - uses: actions/checkout@v3 + - name: download ssh private key from artifact store + uses: actions/download-artifact@v4 + if: ${{ contains('success|failure', env.TEST_RESULT) }} with: - repository: 'theCalcaholic/ncp-test-automation' - ref: "bullseye" - path: /__w/nextcloudpi/nextcloudpi/ncp-test-automation - - name: Activate and Test postinstall VM - working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin - run: | - set -e - echo "Setup ssh" - chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - eval "$(ssh-agent)" - ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - - source ./library.sh - - trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 - - setup-ssh-port-forwarding "$SERVER_ADDRESS" - - echo "Run integration tests" - ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS}" cat /usr/local/etc/instance.cfg - test-ncp-instance -a -f "$SNAPSHOT_ID" -b "v1.54.3" --systemtest-args "--skip-update-test" --nc-test-args "--skip-release-check" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { - - echo "Integration tests failed" - echo "Here are the last lines of ncp-install.log:" - echo "===========================================" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; - echo "===========================================" - echo "and ncp.log:" - echo "===========================================" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; - echo "===========================================" - exit 1 - } - - name: perform update - working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin - run: | - set -e - - echo "Setup ssh" - chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - eval "$(ssh-agent)" - ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - - source ./library.sh - - echo "Updating from $PREVIOUS_VERSION to $VERSION" - ssh-keygen -f "$HOME/.ssh/known_hosts" -R "${SERVER_ADDRESS}" 2> /dev/null || true - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncp-update '$VERSION'" - - name: Run integration tests after update - working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin - run: | - set -e - - echo "Setup ssh" - eval "$(ssh-agent)" - ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - - source ./library.sh - - trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 - - echo "Run integration tests" - setup-ssh-port-forwarding "$SERVER_ADDRESS" - NC_TEST_ARGS=() - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep VERSION_ID=12 || NC_TEST_ARGS+=("--skip-release-check") - set -x - test-ncp-instance -f "$SNAPSHOT_ID" -b "v1.54.3" --nc-test-args "$NC_TEST_ARGS" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { - - echo "Integration tests failed" - echo "Here are the last lines of ncp-install.log:" - echo "===========================================" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; - echo "===========================================" - echo "and ncp.log:" - echo "===========================================" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; - echo "===========================================" - exit 1 - } - - - name: NCP distupgrade - id: distupgrade - working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin - run: | - set -e - - echo "Setup ssh" - eval "$(ssh-agent)" - ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - - source ./library.sh - - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" cat /etc/os-release | grep 'VERSION_ID="11"' || { - echo "Can't upgrade from Debian $(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" grep 'VERSION_ID=' /etc/os-release)" - echo "skipped=yes" | tee -a $GITHUB_OUTPUT - exit 1 - } - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" DEBIAN_FRONTEND=noninteractive ncp-dist-upgrade - echo "skipped=no" | tee -a $GITHUB_OUTPUT - - name: Update Nextcloud - working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin + name: ${{ env.SSH_ARTIFACT_NAME }} + path: /github/workspace/.ssh + - name: Shutdown server + if: ${{ contains('success|failure', env.TEST_RESULT) }} run: | - set -ex - apk add jq - - echo "Setup ssh" + chmod 0600 /github/workspace/.ssh/automation_ssh_key + export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)" + bash /ncp-test-automation/bin/entrypoint.sh eval "$(ssh-agent)" - ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - - source ./library.sh - - current_nc_version="$(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncc status" | grep "version:" | awk '{ print $3 }')" - latest_nc_version="$(cat ../../etc/ncp.cfg | jq -r '.nextcloud_version')" - - if [[ "$current_nc_version" =~ "$latest_nc_version".* ]] - then - echo "Nextcloud is up to date - skipping NC update test." - else - for i in {1..10}; - do - echo "running nc update ($i/10)..." - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "bash -c 'DBG=x ncp-update-nc ${latest_nc_version?}'" - - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" /usr/local/bin/ncc status + ssh-add /github/workspace/.ssh/automation_ssh_key - current_nc_version_new="$(ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" "ncc status" | grep "version:" | awk '{ print $3 }')" - if [[ "$current_nc_version_new" =~ "$latest_nc_version".* ]] - then - break - fi - if [[ "$current_nc_version" == "$current_nc_version_new" ]] - then - echo "failed to update to $latest_nc_version" - exit 1 - fi - current_nc_version="$current_nc_version_new" - done - fi - - - name: Run integration tests after dist-upgrade - id: final_test + ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <> "$GITHUB_OUTPUT"; terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 - - echo "Run integration tests" - setup-ssh-port-forwarding "$SERVER_ADDRESS" + set -x + echo "${TEST_SERVER_ID?}" - test-ncp-instance -f "$SNAPSHOT_ID" -b "${VERSION}" --systemtest-args "--skip-update-test" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { + . ./library.sh - echo "Integration tests failed" - echo "Here are the last lines of ncp-install.log:" - echo "===========================================" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; - echo "===========================================" - echo "ncp.log:" - echo "===========================================" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; - echo "===========================================" - echo "nextcloud.log:" - ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /opt/ncdata/data/nextcloud.log; - exit 1 - } - echo "test_result=success" >> "$GITHUB_OUTPUT" + tf-init "$TF_SNAPSHOT" + tf-apply "$TF_SNAPSHOT" "$TF_VAR_FILE" -var="branch=${VERSION?}" -var="snapshot_provider_id=${TEST_SERVER_ID?}" -var="snapshot_type=ncp-postactivation" -state="${TF_SNAPSHOT}/${VERSION//\//.}.postactivation.tfstate" + snapshot_id="$(tf-output "$TF_SNAPSHOT" -state="${TF_SNAPSHOT}/${VERSION//\//.}.postactivation.tfstate" snapshot_id)" + hcloud image add-label -o "$snapshot_id" "test-result=${TEST_RESULT?}" - install-postactivation-snapshot: + update-postactivation-snapshot: if: ${{ always() }} needs: - - installation-test + - update-test runs-on: ubuntu-latest container: image: thecalcaholic/ncp-test-automation:latest @@ -505,13 +581,13 @@ jobs: HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" env: - TEST_TYPE: install - SERVER_ADDRESS: ${{ needs.installation-test.outputs.server_address }} - TEST_RESULT: ${{ needs.installation-test.test_result }} - TEST_SERVER_ID: ${{ needs.installation-test.outputs.test_server_id }} - VERSION: ${{ needs.installation-test.outputs.version }} - SSH_ARTIFACT_NAME: "${{ needs.installation-test.outputs.ssh_artifact_name }}" - UID: ${{ github.run_id }}-install + TEST_TYPE: update + SERVER_ADDRESS: ${{ needs.update-test.outputs.server_address }} + TEST_RESULT: ${{ needs.update-test.test_result }} + TEST_SERVER_ID: ${{ needs.update-test.outputs.test_server_id }} + VERSION: ${{ needs.update-test.outputs.version }} + UID: ${{ github.run_id }}-update + SSH_ARTIFACT_NAME: "${{ needs.update-test.outputs.ssh_artifact_name }}" steps: - name: download ssh private key from artifact store uses: actions/download-artifact@v4 @@ -527,7 +603,7 @@ jobs: bash /ncp-test-automation/bin/entrypoint.sh eval "$(ssh-agent)" ssh-add /github/workspace/.ssh/automation_ssh_key - + ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" < /etc/cron.d/nc-previews-auto - chmod 644 /etc/cron.d/nc-previews-auto - - cat > /usr/local/bin/nc-previews <> /var/log/ncp.log -( - for i in \$(seq 1 \$(nproc)); do - ionice -c3 nice -n20 /usr/local/bin/ncc preview:pre-generate -n -vvv & - done - wait -) 2>&1 >>/var/log/ncp.log & - -PID=\$! -[[ "$RUNTIME" != 0 ]] && { - for i in \$(seq 1 1 $RUNTIME); do - sleep 1 - kill -0 "\$PID" &>/dev/null || break - done - pkill -f preview:pre-generate - pkill -f preview:generate-all -} -wait "\$PID" -EOF -chmod +x /usr/local/bin/nc-previews - - service cron restart + ncc app:getpath previewgenerator > /dev/null || ncc app:install previewgenerator + is_app_enabled previewgenerator || ncc app:enable previewgenerator + ncc config:app:set --value="64 256" previewgenerator squareSizes + ncc config:app:set --value="256 4096" previewgenerator fillWidthHeightSizes + ncc config:app:set --value="64 256 1024" previewgenerator widthSizes + ncc config:app:set --value="64 256 1024" previewgenerator heightSizes + ncc config:app:set --value=false --type=boolean previewgenerator job_disabled + ncc config:app:set --value=3000 --type=integer previewgenerator job_max_execution_time + ncc config:app:set --value=0 --type=integer previewgenerator job_max_previews + + mkdir -p /etc/cron.hourly + install_template cron.hourly/ncp-previewgenerator /etc/cron.hourly/ncp-previewgenerator + chmod +x /etc/cron.hourly/ncp-previewgenerator echo "Automatic preview generation enabled" return 0 } diff --git a/bin/ncp/NETWORKING/nc-trusted-proxies.sh b/bin/ncp/NETWORKING/nc-trusted-proxies.sh index 4df41b577..b02accc6b 100644 --- a/bin/ncp/NETWORKING/nc-trusted-proxies.sh +++ b/bin/ncp/NETWORKING/nc-trusted-proxies.sh @@ -7,11 +7,23 @@ # # +tmpl_trusted_proxies_list() { + ( + . /usr/local/etc/library.sh + for param in PROXY{1,2,3} + do + proxy="$(find_app_param nc-trusted-proxies "$param")" + [[ -z "$proxy" ]] || echo "$proxy" + done + ) +} + configure() { [[ "$PROXY1" != "" ]] && ncc config:system:set trusted_proxies 0 --value="$PROXY1" [[ "$PROXY2" != "" ]] && ncc config:system:set trusted_proxies 1 --value="$PROXY2" [[ "$PROXY3" != "" ]] && ncc config:system:set trusted_proxies 2 --value="$PROXY3" + install_template nextcloud.conf.sh /etc/apache2/sites-available/001-nextcloud.conf exit 0 } diff --git a/bin/ncp/TOOLS/nc-previews.sh b/bin/ncp/TOOLS/nc-previews.sh index a9a59ece4..92fad9d6d 100644 --- a/bin/ncp/TOOLS/nc-previews.sh +++ b/bin/ncp/TOOLS/nc-previews.sh @@ -8,39 +8,111 @@ # More at nextcloudpi.com # +GENERATE_LOG="/var/log/ncp-generate-previews.log" +GENERATE_JOB_ID="ncp-generate-previews" + +connect_to_preview_generation() { + tail -n 100 -f "${GENERATE_LOG}" & + tail_pid=$! + trap "kill '$tail_pid'" EXIT + while [[ "$(systemctl is-active "${GENERATE_JOB_ID}" ||:)" =~ ^(active|activating|deactivating)$ ]] + do + sleep 3 + done + + if [[ "$(systemctl is-active "${GENERATE_JOB_ID}" ||:)" == "inactive" ]] + then + echo "Preview generation finished successfully." + return 0 + elif [[ "$(systemctl is-active "${GENERATE_JOB_ID}" ||:)" == "failed" ]] + then + echo "Preview generation failed (or was installed already)." + return 1 + else + echo "Preview generation was not found or failed (unexpected status: '$(systemctl is-active "${GENERATE_JOB_ID}" ||:)')" + fi +} + configure() { - pgrep -af preview:pre-generate &>/dev/null || pgrep -af preview:generate-all &>/dev/null && { - echo "nc-previews is already running" - return 1 - } + # Disable during build + ! [[ -f /.ncp-image ]] || return 0 + + + if [[ "$(systemctl is-active "${GENERATE_JOB_ID}" ||:)" =~ ^(active|activating|deactivating)$ ]] + then + echo "Existing preview generation process detected. Connecting..." + connect_to_preview_generation + exit $? + fi + + if ! [[ -f /.ncp-image ]] + then + ncc app:getpath previewgenerator > /dev/null || ncc app:install previewgenerator + is_app_enabled previewgenerator || ncc app:enable previewgenerator + ncc config:app:set --value="64 256" previewgenerator squareSizes + ncc config:app:set --value="256 4096" previewgenerator fillWidthHeightSizes + ncc config:app:set --value="64 256 1024" previewgenerator widthSizes + ncc config:app:set --value="64 256 1024" previewgenerator heightSizes + if is_app_enabled memories + then + ncc config:app:set --value="256 4096" previewgenerator coverWidthHeightSizes + else + ncc config:app:set --value="" previewgenerator coverWidthHeightSizes + fi + fi + + tmpscript="$(mktemp /run/ncp-preview-generate.XXXXXX)" + + PROC="$(nproc)" + if [[ "$PROC" -gt 3 ]] + then + PROC="$((PROC-2))" + else + PROC=1 + fi [[ "$CLEAN" == "yes" ]] && { - local datadir - datadir=$( get_nc_config_value datadirectory ) || { - echo "data directory not found"; - return 1; - } - - rm -r "$datadir"/appdata_*/preview/* &>/dev/null - mysql nextcloud <<<"delete from ${DB_PREFIX?}filecache where path like \"appdata_%/preview/%\"" - ncc files:scan-app-data -n + if ! is_more_recent_than "$(nc_version)" 30.99.99 + then + echo "ERROR: CLEAN not supported for Nextcloud < 31 (was $(nc_version))" + return + else + echo 'echo "Cleaning old previews. This can take a while ..."' >> "$tmpscript" + echo 'ncc preview:cleanup' >> "$tmpscript" + fi } [[ "$INCREMENTAL" == "yes" ]] && { - for i in $(seq 1 $(nproc)); do - ncc preview:pre-generate -n -vvv & - done - wait + cat <> "$tmpscript" +for _ in $PROC; do + ncc preview:pre-generate -n -vvv & +done +wait +EOF return } - for i in $(seq 1 $(nproc)); do - [[ "$PATH1" != "" ]] && PATH_ARG=(-p "$PATH1") - ncc preview:generate-all -n -v ${PATH_ARG[@]} & - done - wait + [[ "$PATH1" != "" ]] && PATH_ARG=(-p "$PATH1") + echo "ncc preview:generate-all -w \"${PROC}\" -n -vv " "${PATH_ARG[@]}" >> "$tmpscript" + + systemctl reset-failed "${GENERATE_JOB_ID}" 2>/dev/null ||: + systemd-run -u "${GENERATE_JOB_ID}" --service-type=oneshot --no-block -p TimeoutStartSec="72h" -p TimeoutStopSec="1h" \ + bash -c "bash '$tmpscript' |& tee '$GENERATE_LOG'" + sleep 1 + + if ! [[ "$(systemctl is-active "${GENERATE_JOB_ID}" ||:)" =~ ^(active|inactive|activating|deactivating)$ ]] + then + echo "Failed to start preview generation job" + [[ -f "${GENERATE_LOG}" ]] && cat "${GENERATE_LOG}" + systemctl status --no-pager "${GENERATE_JOB_ID}" ||: + exit 1 + fi + + echo "Preview generation started. You can safely close this session, the job will keep running in the background." + + [[ "${PREVIEW_GENERATION_DETACH:-false}" == "true" ]] || connect_to_preview_generation } install() { :; } diff --git a/build/docker/Dockerfile b/build/docker/Dockerfile deleted file mode 100644 index 84b0d6e15..000000000 --- a/build/docker/Dockerfile +++ /dev/null @@ -1,222 +0,0 @@ -ARG arch=arm32v7 -ARG arch_qemu=arm -ARG release=bullseye -FROM --platform=linux/amd64 debian:${release}-slim AS qemu - -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends qemu-user-static - -FROM ${arch}/debian:${release}-slim as debian-ncp - -ARG arch_qemu - -LABEL maintainer="Tobias Knöppler" - -CMD /bin/bash - -COPY --from=qemu /usr/bin/qemu-${arch_qemu}-static /usr/bin/ - -RUN mkdir -p /etc/services-available.d /etc/services-enabled.d - -COPY build/docker/debian-ncp/run-parts.sh / - -# syntax=docker/dockerfile:experimental - -FROM --platform=linux/${arch} debian-ncp as lamp - -LABEL maintainer="Ignacio Núñez Hernanz " - -SHELL ["/bin/bash", "-c"] - -ENV DOCKERBUILD 1 -ENV APACHE_RUN_USER=www-data -ENV APACHE_RUN_GROUP=www-data -ENV APACHE_LOG_DIR=/var/log/apache2 -ENV APACHE_LOCK_DIR=/var/lock/apache2 -ENV APACHE_PID_FILE=/var/run/apache2.pid -ENV APACHE_RUN_DIR=/var/run/apache2 - -COPY etc/ncp.cfg etc/library.sh lamp.sh /usr/local/etc/ -COPY etc/ncp-templates /usr/local/etc/ncp-templates - -RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \ -set -e; \ - -# mark as image build -touch /.ncp-image; \ - -# installation -apt-get update; \ -apt-get install --no-install-recommends -y jq wget procps ca-certificates lsb-release; \ - -source /usr/local/etc/library.sh; \ -set +x; \ -install_app /usr/local/etc/lamp.sh; \ - -# stop mysqld -mysqladmin -u root shutdown; \ - -# mariaDB fixups (move database to /data-ro, which will be in a persistent volume) -mkdir -p /data-ro /data; \ -mv /var/lib/mysql /data-ro/database; \ -install_template "mysql/90-ncp.cnf.sh" "/etc/mysql/mariadb.conf.d/90-ncp.cnf" \ - -# package cleanup -apt-get autoremove -y; \ -apt-get clean; \ -find /var/lib/apt/lists -type f | xargs rm; \ -rm -rf /usr/share/man/*; \ -rm -rf /usr/share/doc/*; \ -rm /var/cache/debconf/*-old; \ -rm -f /var/log/alternatives.log /var/log/apt/*; \ - -# specific cleanup -rm /data-ro/database/ib_logfile*; \ -rm /usr/local/etc/lamp.sh; \ -rm /.ncp-image; - -COPY build/docker/lamp/010lamp /etc/services-enabled.d/ - -ENTRYPOINT ["/run-parts.sh"] - -EXPOSE 80 443 - -FROM --platform=linux/${arch} lamp as nextcloud -# syntax=docker/dockerfile:experimental - -ARG arch_qemu - -LABEL maintainer="Ignacio Núñez Hernanz " - -SHELL ["/bin/bash", "-c"] - -ENV DOCKERBUILD 1 - -COPY etc/library.sh /usr/local/etc/ -COPY bin/ncp/CONFIG/nc-nextcloud.sh / -COPY etc/ncp-config.d/nc-nextcloud.cfg /usr/local/etc/ncp-config.d/ - -RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \ -set -e; \ - -# mark as image build -touch /.ncp-image; \ - -# mark as docker image -touch /.docker-image; \ - -# installation ( /var/www/nextcloud -> /data/app which will be in a volume ) -apt-get update; \ -apt-get install --no-install-recommends -y sudo jq; \ -source /usr/local/etc/library.sh; \ -install_app /nc-nextcloud.sh; \ -run_app_unsafe /nc-nextcloud.sh; \ -mv /var/www/nextcloud /data-ro/nextcloud; \ -ln -s /data-ro/nextcloud /var/www/nextcloud; \ - -# package cleanup -apt-get autoremove -y; \ -apt-get clean; \ -find /var/lib/apt/lists -type f | xargs rm; \ -rm -rf /usr/share/man/*; \ -rm -rf /usr/share/doc/*; \ -rm /var/cache/debconf/*-old; \ -rm -f /var/log/alternatives.log /var/log/apt/*; \ - -# specific cleanup -apt-get purge -y wget ca-certificates; \ -rm /nc-nextcloud.sh /usr/local/etc/ncp-config.d/nc-nextcloud.cfg; \ -rm /.ncp-image; - -COPY build/docker/nextcloud/020nextcloud /etc/services-enabled.d/ -COPY bin/ncp-provisioning.sh /usr/local/bin/ -# syntax=docker/dockerfile:experimental - -FROM --platform=linux/${arch} nextcloud as nextcloudpi - -ARG ncp_ver=v0.0.0 - -LABEL maintainer="Ignacio Núñez Hernanz " - -SHELL ["/bin/bash", "-c"] - -ENV DOCKERBUILD 1 -ENV MINIMUM_NC_VERSION=24 - -RUN mkdir -p /tmp/ncp-build -COPY bin/ /tmp/ncp-build/bin/ -COPY etc /tmp/ncp-build/etc/ -COPY ncp-web /tmp/ncp-build/ncp-web/ -COPY ncp-app /tmp/ncp-build/ncp-app/ -COPY ncp-previewgenerator /tmp/ncp-build/ncp-previewgenerator/ -COPY build/docker /tmp/ncp-build/build/docker/ -COPY ncp.sh update.sh post-inst.sh /tmp/ncp-build/ -COPY etc/ncp-config.d/nc-init.cfg /usr/local/etc/ncp-config.d/nc-init-copy.cfg -COPY etc/ncp-config.d/nc-datadir.cfg /usr/local/etc/ncp-config.d/nc-datadir-copy.cfg - -RUN --mount=type=cache,target=/var/cache/apt --mount=type=cache,target=/var/lib/apt \ -set -ex; \ - -# make sure we don't accidentally disable first run wizard -rm -f ncp-web/{wizard.cfg,ncp-web.cfg}; \ - -# mark as image build -touch /.ncp-image; \ - -# mark as docker image -touch /.docker-image; \ - -apt-get update; \ -apt-get install --no-install-recommends -y wget ca-certificates; \ - -# install nextcloudpiset_app_param nc-datadir.sh DATADIR '/data-ro/ncdata' \ -source /usr/local/etc/library.sh; \ -cd /tmp/ncp-build/; \ -install_app ncp.sh; \ - -mv /usr/local/etc/ncp-config.d/nc-init-copy.cfg /usr/local/etc/ncp-config.d/nc-init.cfg; \ -run_app_unsafe bin/ncp/CONFIG/nc-init.sh; \ -echo 'Moving data directory to a more sensible location'; \ -mv /usr/local/etc/ncp-config.d/nc-datadir-copy.cfg /usr/local/etc/ncp-config.d/nc-datadir.cfg; \ -mkdir -p /data-ro/ncdata; \ -set_app_param nc-datadir.sh DATADIR '/data-ro/ncdata'; \ -BUILD_MODE=1 DISABLE_FS_CHECK=1 run_app_unsafe bin/ncp/CONFIG/nc-datadir.sh; \ -set_app_param nc-datadir.sh DATADIR '/data/ncdata'; \ -# Remove nc-datadir.cfg as it's disabled in docker -rm /usr/local/etc/ncp-config.d/nc-datadir.cfg; \ -sed -i 's|data-ro|data|' /data-ro/nextcloud/config/config.php; \ - -# fix default paths -echo "Update data-ro"; \ -sed -i 's|/media/USBdrive|/data/backups|' /usr/local/etc/ncp-config.d/nc-backup.cfg; \ -sed -i 's|/media/USBdrive|/data/backups|' /usr/local/etc/ncp-config.d/nc-backup-auto.cfg; \ -sed -i 's|/data-ro|/data|' /etc/mysql/mariadb.conf.d/90-ncp.cnf; \ - -echo "DEBUGGING:"; \ -cat /etc/mysql/mariadb.conf.d/90-ncp.cnf; \ -ls -l /usr/local/bin/; \ - -# cleanup all NCP extras -run_app_unsafe post-inst.sh; \ - -echo "DEBUGGING:"; \ -cat /etc/mysql/mariadb.conf.d/90-ncp.cnf; \ -ls -l /usr/local/bin/; \ - -# specific cleanup -cd /; rm -r /tmp/ncp-build; \ -rm /usr/local/etc/ncp-config.d/nc-init.cfg; \ - -# package installation clean up -rm -rf /usr/share/man/*; \ -rm -rf /usr/share/doc/*; \ -rm -f /var/log/alternatives.log /var/log/apt/*; \ -rm /var/cache/debconf/*-old; \ - -# set version -echo "${ncp_ver#docker-}" > /usr/local/etc/ncp-version - -COPY build/docker/nextcloudpi/000ncp /etc/services-enabled.d/ - -FROM --platform=linux/${arch} nextcloudpi as ncp-qemu-fix - -RUN echo 'Mutex posixsem' >> /etc/apache2/mods-available/ssl.conf diff --git a/build/docker/debian-ncp/run-parts.sh b/build/docker/debian-ncp/run-parts.sh deleted file mode 100755 index 75e5e4b45..000000000 --- a/build/docker/debian-ncp/run-parts.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -cleanup() -{ - - for file in $( ls -1rv /etc/services-enabled.d ); do - /etc/services-enabled.d/"$file" stop "$1" - done - exit -} - -trap cleanup SIGTERM - -# if an empty volume is mounted to /data, pre-populate it -if [[ $( ls -1A /data | wc -l ) -eq 0 ]] -then - echo "Initializing empty volume.." - cp -raT /data-ro /data -fi - -CURRENT_NC_VERSION="$(sudo -u www-data php -r "include(\"/data/nextcloud/config/config.php\"); echo(\$CONFIG[\"version\"]);")" -CURRENT_NC_MAJ="${CURRENT_NC_VERSION%%.*}" -[[ "$CURRENT_NC_MAJ" -ge "$MINIMUM_NC_VERSION" ]] || { - echo "This image of NCP requires at least Nextcloud version ${MINIMUM_NC_VERSION} but you have ${CURRENT_NC_VERSION} installed. " \ - "Please upgrade your Nextcloud first (using the web UI on an older NCP image), before upgrading to this NCP version." - exit 1 -} - -DOCKER_DISCONTINUATION_ALERT="ATTENTION: NextcloudPi docker is being discontinued after Nextcloud 25! Minor NC updates and security updates and fixes will be provided until 2023/11. -Learn more in the official announcement: https://help.nextcloud.com/t/nextcloudpi-planning-to-discontinue-its-docker-version-with-nc-25" - -echo -e " -\033[1;31m$DOCKER_DISCONTINUATION_ALERT\033[0m - -Continue in 5 seconds..." - -sleep 5 - - -# wrapper to simulate update-rc.d -cat > /usr/local/sbin/update-rc.d <<'EOF' -#!/bin/bash -FILE=/etc/services-available.d/???"$1" - -test -f $FILE || { - echo "$1 doesn't exist" - exit 0 -} - -[[ "$2" == "enable" ]] && { - ln -sf $FILE /etc/services-enabled.d/$( basename $FILE ) - echo "enabled $1" - exit 0 -} - -[[ "$2" == "disable" ]] && { - rm -f /etc/services-enabled.d/$( basename $FILE ) - echo "disabled $1" - exit 0 -} -EOF -chmod +x /usr/local/sbin/update-rc.d - -# Iterate only over 000* entries which might setup environment -for file in $( ls -1v /etc/services-enabled.d | grep ^000.* ); do - /etc/services-enabled.d/"$file" start "$1" -done - -# Iterate over remaining entries -for file in $( ls -1v /etc/services-enabled.d | grep -v ^000.* ); do - /etc/services-enabled.d/"$file" start "$1" -done - - -if [[ "$NOBACKUP" != "true" ]] && ! a2query -s ncp-activation -q -then - BKPDIR=/data/docker-startup-backups - WITH_DATA=no - COMPRESSED=yes - LIMIT=5 - mkdir -p "$BKPDIR" - echo "Back up current instance..." - ncp-backup "$BKPDIR" "$WITH_DATA" "$COMPRESSED" "$LIMIT" || echo 'WARN: Backup creation failed' -fi - -# wait for trap from 'docker stop' -echo "Init done" - -[[ -f /data/docker_discontinuation_alert_sent ]] || \ - ( . /usr/local/etc/library.sh; notify_admin "ATTENTION: NCP docker support to be discontinued" "$DOCKER_DISCONTINUATION_ALERT" && touch /data/docker_discontinuation_alert_sent ) -while true; do sleep 0.5; done - - diff --git a/build/docker/docker-compose-ncpdev.yml b/build/docker/docker-compose-ncpdev.yml deleted file mode 100644 index 80b06544c..000000000 --- a/build/docker/docker-compose-ncpdev.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: '3' -services: - nextcloudpi-dev: - image: ownyourbits/nextcloudpi-x86 - command: "${IP}" - ports: - - "80:80" - - "443:443" - - "4443:4443" - volumes: - - ../../ncp-web:/var/www/ncp-web - - ../../etc:/usr/local/etc - - ../../changelog.md:/changelog.md - - ncdata:/data - container_name: nextcloudpi - -volumes: - ncdata: diff --git a/build/docker/docker-compose.yml b/build/docker/docker-compose.yml deleted file mode 100644 index 122172d89..000000000 --- a/build/docker/docker-compose.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: '3' -services: - nextcloudpi: - image: ownyourbits/nextcloudpi-x86 - command: "${IP}" - ports: - - "80:80" - - "443:443" - - "4443:4443" - volumes: - - ncdata:/data - - /etc/localtime:/etc/localtime:ro - # for nc-encrypt - devices: - - /dev/fuse:/dev/fuse - # for nc-encrypt # NOTE: take a look at this https://github.com/docker/for-linux/issues/321#issuecomment-677744121 - cap_add: - - SYS_ADMIN - container_name: nextcloudpi - -volumes: - ncdata: diff --git a/build/docker/lamp/010lamp b/build/docker/lamp/010lamp deleted file mode 100755 index cd02a2159..000000000 --- a/build/docker/lamp/010lamp +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -source /usr/local/etc/library.sh # sets PHPVER - -set -e - -[[ "$1" == "stop" ]] && { - echo "Stopping apache" - apachectl graceful-stop - echo "Stopping PHP-fpm" - pkill -f php-fpm - echo "Stopping mariaDB" - mysqladmin -u root shutdown - echo "LAMP cleanup complete" - exit 0 -} - -# MOVE CONFIGS TO PERSISTENT VOLUME -persistent_cfg /etc/apache2/sites-available /data/etc/apache2/sites-available -persistent_cfg /etc/apache2/sites-enabled /data/etc/apache2/sites-enabled - -# Run hardcoded hooks. This allows scripts in the image to change persistent values before -# initialization. Use case is to download a new image. -if [[ -f /usr/local/bin/ncp-docker-hook ]]; then - source /usr/local/bin/ncp-docker-hook -fi - -echo "Starting PHP-fpm" -php-fpm"${PHPVER}" - -echo "Starting Apache" -/usr/sbin/apache2ctl start - -# adjust the dbdir to the persistent storage -install_template "mysql/90-ncp.cnf.sh" "/etc/mysql/mariadb.conf.d/90-ncp.cnf" || exit 1 - -# start -echo "Starting mariaDB" -mysqld & - -# wait for mariadb -while :; do - [[ -S /run/mysqld/mysqld.sock ]] && break - sleep 0.5 -done -sleep 1 - -exit 0 diff --git a/build/docker/nextcloud/020nextcloud b/build/docker/nextcloud/020nextcloud deleted file mode 100755 index 3a4400a4c..000000000 --- a/build/docker/nextcloud/020nextcloud +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash - -source /usr/local/etc/library.sh - -set -e - -[[ "$1" == "stop" ]] && { - echo "stopping Cron..." - killall cron - echo "stopping Redis..." - killall redis-server - echo "stopping Postfix..." - postfix stop - echo "stopping HPB..." - killall notify_push - postfix stop - echo "stopping logs..." - killall tail - exit 0 -} - -# we want to work in the volume version of the code -rm /var/www/nextcloud -ln -s /data/nextcloud /var/www/nextcloud - -echo "Starting Redis" -sed -i 's|^requirepass .*|requirepass default|' /etc/redis/redis.conf -chown redis:redis /etc/redis/redis.conf -mkdir -p /var/run/redis -chown redis /var/run/redis -sudo -u redis redis-server /etc/redis/redis.conf - -echo "Starting Cron" -cron - -echo "Starting Postfix" -postfix start - -# Better do real provisioning at the end, as it can restart PHP asynchronously -sed -i "s|'password'.*|'password' => 'default',|" /data/nextcloud/config/config.php -sed -i "s|'dbpassword' =>.*|'dbpassword' => 'default',|" /data/nextcloud/config/config.php -echo -e "[client]\npassword=default" > /root/.my.cnf -chmod 600 /root/.my.cnf -DBPASSWD=default -DBADMIN=ncadmin -mysql < /dev/null 2>&1 || ncc notify_push:setup "https://$2/push" -} - -echo "Nextcloud version $(nc_version). NextCloudPi version $(cat /usr/local/etc/ncp-version)" - -# Display NC logs in the docker logs -LOG_FILE="$(get_nc_config_value logfile 2> /dev/null || true)" -tail -f -n0 "${LOG_FILE:-$( get_nc_config_value datadirectory )/nextcloud.log}" & - -exit 0 diff --git a/build/docker/nextcloudpi/000ncp b/build/docker/nextcloudpi/000ncp deleted file mode 100755 index 879c6aaa7..000000000 --- a/build/docker/nextcloudpi/000ncp +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -source /usr/local/etc/library.sh - -# INIT NCP CONFIG (first run) -[[ "$1" == "start" ]] && [[ -d /data/ncp ]] && { - echo "Install default configurations for new ncp apps" - rsync --ignore-existing -a --out-format="%n" /usr/local/etc/ncp-config.d/*.cfg /data/ncp/ | awk '{ print " > " $0 }' -} -persistent_cfg /usr/local/etc/ncp-config.d /data/ncp -persistent_cfg /etc/letsencrypt # persist SSL certificates -persistent_cfg /etc/shadow # persist ncp-web password -persistent_cfg /etc/cron.d -persistent_cfg /etc/cron.daily -persistent_cfg /etc/cron.hourly -persistent_cfg /etc/cron.weekly - -# reset bin if we pull a more recent container -[[ -d /data/bin ]] && { - date_img=$(date "+%s" -r /.docker-image) - date_per=$(date "+%s" -r /data/bin) - [[ $date_img -gt $date_per ]] && { - rm -r /data/bin - } -} -persistent_cfg /usr/local/bin /data/bin - -[[ "$1" == "start" ]] && { - install_template "php/opcache.ini.sh" "/etc/php/${PHPVER}/mods-available/opcache.ini" - install_template "php/90-ncp.ini.sh" "/etc/php/${PHPVER}/fpm/conf.d/90-ncp.ini" - install_template "php/pool.d.www.conf.sh" "/etc/php/${PHPVER}/fpm/pool.d/www.conf" - #install_template "mysql/91-ncp.cnf.sh" "/etc/mysql/mariadb.conf.d/91-ncp.cnf" - install_template "ncp-metrics.cfg.sh" "/usr/local/etc/ncp-metrics.cfg" -} - -touch /var/log/ncp.log -tail -f -n0 "/var/log/ncp.log" & - -exit 0 diff --git a/etc/library.sh b/etc/library.sh index 2d41465a6..086c187ba 100644 --- a/etc/library.sh +++ b/etc/library.sh @@ -487,7 +487,7 @@ function is_more_recent_than() local patch_b=$( cut -d. -f3 <<<"$version_B" ) # Compare version A with version B - # Return true if A is more recent than B + # Return 1 if A is more recent than B if [ "$major_b" -gt "$major_a" ]; then return 1 @@ -503,7 +503,7 @@ function is_more_recent_than() function is_app_enabled() { local app="$1" - ncc app:list | sed '0,/Disabled/!d' | grep -q "${app}" + ncc app:list --output json | jq -r '.enabled | keys | .[]' | grep '^previewgenerator$' > /dev/null 2> /dev/null } function check_distro() diff --git a/etc/ncp-config.d/nc-nextcloud.cfg b/etc/ncp-config.d/nc-nextcloud.cfg index 7117926fc..54ab64bc7 100644 --- a/etc/ncp-config.d/nc-nextcloud.cfg +++ b/etc/ncp-config.d/nc-nextcloud.cfg @@ -9,7 +9,7 @@ { "id": "VER", "name": "Version", - "value": "32.0.1" + "value": "33.0.2" }, { "id": "MAXFILESIZE", diff --git a/etc/ncp-templates/cron.hourly/ncp-previewgenerator b/etc/ncp-templates/cron.hourly/ncp-previewgenerator new file mode 100644 index 000000000..078458ef3 --- /dev/null +++ b/etc/ncp-templates/cron.hourly/ncp-previewgenerator @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +cat <<'EOF' +GENERATE_JOB_ID="ncp-generate-previews" + +if [[ "$(systemctl is-active "${GENERATE_JOB_ID}" ||:)" =~ ^(active|activating|deactivating)$ ]] +then + echo "Existing initial preview generation process detected. Aborting..." + exit 0 +fi + +#!/usr/bin/env bash +set -eu +source /usr/local/etc/library.sh + +if is_app_enabled memories +then + ncc config:app:set --value="256 4096" previewgenerator coverWidthHeightSizes +else + ncc config:app:set --value="" previewgenerator coverWidthHeightSizes +fi + +for _ in $(seq 1 $(nproc)); do + ncc preview:pre-generate -n -q & +done + +wait +EOF \ No newline at end of file diff --git a/etc/ncp-templates/nextcloud.conf.sh b/etc/ncp-templates/nextcloud.conf.sh index 3dd7ce21a..c234683f9 100644 --- a/etc/ncp-templates/nextcloud.conf.sh +++ b/etc/ncp-templates/nextcloud.conf.sh @@ -29,6 +29,17 @@ else METRICS_IS_ENABLED=no fi +if ! [[ -f /.ncp-image ]] && [[ "$1" != "--defaults" ]] && [[ -f "${BINDIR}/NETWORKING/nc-trusted-proxies.sh" ]]; then + TRUSTED_PROXIES=() + while read -r proxy + do + TRUSTED_PROXIES+=("$proxy") + done < <( + source "${BINDIR}/NETWORKING/nc-trusted-proxies.sh" + tmpl_trusted_proxies_list + ) +fi + echo "INFO: Metrics enabled: ${METRICS_IS_ENABLED}" >&2 echo "### DO NOT EDIT! THIS FILE HAS BEEN AUTOMATICALLY GENERATED. CHANGES WILL BE OVERWRITTEN ###" @@ -81,8 +92,18 @@ cat <> /etc/apache2/apache2.conf diff --git a/ncp-app/appinfo/info.xml b/ncp-app/appinfo/info.xml index 167b8371d..5931f0410 100644 --- a/ncp-app/appinfo/info.xml +++ b/ncp-app/appinfo/info.xml @@ -12,7 +12,7 @@ tools https://github.com/nextcloud/nextcloudpi/issues - + diff --git a/ncp-app/package-lock.json b/ncp-app/package-lock.json index dccd68a06..3e48a28af 100644 --- a/ncp-app/package-lock.json +++ b/ncp-app/package-lock.json @@ -32,7 +32,6 @@ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -101,6 +100,7 @@ "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", @@ -603,6 +603,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1146,6 +1147,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", @@ -1406,6 +1408,7 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1575,6 +1578,7 @@ "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "peer": true, "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", @@ -1825,7 +1829,6 @@ "url": "https://opencollective.com/csstools" } ], - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -1849,7 +1852,6 @@ "url": "https://opencollective.com/csstools" } ], - "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -1862,7 +1864,6 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, - "peer": true, "engines": { "node": ">=10.0.0" } @@ -1872,7 +1873,6 @@ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==", "dev": true, - "peer": true, "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.5.0", @@ -1887,7 +1887,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "peer": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1903,7 +1902,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1916,7 +1914,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1926,7 +1923,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1949,15 +1945,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1968,7 +1962,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -1984,7 +1977,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -1997,7 +1989,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2010,7 +2001,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -2023,7 +2013,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2033,7 +2022,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, - "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -2048,7 +2036,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2059,7 +2046,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2072,7 +2058,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "peer": true, "engines": { "node": ">=12.22" }, @@ -2085,8 +2070,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -2833,7 +2817,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -2857,8 +2840,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@nextcloud/auth": { "version": "1.3.0", @@ -2982,6 +2964,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3370,7 +3353,6 @@ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", "dev": true, - "peer": true, "dependencies": { "eslint-scope": "5.1.1" } @@ -3380,7 +3362,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3394,7 +3375,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "peer": true, "engines": { "node": ">= 8" } @@ -3404,7 +3384,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3476,7 +3455,6 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, - "peer": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3487,7 +3465,6 @@ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*" } @@ -3497,7 +3474,6 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*" } @@ -3507,7 +3483,6 @@ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, - "peer": true, "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -3517,7 +3492,6 @@ "version": "8.56.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3527,7 +3501,6 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -3536,15 +3509,13 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "peer": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3557,7 +3528,6 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3577,15 +3547,13 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/http-proxy": { "version": "1.17.14", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*" } @@ -3619,29 +3587,25 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "peer": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/node": { "version": "20.11.19", @@ -3656,7 +3620,6 @@ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*" } @@ -3665,29 +3628,25 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/qs": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/semver": { "version": "7.5.7", @@ -3699,7 +3658,6 @@ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, - "peer": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -3710,7 +3668,6 @@ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, - "peer": true, "dependencies": { "@types/express": "*" } @@ -3720,7 +3677,6 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, - "peer": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -3737,7 +3693,6 @@ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*" } @@ -3752,7 +3707,6 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, - "peer": true, "dependencies": { "@types/node": "*" } @@ -3775,7 +3729,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", @@ -3811,7 +3764,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -3824,7 +3776,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -3839,8 +3790,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", @@ -3876,7 +3826,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" @@ -3894,7 +3843,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", @@ -3922,7 +3870,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, - "peer": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -3936,7 +3883,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", @@ -3965,7 +3911,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -3978,7 +3923,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -3993,15 +3937,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@typescript-eslint/utils": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -4027,7 +3969,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4040,7 +3981,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -4055,15 +3995,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, - "peer": true, "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" @@ -4081,7 +4019,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4093,8 +4030,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@vue/compiler-sfc": { "version": "2.7.16", @@ -4114,7 +4050,6 @@ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", "dev": true, - "peer": true, "dependencies": { "consolidate": "^0.15.1", "hash-sum": "^1.0.2", @@ -4134,7 +4069,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, - "peer": true, "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -4144,15 +4078,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@vue/component-compiler-utils/node_modules/postcss": { "version": "7.0.39", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, - "peer": true, "dependencies": { "picocolors": "^0.2.1", "source-map": "^0.6.1" @@ -4169,8 +4101,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@vue/eslint-config-typescript": { "version": "12.0.0", @@ -4201,7 +4132,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4210,26 +4140,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "peer": true + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "peer": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "peer": true + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4239,14 +4165,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "peer": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4258,7 +4182,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4267,7 +4190,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -4275,14 +4197,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "peer": true + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4298,7 +4218,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -4311,7 +4230,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4323,7 +4241,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4337,7 +4254,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -4348,7 +4264,6 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "peer": true, "engines": { "node": ">=14.15.0" }, @@ -4362,7 +4277,6 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "peer": true, "engines": { "node": ">=14.15.0" }, @@ -4376,7 +4290,6 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, - "peer": true, "engines": { "node": ">=14.15.0" }, @@ -4393,21 +4306,18 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -4420,7 +4330,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -4445,7 +4354,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peer": true, "peerDependencies": { "acorn": "^8" } @@ -4455,7 +4363,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -4481,7 +4388,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -4499,7 +4405,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4515,14 +4420,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peer": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -4549,7 +4452,6 @@ "engines": [ "node >= 0.8.0" ], - "peer": true, "bin": { "ansi-html": "bin/ansi-html" } @@ -4595,7 +4497,6 @@ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, - "peer": true, "engines": { "node": ">=14" } @@ -4613,7 +4514,6 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -4629,15 +4529,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4657,7 +4555,6 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -4667,7 +4564,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4687,7 +4583,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -4707,7 +4602,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4726,7 +4620,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4745,7 +4638,6 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -4768,7 +4660,6 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -4778,7 +4669,6 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -4790,15 +4680,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/assert": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -4812,7 +4700,6 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -4827,7 +4714,6 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, - "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -5284,22 +5170,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, - "peer": true, "engines": { "node": "*" } @@ -5317,22 +5200,19 @@ "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, - "peer": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -5357,7 +5237,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -5367,7 +5246,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -5376,15 +5254,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "peer": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -5400,7 +5276,6 @@ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -5410,8 +5285,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "peer": true + "dev": true }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -5436,15 +5310,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, - "peer": true, "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -5459,7 +5331,6 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, - "peer": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -5471,7 +5342,6 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, - "peer": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -5484,7 +5354,6 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -5495,7 +5364,6 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -5516,7 +5384,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5531,7 +5398,6 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, - "peer": true, "dependencies": { "pako": "~1.0.5" } @@ -5554,6 +5420,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -5594,7 +5461,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -5609,15 +5475,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "peer": true, "engines": { "node": ">=6" }, @@ -5629,15 +5493,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, - "peer": true, "dependencies": { "semver": "^7.0.0" } @@ -5647,7 +5509,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -5660,7 +5521,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5675,15 +5535,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -5693,7 +5551,6 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5729,7 +5586,6 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, - "peer": true, "dependencies": { "camelcase": "^6.3.0", "map-obj": "^4.1.0", @@ -5748,7 +5604,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -5761,7 +5616,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -5845,7 +5699,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "peer": true, "engines": { "node": ">=6.0" } @@ -5869,7 +5722,6 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -5903,7 +5755,6 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "peer": true, "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5918,7 +5769,6 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "peer": true, "dependencies": { "isobject": "^3.0.1" }, @@ -5957,15 +5807,13 @@ "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -5991,7 +5839,6 @@ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, - "peer": true, "engines": { "node": ">= 12.0.0" } @@ -6000,15 +5847,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "peer": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -6021,7 +5866,6 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "peer": true, "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -6040,7 +5884,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -6049,15 +5892,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", @@ -6069,7 +5910,6 @@ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, - "peer": true, "engines": { "node": ">=0.8" } @@ -6078,8 +5918,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/consolidate": { "version": "0.15.1", @@ -6087,7 +5926,6 @@ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", "dev": true, - "peer": true, "dependencies": { "bluebird": "^3.1.1" }, @@ -6099,15 +5937,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "peer": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -6120,7 +5956,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -6135,7 +5970,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -6144,8 +5978,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/core-js": { "version": "3.36.0", @@ -6173,15 +6006,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, - "peer": true, "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", @@ -6207,15 +6038,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/cosmiconfig/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -6228,7 +6057,6 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -6238,15 +6066,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, - "peer": true, "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6260,7 +6086,6 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, - "peer": true, "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6380,7 +6205,6 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, - "peer": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -6403,7 +6227,6 @@ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", "dev": true, - "peer": true, "engines": { "node": ">=12 || >=16" } @@ -6413,7 +6236,6 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", "dev": true, - "peer": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -6449,7 +6271,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6462,7 +6283,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -6477,15 +6297,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, - "peer": true, "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -6499,7 +6317,6 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "peer": true, "bin": { "cssesc": "bin/cssesc" }, @@ -6521,8 +6338,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/debounce": { "version": "1.2.1", @@ -6550,7 +6366,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -6563,7 +6378,6 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "peer": true, "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -6580,7 +6394,6 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6590,7 +6403,6 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6612,8 +6424,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -6628,7 +6439,6 @@ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "peer": true, "dependencies": { "execa": "^5.0.0" }, @@ -6641,7 +6451,6 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6659,7 +6468,6 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -6669,7 +6477,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "peer": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -6695,7 +6502,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -6705,7 +6511,6 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -6716,7 +6521,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -6734,8 +6538,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -6750,7 +6553,6 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -6761,15 +6563,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "peer": true, "dependencies": { "path-type": "^4.0.0" }, @@ -6782,7 +6582,6 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "peer": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -6795,7 +6594,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6808,7 +6606,6 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -6823,7 +6620,6 @@ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -6841,15 +6637,13 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "peer": true + ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "peer": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -6865,7 +6659,6 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, - "peer": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -6879,8 +6672,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "peer": true + "dev": true }, "node_modules/electron-to-chromium": { "version": "1.4.679", @@ -6892,7 +6684,6 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -6907,8 +6698,7 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/emittery": { "version": "0.13.1", @@ -6944,7 +6734,6 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, - "peer": true, "engines": { "node": ">= 4" } @@ -6954,7 +6743,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -6963,7 +6751,6 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6977,7 +6764,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "peer": true, "engines": { "node": ">=0.12" }, @@ -6990,7 +6776,6 @@ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", "dev": true, - "peer": true, "bin": { "envinfo": "dist/cli.js" }, @@ -7011,7 +6796,6 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", "dev": true, - "peer": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -7066,15 +6850,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -7087,7 +6869,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" } @@ -7095,15 +6876,13 @@ "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "peer": true + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, "node_modules/es-set-tostringtag": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -7118,7 +6897,6 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "peer": true, "dependencies": { "hasown": "^2.0.0" } @@ -7128,7 +6906,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "peer": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7223,7 +7000,6 @@ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", "dev": true, - "peer": true, "engines": { "node": ">=12" }, @@ -7280,7 +7056,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "peer": true, "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -7292,7 +7067,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -7328,7 +7102,6 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "peer": true, "dependencies": { "debug": "^3.2.7" }, @@ -7346,7 +7119,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -7356,7 +7128,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.6.0", @@ -7409,7 +7180,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7420,7 +7190,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -7430,7 +7199,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -7443,7 +7211,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7456,7 +7223,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz", "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==", "dev": true, - "peer": true, "dependencies": { "@es-joy/jsdoccomment": "~0.41.0", "are-docs-informative": "^0.0.2", @@ -7480,7 +7246,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -7493,7 +7258,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7506,7 +7270,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7521,8 +7284,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/eslint-plugin-n": { "version": "16.6.2", @@ -7558,7 +7320,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7569,7 +7330,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -7585,7 +7345,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7598,7 +7357,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7611,7 +7369,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7627,7 +7384,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -7639,8 +7395,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", @@ -7682,7 +7437,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7695,7 +7449,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7710,14 +7463,12 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7731,7 +7482,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -7741,7 +7491,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7756,15 +7505,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7775,7 +7522,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7792,7 +7538,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -7804,15 +7549,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -7825,7 +7568,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7842,7 +7584,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7855,7 +7596,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -7865,7 +7605,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7882,7 +7621,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -7895,7 +7633,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -7911,7 +7648,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -7921,7 +7657,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7934,7 +7669,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -7950,7 +7684,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7963,7 +7696,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -7979,7 +7711,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7992,7 +7723,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -8005,7 +7735,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "peer": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -8023,7 +7752,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -8048,7 +7776,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -8061,7 +7788,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -8070,7 +7796,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -8082,7 +7807,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "peer": true, "engines": { "node": ">=4.0" } @@ -8091,7 +7815,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true, "engines": { "node": ">=4.0" } @@ -8109,7 +7832,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -8119,7 +7841,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -8128,14 +7849,12 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -8145,7 +7864,6 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, - "peer": true, "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -8201,7 +7919,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, - "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -8244,7 +7961,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -8253,15 +7969,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/express/node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "peer": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -8275,15 +7989,13 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "peer": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -8304,15 +8016,13 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -8322,7 +8032,6 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "peer": true, "dependencies": { "reusify": "^1.0.4" } @@ -8332,7 +8041,6 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "peer": true, "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8353,7 +8061,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -8377,7 +8084,6 @@ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -8387,7 +8093,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -8406,7 +8111,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -8415,15 +8119,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, - "peer": true, "dependencies": { "common-path-prefix": "^3.0.0", "pkg-dir": "^7.0.0" @@ -8452,7 +8154,6 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "peer": true, "bin": { "flat": "cli.js" } @@ -8462,7 +8163,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -8476,8 +8176,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/focus-trap": { "version": "6.9.4", @@ -8511,7 +8210,6 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -8534,7 +8232,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -8544,7 +8241,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -8553,8 +8249,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true, - "peer": true + "dev": true }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", @@ -8592,7 +8287,6 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -8611,7 +8305,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8637,7 +8330,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -8676,7 +8368,6 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -8694,7 +8385,6 @@ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, - "peer": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -8736,8 +8426,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", @@ -8764,7 +8453,6 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, - "peer": true, "dependencies": { "global-prefix": "^3.0.0" }, @@ -8777,7 +8465,6 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, - "peer": true, "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -8792,7 +8479,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8813,7 +8499,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "peer": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -8829,7 +8514,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "peer": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -8850,7 +8534,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -8859,15 +8542,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "peer": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -8884,8 +8565,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/hammerjs": { "version": "2.0.8", @@ -8899,15 +8579,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -8936,7 +8614,6 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8954,7 +8631,6 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "peer": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -8967,7 +8643,6 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -8980,7 +8655,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -8993,7 +8667,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, - "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -9009,7 +8682,6 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -9024,7 +8696,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9038,15 +8709,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -9068,7 +8737,6 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "peer": true, "bin": { "he": "bin/he" } @@ -9078,7 +8746,6 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, - "peer": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -9090,7 +8757,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -9103,7 +8769,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9115,15 +8780,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9135,15 +8798,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9158,15 +8819,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -9185,8 +8844,7 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ], - "peer": true + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -9198,7 +8856,6 @@ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" }, @@ -9218,7 +8875,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -9230,15 +8886,13 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9254,15 +8908,13 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "peer": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9277,7 +8929,6 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, - "peer": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -9302,7 +8953,6 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -9314,8 +8964,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/human-signals": { "version": "2.1.0", @@ -9336,7 +8985,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9349,7 +8997,6 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "peer": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -9375,15 +9022,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "peer": true, "engines": { "node": ">= 4" } @@ -9392,15 +9037,13 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9417,7 +9060,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -9427,7 +9069,6 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -9474,7 +9115,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "peer": true, "engines": { "node": ">=12" }, @@ -9500,15 +9140,13 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "peer": true + "dev": true }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, - "peer": true, "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -9523,7 +9161,6 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "peer": true, "engines": { "node": ">=10.13.0" } @@ -9541,7 +9178,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, - "peer": true, "engines": { "node": ">= 10" } @@ -9551,7 +9187,6 @@ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9568,7 +9203,6 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -9590,7 +9224,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "peer": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -9615,7 +9248,6 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9637,7 +9269,6 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, - "peer": true, "dependencies": { "builtin-modules": "^3.3.0" }, @@ -9653,7 +9284,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -9677,7 +9307,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9693,7 +9322,6 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -9734,7 +9362,6 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9762,7 +9389,6 @@ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -9779,7 +9405,6 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -9800,7 +9425,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9816,7 +9440,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -9826,7 +9449,6 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9836,7 +9458,6 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9846,7 +9467,6 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -9863,7 +9483,6 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.7" }, @@ -9890,7 +9509,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "peer": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -9906,7 +9524,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "peer": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -9922,7 +9539,6 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, - "peer": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -9938,7 +9554,6 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -9951,7 +9566,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "peer": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -9963,8 +9577,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -9976,7 +9589,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11648,7 +11260,6 @@ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, - "peer": true, "engines": { "node": ">=12.0.0" } @@ -11668,8 +11279,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -11679,15 +11289,13 @@ "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -11710,7 +11318,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -11720,7 +11327,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11737,15 +11343,13 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/launch-editor": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, - "peer": true, "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -11764,7 +11368,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -11796,7 +11399,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true, "engines": { "node": ">=6.11.5" } @@ -11806,7 +11408,6 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, - "peer": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -11821,7 +11422,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "peer": true, "dependencies": { "minimist": "^1.2.0" }, @@ -11859,8 +11459,7 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/lodash.throttle": { "version": "4.1.1", @@ -11871,8 +11470,7 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", @@ -11931,7 +11529,6 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" }, @@ -11960,7 +11557,6 @@ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -11981,7 +11577,6 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, - "peer": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -11992,15 +11587,13 @@ "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, - "peer": true + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -12010,7 +11603,6 @@ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "peer": true, "dependencies": { "fs-monkey": "^1.0.4" }, @@ -12023,7 +11615,6 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, - "peer": true, "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^7.0.0", @@ -12050,7 +11641,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -12062,15 +11652,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/merge-source-map": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "dev": true, - "peer": true, "dependencies": { "source-map": "^0.6.1" } @@ -12085,7 +11673,6 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "peer": true, "engines": { "node": ">= 8" } @@ -12095,7 +11682,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -12117,7 +11703,6 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -12130,15 +11715,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "peer": true, "bin": { "mime": "cli.js" }, @@ -12178,7 +11761,6 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -12187,15 +11769,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/minimatch": { "version": "9.0.3", @@ -12216,7 +11796,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12226,7 +11805,6 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "peer": true, "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -12246,7 +11824,6 @@ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, - "peer": true, "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -12282,7 +11859,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -12290,15 +11866,13 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "peer": true, "engines": { "node": ">= 6.13.0" } @@ -12321,7 +11895,6 @@ "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", "dev": true, - "peer": true, "dependencies": { "assert": "^2.0.0", "browserify-zlib": "^0.2.0", @@ -12361,7 +11934,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "peer": true, "engines": { "node": ">=12.20" }, @@ -12379,7 +11951,6 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "peer": true, "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -12395,7 +11966,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -12408,7 +11978,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -12423,8 +11992,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -12450,7 +12018,6 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "peer": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -12463,7 +12030,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12473,7 +12039,6 @@ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -12490,7 +12055,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" } @@ -12500,7 +12064,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -12519,7 +12082,6 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -12537,7 +12099,6 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, - "peer": true, "dependencies": { "array.prototype.filter": "^1.0.3", "call-bind": "^1.0.5", @@ -12551,7 +12112,6 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -12568,15 +12128,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -12589,7 +12147,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -12621,7 +12178,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "peer": true, "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -12639,7 +12195,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, - "peer": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -12656,8 +12211,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/p-limit": { "version": "3.1.0", @@ -12703,7 +12257,6 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, - "peer": true, "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -12724,15 +12277,13 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -12745,7 +12296,6 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, - "peer": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -12776,7 +12326,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -12785,8 +12334,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/path-exists": { "version": "4.0.0", @@ -12821,15 +12369,13 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -12839,7 +12385,6 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, - "peer": true, "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -12888,7 +12433,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, - "peer": true, "dependencies": { "find-up": "^6.3.0" }, @@ -12904,7 +12448,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "peer": true, "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -12921,7 +12464,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "peer": true, "dependencies": { "p-locate": "^6.0.0" }, @@ -12937,7 +12479,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "peer": true, "dependencies": { "yocto-queue": "^1.0.0" }, @@ -12953,7 +12494,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "peer": true, "dependencies": { "p-limit": "^4.0.0" }, @@ -12969,7 +12509,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -12979,7 +12518,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "peer": true, "engines": { "node": ">=12.20" }, @@ -13002,7 +12540,6 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" } @@ -13025,6 +12562,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -13039,7 +12577,6 @@ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz", "integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==", "dev": true, - "peer": true, "dependencies": { "htmlparser2": "^8.0.0", "js-tokens": "^8.0.0", @@ -13054,22 +12591,19 @@ "version": "8.0.3", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "peer": true + "dev": true }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "peer": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -13082,7 +12616,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", "dev": true, - "peer": true, "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -13100,7 +12633,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", "dev": true, - "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -13116,7 +12648,6 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "peer": true, "dependencies": { "icss-utils": "^5.0.0" }, @@ -13131,15 +12662,13 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", "dev": true, - "peer": true, "engines": { "node": ">=12.0" }, @@ -13170,7 +12699,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "engines": { "node": ">=12.0" }, @@ -13196,15 +12724,13 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -13253,7 +12779,6 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6.0" } @@ -13262,8 +12787,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true + "dev": true }, "node_modules/prompts": { "version": "2.4.2", @@ -13282,7 +12806,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -13296,7 +12819,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "peer": true, "engines": { "node": ">= 0.10" } @@ -13305,15 +12827,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, - "peer": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -13327,14 +12847,12 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "peer": true, "engines": { "node": ">=6" } @@ -13359,7 +12877,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, - "peer": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -13375,7 +12892,6 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "dev": true, - "peer": true, "engines": { "node": ">=0.4.x" } @@ -13398,15 +12914,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -13418,7 +12932,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -13428,7 +12941,6 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, - "peer": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -13439,7 +12951,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -13449,7 +12960,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, - "peer": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -13465,7 +12975,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -13480,7 +12989,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", "dev": true, - "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^3.0.2", @@ -13499,7 +13007,6 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", "dev": true, - "peer": true, "dependencies": { "find-up": "^5.0.0", "read-pkg": "^6.0.0", @@ -13517,7 +13024,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13534,7 +13040,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -13550,7 +13055,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -13566,7 +13070,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -13579,7 +13082,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -13592,7 +13094,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -13621,7 +13122,6 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, - "peer": true, "dependencies": { "resolve": "^1.20.0" }, @@ -13634,7 +13134,6 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, - "peer": true, "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -13680,7 +13179,6 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -13742,7 +13240,6 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -13752,7 +13249,6 @@ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.5" } @@ -13761,8 +13257,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/resolve": { "version": "1.22.8", @@ -13804,7 +13299,6 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -13822,7 +13316,6 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "peer": true, "engines": { "node": ">= 4" } @@ -13832,7 +13325,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "peer": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -13843,7 +13335,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -13859,7 +13350,6 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, - "peer": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -13884,7 +13374,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -13894,7 +13383,6 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.5", "get-intrinsic": "^1.2.2", @@ -13925,15 +13413,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -13950,8 +13436,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/sass": { "version": "1.71.1", @@ -14014,7 +13499,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -14051,7 +13535,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -14063,8 +13546,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "dev": true }, "node_modules/scrollparent": { "version": "2.1.0", @@ -14075,15 +13557,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "peer": true, "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -14105,7 +13585,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -14130,7 +13609,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14139,21 +13617,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -14163,7 +13638,6 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, - "peer": true, "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -14182,7 +13656,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14192,7 +13665,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -14202,7 +13674,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, - "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -14217,29 +13688,25 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.6" } @@ -14249,7 +13716,6 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, - "peer": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -14265,7 +13731,6 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dev": true, - "peer": true, "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", @@ -14283,7 +13748,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -14298,22 +13762,19 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -14327,7 +13788,6 @@ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "peer": true, "dependencies": { "kind-of": "^6.0.2" }, @@ -14359,7 +13819,6 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14380,7 +13839,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -14417,7 +13875,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -14435,7 +13892,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14451,7 +13907,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14463,15 +13918,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "peer": true, "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -14508,7 +13961,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -14519,7 +13971,6 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -14529,15 +13980,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -14547,15 +13996,13 @@ "version": "3.0.17", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -14572,7 +14019,6 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -14587,7 +14033,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14631,7 +14076,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -14641,7 +14085,6 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dev": true, - "peer": true, "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -14652,7 +14095,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14667,7 +14109,6 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, - "peer": true, "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -14680,7 +14121,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14695,7 +14135,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -14758,7 +14197,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -14776,7 +14214,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -14791,7 +14228,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -14833,7 +14269,6 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, - "peer": true, "dependencies": { "min-indent": "^1.0.1" }, @@ -14864,6 +14299,7 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "peer": true, "engines": { "node": ">= 12.13.0" }, @@ -14879,8 +14315,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/stylelint": { "version": "15.11.0", @@ -14946,7 +14381,6 @@ "resolved": "https://registry.npmjs.org/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz", "integrity": "sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==", "dev": true, - "peer": true, "engines": { "node": "^12 || >=14" }, @@ -14963,7 +14397,6 @@ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-13.0.0.tgz", "integrity": "sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==", "dev": true, - "peer": true, "engines": { "node": "^14.13.1 || >=16.0.0" }, @@ -14997,7 +14430,6 @@ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.5.0.tgz", "integrity": "sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==", "dev": true, - "peer": true, "dependencies": { "semver": "^7.3.5", "stylelint-config-html": ">=1.0.0", @@ -15019,7 +14451,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -15032,7 +14463,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -15047,15 +14477,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/stylelint-scss": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-5.3.2.tgz", "integrity": "sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==", "dev": true, - "peer": true, "dependencies": { "known-css-properties": "^0.29.0", "postcss-media-query-parser": "^0.2.3", @@ -15071,15 +14499,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/stylelint/node_modules/file-entry-cache": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", "dev": true, - "peer": true, "dependencies": { "flat-cache": "^3.2.0" }, @@ -15092,7 +14518,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "peer": true, "engines": { "node": ">=14" }, @@ -15105,7 +14530,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -15130,7 +14554,6 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", "dev": true, - "peer": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -15144,7 +14567,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -15154,7 +14576,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15177,8 +14598,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tabbable": { "version": "5.3.3", @@ -15190,7 +14610,6 @@ "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, - "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -15207,7 +14626,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -15223,14 +14641,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "peer": true, "engines": { "node": ">=6" } @@ -15239,7 +14655,6 @@ "version": "5.27.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -15257,7 +14672,6 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -15291,7 +14705,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, "engines": { "node": ">=8" } @@ -15300,7 +14713,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -15314,7 +14726,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -15332,7 +14743,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15346,14 +14756,12 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15396,22 +14804,19 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, - "peer": true, "dependencies": { "setimmediate": "^1.0.4" }, @@ -15458,7 +14863,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "peer": true, "engines": { "node": ">=0.6" } @@ -15473,7 +14877,6 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, - "peer": true, "engines": { "node": ">=12" }, @@ -15486,7 +14889,6 @@ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", "dev": true, - "peer": true, "engines": { "node": ">=16" }, @@ -15499,7 +14901,6 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "peer": true, "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -15512,7 +14913,6 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "peer": true, "dependencies": { "minimist": "^1.2.0" }, @@ -15525,7 +14925,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -15534,15 +14933,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -15574,7 +14971,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "peer": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -15588,7 +14984,6 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -15603,7 +14998,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -15623,7 +15017,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, - "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -15644,7 +15037,6 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -15679,7 +15071,6 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -15736,7 +15127,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -15774,7 +15164,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -15784,7 +15173,6 @@ "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, - "peer": true, "dependencies": { "punycode": "^1.4.1", "qs": "^6.11.2" @@ -15794,15 +15182,13 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -15815,15 +15201,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -15874,7 +15258,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -15885,7 +15268,6 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15896,7 +15278,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8" } @@ -15905,8 +15286,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/vscode-oniguruma": { "version": "1.7.0", @@ -15923,6 +15303,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "peer": true, "dependencies": { "@vue/compiler-sfc": "2.7.16", "csstype": "^3.1.0" @@ -15944,7 +15325,6 @@ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", "dev": true, - "peer": true, "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", @@ -15969,7 +15349,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -15986,7 +15365,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -15999,7 +15377,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "peer": true, "engines": { "node": ">=4.0" } @@ -16009,7 +15386,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -16022,7 +15398,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, - "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -16037,15 +15412,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true, - "peer": true + "dev": true }, "node_modules/vue-loader": { "version": "15.11.1", @@ -16116,7 +15489,6 @@ "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", "dev": true, - "peer": true, "dependencies": { "hash-sum": "^1.0.2", "loader-utils": "^1.0.2" @@ -16137,8 +15509,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/vue-virtual-scroller": { "version": "1.1.2", @@ -16184,7 +15555,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -16198,7 +15568,6 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -16301,7 +15670,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "peer": true, "engines": { "node": ">=14" } @@ -16311,7 +15679,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, - "peer": true, "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -16395,7 +15762,6 @@ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, - "peer": true, "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -16409,7 +15775,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "peer": true, "engines": { "node": ">=10.13.0" } @@ -16418,7 +15783,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16437,7 +15801,6 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "peer": true, "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -16452,7 +15815,6 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, - "peer": true, "engines": { "node": ">=0.8.0" } @@ -16476,7 +15838,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "peer": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -16493,7 +15854,6 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, - "peer": true, "dependencies": { "available-typed-arrays": "^1.0.6", "call-bind": "^1.0.5", @@ -16512,8 +15872,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -16583,7 +15942,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -16605,7 +15963,6 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, - "peer": true, "engines": { "node": ">=12" } @@ -16615,7 +15972,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "peer": true, "engines": { "node": ">=0.4" } @@ -16655,7 +16011,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "peer": true, "engines": { "node": ">=10" } diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/.travis.yml b/ncp-previewgenerator/ncp-previewgenerator-nc20/.travis.yml deleted file mode 100644 index 66f01ba7e..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/.travis.yml +++ /dev/null @@ -1,45 +0,0 @@ -language: php -php: - - 7 - - 7.1 - - 7.2 - -env: - global: - - CORE_BRANCH=master - - APP_NAME=previewgenerator - matrix: - - DB=sqlite - -branches: - only: - - master - - /^stable\d+(\.\d+)?$/ - -before_install: - - wget https://raw.githubusercontent.com/nextcloud/travis_ci/master/before_install.sh - - . ./before_install.sh $APP_NAME $CORE_BRANCH $DB - - # Add some output debugging information - - cd ../server - - ./occ check - - ./occ status - - ./occ app:list - - ./occ app:enable $APP_NAME - -script: - - cd apps/$APP_NAME/ - - # Test the app - - sh -c "find . -name \*.php -exec php -l \"{}\" \;;" - - cd ../../ - #- sh -c "./occ app:check-code $APP_NAME -c private -c strong-comparison;" - #- sh -c "./occ app:check-code $APP_NAME -c deprecation;" - - cd apps/$APP_NAME/ - - # Run phpunit tests - - cd tests/ - - sh -c "phpunit --configuration phpunit.xml" - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/CHANGELOG.md b/ncp-previewgenerator/ncp-previewgenerator-nc20/CHANGELOG.md deleted file mode 100644 index 507faa277..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/CHANGELOG.md +++ /dev/null @@ -1,82 +0,0 @@ -## 2.1.0 - 2019-03-05 -### Added -- Nextcloud 16 support - -## 2.0.0 - 2018-11-08 - -- PHP 7.x required -- Nextcloud 14 only -- Moved to migrations for DB handling -- Added path option to generate command (thanks to @adduxa) -- Nextcloud 15 compatible - -## 1.0.9 - 2017-12-29 - -### Fixes - -### Added -- Show timestamp in occ commands [#88](https://github.com/rullzer/previewgenerator/pull/88) -- Add Composer Classmap for file (NC13) [#90](https://github.com/rullzer/previewgenerator/pull/90) -- Respect .nomedia [#92](https://github.com/rullzer/previewgenerator/pull/92) -- Use PID to check for already running process [#93](https://github.com/rullzer/previewgenerator/pull/93) - -## 1.0.8 - 2017-12-21 - -### Fixes -- Do not add file if it already is in the table [#86](https://github.com/rullzer/previewgenerator/pull/86) - -### Added -- Allow to specify sizes to be generated [#87](https://github.com/rullzer/previewgenerator/pull/86) - -## 1.0.7 - 2017-09-26 - -### Fixes -- Updated/Fixed README - - [#55](https://github.com/rullzer/previewgenerator/pull/55) @Eeems - - [#58](https://github.com/rullzer/previewgenerator/pull/58) @MichaIng - - [#67](https://github.com/rullzer/previewgenerator/pull/67) @sndrr -- Avoid folder processing on pre-generate [#73](https://github.com/rullzer/previewgenerator/pull/73) @Seik - -### Added -- Make NC13 Compatible [#63](https://github.com/rullzer/previewgenerator/pull/63) - -## 1.0.6 - 2017-05-05 - -### Fixed -- Better preview error handling [#51](https://github.com/rullzer/previewgenerator/pull/51) @icewind1991 -- Travis test runs [#53](https://github.com/rullzer/previewgenerator/pull/53) - -### Added -- README.md [#52](https://github.com/rullzer/previewgenerator/pull/52) -- CHANGELOG.md [#52](https://github.com/rullzer/previewgenerator/pull/52) - -## 1.0.5 - 2017-03-17 - -### Added -- Generate more preview sizes -- Add --force command to break lock - -## 1.0.4 - 2017-03-14 - -### Fixed -- Lock timeout was 30 hours instead of minutes - -## 1.0.3 - 2017-03-14 - -### Added -- Do not use app with encryption -- Check for already running command - -## 1.0.2 - 2017-03-08 - -### Added -- More verbose output of commands -- Hack around preview generation errors by not trying the file again in the next run - -## 1.0.1 - 2016-12-08 - -### Fixed -- Pimp info.xml - -## 1.0.0 – 2016-12-07 -Initial release diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/LICENSE b/ncp-previewgenerator/ncp-previewgenerator-nc20/LICENSE deleted file mode 100644 index dbbe35581..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/Makefile b/ncp-previewgenerator/ncp-previewgenerator-nc20/Makefile deleted file mode 100644 index 4cb7cb0d3..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# Makefile for building the project - -app_name=previewgenerator -project_dir=$(CURDIR)/../$(app_name) -build_dir=$(CURDIR)/build/artifacts -sign_dir=$(build_dir)/sign -appstore_dir=$(build_dir)/appstore -source_dir=$(build_dir)/source -package_name=$(app_name) -cert_dir=$(HOME)/.nextcloud/certificates - -appstore: - mkdir -p $(sign_dir) - rsync -a \ - --exclude=.git \ - --exclude=build \ - --exclude=.gitignore \ - --exclude=.travis.yml \ - --exclude=.scrutinizer.yml \ - --exclude=CONTRIBUTING.md \ - --exclude=composer.json \ - --exclude=composer.lock \ - --exclude=composer.phar \ - --exclude=l10n/.tx \ - --exclude=l10n/no-php \ - --exclude=Makefile \ - --exclude=nbproject \ - --exclude=screenshots \ - --exclude=phpunit*xml \ - --exclude=tests \ - --exclude=vendor/bin \ - $(project_dir) $(sign_dir) - @echo "Signing…" - tar -czf $(build_dir)/$(app_name).tar.gz \ - -C $(sign_dir) $(app_name) - openssl dgst -sha512 -sign $(cert_dir)/$(app_name).key $(build_dir)/$(app_name).tar.gz | openssl base64 diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/README.md b/ncp-previewgenerator/ncp-previewgenerator-nc20/README.md deleted file mode 100644 index 98bb4103e..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Preview Generator - -Nextcloud app that allows admins to pre-generate previews. The app listens to -edit events and stores this information. Once a cron job is triggered it will -start preview generation. This means that you can better utilize your -system by pre-generating previews when your system is normally idle and thus -putting less load on your machine when the requests are actually served. - -The app does not replace on demand preview generation so if a preview is -requested before it is pre-generated it will still be shown. - -## How to install - -* Install directly from within your Nextcloud from the [app store](https://apps.nextcloud.com/apps/previewgenerator) -* Clone this repository in you Nextcloud app folder - -## How to use the app - -1. Install the app -2. Enable the app -3. Run `./occ preview:generate-all` once after installation. -4. Add a (system) cron job for ` ./occ preview:pre-generate` - * I run it every 10 minutes - -## Known issues - -* The app does not work with encryption enabled - -## How does the app work - -1. Listen to events that a file has been written or modified and store it in the database -2. On cron run request previews for the files that have been written or modified - -If a preview already exists at step 2 then requesting it is really cheap. If not -it will be generated. Depending on the sizes of the files and the hardware you -are running on the time this takes can vary. - -## Commands - -### preview:delete_old - -This removes the previews from the old preview location that was used before -Nextcloud 11. That has some issues. Note that the gallery shipped with Nextcloud -11 did not yet use this location. So you might want to run it again with Nextcloud 12. - -### preview:generate-all [user-id] - -Loop over all files and try to generate previews for them. If `user-id` is supplied -just loop over the files for that user. - -### preview:pre-generate - -Do the actual pregeneration. This means only for new or modified files (since -the app was enabled or the last pregeneration was done). - -## FAQ - -### Why can't I use webcron? - -Preview generation can be a very long running job. Thus we need a system that -does not time out. - -### It sometimes crashed - -Yes this happens. Most of it is due to corrupted files not being handled that gracefully -in the Nextcloud server. Improvements in this area are coming with Nextcloud 12 - -### I get "Command already running" - -Yes this happens when the `pre-generate` command crashes. No worries the lock -will be released after 30 minutes of inactivity from the app. So go grab a cookie. - -### I don't want to generate all the preview sizes - -This is possible since version 1.0.8. Just set the correct values via the command line - -``` -./occ config:app:set --value="32 64 1024" previewgenerator squareSizes -./occ config:app:set --value="64 128 1024" previewgenerator widthSizes -./occ config:app:set --value="64 256 1024" previewgenerator heightSizes -``` - -This will only generate: - * square previews of: 32x32, 64x64 and 1024x1024 - * aspect ratio previews with a width of: 64, 128 and 1024 - * aspect ratio previews with a height of: 64, 256 and 1024 - -Note: - * preview sizes are always a power of 2. - * The smallest size is 32 - * The max size is determined by your preview settings in config.php - - ### I get "PHP Fatal error: Allowed memory size of X bytes exhausted" - You need to increase the memory allowance of PHP, by default it is 128 MB. You do that by changing the memory_limit in the php.ini file. - - If you use the docker container you need to create the php.ini file in /usr/local/etc/php first. diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/app.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/app.php deleted file mode 100644 index 781cab2f5..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/app.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -$app = new \OCA\PreviewGenerator\AppInfo\Application(); diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/info.xml b/ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/info.xml deleted file mode 100644 index f28e35f2f..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/appinfo/info.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - previewgenerator - NCP Preview Generator - A faster preview pre-generation app - - - AGPL - Roeland Jago Douma and Ignacio Nunez - 102.2.0 - PreviewGenerator - multimedia - https://nextcloudpi.com - https://github.com/nextcloud/nextcloudpi/issues - https://github.com/nextcloud/nextcloudpi - - - - - - - - - - OCA\PreviewGenerator\Command\Generate - OCA\PreviewGenerator\Command\DeleteOld - OCA\PreviewGenerator\Command\PreGenerate - - diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/autoload.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/autoload.php deleted file mode 100644 index 9d93afc1a..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/LICENSE b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/LICENSE deleted file mode 100644 index f27399a04..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_classmap.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_classmap.php deleted file mode 100644 index 26656a366..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_classmap.php +++ /dev/null @@ -1,18 +0,0 @@ - $baseDir . '/../lib/AppInfo/Application.php', - 'OCA\\PreviewGenerator\\Command\\DeleteOld' => $baseDir . '/../lib/Command/DeleteOld.php', - 'OCA\\PreviewGenerator\\Command\\Generate' => $baseDir . '/../lib/Command/Generate.php', - 'OCA\\PreviewGenerator\\Command\\PreGenerate' => $baseDir . '/../lib/Command/PreGenerate.php', - 'OCA\\PreviewGenerator\\Command\\TimestampFormatter' => $baseDir . '/../lib/Command/TimestampFormatter.php', - 'OCA\\PreviewGenerator\\Migration\\Version020000Date20180823071939' => $baseDir . '/../lib/Migration/Version020000Date20180823071939.php', - 'OCA\\PreviewGenerator\\Migration\\Version020200Date20190608205303' => $baseDir . '/../lib/Migration/Version020200Date20190608205303.php', - 'OCA\\PreviewGenerator\\SizeHelper' => $baseDir . '/../lib/SizeHelper.php', - 'OCA\\PreviewGenerator\\Watcher' => $baseDir . '/../lib/Watcher.php', -); diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_namespaces.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_namespaces.php deleted file mode 100644 index 71c9e9185..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($baseDir . '/../lib'), -); diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_real.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_real.php deleted file mode 100644 index 61e74c66d..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_real.php +++ /dev/null @@ -1,43 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitPreviewGenerator::getInitializer($loader)); - } else { - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->setClassMapAuthoritative(true); - $loader->register(true); - - return $loader; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_static.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_static.php deleted file mode 100644 index b2d98620f..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/autoload_static.php +++ /dev/null @@ -1,44 +0,0 @@ - - array ( - 'OCA\\PreviewGenerator\\' => 21, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'OCA\\PreviewGenerator\\' => - array ( - 0 => __DIR__ . '/..' . '/../lib', - ), - ); - - public static $classMap = array ( - 'OCA\\PreviewGenerator\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php', - 'OCA\\PreviewGenerator\\Command\\DeleteOld' => __DIR__ . '/..' . '/../lib/Command/DeleteOld.php', - 'OCA\\PreviewGenerator\\Command\\Generate' => __DIR__ . '/..' . '/../lib/Command/Generate.php', - 'OCA\\PreviewGenerator\\Command\\PreGenerate' => __DIR__ . '/..' . '/../lib/Command/PreGenerate.php', - 'OCA\\PreviewGenerator\\Command\\TimestampFormatter' => __DIR__ . '/..' . '/../lib/Command/TimestampFormatter.php', - 'OCA\\PreviewGenerator\\Migration\\Version020000Date20180823071939' => __DIR__ . '/..' . '/../lib/Migration/Version020000Date20180823071939.php', - 'OCA\\PreviewGenerator\\Migration\\Version020200Date20190608205303' => __DIR__ . '/..' . '/../lib/Migration/Version020200Date20190608205303.php', - 'OCA\\PreviewGenerator\\SizeHelper' => __DIR__ . '/..' . '/../lib/SizeHelper.php', - 'OCA\\PreviewGenerator\\Watcher' => __DIR__ . '/..' . '/../lib/Watcher.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitPreviewGenerator::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitPreviewGenerator::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInitPreviewGenerator::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/installed.json b/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/installed.json deleted file mode 100644 index fe51488c7..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/composer/composer/installed.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/AppInfo/Application.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/AppInfo/Application.php deleted file mode 100644 index e61dad842..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/AppInfo/Application.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\AppInfo; - -use OCA\PreviewGenerator\Watcher; -use OCP\AppFramework\App; -use OCP\AppFramework\IAppContainer; -use OCP\Files\IRootFolder; -use OCP\Files\Node; - -class Application extends App { - - const APPNAME='previewgenerator'; - - public function __construct() { - parent::__construct(self::APPNAME); - - $container = $this->getContainer(); - $this->connectWatcher($container); - } - - private function connectWatcher(IAppContainer $container) { - /** @var IRootFolder $root */ - $root = $container->query(IRootFolder::class); - $root->listen('\OC\Files', 'postWrite', function (Node $node) use ($container) { - /** @var Watcher $watcher */ - $watcher = $container->query(Watcher::class); - $watcher->postWrite($node); - }); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/DeleteOld.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/DeleteOld.php deleted file mode 100644 index d0ace747f..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/DeleteOld.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Command; - -use OCP\Files\Folder; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IUser; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -class DeleteOld extends Command { - - /** @var IUserManager */ - protected $userManager; - - /** @var IRootFolder */ - protected $rootFolder; - - public function __construct(IRootFolder $rootFolder, - IUserManager $userManager) { - parent::__construct(); - - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - } - - protected function configure() { - $this - ->setName('preview:delete_old') - ->setDescription('Delete old preview folder (pre NC11)') - ->addArgument( - 'user_id', - InputArgument::OPTIONAL, - 'Delete old preview folder for the given user' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output): int { - $userId = $input->getArgument('user_id'); - - if ($userId === null) { - $this->userManager->callForSeenUsers(function (IUser $user) { - $this->deletePreviews($user); - }); - } else { - $user = $this->userManager->get($userId); - if ($user !== null) { - $this->deletePreviews($user); - } - } - - return 0; - } - - private function deletePreviews(IUser $user) { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($user->getUID()); - - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $userRoot = $userFolder->getParent(); - - try { - /** @var Folder $thumbnails */ - $thumbnails = $userRoot->get('thumbnails'); - $thumbnails->delete(); - } catch (NotFoundException $e) { - //Ignore - } - } - - -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/Generate.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/Generate.php deleted file mode 100644 index 7aafad986..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/Generate.php +++ /dev/null @@ -1,250 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator\Command; - -use OCA\PreviewGenerator\SizeHelper; -use OCP\Encryption\IManager; -use OCP\Files\File; -use OCP\Files\Folder; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\IPreview; -use OCP\IUser; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class Generate extends Command { - - /** @var IUserManager */ - protected $userManager; - - /** @var IRootFolder */ - protected $rootFolder; - - /** @var IPreview */ - protected $previewGenerator; - - /** @var IConfig */ - protected $config; - - /** @var IDBConnection */ - protected $connection; - - /** @var OutputInterface */ - protected $output; - - /** @var int[][] */ - protected $sizes; - - /** @var IManager */ - protected $encryptionManager; - - public function __construct(IRootFolder $rootFolder, - IUserManager $userManager, - IPreview $previewGenerator, - IConfig $config, - IDBConnection $connection, - IManager $encryptionManager) { - parent::__construct(); - - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - $this->previewGenerator = $previewGenerator; - $this->config = $config; - $this->connection = $connection; - $this->encryptionManager = $encryptionManager; - } - - protected function configure() { - $this - ->setName('preview:generate-all') - ->setDescription('Generate previews') - ->addArgument( - 'user_id', - InputArgument::OPTIONAL, - 'Generate previews for the given user' - )->addOption( - 'path', - 'p', - InputOption::VALUE_OPTIONAL, - 'limit scan to this path, eg. --path="/alice/files/Photos", the user_id is determined by the path and the user_id parameter is ignored' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output): int { - if ($this->encryptionManager->isEnabled()) { - $output->writeln('Encryption is enabled. Aborted.'); - return 1; - } - - // Set timestamp output - $formatter = new TimestampFormatter($this->config, $output->getFormatter()); - $output->setFormatter($formatter); - $this->output = $output; - - $this->sizes = SizeHelper::calculateSizes($this->config); - - $inputPath = $input->getOption('path'); - if ($inputPath) { - $inputPath = '/' . trim($inputPath, '/'); - list (, $userId,) = explode('/', $inputPath, 3); - $user = $this->userManager->get($userId); - if ($user !== null) { - $this->generatePathPreviews($user, $inputPath); - } - } else { - $userId = $input->getArgument('user_id'); - if ($userId === null) { - $this->userManager->callForSeenUsers(function (IUser $user) { - $this->generateUserPreviews($user); - }); - } else { - $user = $this->userManager->get($userId); - if ($user !== null) { - $this->generateUserPreviews($user); - } - } - } - - return 0; - } - - private function generatePathPreviews(IUser $user, string $path) { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($user->getUID()); - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - try { - $relativePath = $userFolder->getRelativePath($path); - } catch (NotFoundException $e) { - $this->output->writeln('Path not found'); - return; - } - $pathFolder = $userFolder->get($relativePath); - $this->processFolder($pathFolder, $user); - } - - private function generateUserPreviews(IUser $user) { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($user->getUID()); - - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $this->processFolder($userFolder, $user); - } - - private function processFolder(Folder $folder, IUser $user) { - // Respect the '.nomedia' file. If present don't traverse the folder - if ($folder->nodeExists('.nomedia')) { - $this->output->writeln('Skipping folder ' . $folder->getPath()); - return; - } - - // random sleep between 0 and 50ms to avoid collision between 2 processes - usleep(rand(0,50000)); - - $this->output->writeln('Scanning folder ' . $folder->getPath()); - - $nodes = $folder->getDirectoryListing(); - - foreach ($nodes as $node) { - if ($node instanceof Folder) { - $this->processFolder($node, $user); - } else if ($node instanceof File) { - $is_locked = false; - $qb = $this->connection->getQueryBuilder(); - $row = $qb->select('*') - ->from('preview_generation') - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId()))) - ->setMaxResults(1) - ->execute() - ->fetch(); - if ($row !== false) { - if ($row['locked'] == 1) { - // already being processed - $is_locked = true; - } else { - $qb->update('preview_generation') - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId()))) - ->set('locked', $qb->createNamedParameter(true)) - ->execute(); - } - } else { - $qb->insert('preview_generation') - ->values([ - 'uid' => $qb->createNamedParameter($user->getUID()), - 'file_id' => $qb->createNamedParameter($node->getId()), - 'locked' => $qb->createNamedParameter(true), - ]) - ->execute(); - } - - if ($is_locked === false) { - try { - $this->processFile($node); - } finally { - $qb->delete('preview_generation') - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId()))) - ->execute(); - } - } - } - } - } - - private function processFile(File $file) { - if ($this->previewGenerator->isMimeSupported($file->getMimeType())) { - if ($this->output->getVerbosity() > OutputInterface::VERBOSITY_VERBOSE) { - $this->output->writeln('Generating previews for ' . $file->getPath()); - } - - try { - foreach ($this->sizes['square'] as $size) { - $this->previewGenerator->getPreview($file, $size, $size, true); - } - - // Height previews - foreach ($this->sizes['height'] as $height) { - $this->previewGenerator->getPreview($file, -1, $height, false); - } - - // Width previews - foreach ($this->sizes['width'] as $width) { - $this->previewGenerator->getPreview($file, $width, -1, false); - } - } catch (NotFoundException $e) { - // Maybe log that previews could not be generated? - } catch (\InvalidArgumentException $e) { - $error = $e->getMessage(); - $this->output->writeln("${error}"); - } - } - } - -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/PreGenerate.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/PreGenerate.php deleted file mode 100644 index 5f34fca9a..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/PreGenerate.php +++ /dev/null @@ -1,221 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Command; - -use OCA\PreviewGenerator\SizeHelper; -use OCP\AppFramework\Utility\ITimeFactory; -use OCP\Encryption\IManager; -use OCP\Files\File; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\IPreview; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class PreGenerate extends Command { - - /** @var string */ - protected $appName; - - /** @var IUserManager */ - protected $userManager; - - /** @var IRootFolder */ - protected $rootFolder; - - /** @var IPreview */ - protected $previewGenerator; - - /** @var IConfig */ - protected $config; - - /** @var IDBConnection */ - protected $connection; - - /** @var OutputInterface */ - protected $output; - - /** @var int[][] */ - protected $sizes; - - /** @var IManager */ - protected $encryptionManager; - - /** @var ITimeFactory */ - protected $time; - - /** - * @param string $appName - * @param IRootFolder $rootFolder - * @param IUserManager $userManager - * @param IPreview $previewGenerator - * @param IConfig $config - * @param IDBConnection $connection - * @param IManager $encryptionManager - * @param ITimeFactory $time - */ - public function __construct($appName, - IRootFolder $rootFolder, - IUserManager $userManager, - IPreview $previewGenerator, - IConfig $config, - IDBConnection $connection, - IManager $encryptionManager, - ITimeFactory $time) { - parent::__construct(); - - $this->appName = $appName; - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - $this->previewGenerator = $previewGenerator; - $this->config = $config; - $this->connection = $connection; - $this->encryptionManager = $encryptionManager; - $this->time = $time; - } - - protected function configure() { - $this - ->setName('preview:pre-generate') - ->setDescription('Pre generate previews'); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * @return int - */ - protected function execute(InputInterface $input, OutputInterface $output) { - if ($this->encryptionManager->isEnabled()) { - $output->writeln('Encryption is enabled. Aborted.'); - return 1; - } - - // Set timestamp output - $formatter = new TimestampFormatter($this->config, $output->getFormatter()); - $output->setFormatter($formatter); - $this->output = $output; - - $this->sizes = SizeHelper::calculateSizes($this->config); - $this->startProcessing(); - - return 0; - } - - private function startProcessing() { - // random sleep between 0 and 50ms to avoid collision between 2 processes - usleep(rand(0,50000)); - - while(true) { - $qb = $this->connection->getQueryBuilder(); - $row = $qb->select('*') - ->from('preview_generation') - ->where($qb->expr()->eq('locked', $qb->createNamedParameter(false))) - ->setMaxResults(1) - ->execute() - ->fetch(); - - if ($row === false) { - break; - } - - $qb->update('preview_generation') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($row['id']))) - ->set('locked', $qb->createNamedParameter(true)) - ->execute(); - try { - $this->processRow($row); - } finally { - $qb->delete('preview_generation') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($row['id']))) - ->execute(); - } - } - } - - private function processRow($row) { - //Get user - $user = $this->userManager->get($row['uid']); - - if ($user === null) { - return; - } - - try { - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $userRoot = $userFolder->getParent(); - } catch (NotFoundException $e) { - return; - } - - //Get node - $nodes = $userRoot->getById($row['file_id']); - - if ($nodes === []) { - return; - } - - $node = $nodes[0]; - if ($node instanceof File) { - $this->processFile($node); - } - } - - private function processFile(File $file) { - if ($this->previewGenerator->isMimeSupported($file->getMimeType())) { - if ($this->output->getVerbosity() > OutputInterface::VERBOSITY_VERBOSE) { - $this->output->writeln('Generating previews for ' . $file->getPath()); - } - - try { - foreach ($this->sizes['square'] as $size) { - $this->previewGenerator->getPreview($file, $size, $size, true); - } - - // Height previews - foreach ($this->sizes['height'] as $height) { - $this->previewGenerator->getPreview($file, -1, $height, false); - } - - // Width previews - foreach ($this->sizes['width'] as $width) { - $this->previewGenerator->getPreview($file, $width, -1, false); - } - } catch (NotFoundException $e) { - if ($this->output->getVerbosity() > OutputInterface::VERBOSITY_VERBOSE) { - $error = $e->getMessage(); - $this->output->writeln("${error} " . $file->getPath() . " not found."); - } - } catch (\InvalidArgumentException $e) { - $error = $e->getMessage(); - $this->output->writeln("${error}"); - } - } - } - -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/TimestampFormatter.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/TimestampFormatter.php deleted file mode 100644 index b7169392c..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Command/TimestampFormatter.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OCA\PreviewGenerator\Command; - -use OCP\IConfig; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Formatter\OutputFormatterStyleInterface; - -/** - * TODO: This was taken from the server. At some point we should have it in OCP - * and then just use that - * - * Class TimestampFormatter - * - * @package OCA\PreviewGenerator\Command - */ -class TimestampFormatter implements OutputFormatterInterface { - /** @var IConfig */ - protected $config; - - /** @var OutputFormatterInterface */ - protected $formatter; - - /** - * @param IConfig $config - * @param OutputFormatterInterface $formatter - */ - public function __construct(IConfig $config, OutputFormatterInterface $formatter) { - $this->config = $config; - $this->formatter = $formatter; - } - - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages or not - */ - public function setDecorated($decorated) { - $this->formatter->setDecorated($decorated); - } - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - */ - public function isDecorated(): bool { - return $this->formatter->isDecorated(); - } - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - */ - public function setStyle($name, OutputFormatterStyleInterface $style) { - $this->formatter->setStyle($name, $style); - } - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * @return bool - */ - public function hasStyle($name): bool { - return $this->formatter->hasStyle($name); - } - - /** - * Gets style options from style with specified name. - * - * @param string $name - * @return OutputFormatterStyleInterface - * @throws \InvalidArgumentException When style isn't defined - */ - public function getStyle($name): OutputFormatterStyleInterface { - return $this->formatter->getStyle($name); - } - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * @return string The styled message, prepended with a timestamp using the - * log timezone and dateformat, e.g. "2015-06-23T17:24:37+02:00" - */ - public function format($message): string { - - $timeZone = $this->config->getSystemValue('logtimezone', 'UTC'); - $timeZone = $timeZone !== null ? new \DateTimeZone($timeZone) : null; - - $time = new \DateTime('now', $timeZone); - $timestampInfo = $time->format($this->config->getSystemValue('logdateformat', \DateTime::ATOM)); - - return $timestampInfo . ' ' . $this->formatter->format($message); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020000Date20180823071939.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020000Date20180823071939.php deleted file mode 100644 index 7cebcd450..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020000Date20180823071939.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator\Migration; - -use OCP\DB\ISchemaWrapper; -use OCP\Migration\SimpleMigrationStep; -use OCP\Migration\IOutput; - -class Version020000Date20180823071939 extends SimpleMigrationStep { - - /** - * @param IOutput $output - * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` - * @param array $options - * @return null|ISchemaWrapper - */ - public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { - /** @var ISchemaWrapper $schema */ - $schema = $schemaClosure(); - - if (!$schema->hasTable('preview_generation')) { - $table = $schema->createTable('preview_generation'); - $table->addColumn('id', 'integer', [ - 'autoincrement' => true, - 'notnull' => true, - 'length' => 4, - ]); - $table->addColumn('uid', 'string', [ - 'notnull' => true, - 'length' => 256, - ]); - $table->addColumn('file_id', 'integer', [ - 'notnull' => true, - 'length' => 4, - ]); - $table->setPrimaryKey(['id']); - } - return $schema; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020200Date20190608205303.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020200Date20190608205303.php deleted file mode 100644 index dd6ad7f5e..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Migration/Version020200Date20190608205303.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * @author Ignacio Nunez - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator\Migration; - -use OCP\DB\ISchemaWrapper; -use OCP\Migration\SimpleMigrationStep; -use OCP\Migration\IOutput; -use Doctrine\DBAL\Types\Type; - -class Version020200Date20190608205303 extends SimpleMigrationStep { - - /** - * @param IOutput $output - * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` - * @param array $options - * @return null|ISchemaWrapper - */ - public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { - /** @var ISchemaWrapper $schema */ - $schema = $schemaClosure(); - $table = $schema->getTable('preview_generation'); - - if (!$table->hasColumn('locked')) { - $table->addColumn('locked', Type::BOOLEAN, [ - 'notnull' => true, - 'default' => 0, - ]); - } - return $schema; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/SizeHelper.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/SizeHelper.php deleted file mode 100644 index c49b253b3..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/SizeHelper.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator; - -use OCP\IConfig; - -class SizeHelper { - - public static function calculateSizes(IConfig $config): array { - /* - * First calculate the systems max sizes - */ - - $sizes = [ - 'square' => [], - 'height' => [], - 'width' => [], - ]; - - $maxW = (int)$config->getSystemValue('preview_max_x', 4096); - $maxH = (int)$config->getSystemValue('preview_max_y', 4096); - - $s = 32; - while($s <= $maxW || $s <= $maxH) { - $sizes['square'][] = $s; - $s *= 2; - } - - $w = 32; - while($w <= $maxW) { - $sizes['width'][] = $w; - $w *= 2; - } - - $h = 32; - while($h <= $maxH) { - $sizes['height'][] = $h; - $h *= 2; - } - - - /* - * Now calculate the user provided max sizes - * Note that only powers of 2 matter but if users supply different - * stuff it is their own fault and we just ignore it - */ - $getCustomSizes = function(IConfig $config, $key) { - $TXT = $config->getAppValue('previewgenerator', $key, ''); - $values = []; - if ($TXT !== '') { - foreach (explode(' ', $TXT) as $value) { - if (ctype_digit($value)) { - $values[] = (int)$value; - } - } - } - - return $values; - }; - - $squares = $getCustomSizes($config, 'squareSizes'); - $widths = $getCustomSizes($config, 'widthSizes'); - $heights = $getCustomSizes($config, 'heightSizes'); - - if ($squares !== []) { - $sizes['square'] = array_intersect($sizes['square'], $squares); - } - - if ($widths !== []) { - $sizes['width'] = array_intersect($sizes['width'], $widths); - } - - if ($heights !== []) { - $sizes['height'] = array_intersect($sizes['height'], $heights); - } - - return $sizes; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Watcher.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Watcher.php deleted file mode 100644 index 5344ff7bd..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/lib/Watcher.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator; - -use OCP\Files\Folder; -use OCP\Files\Node; -use OCP\IDBConnection; -use OCP\IUserManager; - -class Watcher { - - /** @var IDBConnection */ - private $connection; - - /** @var IUserManager */ - private $userManager; - - public function __construct(IDBConnection $connection, - IUserManager $userManager) { - $this->connection = $connection; - $this->userManager = $userManager; - } - - public function postWrite(Node $node) { - $absPath = ltrim($node->getPath(), '/'); - $owner = explode('/', $absPath)[0]; - - if ($node instanceof Folder || !$this->userManager->userExists($owner)) { - return; - } - - $qb = $this->connection->getQueryBuilder(); - $qb->select('id') - ->from('preview_generation') - ->where( - $qb->expr()->andX( - $qb->expr()->eq('uid', $qb->createNamedParameter($owner)), - $qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId())) - ) - )->setMaxResults(1); - $cursor = $qb->execute(); - $inTable = $cursor->fetch() !== false; - $cursor->closeCursor(); - - // Don't insert if there is already such an entry - if ($inTable) { - return; - } - - $qb = $this->connection->getQueryBuilder(); - $qb->insert('preview_generation') - ->setValue('uid', $qb->createNamedParameter($owner)) - ->setValue('file_id', $qb->createNamedParameter($node->getId())); - $qb->execute(); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/WatcherTest.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/WatcherTest.php deleted file mode 100644 index a89bbc052..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/WatcherTest.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Tests; - -use OCA\PreviewGenerator\Watcher; -use OCP\Files\Node; -use OCP\IDBConnection; -use OCP\IUserManager; -use Test\TestCase; - -/** - * Class WatcherTest - * - * @package OCA\PreviewGenerator\Tests - * @group DB - */ -class WatcherTest extends TestCase { - - /** @var IDBConnection */ - private $connection; - - /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ - private $userManager; - - /** @var Watcher */ - private $watcher; - - public function setUp() { - parent::setUp(); - - $this->connection = \OC::$server->getDatabaseConnection(); - $this->userManager = $this->createMock(IUserManager::class); - $this->watcher = new Watcher($this->connection, $this->userManager); - - $qb = $this->connection->getQueryBuilder(); - $qb->delete('preview_generation'); - } - - public function testPostWriteCantFindUser() { - $node = $this->createMock(Node::class); - $node->method('getPath') - ->willReturn('/foo/bar/baz'); - - $this->userManager->expects($this->once()) - ->method('userExists') - ->with('foo') - ->willReturn(false); - - $this->watcher->postWrite($node); - } - - public function testPostWrite() { - $node = $this->createMock(Node::class); - $node->method('getPath') - ->willReturn('/foo/bar/baz'); - $node->method('getId') - ->willReturn(42); - - $this->userManager->expects($this->once()) - ->method('userExists') - ->with('foo') - ->willReturn(true); - - $this->watcher->postWrite($node); - - $qb = $this->connection->getQueryBuilder(); - $qb->select('*') - ->from('preview_generation'); - $cursor = $qb->execute(); - $rows = $cursor->fetchAll(); - $cursor->closeCursor(); - - $this->assertCount(1, $rows); - $row = $rows[0]; - $this->assertSame('foo', $row['uid']); - $this->assertSame('42', $row['file_id']); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/bootstrap.php b/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/bootstrap.php deleted file mode 100644 index a26997652..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/bootstrap.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -define('PHPUNIT_RUN', 1); - -require_once __DIR__.'/../../../lib/base.php'; - -\OC_App::loadApp('previewgenerator'); - -OC_Hook::clear(); diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/phpunit.xml b/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/phpunit.xml deleted file mode 100644 index ca916756f..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc20/tests/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - . - - - - - ../ - - ../tests - - - - - - - - diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/.github/workflows/lint.yml b/ncp-previewgenerator/ncp-previewgenerator-nc21/.github/workflows/lint.yml deleted file mode 100644 index 97ea55a73..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/.github/workflows/lint.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Lint - -on: - pull_request: - push: - branches: - - master - - stable* - -jobs: - php: - runs-on: ubuntu-latest - - strategy: - matrix: - php-versions: ['7.3', '7.4', '8.0'] - - name: php${{ matrix.php-versions }} - steps: - - uses: actions/checkout@v2 - - - name: Set up php ${{ matrix.php-versions }} - uses: shivammathur/setup-php@v1 - with: - php-version: ${{ matrix.php-versions }} - coverage: none - - - name: Lint - run: composer run lint - - php-cs-fixer: - runs-on: ubuntu-latest - - strategy: - matrix: - php-versions: ['7.4'] - - name: cs php${{ matrix.php-versions }} - steps: - - name: Checkout - uses: actions/checkout@master - - - name: Set up php - uses: shivammathur/setup-php@master - with: - php-version: ${{ matrix.php-versions }} - coverage: none - - - name: Install dependencies - run: composer i - - - name: Run coding standards check - run: composer run cs:check || ( echo 'Please run `composer run cs:fix` to format your code' && exit 1 ) - diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/.nextcloudignore b/ncp-previewgenerator/ncp-previewgenerator-nc21/.nextcloudignore deleted file mode 100644 index d0704339b..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/.nextcloudignore +++ /dev/null @@ -1,19 +0,0 @@ -.babelrc.js -.drone.yml -.eslintrc.js -.git -.github -.gitignore -.nextcloudignore -.scrutinizer.yml -.travis.yml -.tx -composer.json -composer.lock -krankerl.toml -node_modules -package.json -package-lock.json -screenshots -src -vendor diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/.php_cs.dist b/ncp-previewgenerator/ncp-previewgenerator-nc21/.php_cs.dist deleted file mode 100644 index 8a0cb43c8..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/.php_cs.dist +++ /dev/null @@ -1,17 +0,0 @@ -getFinder() - ->notPath('build') - ->notPath('l10n') - ->notPath('src') - ->notPath('vendor') - ->in(__DIR__); -return $config; diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/CHANGELOG.md b/ncp-previewgenerator/ncp-previewgenerator-nc21/CHANGELOG.md deleted file mode 100644 index 438ffca6f..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/CHANGELOG.md +++ /dev/null @@ -1,111 +0,0 @@ -## 3.1.1 - 2021-01-27 -### Changed -- Use new batch preview method - -### Fixed -- Init filesystem for the users -- Handle unavailable storages more graceful - -## 3.1.0 -2020-12-21 -### Added -- Nextcloud 21 support - -## 3.0.0 - 2020-08-31 -### Added -- Nextcloud 20 support -- IBootstap support -- Listen to new events hence only initialize the FS if needed - -### Removed -- Nextcloud <20 support - -## 2.3.0 - 2020-04-03 -### Added -- Nextcloud 19 support - -## 2.2.0 - 2019-12-05 -### Added -- Nextcloud 18 support - -## 2.1.0 - 2019-03-05 -### Added -- Nextcloud 16 support - -## 2.0.0 - 2018-11-08 - -- PHP 7.x required -- Nextcloud 14 only -- Moved to migrations for DB handling -- Added path option to generate command (thanks to @adduxa) -- Nextcloud 15 compatible - -## 1.0.9 - 2017-12-29 - -### Fixes - -### Added -- Show timestamp in occ commands [#88](https://github.com/rullzer/previewgenerator/pull/88) -- Add Composer Classmap for file (NC13) [#90](https://github.com/rullzer/previewgenerator/pull/90) -- Respect .nomedia [#92](https://github.com/rullzer/previewgenerator/pull/92) -- Use PID to check for already running process [#93](https://github.com/rullzer/previewgenerator/pull/93) - -## 1.0.8 - 2017-12-21 - -### Fixes -- Do not add file if it already is in the table [#86](https://github.com/rullzer/previewgenerator/pull/86) - -### Added -- Allow to specify sizes to be generated [#87](https://github.com/rullzer/previewgenerator/pull/86) - -## 1.0.7 - 2017-09-26 - -### Fixes -- Updated/Fixed README - - [#55](https://github.com/rullzer/previewgenerator/pull/55) @Eeems - - [#58](https://github.com/rullzer/previewgenerator/pull/58) @MichaIng - - [#67](https://github.com/rullzer/previewgenerator/pull/67) @sndrr -- Avoid folder processing on pre-generate [#73](https://github.com/rullzer/previewgenerator/pull/73) @Seik - -### Added -- Make NC13 Compatible [#63](https://github.com/rullzer/previewgenerator/pull/63) - -## 1.0.6 - 2017-05-05 - -### Fixed -- Better preview error handling [#51](https://github.com/rullzer/previewgenerator/pull/51) @icewind1991 -- Travis test runs [#53](https://github.com/rullzer/previewgenerator/pull/53) - -### Added -- README.md [#52](https://github.com/rullzer/previewgenerator/pull/52) -- CHANGELOG.md [#52](https://github.com/rullzer/previewgenerator/pull/52) - -## 1.0.5 - 2017-03-17 - -### Added -- Generate more preview sizes -- Add --force command to break lock - -## 1.0.4 - 2017-03-14 - -### Fixed -- Lock timeout was 30 hours instead of minutes - -## 1.0.3 - 2017-03-14 - -### Added -- Do not use app with encryption -- Check for already running command - -## 1.0.2 - 2017-03-08 - -### Added -- More verbose output of commands -- Hack around preview generation errors by not trying the file again in the next run - -## 1.0.1 - 2016-12-08 - -### Fixed -- Pimp info.xml - -## 1.0.0 – 2016-12-07 -Initial release diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/LICENSE b/ncp-previewgenerator/ncp-previewgenerator-nc21/LICENSE deleted file mode 100644 index dbbe35581..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/README.md b/ncp-previewgenerator/ncp-previewgenerator-nc21/README.md deleted file mode 100644 index 98bb4103e..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Preview Generator - -Nextcloud app that allows admins to pre-generate previews. The app listens to -edit events and stores this information. Once a cron job is triggered it will -start preview generation. This means that you can better utilize your -system by pre-generating previews when your system is normally idle and thus -putting less load on your machine when the requests are actually served. - -The app does not replace on demand preview generation so if a preview is -requested before it is pre-generated it will still be shown. - -## How to install - -* Install directly from within your Nextcloud from the [app store](https://apps.nextcloud.com/apps/previewgenerator) -* Clone this repository in you Nextcloud app folder - -## How to use the app - -1. Install the app -2. Enable the app -3. Run `./occ preview:generate-all` once after installation. -4. Add a (system) cron job for ` ./occ preview:pre-generate` - * I run it every 10 minutes - -## Known issues - -* The app does not work with encryption enabled - -## How does the app work - -1. Listen to events that a file has been written or modified and store it in the database -2. On cron run request previews for the files that have been written or modified - -If a preview already exists at step 2 then requesting it is really cheap. If not -it will be generated. Depending on the sizes of the files and the hardware you -are running on the time this takes can vary. - -## Commands - -### preview:delete_old - -This removes the previews from the old preview location that was used before -Nextcloud 11. That has some issues. Note that the gallery shipped with Nextcloud -11 did not yet use this location. So you might want to run it again with Nextcloud 12. - -### preview:generate-all [user-id] - -Loop over all files and try to generate previews for them. If `user-id` is supplied -just loop over the files for that user. - -### preview:pre-generate - -Do the actual pregeneration. This means only for new or modified files (since -the app was enabled or the last pregeneration was done). - -## FAQ - -### Why can't I use webcron? - -Preview generation can be a very long running job. Thus we need a system that -does not time out. - -### It sometimes crashed - -Yes this happens. Most of it is due to corrupted files not being handled that gracefully -in the Nextcloud server. Improvements in this area are coming with Nextcloud 12 - -### I get "Command already running" - -Yes this happens when the `pre-generate` command crashes. No worries the lock -will be released after 30 minutes of inactivity from the app. So go grab a cookie. - -### I don't want to generate all the preview sizes - -This is possible since version 1.0.8. Just set the correct values via the command line - -``` -./occ config:app:set --value="32 64 1024" previewgenerator squareSizes -./occ config:app:set --value="64 128 1024" previewgenerator widthSizes -./occ config:app:set --value="64 256 1024" previewgenerator heightSizes -``` - -This will only generate: - * square previews of: 32x32, 64x64 and 1024x1024 - * aspect ratio previews with a width of: 64, 128 and 1024 - * aspect ratio previews with a height of: 64, 256 and 1024 - -Note: - * preview sizes are always a power of 2. - * The smallest size is 32 - * The max size is determined by your preview settings in config.php - - ### I get "PHP Fatal error: Allowed memory size of X bytes exhausted" - You need to increase the memory allowance of PHP, by default it is 128 MB. You do that by changing the memory_limit in the php.ini file. - - If you use the docker container you need to create the php.ini file in /usr/local/etc/php first. diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/appinfo/info.xml b/ncp-previewgenerator/ncp-previewgenerator-nc21/appinfo/info.xml deleted file mode 100644 index 84b3abfb6..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/appinfo/info.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - previewgenerator - Preview Generator - A preview pre-generation app - - - AGPL - Roeland Jago Douma - - 99.99.99 - PreviewGenerator - multimedia - https://github.com/rullzer/previewgenerator - https://github.com/rullzer/previewgenerator/issues - https://github.com/rullzer/previewgenerator.git - - - - - - - - - - OCA\PreviewGenerator\Command\Generate - OCA\PreviewGenerator\Command\DeleteOld - OCA\PreviewGenerator\Command\PreGenerate - - diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/composer.json b/ncp-previewgenerator/ncp-previewgenerator-nc21/composer.json deleted file mode 100644 index 815a61b2b..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/composer.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "rullzer/previewgenerator", - "config": { - "optimize-autoloader": true, - "classmap-authoritative": true, - "platform": { - "php": "7.3" - } - }, - "scripts": { - "cs:fix": "php-cs-fixer fix", - "cs:check": "php-cs-fixer fix --dry-run --diff", - "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l" - }, - "require-dev": { - "nextcloud/coding-standard": "^0.3.0" - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/krankerl.toml b/ncp-previewgenerator/ncp-previewgenerator-nc21/krankerl.toml deleted file mode 100644 index 0fb064b68..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/krankerl.toml +++ /dev/null @@ -1,3 +0,0 @@ -[package] -before_cmds = [ -] diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/AppInfo/Application.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/AppInfo/Application.php deleted file mode 100644 index dc43dcaf7..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/AppInfo/Application.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\AppInfo; - -use OCA\PreviewGenerator\Listeners\PostWriteListener; -use OCP\AppFramework\App; -use OCP\AppFramework\Bootstrap\IBootContext; -use OCP\AppFramework\Bootstrap\IBootstrap; -use OCP\AppFramework\Bootstrap\IRegistrationContext; -use OCP\Files\Events\Node\NodeWrittenEvent; - -class Application extends App implements IBootstrap { - public const APPNAME='previewgenerator'; - - public function __construct() { - parent::__construct(self::APPNAME); - } - - public function register(IRegistrationContext $context): void { - $context->registerEventListener(NodeWrittenEvent::class, PostWriteListener::class); - } - - public function boot(IBootContext $context): void { - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/DeleteOld.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/DeleteOld.php deleted file mode 100644 index a9b4d1973..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/DeleteOld.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Command; - -use OCP\Files\Folder; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IUser; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -class DeleteOld extends Command { - - /** @var IUserManager */ - protected $userManager; - - /** @var IRootFolder */ - protected $rootFolder; - - public function __construct(IRootFolder $rootFolder, - IUserManager $userManager) { - parent::__construct(); - - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - } - - protected function configure() { - $this - ->setName('preview:delete_old') - ->setDescription('Delete old preview folder (pre NC11)') - ->addArgument( - 'user_id', - InputArgument::OPTIONAL, - 'Delete old preview folder for the given user' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output): int { - $userId = $input->getArgument('user_id'); - - if ($userId === null) { - $this->userManager->callForSeenUsers(function (IUser $user) { - $this->deletePreviews($user); - }); - } else { - $user = $this->userManager->get($userId); - if ($user !== null) { - $this->deletePreviews($user); - } - } - - return 0; - } - - private function deletePreviews(IUser $user) { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($user->getUID()); - - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $userRoot = $userFolder->getParent(); - - try { - /** @var Folder $thumbnails */ - $thumbnails = $userRoot->get('thumbnails'); - $thumbnails->delete(); - } catch (NotFoundException $e) { - //Ignore - } - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/Generate.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/Generate.php deleted file mode 100644 index 669139b2a..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/Generate.php +++ /dev/null @@ -1,256 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator\Command; - -use OCA\PreviewGenerator\SizeHelper; -use OCP\Encryption\IManager; -use OCP\Files\File; -use OCP\Files\Folder; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\Files\StorageNotAvailableException; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\IPreview; -use OCP\IUser; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -class Generate extends Command { - - /** @var IUserManager */ - protected $userManager; - - /** @var IRootFolder */ - protected $rootFolder; - - /** @var IPreview */ - protected $previewGenerator; - - /** @var IConfig */ - protected $config; - - /** @var IDBConnection */ - protected $connection; - - /** @var OutputInterface */ - protected $output; - - /** @var int[][] */ - protected $sizes; - - /** @var IManager */ - protected $encryptionManager; - - public function __construct(IRootFolder $rootFolder, - IUserManager $userManager, - IPreview $previewGenerator, - IConfig $config, - IDBConnection $connection, - IManager $encryptionManager) { - parent::__construct(); - - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - $this->previewGenerator = $previewGenerator; - $this->config = $config; - $this->connection = $connection; - $this->encryptionManager = $encryptionManager; - } - - protected function configure() { - $this - ->setName('preview:generate-all') - ->setDescription('Generate previews') - ->addArgument( - 'user_id', - InputArgument::OPTIONAL, - 'Generate previews for the given user' - )->addOption( - 'path', - 'p', - InputOption::VALUE_OPTIONAL, - 'limit scan to this path, eg. --path="/alice/files/Photos", the user_id is determined by the path and the user_id parameter is ignored' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output): int { - if ($this->encryptionManager->isEnabled()) { - $output->writeln('Encryption is enabled. Aborted.'); - return 1; - } - - // Set timestamp output - $formatter = new TimestampFormatter($this->config, $output->getFormatter()); - $output->setFormatter($formatter); - $this->output = $output; - - $this->sizes = SizeHelper::calculateSizes($this->config); - - $inputPath = $input->getOption('path'); - if ($inputPath) { - $inputPath = '/' . trim($inputPath, '/'); - [, $userId,] = explode('/', $inputPath, 3); - $user = $this->userManager->get($userId); - if ($user !== null) { - $this->generatePathPreviews($user, $inputPath); - } - } else { - $userId = $input->getArgument('user_id'); - if ($userId === null) { - $this->userManager->callForSeenUsers(function (IUser $user) { - $this->generateUserPreviews($user); - }); - } else { - $user = $this->userManager->get($userId); - if ($user !== null) { - $this->generateUserPreviews($user); - } - } - } - - return 0; - } - - private function generatePathPreviews(IUser $user, string $path) { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($user->getUID()); - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - try { - $relativePath = $userFolder->getRelativePath($path); - } catch (NotFoundException $e) { - $this->output->writeln('Path not found'); - return; - } - $pathFolder = $userFolder->get($relativePath); - $this->parseFolder($pathFolder, $user); - } - - private function generateUserPreviews(IUser $user) { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($user->getUID()); - - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $this->parseFolder($userFolder, $user); - } - - private function parseFolder(Folder $folder, IUser $user) { - try { - // Respect the '.nomedia' file. If present don't traverse the folder - if ($folder->nodeExists('.nomedia')) { - $this->output->writeln('Skipping folder ' . $folder->getPath()); - return; - } - - // random sleep between 0 and 50ms to avoid collision between 2 processes - usleep(rand(0,50000)); - - $this->output->writeln('Scanning folder ' . $folder->getPath()); - - $nodes = $folder->getDirectoryListing(); - - foreach ($nodes as $node) { - if ($node instanceof Folder) { - $this->parseFolder($node, $user); - } else if ($node instanceof File) { - $is_locked = false; - $qb = $this->connection->getQueryBuilder(); - $row = $qb->select('*') - ->from('preview_generation') - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId()))) - ->setMaxResults(1) - ->execute() - ->fetch(); - if ($row !== false) { - if ($row['locked'] == 1) { - // already being processed - $is_locked = true; - } else { - $qb->update('preview_generation') - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId()))) - ->set('locked', $qb->createNamedParameter(true)) - ->execute(); - } - } else { - $qb->insert('preview_generation') - ->values([ - 'uid' => $qb->createNamedParameter($user->getUID()), - 'file_id' => $qb->createNamedParameter($node->getId()), - 'locked' => $qb->createNamedParameter(true), - ]) - ->execute(); - } - - if ($is_locked === false) { - try { - $this->parseFile($node); - } finally { - $qb->delete('preview_generation') - ->where($qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId()))) - ->execute(); - } - } - } - } - } catch (StorageNotAvailableException $e) { - $this->output->writeln(sprintf('Storage for folder folder %s is not available: %s', - $folder->getPath(), - $e->getHint() - )); - } - } - - private function parseFile(File $file) { - if ($this->previewGenerator->isMimeSupported($file->getMimeType())) { - if ($this->output->getVerbosity() > OutputInterface::VERBOSITY_VERBOSE) { - $this->output->writeln('Generating previews for ' . $file->getPath()); - } - - try { - $specifications = array_merge( - array_map(function ($squareSize) { - return ['width' => $squareSize, 'height' => $squareSize, 'crop' => true]; - }, $this->sizes['square']), - array_map(function ($heightSize) { - return ['width' => -1, 'height' => $heightSize, 'crop' => false]; - }, $this->sizes['height']), - array_map(function ($widthSize) { - return ['width' => $widthSize, 'height' => -1, 'crop' => false]; - }, $this->sizes['width']) - ); - $this->previewGenerator->generatePreviews($file, $specifications); - } catch (NotFoundException $e) { - // Maybe log that previews could not be generated? - } catch (\InvalidArgumentException $e) { - $error = $e->getMessage(); - $this->output->writeln("${error}"); - } - } - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/PreGenerate.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/PreGenerate.php deleted file mode 100644 index f51efdb5b..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/PreGenerate.php +++ /dev/null @@ -1,219 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Command; - -use OCA\PreviewGenerator\SizeHelper; -use OCP\AppFramework\Utility\ITimeFactory; -use OCP\Encryption\IManager; -use OCP\Files\File; -use OCP\Files\IRootFolder; -use OCP\Files\NotFoundException; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\IPreview; -use OCP\IUserManager; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -class PreGenerate extends Command { - - /** @var string */ - protected $appName; - - /** @var IUserManager */ - protected $userManager; - - /** @var IRootFolder */ - protected $rootFolder; - - /** @var IPreview */ - protected $previewGenerator; - - /** @var IConfig */ - protected $config; - - /** @var IDBConnection */ - protected $connection; - - /** @var OutputInterface */ - protected $output; - - /** @var int[][] */ - protected $sizes; - - /** @var IManager */ - protected $encryptionManager; - - /** @var ITimeFactory */ - protected $time; - - /** - * @param string $appName - * @param IRootFolder $rootFolder - * @param IUserManager $userManager - * @param IPreview $previewGenerator - * @param IConfig $config - * @param IDBConnection $connection - * @param IManager $encryptionManager - * @param ITimeFactory $time - */ - public function __construct($appName, - IRootFolder $rootFolder, - IUserManager $userManager, - IPreview $previewGenerator, - IConfig $config, - IDBConnection $connection, - IManager $encryptionManager, - ITimeFactory $time) { - parent::__construct(); - - $this->appName = $appName; - $this->userManager = $userManager; - $this->rootFolder = $rootFolder; - $this->previewGenerator = $previewGenerator; - $this->config = $config; - $this->connection = $connection; - $this->encryptionManager = $encryptionManager; - $this->time = $time; - } - - protected function configure() { - $this - ->setName('preview:pre-generate') - ->setDescription('Pre generate previews'); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * @return int - */ - protected function execute(InputInterface $input, OutputInterface $output) { - if ($this->encryptionManager->isEnabled()) { - $output->writeln('Encryption is enabled. Aborted.'); - return 1; - } - - // Set timestamp output - $formatter = new TimestampFormatter($this->config, $output->getFormatter()); - $output->setFormatter($formatter); - $this->output = $output; - - $this->sizes = SizeHelper::calculateSizes($this->config); - $this->startProcessing(); - - return 0; - } - - private function startProcessing() { - // random sleep between 0 and 50ms to avoid collision between 2 processes - usleep(rand(0,50000)); - - while (true) { - $qb = $this->connection->getQueryBuilder(); - $row = $qb->select('*') - ->from('preview_generation') - ->where($qb->expr()->eq('locked', $qb->createNamedParameter(false))) - ->setMaxResults(1) - ->execute() - ->fetch(); - - if ($row === false) { - break; - } - - $qb->update('preview_generation') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($row['id']))) - ->set('locked', $qb->createNamedParameter(true)) - ->execute(); - try { - $this->processRow($row); - } finally { - $qb->delete('preview_generation') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($row['id']))) - ->execute(); - } - } - } - - private function processRow($row) { - //Get user - $user = $this->userManager->get($row['uid']); - - if ($user === null) { - return; - } - - \OC_Util::tearDownFS(); - \OC_Util::setupFS($row['uid']); - - try { - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - $userRoot = $userFolder->getParent(); - } catch (NotFoundException $e) { - return; - } - - //Get node - $nodes = $userRoot->getById($row['file_id']); - - if ($nodes === []) { - return; - } - - $node = $nodes[0]; - if ($node instanceof File) { - $this->processFile($node); - } - } - - private function processFile(File $file) { - if ($this->previewGenerator->isMimeSupported($file->getMimeType())) { - if ($this->output->getVerbosity() > OutputInterface::VERBOSITY_VERBOSE) { - $this->output->writeln('Generating previews for ' . $file->getPath()); - } - - try { - $specifications = array_merge( - array_map(function ($squareSize) { - return ['width' => $squareSize, 'height' => $squareSize, 'crop' => true]; - }, $this->sizes['square']), - array_map(function ($heightSize) { - return ['width' => -1, 'height' => $heightSize, 'crop' => false]; - }, $this->sizes['height']), - array_map(function ($widthSize) { - return ['width' => $widthSize, 'height' => -1, 'crop' => false]; - }, $this->sizes['width']) - ); - $this->previewGenerator->generatePreviews($file, $specifications); - } catch (NotFoundException $e) { - // Maybe log that previews could not be generated? - } catch (\InvalidArgumentException $e) { - $error = $e->getMessage(); - $this->output->writeln("${error}"); - } - } - } - -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/TimestampFormatter.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/TimestampFormatter.php deleted file mode 100644 index eb0d971fd..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Command/TimestampFormatter.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see - * - */ - -namespace OCA\PreviewGenerator\Command; - -use OCP\IConfig; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Formatter\OutputFormatterStyleInterface; - -/** - * TODO: This was taken from the server. At some point we should have it in OCP - * and then just use that - * - * Class TimestampFormatter - * - * @package OCA\PreviewGenerator\Command - */ -class TimestampFormatter implements OutputFormatterInterface { - /** @var IConfig */ - protected $config; - - /** @var OutputFormatterInterface */ - protected $formatter; - - /** - * @param IConfig $config - * @param OutputFormatterInterface $formatter - */ - public function __construct(IConfig $config, OutputFormatterInterface $formatter) { - $this->config = $config; - $this->formatter = $formatter; - } - - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages or not - */ - public function setDecorated($decorated) { - $this->formatter->setDecorated($decorated); - } - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - */ - public function isDecorated(): bool { - return $this->formatter->isDecorated(); - } - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - */ - public function setStyle($name, OutputFormatterStyleInterface $style) { - $this->formatter->setStyle($name, $style); - } - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * @return bool - */ - public function hasStyle($name): bool { - return $this->formatter->hasStyle($name); - } - - /** - * Gets style options from style with specified name. - * - * @param string $name - * @return OutputFormatterStyleInterface - * @throws \InvalidArgumentException When style isn't defined - */ - public function getStyle($name): OutputFormatterStyleInterface { - return $this->formatter->getStyle($name); - } - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * @return string The styled message, prepended with a timestamp using the - * log timezone and dateformat, e.g. "2015-06-23T17:24:37+02:00" - */ - public function format($message): string { - $timeZone = $this->config->getSystemValue('logtimezone', 'UTC'); - $timeZone = $timeZone !== null ? new \DateTimeZone($timeZone) : null; - - $time = new \DateTime('now', $timeZone); - $timestampInfo = $time->format($this->config->getSystemValue('logdateformat', \DateTime::ATOM)); - - return $timestampInfo . ' ' . $this->formatter->format($message); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Listeners/PostWriteListener.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Listeners/PostWriteListener.php deleted file mode 100644 index 60576e634..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Listeners/PostWriteListener.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Listeners; - -use OCP\EventDispatcher\Event; -use OCP\EventDispatcher\IEventListener; -use OCP\Files\Events\Node\NodeWrittenEvent; -use OCP\Files\Folder; -use OCP\IDBConnection; -use OCP\IUserManager; - -class PostWriteListener implements IEventListener { - - /** @var IDBConnection */ - private $connection; - - /** @var IUserManager */ - private $userManager; - - public function __construct(IDBConnection $connection, - IUserManager $userManager) { - $this->connection = $connection; - $this->userManager = $userManager; - } - - public function handle(Event $event): void { - if (!($event instanceof NodeWrittenEvent)) { - return; - } - - $node = $event->getNode(); - $absPath = ltrim($node->getPath(), '/'); - $owner = explode('/', $absPath)[0]; - - if ($node instanceof Folder || !$this->userManager->userExists($owner)) { - return; - } - - $qb = $this->connection->getQueryBuilder(); - $qb->select('id') - ->from('preview_generation') - ->where( - $qb->expr()->andX( - $qb->expr()->eq('uid', $qb->createNamedParameter($owner)), - $qb->expr()->eq('file_id', $qb->createNamedParameter($node->getId())) - ) - )->setMaxResults(1); - $cursor = $qb->execute(); - $inTable = $cursor->fetch() !== false; - $cursor->closeCursor(); - - // Don't insert if there is already such an entry - if ($inTable) { - return; - } - - $qb = $this->connection->getQueryBuilder(); - $qb->insert('preview_generation') - ->setValue('uid', $qb->createNamedParameter($owner)) - ->setValue('file_id', $qb->createNamedParameter($node->getId())); - $qb->execute(); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020000Date20180823071939.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020000Date20180823071939.php deleted file mode 100644 index 951d53a3e..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020000Date20180823071939.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator\Migration; - -use OCP\DB\ISchemaWrapper; -use OCP\Migration\SimpleMigrationStep; -use OCP\Migration\IOutput; - -class Version020000Date20180823071939 extends SimpleMigrationStep { - - /** - * @param IOutput $output - * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` - * @param array $options - * @return null|ISchemaWrapper - */ - public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { - /** @var ISchemaWrapper $schema */ - $schema = $schemaClosure(); - - if (!$schema->hasTable('preview_generation')) { - $table = $schema->createTable('preview_generation'); - $table->addColumn('id', 'integer', [ - 'autoincrement' => true, - 'notnull' => true, - 'length' => 4, - ]); - $table->addColumn('uid', 'string', [ - 'notnull' => true, - 'length' => 256, - ]); - $table->addColumn('file_id', 'integer', [ - 'notnull' => true, - 'length' => 4, - ]); - $table->setPrimaryKey(['id']); - } - return $schema; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020200Date20190608205303.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020200Date20190608205303.php deleted file mode 100644 index 7c264730d..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/Migration/Version020200Date20190608205303.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * @author Ignacio Nunez - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator\Migration; - -use OCP\DB\ISchemaWrapper; -use OCP\Migration\SimpleMigrationStep; -use OCP\Migration\IOutput; -use OCP\DB\Types; - -class Version020200Date20190608205303 extends SimpleMigrationStep { - - /** - * @param IOutput $output - * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` - * @param array $options - * @return null|ISchemaWrapper - */ - public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { - /** @var ISchemaWrapper $schema */ - $schema = $schemaClosure(); - $table = $schema->getTable('preview_generation'); - - if (!$table->hasColumn('locked')) { - $table->addColumn('locked', Types::BOOLEAN, [ - 'notnull' => false, - 'default' => 0, - ]); - } - return $schema; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/SizeHelper.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/SizeHelper.php deleted file mode 100644 index 62c683830..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/lib/SizeHelper.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -namespace OCA\PreviewGenerator; - -use OCP\IConfig; - -class SizeHelper { - public static function calculateSizes(IConfig $config): array { - /* - * First calculate the systems max sizes - */ - - $sizes = [ - 'square' => [], - 'height' => [], - 'width' => [], - ]; - - $maxW = (int)$config->getSystemValue('preview_max_x', 4096); - $maxH = (int)$config->getSystemValue('preview_max_y', 4096); - - $s = 32; - while ($s <= $maxW || $s <= $maxH) { - $sizes['square'][] = $s; - $s *= 2; - } - - $w = 32; - while ($w <= $maxW) { - $sizes['width'][] = $w; - $w *= 2; - } - - $h = 32; - while ($h <= $maxH) { - $sizes['height'][] = $h; - $h *= 2; - } - - - /* - * Now calculate the user provided max sizes - * Note that only powers of 2 matter but if users supply different - * stuff it is their own fault and we just ignore it - */ - $getCustomSizes = function (IConfig $config, $key) { - $TXT = $config->getAppValue('previewgenerator', $key, ''); - $values = []; - if ($TXT !== '') { - foreach (explode(' ', $TXT) as $value) { - if (ctype_digit($value)) { - $values[] = (int)$value; - } - } - } - - return $values; - }; - - $squares = $getCustomSizes($config, 'squareSizes'); - $widths = $getCustomSizes($config, 'widthSizes'); - $heights = $getCustomSizes($config, 'heightSizes'); - - if ($squares !== []) { - $sizes['square'] = array_intersect($sizes['square'], $squares); - } - - if ($widths !== []) { - $sizes['width'] = array_intersect($sizes['width'], $widths); - } - - if ($heights !== []) { - $sizes['height'] = array_intersect($sizes['height'], $heights); - } - - return $sizes; - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/WatcherTest.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/WatcherTest.php deleted file mode 100644 index a89bbc052..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/WatcherTest.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ -namespace OCA\PreviewGenerator\Tests; - -use OCA\PreviewGenerator\Watcher; -use OCP\Files\Node; -use OCP\IDBConnection; -use OCP\IUserManager; -use Test\TestCase; - -/** - * Class WatcherTest - * - * @package OCA\PreviewGenerator\Tests - * @group DB - */ -class WatcherTest extends TestCase { - - /** @var IDBConnection */ - private $connection; - - /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ - private $userManager; - - /** @var Watcher */ - private $watcher; - - public function setUp() { - parent::setUp(); - - $this->connection = \OC::$server->getDatabaseConnection(); - $this->userManager = $this->createMock(IUserManager::class); - $this->watcher = new Watcher($this->connection, $this->userManager); - - $qb = $this->connection->getQueryBuilder(); - $qb->delete('preview_generation'); - } - - public function testPostWriteCantFindUser() { - $node = $this->createMock(Node::class); - $node->method('getPath') - ->willReturn('/foo/bar/baz'); - - $this->userManager->expects($this->once()) - ->method('userExists') - ->with('foo') - ->willReturn(false); - - $this->watcher->postWrite($node); - } - - public function testPostWrite() { - $node = $this->createMock(Node::class); - $node->method('getPath') - ->willReturn('/foo/bar/baz'); - $node->method('getId') - ->willReturn(42); - - $this->userManager->expects($this->once()) - ->method('userExists') - ->with('foo') - ->willReturn(true); - - $this->watcher->postWrite($node); - - $qb = $this->connection->getQueryBuilder(); - $qb->select('*') - ->from('preview_generation'); - $cursor = $qb->execute(); - $rows = $cursor->fetchAll(); - $cursor->closeCursor(); - - $this->assertCount(1, $rows); - $row = $rows[0]; - $this->assertSame('foo', $row['uid']); - $this->assertSame('42', $row['file_id']); - } -} diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/bootstrap.php b/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/bootstrap.php deleted file mode 100644 index a26997652..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/bootstrap.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * @author Roeland Jago Douma - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * - */ - -define('PHPUNIT_RUN', 1); - -require_once __DIR__.'/../../../lib/base.php'; - -\OC_App::loadApp('previewgenerator'); - -OC_Hook::clear(); diff --git a/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/phpunit.xml b/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/phpunit.xml deleted file mode 100644 index ca916756f..000000000 --- a/ncp-previewgenerator/ncp-previewgenerator-nc21/tests/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - . - - - - - ../ - - ../tests - - - - - - - - diff --git a/tests/nextcloud_tests.py b/tests/nextcloud_tests.py index f87152f63..d413a93ed 100755 --- a/tests/nextcloud_tests.py +++ b/tests/nextcloud_tests.py @@ -274,7 +274,7 @@ def settings_config_check_warnings(warnings): elif re.match(r'.*Could not check for JavaScript support.*', warning.text): continue # TODO: Solve redis error logs at the source - elif re.match(r'.*\d+ errors? in the logs since.*', warning.text): + elif re.match(r'.*\d+ (errors?|warnings?) in the logs since.*', warning.text): continue else: raise ConfigTestFailure(f"WARN: {warning.text}") @@ -284,14 +284,15 @@ def settings_config_check_infos(infos): if re.match(r'.*Your installation has no default phone region set.*', info.text) \ or re.match(r'The PHP module "imagick" is not enabled', info.text) \ or re.match(r'The PHP module "imagick" in this instance has no SVG support.*', info.text) \ - or re.match(r'\d+ warnings? in the logs since.*', info.text): + or re.match(r'.*\d+ (errors?|warnings?) in the logs since.*', info.text) \ + or re.match(r'Second factor providers are available but two-factor authentication is not enforced.', info.text): continue else: print(f'INFO: {info.text}') php_modules = info.find_elements(By.CSS_SELECTOR, "li") if len(php_modules) != 1: raise ConfigTestFailure(f"Could not find the list of php modules within the info message " - f"'{infos[0].text}'") + f"'{info.text}'") if php_modules[0].text != "imagick": raise ConfigTestFailure("The list of php_modules does not equal [imagick]") diff --git a/update.sh b/update.sh index f87338549..ccf042543 100755 --- a/update.sh +++ b/update.sh @@ -154,11 +154,6 @@ rm -rf /var/www/ncp-app mkdir -p /var/www/ncp-app cp -r ncp-app/{appinfo,css,img,js,lib,templates} /var/www/ncp-app/ -# install ncp-previewgenerator -rm -rf /var/www/ncp-previewgenerator -cp -r ncp-previewgenerator /var/www/ -chown -R www-data: /var/www/ncp-previewgenerator - # copy NC app to nextcloud directory and enable it rm -rf /var/www/nextcloud/apps/nextcloudpi cp -r /var/www/ncp-app /var/www/nextcloud/apps/nextcloudpi diff --git a/updates/1.13.6.sh b/updates/1.13.6.sh index e532c47e1..19c6bd453 100644 --- a/updates/1.13.6.sh +++ b/updates/1.13.6.sh @@ -34,10 +34,10 @@ EOF rm -f "$BINDIR"/{SYSTEM/unattended-upgrades.sh,CONFIG/nc-autoupdate-nc.sh,CONFIG/nc-autoupdate-ncp.sh,CONFIG/nc-update-nc-apps-auto.sh} # previews settings - ncc config:app:set previewgenerator squareSizes --value="32" - ncc config:app:set previewgenerator widthSizes --value="128 256 512" - ncc config:app:set previewgenerator heightSizes --value="128 256" - ncc config:system:set jpeg_quality --value 60 +# ncc config:app:set previewgenerator squareSizes --value="32" +# ncc config:app:set previewgenerator widthSizes --value="128 256 512" +# ncc config:app:set previewgenerator heightSizes --value="128 256" +# ncc config:system:set jpeg_quality --value 60 # update unattended labels is_active_app unattended-upgrades && run_app unattended-upgrades @@ -125,9 +125,9 @@ EOF # adjust preview sizes [[ "$(ncc config:system:get preview_max_x)" == "" ]] && { - ncc config:app:set previewgenerator squareSizes --value="32 256" - ncc config:app:set previewgenerator widthSizes --value="256 384" - ncc config:app:set previewgenerator heightSizes --value="256" +# ncc config:app:set previewgenerator squareSizes --value="32 256" +# ncc config:app:set previewgenerator widthSizes --value="256 384" +# ncc config:app:set previewgenerator heightSizes --value="256" ncc config:system:set preview_max_x --value 2048 ncc config:system:set preview_max_y --value 2048 ncc config:system:set jpeg_quality --value 60 diff --git a/updates/1.20.0.sh b/updates/1.20.0.sh index 9e8dda0bd..160254cfd 100644 --- a/updates/1.20.0.sh +++ b/updates/1.20.0.sh @@ -9,14 +9,14 @@ source /usr/local/etc/library.sh # sets NCLATESTVER PHPVER RELEASE # all images # replace preview generator for the NCP version -[[ -d /var/www/nextcloud/apps/previewgenerator ]] && { - grep -q NCP /var/www/nextcloud/apps/previewgenerator &>/dev/null || { - cp -raT /var/www/nextcloud/apps/{previewgenerator,previewgenerator.orig} - cp -r /var/www/ncp-previewgenerator /var/www/nextcloud/apps/previewgenerator - chown -R www-data: /var/www/nextcloud/apps/previewgenerator - is_active_app nc-previews-auto && run_app nc-previews-auto - } -} +#[[ -d /var/www/nextcloud/apps/previewgenerator ]] && { +# grep -q NCP /var/www/nextcloud/apps/previewgenerator &>/dev/null || { +# cp -raT /var/www/nextcloud/apps/{previewgenerator,previewgenerator.orig} +# cp -r /var/www/ncp-previewgenerator /var/www/nextcloud/apps/previewgenerator +# chown -R www-data: /var/www/nextcloud/apps/previewgenerator +# is_active_app nc-previews-auto && run_app nc-previews-auto +# } +#} # reduce nc-scan-auto verbosity is_active_app nc-scan-auto && run_app nc-scan-auto diff --git a/updates/1.57.0.sh b/updates/1.57.0.sh new file mode 100644 index 000000000..22f9a9ca7 --- /dev/null +++ b/updates/1.57.0.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +set -eu + +source /usr/local/etc/library.sh + +echo "Configuring serverid ..." +ncc config:system:get serverid > /dev/null || ncc config:system:set serverid --value="$((RANDOM % 1024))" --type=integer +echo "Installing PHP APCU ..." +sudo apt-get install -y php${PHPVER}-apcu +echo "Enable apache2 remoteip" +a2enmod remoteip +install_template nextcloud.conf.sh /etc/apache2/sites-available/001-nextcloud.conf --allow-fallback || { + echo "ERROR: Parsing template failed. Nextcloud will not work." + exit 1 +} +systemctl reload apache2 + +if [[ -L /var/www/nextcloud/apps/previewgenerator ]] +then + echo "Removing custom version of previewgenerator app ..." + ncc app:remove previewgenerator || :; + rm -f /var/www/nextcloud/apps/previewgenerator + rm -rf /var/www/ncp-previewgenerator +fi + +if [[ -f "/etc/cron.d/nc-previews-auto" ]] +then + echo "Migrate nc-previews(-auto) to v1.57.0 ..." + + echo "Reconfigure automatic preview generation" + run_app nc-previews-auto + + echo "Rerun initial preview generation ..." + set_app_param nc-previews CLEAN yes + set_app_param nc-previews INCREMENTAL no + set_app_param nc-previews PATH1 "" + + PREVIEW_GENERATION_DETACH=true run_app nc-previews + echo "Initial preview generation job started in background. You can view it's progress by running the nc-previews app from the NCP web UI." + rm /etc/cron.d/nc-previews-auto + echo "Done." +fi From 658157de456b9cacf8386f50539063b8c4214559 Mon Sep 17 00:00:00 2001 From: Aroldo de Mattos Bossoni Date: Fri, 6 Mar 2026 15:42:31 -0300 Subject: [PATCH 3/9] fix(ncp-web): prevent XSS via log output and undefined array key warning This commit addresses two issues in the NextCloudPi web panel: 1. HTML injection via ncp.log content (XSS vulnerability) - When /var/log/ncp.log contains HTML-like content (e.g., from certain backup operations), the unescaped output breaks the HTML parser - This causes the browser to ignore subsequent - - - diff --git a/ncp-web/activate/JS.js b/ncp-web/activate/JS.js index 3432dbe17..87da8f04c 100644 --- a/ncp-web/activate/JS.js +++ b/ncp-web/activate/JS.js @@ -44,6 +44,23 @@ function launch_nc_passwd() } ).error( errorMsg ); } +function seturl_ok_cb( result ) +{ + var ret = $.parseJSON(result) + if (ret.token) + $('#csrf-token').set( { value: ret.token } ); + if ( ret.ret === '0') { + + $.request('post', '../ncp-launcher.php', { action: 'launch', + ref : 'nc-admin', + config: '{ "PASSWORD":"' + $('#nc-pwd').get('.value') + '",' + + '"CONFIRM" :"' + $('#nc-pwd').get('.value') + '",' + + '"USER" : "ncp" }', + csrf_token: $( '#csrf-token' ).get( '.value' ) } + ).then( nc_admin_ok_cb ).error( errorMsg ); + } +} + function nc_admin_ok_cb( result ) { var ret = $.parseJSON( result ); @@ -60,13 +77,10 @@ function nc_admin_ok_cb( result ) function launch_activation() { // request - $.request('post', '../ncp-launcher.php', { action: 'launch', - ref : 'nc-admin', - config: '{ "PASSWORD":"' + $('#nc-pwd').get('.value') + '",' - + '"CONFIRM" :"' + $('#nc-pwd').get('.value') + '",' - + '"USER" : "ncp" }', - csrf_token: $( '#csrf-token' ).get( '.value' ) } - ).then( nc_admin_ok_cb ).error( errorMsg ); + $.request('post', '../ncp-launcher.php', { action: 'set-url', + url: window.location.origin, + csrf_token: $( '#csrf-token' ).get( '.value' ) } + ).then(seturl_ok_cb).error(errorMsg) } $(function() diff --git a/ncp-web/ncp-launcher.php b/ncp-web/ncp-launcher.php index df0eede11..2a0d83eb8 100644 --- a/ncp-web/ncp-launcher.php +++ b/ncp-web/ncp-launcher.php @@ -154,6 +154,15 @@ echo ' "table": ' . json_encode( $table ) . ' , '; echo ' "suggestions": ' . json_encode( $suggestions ) . ' , '; echo ' "ret": "' . $ret . '" }'; +} else if ($_POST['action'] == "set-url") { + if (!$_POST['url']) { + exit('{ "output": "domain can\'t be empty", "ret": 1 }'); + } + echo '{ "token": "' . getCSRFToken() . '",'; // Get new token + exec("/usr/bin/php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value '" . $_POST['url'] . "'", + $out, $ret); + echo ' "out": "' . htmlspecialchars(join("\n", $out), ENT_QUOTES, "UTF-8") . '", '; + echo ' "ret": "' . $ret . '"}'; } // diff --git a/tests/nextcloud_tests.py b/tests/nextcloud_tests.py index d413a93ed..3123537fc 100755 --- a/tests/nextcloud_tests.py +++ b/tests/nextcloud_tests.py @@ -89,8 +89,12 @@ def log(self, result): def usage(): "Print usage" - print("usage: nextcloud_tests.py [--new] [ip]") - print("--new removes saved configuration") + print("usage: nextcloud_tests.py [-h|--help] [-n|--new] [--no-gui] [--skip-release-check] [--wait-multiplier=1] [--return-after=0] [ip]") + print(" -n|--new removes saved configuration") + print(" -h|--help show this message") + print(" --no-gui run selenium in headless mode") + print(" --skip-release-check skip release check") + print(" --wait-multiplier=1 Multiply all wait times by this value") def signal_handler(sig, frame): @@ -377,7 +381,7 @@ def settings_config_check_pre32(wait, test): print(f"Setting geckodriver from env ({os.environ['GECKODRIVER_PATH']})") webdriver_exec_path = os.environ['GECKODRIVER_PATH'] if 'FF_BINARY_PATH' in os.environ: - print(f"Setting firefox binary from env ({os.environ['FF_BINARY_PATH']}") + print(f"Setting firefox binary from env ({os.environ['FF_BINARY_PATH']})") options.binary_location = os.environ['FF_BINARY_PATH'] wait_multiplier = 1 for opt, arg in opts: From e42fe062caba4cae9ef78fa115067b8fbdef1591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Kn=C3=B6ppler?= <6317548+theCalcaholic@users.noreply.github.com> Date: Sat, 4 Apr 2026 16:27:30 +0200 Subject: [PATCH 7/9] nc-autoupdate-nc: Optionally prevent update if NC apps are incompatible --- bin/ncp-update-nc | 7 ++++- bin/ncp-update-nc.d/update-nc.sh | 21 +++++++++++++ bin/ncp/CONFIG/nc-previews-auto.sh | 2 +- bin/ncp/UPDATES/nc-autoupdate-nc.sh | 29 +++++++++--------- bin/ncp/UPDATES/nc-update-nextcloud.sh | 7 ++++- etc/ncp-config.d/nc-autoupdate-nc.cfg | 6 ++++ etc/ncp-config.d/nc-update-nextcloud.cfg | 6 ++++ .../cron.daily/ncp-autoupdate-nc.sh | 30 +++++++++++++++++++ ...eviewgenerator => ncp-previewgenerator.sh} | 0 updates/1.57.0.sh | 5 ++++ 10 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 etc/ncp-templates/cron.daily/ncp-autoupdate-nc.sh rename etc/ncp-templates/cron.hourly/{ncp-previewgenerator => ncp-previewgenerator.sh} (100%) diff --git a/bin/ncp-update-nc b/bin/ncp-update-nc index 347868089..1e40868c2 100755 --- a/bin/ncp-update-nc +++ b/bin/ncp-update-nc @@ -22,6 +22,11 @@ set -eE${DBG} BIN="${0##*/}" VER="$1" [[ "$VER" == "" ]] && { echo "Usage ${BIN} "; exit 1; } +extra_args=() +if [[ " $* " =~ " "--allow-incompatible-apps" " ]] +then + extra_args+=(--allow-incompatible-apps) +fi connect_to_nc_update() { tail -n 100 -f "/var/log/ncp-update-nc.log" & @@ -54,7 +59,7 @@ fi systemctl reset-failed ncp-update-nc 2>/dev/null ||: systemd-run -u 'ncp-update-nc' --service-type=oneshot --no-block -p TimeoutStartSec="24h" -p TimeoutStopSec="1h" \ - bash -c "set -o pipefail; DBG='${DBG:-}' /usr/local/bin/ncp-update-nc.d/update-nc.sh '${VER}' |& tee /var/log/ncp-update-nc.log" + bash -c "set -o pipefail; DBG='${DBG:-}' /usr/local/bin/ncp-update-nc.d/update-nc.sh '${VER}' ${extra_args[*]} |& tee /var/log/ncp-update-nc.log" sleep 1 if ! [[ "$(systemctl is-active ncp-update-nc ||:)" =~ ^(active|inactive|activating|deactivating)$ ]] diff --git a/bin/ncp-update-nc.d/update-nc.sh b/bin/ncp-update-nc.d/update-nc.sh index 2f1988f9e..401677fbb 100755 --- a/bin/ncp-update-nc.d/update-nc.sh +++ b/bin/ncp-update-nc.d/update-nc.sh @@ -94,6 +94,27 @@ URL="https://download.nextcloud.com/server/releases/nextcloud-$TARGET_VERSION.ta echo "Download Nextcloud $TARGET_VERSION..." wget -q "$URL" -O nextcloud.tar.bz2 || { echo "Error downloading"; exit 1; } +# Check if installed apps are compatible +server_apps="$(tar -tf nextcloud.tar.bz2 --exclude='nextcloud/apps/*/*' | grep '^nextcloud/apps' | sed -e 's|^nextcloud/apps/||g' -e 's|/$||g')" +compatible_apps="$(curl "https://apps.nextcloud.com/api/v1/platform/$TARGET_VERSION/apps.json" | jq '.[].id' -r)" +enabled_apps="$(ncc app:list --output json | jq '.enabled | keys | .[]' -r)" + +incompatible="$(comm -2 -3 <( echo "${enabled_apps?}" | sort ) <( { echo "${compatible_apps?}"; echo "${server_apps?}"; echo "nextcloudpi"; } | sort ))" + +if [[ -n "$incompatible" ]] +then + if [[ " ${*} " =~ " "--allow-incompatible-apps" " ]] + then + echo "WARNING: The following apps are incompatible with the new Nextcloud version and will be disabled (update is running with --allow-incompatible-apps):" + echo "$incompatible" + else + echo "ERROR: Some installed apps are incompatible with the new Nextcloud version. Aborting update (run with --allow-incompatible-apps to ignore this)." + echo "Incompatible apps:" + echo "$incompatible" + exit 1 + fi +fi + # backup #################### BKPDIR="$BASEDIR" diff --git a/bin/ncp/CONFIG/nc-previews-auto.sh b/bin/ncp/CONFIG/nc-previews-auto.sh index 9cf577115..a24f5f67f 100644 --- a/bin/ncp/CONFIG/nc-previews-auto.sh +++ b/bin/ncp/CONFIG/nc-previews-auto.sh @@ -33,7 +33,7 @@ configure() ncc config:app:set --value=0 --type=integer previewgenerator job_max_previews mkdir -p /etc/cron.hourly - install_template cron.hourly/ncp-previewgenerator /etc/cron.hourly/ncp-previewgenerator + install_template cron.hourly/ncp-previewgenerator.sh /etc/cron.hourly/ncp-previewgenerator chmod +x /etc/cron.hourly/ncp-previewgenerator echo "Automatic preview generation enabled" return 0 diff --git a/bin/ncp/UPDATES/nc-autoupdate-nc.sh b/bin/ncp/UPDATES/nc-autoupdate-nc.sh index 3a750988a..76c2294d0 100644 --- a/bin/ncp/UPDATES/nc-autoupdate-nc.sh +++ b/bin/ncp/UPDATES/nc-autoupdate-nc.sh @@ -10,6 +10,19 @@ # just change NCLATESTVER and re-activate in update.sh to upgrade users +tmpl_ncp_update_nc_args() { + + CHECK_INCOMPATIBLE_APPS="$( + . /usr/local/etc/library.sh + find_app_param nc-autoupdate-nc CHECK_INCOMPATIBLE_APPS + )" + if [[ "${CHECK_INCOMPATIBLE_APPS:-yes}" != "yes" ]] + then + echo "--allow-incompatible-apps" + fi + +} + configure() { [[ "$ACTIVE" != "yes" ]] && { @@ -18,21 +31,7 @@ configure() return 0 } - cat > /etc/cron.daily/ncp-autoupdate-nc <> /var/log/ncp.log -/usr/local/bin/ncp-update-nc "latest" 2>&1 | tee -a /var/log/ncp.log - -if [[ \${PIPESTATUS[0]} -eq 0 ]]; then - - VER="\$(nc_version)" - - notify_admin "NextCloudPi" "Nextcloud was updated to \$VER" -fi -echo "" >> /var/log/ncp.log -EOF + install_template cron.daily/ncp-autoupdate-nc.sh "/etc/cron.daily/ncp-autoupdate-nc" chmod 755 /etc/cron.daily/ncp-autoupdate-nc echo "automatic Nextcloud updates enabled" } diff --git a/bin/ncp/UPDATES/nc-update-nextcloud.sh b/bin/ncp/UPDATES/nc-update-nextcloud.sh index 58c7487f3..6ff504f39 100644 --- a/bin/ncp/UPDATES/nc-update-nextcloud.sh +++ b/bin/ncp/UPDATES/nc-update-nextcloud.sh @@ -12,7 +12,12 @@ LATEST="$NCLATESTVER" configure() { - bash /usr/local/bin/ncp-update-nc "$VERSION" + extra_args=() + if [[ "${CHECK_INCOMPATIBLE_APPS:-yes}" != "yes" ]] + then + extra_args+=(--allow-incompatible-apps) + fi + bash /usr/local/bin/ncp-update-nc "$VERSION" "${extra_args[@]}" } install() { :; } diff --git a/etc/ncp-config.d/nc-autoupdate-nc.cfg b/etc/ncp-config.d/nc-autoupdate-nc.cfg index 617e71b01..55c02a64f 100644 --- a/etc/ncp-config.d/nc-autoupdate-nc.cfg +++ b/etc/ncp-config.d/nc-autoupdate-nc.cfg @@ -11,6 +11,12 @@ "name": "Active", "value": "no", "type": "bool" + }, + { + "id": "CHECK_INCOMPATIBLE_APPS", + "name": "Check for incompatible apps", + "value": "yes", + "type": "bool" } ] } diff --git a/etc/ncp-config.d/nc-update-nextcloud.cfg b/etc/ncp-config.d/nc-update-nextcloud.cfg index 0be2f6311..e8b6194ef 100644 --- a/etc/ncp-config.d/nc-update-nextcloud.cfg +++ b/etc/ncp-config.d/nc-update-nextcloud.cfg @@ -11,6 +11,12 @@ "name": "Version", "value": "0", "suggest": "0" + }, + { + "id": "CHECK_INCOMPATIBLE_APPS", + "name": "Check for incompatible apps", + "value": "yes", + "type": "bool" } ] } diff --git a/etc/ncp-templates/cron.daily/ncp-autoupdate-nc.sh b/etc/ncp-templates/cron.daily/ncp-autoupdate-nc.sh new file mode 100644 index 000000000..47d28a72c --- /dev/null +++ b/etc/ncp-templates/cron.daily/ncp-autoupdate-nc.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -e +set +u +source /usr/local/etc/library.sh + +ncp_update_nc_args="" +if [[ "$1" != "--defaults" ]] +then + ncp_update_nc_args="$( + source "${BINDIR}/UPDATES/nc-autoupdate-nc.sh" + tmpl_ncp_update_nc_args + )" +fi + +cat <> /var/log/ncp.log +/usr/local/bin/ncp-update-nc ${ncp_update_nc_args} "latest" 2>&1 | tee -a /var/log/ncp.log + +if [[ \${PIPESTATUS[0]} -eq 0 ]]; then + + VER="\$(nc_version)" + + notify_admin "NextCloudPi" "Nextcloud was updated to \$VER" +fi +echo "" >> /var/log/ncp.log +EOF \ No newline at end of file diff --git a/etc/ncp-templates/cron.hourly/ncp-previewgenerator b/etc/ncp-templates/cron.hourly/ncp-previewgenerator.sh similarity index 100% rename from etc/ncp-templates/cron.hourly/ncp-previewgenerator rename to etc/ncp-templates/cron.hourly/ncp-previewgenerator.sh diff --git a/updates/1.57.0.sh b/updates/1.57.0.sh index 68a3e2135..e75f79012 100644 --- a/updates/1.57.0.sh +++ b/updates/1.57.0.sh @@ -17,6 +17,11 @@ install_template nextcloud.conf.sh /etc/apache2/sites-available/001-nextcloud.co } systemctl reload apache2 +if is_active_app nc-autoupdate-nc +then + run_app nc-autoupdate-nc +fi + if [[ -L /var/www/nextcloud/apps/previewgenerator ]] then echo "Removing custom version of previewgenerator app ..." From fa3a7a7525216dfc5d5b0dd11dc2bd3cf4e086e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Kn=C3=B6ppler?= <6317548+theCalcaholic@users.noreply.github.com> Date: Sat, 4 Apr 2026 16:54:08 +0200 Subject: [PATCH 8/9] changelog.md: Document v1.57.0 --- changelog.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/changelog.md b/changelog.md index ea91af6c8..bf5649f36 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,24 @@ # NextcloudPi Changelog +## [v1.57.0](https://github.com/nextcloud/nextcloudpi/tree/v1.57.0) (2026-04-04) Nextcloud 33, new previewgenerator, fixes + +### Changes + +- Support for Nextcloud 33 +- Migrate to upstream previewgenerator (fixes [#2098](https://github.com/nextcloud/nextcloudpi/issues/2098)) +- Set overwrite.cli.url during NCP activation (fixes [#2087](https://github.com/nextcloud/nextcloudpi/issues/2087)) +- Add option to check for incompatible apps in nc-update-nextcloud and nc-autoupdate-nc (on by default) + +### Fixes + +- Fix outdated OS version being picked up in ncp_diag ([#2090](https://github.com/nextcloud/nextcloudpi/pull/2090) , thanks @CrazyWolf13) +- Fix(ncp-web): prevent XSS via log output and undefined array key warning ([#2096](https://github.com/nextcloud/nextcloudpi/pull/2096), thanks @aroldobossoni) +- Fix trusted proxy not being respected by Apache + +### Development related + +- Reenable and fix update tests for incus and VM targets +- Disable dist-upgrade test for VM target ## [v1.56.0](https://github.com/nextcloud/nextcloudpi/tree/v1.56.0) (2025-11-19) Nextcloud 32 and fixes From 7f91ea0f2533986c2c53a67384c9445e82960487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Kn=C3=B6ppler?= <6317548+theCalcaholic@users.noreply.github.com> Date: Sat, 4 Apr 2026 16:57:31 +0200 Subject: [PATCH 9/9] staged_rollouts: Push v1.57.0 to 15% of instances --- staged_rollouts/v1.57.0.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 staged_rollouts/v1.57.0.txt diff --git a/staged_rollouts/v1.57.0.txt b/staged_rollouts/v1.57.0.txt new file mode 100644 index 000000000..33e03b81b --- /dev/null +++ b/staged_rollouts/v1.57.0.txt @@ -0,0 +1,15 @@ +4 +5 +7 +8 +21 +27 +30 +31 +32 +50 +64 +68 +71 +79 +81 \ No newline at end of file