diff --git a/.github/actions/create-test-instance-bullseye/action.yml b/.github/actions/create-test-instance-bullseye/action.yml new file mode 100644 index 000000000..07a8bff2e --- /dev/null +++ b/.github/actions/create-test-instance-bullseye/action.yml @@ -0,0 +1,35 @@ +name: Create Test VM +description: Create NCP instance for testing in the Hetzner cloud +inputs: + version: + description: version (git rev / tag / branch) to install + required: true + uid: + description: A unique ID for labeling/naming generated resources + required: true + hcloud_token: + description: A auth token for Hetzner cloud + required: true + server_type: + description: Server type to use for hetzner servers + required: true + default: "cx11" + +outputs: + server_address: + description: Adress of the test instance + snapshot_id: + description: ID of the generated postinstall snapshot + test_server_id: + description: ID of the created test server +runs: + using: docker + image: docker://thecalcaholic/ncp-test-automation:bullseye + + env: + HCLOUD_TOKEN: ${{ inputs.hcloud_token }} + UID: ${{ inputs.uid }} + SERVER_TYPE: ${{ inputs.server_type }} + args: + - /ncp-test-automation/bin/actions/create-test-instance.sh + - ${{ inputs.version }} \ No newline at end of file diff --git a/.github/actions/create-test-instance/action.yml b/.github/actions/create-test-instance/action.yml index 0894a397a..8229415db 100644 --- a/.github/actions/create-test-instance/action.yml +++ b/.github/actions/create-test-instance/action.yml @@ -24,7 +24,7 @@ outputs: description: ID of the created test server runs: using: docker - image: docker://thecalcaholic/ncp-test-automation + image: docker://thecalcaholic/ncp-test-automation:bookworm env: HCLOUD_TOKEN: ${{ inputs.hcloud_token }} diff --git a/.github/workflows/build-lxd.yml b/.github/workflows/build-lxd.yml index 9914bc3fc..c25cdb214 100644 --- a/.github/workflows/build-lxd.yml +++ b/.github/workflows/build-lxd.yml @@ -34,18 +34,22 @@ jobs: runs-on: ubuntu-latest outputs: runner_label: ${{ steps.script.outputs.runner_label }} + lxc_cmd: ${{ steps.script.outputs.lxc_cmd }} steps: - name: script id: script run: | if [[ "${LXD_ARCH}" == "arm64" ]] then + LXC_CMD="incus" RUNNER_LABEL="ubuntu-20.04-arm64" else + LXC_CMD="lxc" RUNNER_LABEL="ubuntu-20.04" fi - echo "runner_label=$RUNNER_LABEL" | tee -a $GITHUB_OUTPUT + echo "runner_label=$RUNNER_LABEL" | tee -a $GITHUB_OUTPUT + echo "lxc_cmd=$LXC_CMD" | tee -a $GITHUB_OUTPUT build-current: needs: - determine-runner @@ -57,14 +61,16 @@ jobs: VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" ARTIFACT_NAME: "${{ github.run_id }}-lxd-${{ inputs.arch || 'x86' }}-image" LXD_ARCH: "${{ inputs.arch || 'x86' }}" + LXC: "${{ needs.determine-runner.outputs.lxc_cmd }}" steps: - name: Checkout code uses: actions/checkout@v3 with: ref: "${{ env.VERSION }}" - name: Cleanup lxd - run: test -z "$(lxc profile device show default | grep eth0)" || lxc profile device remove default eth0 + run: test -z "$("$LXC" profile device show default | grep eth0)" || "$LXC" profile device remove default eth0 - uses: whywaita/setup-lxd@v1 + if: ${{ needs.determine-runner.outputs.lxc_cmd == 'lxc' }} continue-on-error: true with: lxd_version: latest/stable @@ -73,6 +79,8 @@ jobs: sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT sudo iptables -I DOCKER-USER -o lxdbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT - name: Build LXD image + env: + USE_INCUS: "${{ needs.determine-runner.outputs.lxc_cmd == 'incus' && 'yes' || 'no' }}" run: | ./build/build-LXD.sh - name: Pack LXD image @@ -80,7 +88,7 @@ jobs: run: | . ./build/buildlib.sh ARTIFACT_FILE="NextcloudPi_LXD_${LXD_ARCH:-x86}_${VERSION//\//_}" - lxc image export -q ncp/"${version}" "output/${ARTIFACT_FILE}" + "$LXC" image export -q ncp/"${version}" "output/${ARTIFACT_FILE}" echo "artifact_file=${ARTIFACT_FILE}.tar.gz" >> $GITHUB_OUTPUT - name: upload LXD image to artifact store uses: actions/upload-artifact@v3 @@ -90,6 +98,8 @@ jobs: if-no-files-found: error build-previous: + needs: + - determine-runner runs-on: [ ubuntu-20.04 ] if: ${{ inputs.arch == 'x86' || inputs.arch == '' }} outputs: @@ -100,6 +110,7 @@ jobs: VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" ARTIFACT_NAME: "${{ github.run_id }}-lxd-${{ inputs.arch || 'x86' }}-image-previous" LXD_ARCH: "${{ inputs.arch || 'x86' }}" + LXC: "${{ needs.determine-runner.outputs.lxc_cmd }}" steps: - name: Checkout code uses: actions/checkout@v3 @@ -134,6 +145,7 @@ jobs: echo "VERSION=$version" >> "$GITHUB_ENV" echo "previous_version=${version}" >> $GITHUB_OUTPUT - uses: whywaita/setup-lxd@v1 + if: ${{ needs.determine-runner.outputs.lxc_cmd == 'lxc' }} continue-on-error: true with: lxd_version: latest/stable @@ -143,6 +155,8 @@ jobs: sudo iptables -I DOCKER-USER -o lxdbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT - name: Build LXD image + env: + USE_INCUS: "${{ needs.determine-runner.outputs.lxc_cmd == 'incus' && 'yes' || 'no' }}" run: | ./build/build-LXD.sh - name: Pack LXD image @@ -150,7 +164,7 @@ jobs: run: | . ./build/buildlib.sh ARTIFACT_FILE="NextcloudPi_LXD_${LXD_ARCH:-x86}_${VERSION//\//_}" - lxc image export -q ncp/"${version}" "output/${ARTIFACT_FILE}" + "${LXC}" image export -q ncp/"${version}" "output/${ARTIFACT_FILE}" echo "artifact_file=${ARTIFACT_FILE}.tar.gz" >> $GITHUB_OUTPUT - name: upload LXD image to artifact store uses: actions/upload-artifact@v3 @@ -161,6 +175,7 @@ jobs: test-update: needs: + - determine-runner - build-previous runs-on: [ubuntu-20.04] outputs: @@ -169,8 +184,10 @@ jobs: env: VERSION: "${{ inputs.git_ref || github.ref }}" ARTIFACT_NAME: "${{ needs.build-previous.outputs.artifact_name }}" + LXC: "${{ needs.determine-runner.outputs.lxc_cmd }}" steps: - uses: whywaita/setup-lxd@v1 + if: ${{ needs.determine-runner.outputs.lxc_cmd == 'lxc' }} continue-on-error: true with: lxd_version: latest/stable @@ -203,43 +220,43 @@ jobs: - name: Launch ncp container run: | set -x - lxc delete -q -f ncp || true - lxc image import -q "./${{ needs.build-previous.outputs.artifact_file }}" --alias "ncp/update" - systemd-run --user --scope -p "Delegate=yes" lxc launch -q "ncp/update" ncp - lxc exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' - lxc exec ncp -- rm -f /opt/ncdata/data/nextcloud.log + "$LXC" delete -q -f ncp || true + "$LXC" image import -q "./${{ needs.build-previous.outputs.artifact_file }}" --alias "ncp/update" + systemd-run --user --scope -p "Delegate=yes" "$LXC" launch -q "ncp/update" ncp + "$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + "$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log sleep 30 - ip="$(lxc list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" + ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" ip="${ip/% *}" echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts - name: Activate and Test LXD Image working-directory: ./tests run: | - lxc exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & + "$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & python activation_tests.py --no-gui "nextcloudpi.local" 443 4443 || { echo "Activation test failed!" echo "Geckodriver logs:" tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - lxc exec ncp -- "tail -n20 /var/log/ncp.log" || true + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true exit 1 } python system_tests.py --non-interactive || { echo "System test failed!" exit 1 } - python nextcloud_tests.py --no-gui "nextcloudpi.local" 443 4443 || { + python nextcloud_tests.py --no-gui --skip-release-check "nextcloudpi.local" 443 4443 || { echo "Nextcloud test failed!" echo "Geckodriver logs:" tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - lxc exec ncp -- "tail -n20 /var/log/ncp.log" || true + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " - datadir="$(lxc exec ncp -- ncc config:system:get datadirectory)" - lxc exec ncp -- cat "$datadir/nextcloud.log" || true + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true exit 1 } @@ -250,42 +267,228 @@ jobs: BRANCH="${BRANCH/refs\/tags\//}" if [[ "$BRANCH" =~ "refs/pull/"* ]] then - UPDATE_ARGS=("${{ github.base_ref }}" "$VERSION") + UPDATE_ARGS=("${{ github.head_ref }}" "$VERSION") else UPDATE_ARGS=("$BRANCH") fi echo "VERSION=${VERSION}" >> "$GITHUB_ENV" echo "Running update ${{ needs.build-previous.outputs.previous_version }} -> ${VERSION}" - current_nc_version="$(lxc exec ncp -- ncc status | grep "version:" | awk '{ print $3 }')" + current_nc_version="$("$LXC" exec ncp -- ncc status | grep "version:" | awk '{ print $3 }')" latest_nc_version="$(cat etc/ncp.cfg | jq -r '.nextcloud_version')" - lxc exec ncp -- bash -c "DBG=x ncp-update ${UPDATE_ARGS[*]}" - lxc exec ncp -- /usr/local/bin/ncc status + "$LXC" exec ncp -- bash -c "DBG=x ncp-update ${UPDATE_ARGS[*]}" + "$LXC" exec ncp -- /usr/local/bin/ncc status if [[ "$current_nc_version" =~ "$latest_nc_version".* ]] then echo "Nextcloud is up to date - skipping NC update test." else - lxc exec ncp -- bash -c "DBG=x ncp-update-nc ${latest_nc_version?}" + "$LXC" exec ncp -- bash -c "DBG=x ncp-update-nc ${latest_nc_version?}" fi - lxc exec ncp -- rm -f /opt/ncdata/data/nextcloud.log + "$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log - lxc stop ncp + "$LXC" stop ncp + - name: Relaunch container + run: | + set -x + systemd-run --user --scope -p "Delegate=yes" "$LXC" start ncp + "$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + sleep 30 + ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" + ip="${ip/% *}" + echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts + - name: Test LXD Image + working-directory: ./tests + run: | + "$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & + python system_tests.py --non-interactive || { + echo "System test failed!" + exit 1 + } + python nextcloud_tests.py --no-gui --skip-release-check "nextcloudpi.local" 443 4443 || { + echo "Nextcloud test failed!" + echo "Geckodriver logs:" + tail -n 20 geckodriver.log >&2 || true + echo "================" + echo "ncp.log: " + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + echo "================" + echo "nextcloud log: " + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true + exit 1 + } + + test-dist-upgrade: + needs: + - determine-runner + runs-on: [ubuntu-20.04] + env: + VERSION: "${{ inputs.git_ref || github.ref }}" + LXC: "${{ needs.determine-runner.outputs.lxc_cmd }}" + PREVIOUS_IMAGE_URL: "https://github.com/nextcloud/nextcloudpi/releases/download/v1.53.2/NextcloudPi_LXD_x86_v1.53.2.tar.gz" + steps: + - uses: whywaita/setup-lxd@v1 + if: ${{ needs.determine-runner.outputs.lxc_cmd == 'lxc' }} + continue-on-error: true + with: + lxd_version: latest/stable + - name: Fix LXD + run: | + sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT + sudo iptables -I DOCKER-USER -o lxdbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: "${{ env.VERSION }}" + - name: Setup Firefox + continue-on-error: true + id: setup-firefox-browser-action + uses: browser-actions/setup-firefox@latest + - name: Setup Firefox from packages + if: ${{ steps.setup-firefox-browser-action.outcome == 'failure' }} + run: | + sudo apt-get install -y --no-install-recommends firefox + - name: Setup GeckoDriver + uses: ChlodAlejandro/setup-geckodriver@latest + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Setup Selenium + run: pip install selenium + - name: download LXD image + run: | + wget -qO ./ncp.tar.gz "${PREVIOUS_IMAGE_URL?}" + - name: Launch ncp container + run: | + set -x + "$LXC" delete -q -f ncp || true + "$LXC" image import -q "./ncp.tar.gz" --alias "ncp/update" + systemd-run --user --scope -p "Delegate=yes" "$LXC" launch -q "ncp/update" ncp + "$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + "$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log + sleep 30 + ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" + ip="${ip/% *}" + echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts + - name: Activate and Test LXD Image + working-directory: ./tests + run: | + "$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & + python activation_tests.py --no-gui "nextcloudpi.local" 443 4443 || { + echo "Activation test failed!" + echo "Geckodriver logs:" + tail -n 20 geckodriver.log >&2 || true + echo "================" + echo "ncp.log: " + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + exit 1 + } + python system_tests.py --non-interactive --skip-update-test || { + echo "System test failed!" + exit 1 + } + python nextcloud_tests.py --no-gui --skip-release-check "nextcloudpi.local" 443 4443 || { + echo "Nextcloud test failed!" + echo "Geckodriver logs:" + tail -n 20 geckodriver.log >&2 || true + echo "================" + echo "ncp.log: " + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + echo "================" + echo "nextcloud log: " + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true + exit 1 + } + + - name: Update ncp + run: | + set -ex + BRANCH="${VERSION/refs\/heads\//}" + BRANCH="${BRANCH/refs\/tags\//}" + if [[ "$BRANCH" =~ "refs/pull/"* ]] + then + UPDATE_ARGS=("${{ github.head_ref }}" "$VERSION") + else + UPDATE_ARGS=("$BRANCH") + fi + echo "VERSION=${VERSION}" >> "$GITHUB_ENV" + echo "Running update to ${VERSION}" + + current_nc_version="$("$LXC" exec ncp -- ncc status | grep "version:" | awk '{ print $3 }')" + latest_nc_version="$(cat etc/ncp.cfg | jq -r '.nextcloud_version')" + + "$LXC" exec ncp -- bash -c "DBG=x ncp-update ${UPDATE_ARGS[*]}" + "$LXC" exec ncp -- /usr/local/bin/ncc status + + if [[ "$current_nc_version" =~ "$latest_nc_version".* ]] + then + echo "Nextcloud is up to date - skipping NC update test." + else + "$LXC" exec ncp -- bash -c "DBG=x ncp-update-nc ${latest_nc_version?}" + fi + + "$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log + + "$LXC" stop ncp - name: Relaunch container run: | set -x - systemd-run --user --scope -p "Delegate=yes" lxc start ncp - lxc exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + systemd-run --user --scope -p "Delegate=yes" "$LXC" start ncp + "$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' sleep 30 - ip="$(lxc list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" + ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" ip="${ip/% *}" echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts - name: Test LXD Image working-directory: ./tests run: | - lxc exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & + "$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & + python system_tests.py --non-interactive --skip-update-test || { + echo "System test failed!" + exit 1 + } + python nextcloud_tests.py --no-gui --skip-release-check "nextcloudpi.local" 443 4443 || { + echo "Nextcloud test failed!" + echo "Geckodriver logs:" + tail -n 20 geckodriver.log >&2 || true + echo "================" + echo "ncp.log: " + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true + echo "================" + echo "nextcloud log: " + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true + exit 1 + } + - name: NCP distupgrade + id: distupgrade + run: | + set -x + "$LXC" exec ncp -- cat /etc/os-release | grep 'VERSION_ID="11"' || { + echo "can't upgrade from Debian $("$LXC" exec ncp -- cat /etc/os-release | grep VERSION_ID=)" + exit 1 + } + "$LXC" exec ncp -- bash -c "DEBIAN_FRONTEND=noninteractive ncp-dist-upgrade" + + "$LXC" exec ncp -- rm -f /opt/ncdata/data/nextcloud.log + + "$LXC" stop ncp + - name: Relaunch container + run: | + set -x + systemd-run --user --scope -p "Delegate=yes" "$LXC" start ncp + "$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + sleep 30 + ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" + ip="${ip/% *}" + echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts + - name: Test LXD Image + working-directory: ./tests + run: | + "$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & python system_tests.py --non-interactive || { echo "System test failed!" exit 1 @@ -296,14 +499,14 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - lxc exec ncp -- "tail -n20 /var/log/ncp.log" || true + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " - datadir="$(lxc exec ncp -- ncc config:system:get datadirectory)" - lxc exec ncp -- cat "$datadir/nextcloud.log" || true + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true exit 1 } - lxc stop ncp + "$LXC" stop ncp test-fresh-install: needs: @@ -314,14 +517,16 @@ jobs: VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" ARTIFACT_NAME: ${{ needs.build-current.outputs.artifact_name }} ARTIFACT_FILE: ${{ needs.build-current.outputs.artifact_file }} + LXC: "${{ needs.determine-runner.outputs.lxc_cmd }}" steps: - name: Checkout code uses: actions/checkout@v3 with: ref: "${{ env.VERSION }}" - name: Cleanup lxd - run: test -z "$(lxc profile device show default | grep eth0)" || lxc profile device remove default eth0 + run: test -z "$("$LXC" profile device show default | grep eth0)" || "$LXC" profile device remove default eth0 - uses: whywaita/setup-lxd@v1 + if: ${{ needs.determine-runner.outputs.lxc_cmd == 'lxc' }} continue-on-error: true with: lxd_version: latest/stable @@ -347,38 +552,38 @@ jobs: - name: Remove old lxd images if: ${{ inputs.arch == 'arm64' }} run: | - for img in $(lxc image list -c f -f csv) + for img in $("$LXC" image list -c f -f csv) do - lxc image delete "$img" + "$LXC" image delete "$img" done - name: Launch ncp container run: | set -x . ./build/buildlib.sh - lxc delete -q -f ncp || true - lxc image import -q "./${ARTIFACT_FILE?}" --alias "ncp/test" || true - systemd-run --user --scope -p "Delegate=yes" lxc launch -q "ncp/test" ncp || \ - sudo systemd-run --scope -p "Delegate=yes" lxc launch -q "ncp/test" ncp - lxc exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + "$LXC" delete -q -f ncp || true + "$LXC" image import -q "./${ARTIFACT_FILE?}" --alias "ncp/test" || true + systemd-run --user --scope -p "Delegate=yes" "$LXC" launch -q "ncp/test" ncp || \ + sudo systemd-run --scope -p "Delegate=yes" "$LXC" launch -q "ncp/test" ncp + "$LXC" exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' sleep 30 - ip="$(lxc list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" + ip="$("$LXC" list -c n4 -f csv | grep '^ncp' | cut -d ',' -f2)" ip="${ip/% *}" echo "${ip} nextcloudpi.local" | sudo tee /etc/hosts - name: Test LXD Image working-directory: ./tests run: | - lxc exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & + "$LXC" exec ncp -- bash -c 'tail -f /var/log/ncp.log' |& awk '{ print "NCP::" $0 }' & python activation_tests.py --no-gui "nextcloudpi.local" 443 4443 || { echo "Activation test failed!" echo "Geckodriver logs:" tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - lxc exec ncp -- "tail -n20 /var/log/ncp.log" || true + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " - datadir="$(lxc exec ncp -- ncc config:system:get datadirectory)" - lxc exec ncp -- cat "$datadir/nextcloud.log" || true + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true exit 1 } python system_tests.py --non-interactive || { @@ -391,11 +596,11 @@ jobs: tail -n 20 geckodriver.log >&2 || true echo "================" echo "ncp.log: " - lxc exec ncp -- "tail -n20 /var/log/ncp.log" || true + "$LXC" exec ncp -- "tail -n20 /var/log/ncp.log" || true echo "================" echo "nextcloud log: " - datadir="$(lxc exec ncp -- ncc config:system:get datadirectory)" - lxc exec ncp -- cat "$datadir/nextcloud.log" || true + datadir="$("$LXC" exec ncp -- ncc config:system:get datadirectory)" + "$LXC" exec ncp -- cat "$datadir/nextcloud.log" || true exit 1 } lxc stop ncp diff --git a/.github/workflows/build-sd-images.yml b/.github/workflows/build-sd-images.yml index c37b77997..5bc96d61e 100644 --- a/.github/workflows/build-sd-images.yml +++ b/.github/workflows/build-sd-images.yml @@ -186,6 +186,14 @@ jobs: sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-arm-static -O raspbian_root/usr/bin/qemu-arm-static sudo chmod +x raspbian_root/usr/bin/qemu-{arm,aarch64}-static echo 'Mutex posixsem' | sudo tee -a raspbian_root/etc/apache2/mods-available/ssl.conf + echo 'ignore-warnings ARM64-COW-BUG' | sudo tee -a raspbian_root/etc/redis/redis.conf + sudo mkdir -p raspbian_root/etc/systemd/system/redis-server.service.d + echo '[Service]' | sudo tee raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf + echo 'PrivateUsers=false' | sudo tee -a raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf + + sudo mkdir -p raspbian_root/etc/systemd/system/php8.1-fpm.service.d + echo '[Service]' | sudo tee raspbian_root/etc/systemd/system/php8.1-fpm.service.d/ncp.conf + echo 'ExecStartPre=mkdir -p /var/run/php' | sudo tee -a raspbian_root/etc/systemd/system/php8.1-fpm.service.d/ncp.conf - name: Test image id: test run: | @@ -308,8 +316,9 @@ jobs: echo -e "${LOG_DIAG} ncp.log: " "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true echo "================" - echo "Nextcloud log: " - "${CONTAINER_CMD[@]}" -q ncp cat /opt/ncdata/data/nextcloud.log + echo "${LOG_DIAG} Nextcloud log: " + "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true + "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true sleep 12 continue } @@ -323,3 +332,515 @@ jobs: echo -e "${LOG_CICD} Nextcloud test failed in all attempts!" exit 1 } + +# test-distupgrade: +# runs-on: ubuntu-20.04 +# env: +# VERSION: "${{ inputs.git_ref || github.ref }}" +# LOG_GUEST: "\\033[1;34mGUEST::\\033[0m" +# LOG_NCP: "\\033[1;36m~NCP::\\033[0m" +# LOG_CICD: "\\033[1;35mCICD::\\033[0m" +# LOG_TEST: "\\033[1;33mTEST::\\033[0m" +# LOG_DIAG: "\\033[1;31mDIAG::\\033[0m" +# PREVIOUS_VERSION: "v1.53.2" +# defaults: +# run: +# shell: bash +# steps: +# - name: Set up QEMU +# uses: docker/setup-qemu-action@v3 +# - name: Checkout code +# uses: actions/checkout@v3 +# with: +# ref: "${{ env.VERSION }}" +# - name: Download previous image +# id: download-previous-image +# run: | +# set -x +# mkdir -p output +# cd output +# wgetrc=0 +# wgeterr="$(wget -O ./ncp.zip "https://github.com/nextcloud/nextcloudpi/releases/download/${PREVIOUS_VERSION?}/NextcloudPi_${{ inputs.board_name }}_${PREVIOUS_VERSION}.zip" 2>&1)" || wgetrc=$? +# if [[ $wgetrc -ne 0 ]] +# then +# if echo "$wgeterr" | grep '404 Not Found' +# then +# echo "Board not found in previous release - skipping." +# echo "skipped=true" >> "$GITHUB_OUTPUT" +# exit 0 +# else +# echo "$wgeterr" +# exit $wgetrc +# fi +# fi +# echo "skipped=false" >> "$GITHUB_OUTPUT" +# unzip ncp.zip +# rm ncp.zip +# mv NextcloudPi_${{ inputs.board_name }}_${PREVIOUS_VERSION}.img ./ncp.img +# echo "ARTIFACT_FILE=ncp.img" >> "$GITHUB_ENV" +# - name: Prepare test +# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }} +# run: | +# set -x +# mv output/${ARTIFACT_FILE?} ncp.img +# sudo apt-get install -y systemd-container +# sudo pip install selenium +# sudo rm -rf raspbian_root +# . ./build/buildlib.sh +# mount_raspbian "ncp.img" +# sudo cat raspbian_root/etc/machine-id +# sudo systemd-id128 new | sudo tee ./raspbian_root/etc/machine-id +# sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-aarch64-static -O raspbian_root/usr/bin/qemu-aarch64-static +# sudo wget -nv https://github.com/multiarch/qemu-user-static/releases/latest/download/qemu-arm-static -O raspbian_root/usr/bin/qemu-arm-static +# sudo chmod +x raspbian_root/usr/bin/qemu-{arm,aarch64}-static +# echo 'Mutex posixsem' | sudo tee -a raspbian_root/etc/apache2/mods-available/ssl.conf +# echo 'ignore-warnings ARM64-COW-BUG' | sudo tee -a raspbian_root/etc/redis/redis.conf +# sudo mkdir -p raspbian_root/etc/systemd/system/redis-server.service.d +# echo '[Service]' | sudo tee raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf +# echo 'PrivateUsers=false' | sudo tee -a raspbian_root/etc/systemd/system/redis-server.service.d/ncp.conf +# - name: Test and activate image +# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }} +# id: test +# run: | +# +# log_err() { +# rc="${1?}" +# msg="${2?}" +# echo -e "${LOG_DIAG} $msg" >&2 +# return $rc +# } +# +# sudo systemd-nspawn --boot -D ./raspbian_root/ -M ncp --hostname=nextcloudpi |& awk "{ print \"${LOG_GUEST} \" \$0 }" & +# sleep 60 +# +# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait) +# +# success=false +# for attempt in {1..30} +# do +# echo -e "${LOG_CICD} == Wait until container network is available (attempt $attempt/30) ==" +# ip="$("${CONTAINER_CMD[@]}" bash -c '. /usr/local/etc/library.sh > /dev/null; get_ip')" +# [[ -n "$ip" ]] && curl -k "https://$ip/activate/" > /dev/null || { sleep 6; continue; } +# success=true +# break +# done +# sudo cat ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" +# sudo tail -n 0 -f ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" & +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Could not reach container. Aborting..." +# exit 1 +# } +# +# attempt=0 +# success=false +# for attempt in {1..150} +# do +# echo -e "${LOG_CICD} Waiting for container startup (attempt $attempt/150)..." +# "${CONTAINER_CMD[@]}" journalctl -eu redis.service || true +# "${CONTAINER_CMD[@]}" systemctl status php8.1-fpm.service || true +# redis_pw="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"password'")" \ +# && redis_socket="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"host'")" \ +# || log_err $? "Error retrieving redis credentials" || true +# if { "${CONTAINER_CMD[@]}" -q ncc status |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "ncc status check failed"; } \ +# && { [[ "$("${CONTAINER_CMD[@]}" ncc maintenance:mode)" =~ .*disabled.* ]] || log_err $? "Maintenance mode is enabled or could not be retrieved"; } \ +# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" set redisready yes |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to set redis variable"; } \ +# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" get redisready |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to read redis variable"; } +# then +# echo -e "${LOG_CICD} Startup successful" +# success=true +# break +# fi +# attempt=$((attempt + 1)) +# sleep 5 +# done +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Timeout reached." +# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status redis |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status 'php*-fpm' |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status apache2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# exit 1 +# } +# +# set -x +# set +e +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == Activation Tests (attempt $attempt/5) ==" +# python tests/activation_tests.py -t 300 --no-gui "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} Activation test failed!" +# echo -e "${LOG_DIAG} Geckodriver logs:" +# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo "================" +# echo -e "${LOG_DIAG} mysql: " +# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# sleep 12 +# continue +# } +# success=true +# break +# done +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Activation test failed in all attempts!" +# exit 1 +# } +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == System Tests (attempt $attempt/5) ==" +# sudo python tests/system_tests.py --non-interactive --skip-update-test |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} System test failed!" +# sleep 12 +# continue +# } +# success=true +# break +# done +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} System test failed in all attempts!" +# exit 1 +# } +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == Nextcloud Tests (attempt $attempt/5) ==" +# python tests/nextcloud_tests.py --no-gui --skip-release-check "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} Nextcloud test failed!" +# echo -e "{$LOG_DIAG} Geckodriver logs:" +# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo -e "${LOG_CICD} ================" +# echo -e "${LOG_DIAG} ncp.log: " +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo "================" +# echo "${LOG_DIAG} Nextcloud log: " +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# sleep 12 +# continue +# } +# success=true +# break +# done +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Nextcloud test failed in all attempts!" +# exit 1 +# } +# - name: Update NCP +# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }} +# run: | +# set -ex +# +# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait) +# +# BRANCH="${VERSION/refs\/heads\//}" +# BRANCH="${BRANCH/refs\/tags\//}" +# if [[ "$BRANCH" =~ "refs/pull/"* ]] +# then +# UPDATE_ARGS=("${{ github.head_ref }}" "$VERSION") +# else +# UPDATE_ARGS=("$BRANCH") +# fi +# current_nc_version="$("${CONTAINER_CMD[@]}" ncc status | grep "version:" | awk '{ print $3 }')" +# latest_nc_version="$(cat etc/ncp.cfg | jq -r '.nextcloud_version')" +# +# echo "Updating from $PREVIOUS_VERSION to $VERSION" +# +# "${CONTAINER_CMD[@]}" bash -c "DBG=x ncp-update ${UPDATE_ARGS[*]}" +# "${CONTAINER_CMD[@]}" /usr/local/bin/ncc status +# # "${CONTAINER_CMD[@]}" bash -c 'curl https://download.nextcloud.com/server/releases/nextcloud-28.0.4.tar.bz2 > /var/www/nextcloud-28.0.4.tar.bz2' +# k0nKat1Nation +# +# # if [[ "$current_nc_version" =~ "$latest_nc_version".* ]] +# # then +# # echo "Nextcloud is up to date - skipping NC update test." +# # else +# # "${CONTAINER_CMD[@]}" bash -c "DBG=x ncp-update-nc ${latest_nc_version?}" +# # fi +# +# sudo machinectl terminate ncp +# sudo rm -f ./raspbian_root/opt/ncdata/data/nextcloud.log +# - name: Test image after update +# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }} +# run: | +# +# log_err() { +# rc="${1?}" +# msg="${2?}" +# echo -e "${LOG_DIAG} $msg" >&2 +# return $rc +# } +# +# sudo systemd-nspawn --boot -D ./raspbian_root/ -M ncp --hostname=nextcloudpi |& awk "{ print \"${LOG_GUEST} \" \$0 }" & +# sleep 60 +# +# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait) +# +# success=false +# for attempt in {1..30} +# do +# echo -e "${LOG_CICD} == Wait until container network is available (attempt $attempt/30) ==" +# ip="$("${CONTAINER_CMD[@]}" bash -c '. /usr/local/etc/library.sh > /dev/null; get_ip')" +# [[ -n "$ip" ]] && curl -k "https://$ip/activate/" > /dev/null || { sleep 6; continue; } +# success=true +# break +# done +# sudo cat ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" +# sudo tail -n 0 -f ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" & +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Could not reach container. Aborting..." +# exit 1 +# } +# +# attempt=0 +# success=false +# for attempt in {1..150} +# do +# echo -e "${LOG_CICD} Waiting for container startup (attempt $attempt/150)..." +# "${CONTAINER_CMD[@]}" journalctl -eu redis.service || true +# "${CONTAINER_CMD[@]}" systemctl status php8.1-fpm.service || true +# redis_pw="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"password'")" \ +# && redis_socket="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"host'")" \ +# || log_err $? "Error retrieving redis credentials" || true +# if { "${CONTAINER_CMD[@]}" -q ncc status |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "ncc status check failed"; } \ +# && { [[ "$("${CONTAINER_CMD[@]}" ncc maintenance:mode)" =~ .*disabled.* ]] || log_err $? "Maintenance mode is enabled or could not be retrieved"; } \ +# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" set redisready yes |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to set redis variable"; } \ +# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" get redisready |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to read redis variable"; } +# then +# echo -e "${LOG_CICD} Startup successful" +# success=true +# break +# fi +# attempt=$((attempt + 1)) +# sleep 5 +# done +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Timeout reached." +# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status redis |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status 'php*-fpm' |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status apache2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# exit 1 +# } +# +# set -x +# set +e +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == System Tests (attempt $attempt/5) ==" +# sudo python tests/system_tests.py --non-interactive --skip-update-test |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} System test failed!" +# sleep 12 +# continue +# } +# success=true +# break +# done +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} System test failed in all attempts!" +# exit 1 +# } +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == Nextcloud Tests (attempt $attempt/5) ==" +# python tests/nextcloud_tests.py --no-gui --skip-release-check "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} Nextcloud test failed!" +# echo -e "{$LOG_DIAG} Geckodriver logs:" +# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo -e "${LOG_CICD} ================" +# echo -e "${LOG_DIAG} ncp.log: " +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo "================" +# echo "${LOG_DIAG} Nextcloud log: " +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# sleep 12 +# continue +# } +# success=true +# break +# done +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Nextcloud test failed in all attempts!" +# exit 1 +# } +# +# - name: Run dist-upgrade +# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }} +# run: | +# set -ex +# +# source ./library.sh +# +# echo "Updating from $PREVIOUS_VERSION to $VERSION +# +# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait) +# +# sudo grep 'VERSION="11"' ./raspbian_root/etc/os-release || { +# echo "Can't dist-upgrade from debian version $(sudo grep 'Version=' ./raspbian_root/etc/os-release)" +# exit 1 +# } +# "${CONTAINER_CMD[@]}" DBG=x ncp-dist-upgrade "$VERSION" +# +# sudo machinectl terminate ncp +# sudo rm -f ./raspbian_root/opt/ncdata/data/nextcloud.log +# +# - name: Test image after dist-upgrade +# if: ${{ steps.download-previous-image.outputs.skipped == 'false' }} +# run: | +# +# log_err() { +# rc="${1?}" +# msg="${2?}" +# echo -e "${LOG_DIAG} $msg" >&2 +# return $rc +# } +# +# sudo systemd-nspawn --boot -D ./raspbian_root/ -M ncp --hostname=nextcloudpi |& awk "{ print \"${LOG_GUEST} \" \$0 }" & +# sleep 60 +# +# CONTAINER_CMD=(sudo systemd-run --machine=ncp -P --wait) +# +# success=false +# for attempt in {1..30} +# do +# echo -e "${LOG_CICD} == Wait until container network is available (attempt $attempt/30) ==" +# ip="$("${CONTAINER_CMD[@]}" bash -c '. /usr/local/etc/library.sh > /dev/null; get_ip')" +# [[ -n "$ip" ]] && curl -k "https://$ip/activate/" > /dev/null || { sleep 6; continue; } +# success=true +# break +# done +# sudo cat ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" +# sudo tail -n 0 -f ./raspbian_root/var/log/ncp.log |& awk "{ print \"${LOG_NCP} \" \$0 }" & +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Could not reach container. Aborting..." +# exit 1 +# } +# +# attempt=0 +# success=false +# for attempt in {1..150} +# do +# echo -e "${LOG_CICD} Waiting for container startup (attempt $attempt/150)..." +# "${CONTAINER_CMD[@]}" journalctl -eu redis.service || true +# "${CONTAINER_CMD[@]}" systemctl status php8.1-fpm.service || true +# redis_pw="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"password'")" \ +# && redis_socket="$("${CONTAINER_CMD[@]}" bash -c ". /usr/local/etc/library.sh; get_nc_config_value 'redis\"][\"host'")" \ +# || log_err $? "Error retrieving redis credentials" || true +# if { "${CONTAINER_CMD[@]}" -q ncc status |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "ncc status check failed"; } \ +# && { [[ "$("${CONTAINER_CMD[@]}" ncc maintenance:mode)" =~ .*disabled.* ]] || log_err $? "Maintenance mode is enabled or could not be retrieved"; } \ +# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" set redisready yes |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to set redis variable"; } \ +# && { "${CONTAINER_CMD[@]}" redis-cli -s "$redis_socket" -a "$redis_pw" get redisready |& awk "{ print \"${LOG_DIAG} \" \$0 }" || log_err $? "Failed to read redis variable"; } +# then +# echo -e "${LOG_CICD} Startup successful" +# success=true +# break +# fi +# attempt=$((attempt + 1)) +# sleep 5 +# done +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Timeout reached." +# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status redis |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status 'php*-fpm' |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q systemctl status apache2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" +# exit 1 +# } +# +# set -x +# set +e +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == Activation Tests (attempt $attempt/5) ==" +# python tests/activation_tests.py -t 300 --no-gui "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} Activation test failed!" +# echo -e "${LOG_DIAG} Geckodriver logs:" +# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo "================" +# echo -e "${LOG_DIAG} mysql: " +# "${CONTAINER_CMD[@]}" -q ncp-diag |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# "${CONTAINER_CMD[@]}" -q systemctl status mysql |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# sleep 12 +# continue +# } +# success=true +# break +# done +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Activation test failed in all attempts!" +# exit 1 +# } +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == System Tests (attempt $attempt/5) ==" +# sudo python tests/system_tests.py --non-interactive |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} System test failed!" +# sleep 12 +# continue +# } +# success=true +# break +# done +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} System test failed in all attempts!" +# exit 1 +# } +# +# success=false +# for attempt in {1..5} +# do +# echo -e "${LOG_CICD} == Nextcloud Tests (attempt $attempt/5) ==" +# python tests/nextcloud_tests.py --no-gui "$ip" 443 4443 |& awk "{ print \"${LOG_TEST} \" \$0 }" +# [[ ${PIPESTATUS[0]} -eq 0 ]] || { +# echo -e "${LOG_CICD} Nextcloud test failed!" +# echo -e "{$LOG_DIAG} Geckodriver logs:" +# tail -n 20 geckodriver.log >&2 |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo -e "${LOG_CICD} ================" +# echo -e "${LOG_DIAG} ncp.log: " +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c "tail -n20 /var/log/ncp.log" |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# echo "================" +# echo "${LOG_DIAG} Nextcloud log: " +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'ls -l /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# "${CONTAINER_CMD[@]}" -q ncp /bin/bash -c 'cat /opt/ncdata/data/nextcloud.log' |& awk "{ print \"${LOG_DIAG} \" \$0 }" || true +# sleep 12 +# continue +# } +# success=true +# break +# done +# +# [[ "$success" == "true" ]] || { +# echo -e "${LOG_CICD} Nextcloud test failed in all attempts!" +# exit 1 +# } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b5d40ad1a..ec61ff9a7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,11 +16,6 @@ on: description: 'Build/test LXD image?' required: false default: true - docker: - type: boolean - description: 'Build/test docker images?' - required: false - default: true installer: type: boolean description: 'Run curl-installer/upgrade tests?' @@ -28,16 +23,14 @@ on: default: true release: type: boolean - description: 'Release images to GH and docker registry' + description: 'Release images to GH' required: false default: false push: tags: - "v*" - - "docker-v*" branches: - master - - docker-stable permissions: contents: write @@ -58,44 +51,29 @@ jobs: arch: 'arm64' secrets: inherit - docker-x86: - if: ${{ inputs.docker || ( github.event_name != 'workflow_dispatch' && startsWith(github.ref_name, 'docker-') ) }} - uses: ./.github/workflows/build-docker.yml - with: - git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" - arch: "x86" - secrets: inherit - - docker-armhf: - if: ${{ inputs.docker || ( github.event_name != 'workflow_dispatch' && startsWith(github.ref_name, 'docker-') ) }} - uses: ./.github/workflows/build-docker.yml - with: - git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" - arch: "armhf" - secrets: inherit - - docker-arm64: - if: ${{ inputs.docker || ( github.event_name != 'workflow_dispatch' && startsWith(github.ref_name, 'docker-') ) }} - uses: ./.github/workflows/build-docker.yml + test-curl-installer: + if: ${{ inputs.installer || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }} + uses: ./.github/workflows/vm-tests.yml with: git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" - arch: "arm64" secrets: inherit - test-curl-installer: - if: ${{ inputs.installer || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }} - uses: ./.github/workflows/vm-tests.yml + raspberrypi-4: + if: ${{ inputs.sd-images || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }} + uses: ./.github/workflows/build-sd-images.yml with: git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" + board_id: rpi4b + board_name: RaspberryPi4 secrets: inherit - raspberrypi: + raspberrypi-5: if: ${{ inputs.sd-images || ( github.event_name != 'workflow_dispatch' && !startsWith(github.ref_name, 'docker-') ) }} uses: ./.github/workflows/build-sd-images.yml with: git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" - board_id: raspberrypi - board_name: RaspberryPi + board_id: rpi5b + board_name: RaspberryPi5 secrets: inherit # TODO: Fix 32bit armbian images @@ -207,19 +185,31 @@ jobs: artifact_file: "${{ needs.lxd-arm64.outputs.lxc_artifact_file }}" dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }} - raspberrypi-release: + raspberrypi-4-release: needs: - - raspberrypi + - raspberrypi-4 - github-release if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }} uses: ./.github/workflows/publish-image.yml with: git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" - artifact_id: "${{ needs.raspberrypi.outputs.artifact_name }}" - artifact_file: "${{ needs.raspberrypi.outputs.artifact_file }}" + artifact_id: "${{ needs.raspberrypi-4.outputs.artifact_name }}" + artifact_file: "${{ needs.raspberrypi-4.outputs.artifact_file }}" dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }} secrets: inherit + raspberrypi-5-release: + needs: + - raspberrypi-5 + - github-release + if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }} + uses: ./.github/workflows/publish-image.yml + with: + git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}" + artifact_id: "${{ needs.raspberrypi-5.outputs.artifact_name }}" + artifact_file: "${{ needs.raspberrypi-5.outputs.artifact_file }}" + dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }} + secrets: inherit odroidxu4-release: needs: - odroidxu4 @@ -305,55 +295,6 @@ jobs: dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }} secrets: inherit - docker-release: - needs: - - docker-x86 - - docker-armhf - - docker-arm64 - if: ${{ (inputs.release || github.event_name != 'workflow_dispatch') && github.ref_type == 'tag' && (github.ref_protected || startsWith(github.ref, 'refs/tags/docker-v')) }} - runs-on: ubuntu-latest - steps: - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Checkout code - uses: actions/checkout@v3 - - - name: Create manifest and push as tag to docker hub - run: | - . ./build/buildlib.sh - version="${version#docker-}" - - for arch in x86 armhf arm64 - do - docker pull "thecalcaholic/ncp-internal-${arch}:${{ github.run_id }}" - docker tag "thecalcaholic/ncp-internal-${arch}:${{ github.run_id }}" "ownyourbits/nextcloudpi-${arch}:${version?}" - docker tag "ownyourbits/nextcloudpi-${arch}:${version?}" "ownyourbits/nextcloudpi-${arch}:latest" - docker push "ownyourbits/nextcloudpi-${arch}:${version?}" - [[ "$version" =~ ^(docker-)?v[0-9]+'.'[0-9]+'.'[0-9]+$ ]] && docker push "ownyourbits/nextcloudpi-${arch}:latest" - done - - docker manifest create ownyourbits/nextcloudpi:${version?} \ - ownyourbits/nextcloudpi-armhf:${version?} \ - ownyourbits/nextcloudpi-x86:${version?} \ - ownyourbits/nextcloudpi-arm64:${version?} - docker manifest push ownyourbits/nextcloudpi:${version?} - - - name: Create manifest and push as latest to docker hub - run: | - [[ "${{ github.ref }}" =~ ^'refs/tags/'(docker-)?'v'[0-9]+'.'[0-9]+'.'[0-9]+$ ]] || { - echo "not tagging latest - is a pre-/beta-release" - exit 0 - } - docker manifest create ownyourbits/nextcloudpi:latest \ - ownyourbits/nextcloudpi-armhf:latest \ - ownyourbits/nextcloudpi-x86:latest \ - ownyourbits/nextcloudpi-arm64:latest - docker manifest push ownyourbits/nextcloudpi:latest - github-release: if: ${{ github.event_name == 'workflow_dispatch' || !startsWith(github.ref_name, 'docker-') }} needs: diff --git a/.github/workflows/vm-tests.yml b/.github/workflows/vm-tests.yml index ee8258939..d01a97bfd 100644 --- a/.github/workflows/vm-tests.yml +++ b/.github/workflows/vm-tests.yml @@ -18,53 +18,124 @@ on: - master jobs: - setup-installation-test-instance: + installation-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 }}-install" 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 }} 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 }}-install-ssh" + UID: "${{ github.run_id }}-install" + defaults: + run: + shell: bash steps: - uses: actions/checkout@v3 - - run: | + with: + path: /home/runner/actions-runner/_work/nextcloudpi/nextcloudpi + - name: Generate ssh keypair + working-directory: /__w/nextcloudpi/nextcloudpi + run: | set -e - mkdir -p ./.ssh + mkdir -p .ssh ssh-keygen -t ed25519 -f ".ssh/automation_ssh_key" + . /ncp-test-automation/bin/entrypoint.sh - name: upload ssh private key to artifact store uses: actions/upload-artifact@v3 with: - name: ${{ github.run_id }}-install-ssh-privkey - path: .ssh + name: "${{ env.SSH_ARTIFACT_NAME }}" + path: /__w/nextcloudpi/nextcloudpi/.ssh if-no-files-found: error - id: create-test-instance uses: ./.github/actions/create-test-instance with: version: ${{ env.VERSION }} - uid: "${{ github.run_id }}-install" + uid: "${{ env.UID }}" hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} server_type: "cx11" + - 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: Test postinstall VM + id: final_test + 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 '[ $? -eq 0 ] || echo "test_result=failure" >> "$GITHUB_OUTPUT"; 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 + set -x + test-ncp-instance -a -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 "and ncp.log:" + echo "===========================================" + ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp.log; + echo "===========================================" + exit 1 + } + echo "test_result=success" >> "$GITHUB_OUTPUT"; - setup-update-test-instance: + update-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" + 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: 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 @@ -82,62 +153,46 @@ jobs: version="${version%-*-*}" fi echo "Previous version is '$version'" - echo "previous_version=${version}" >> $GITHUB_OUTPUT + #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 ./.ssh - ssh-keygen -t ed25519 -f ".ssh/automation_ssh_key" + 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 with: - name: ${{ github.run_id }}-update-ssh-privkey - path: .ssh + name: "${{ env.SSH_ARTIFACT_NAME }}" + path: /__w/nextcloudpi/nextcloudpi/.ssh if-no-files-found: error - id: create-test-instance - uses: ./.github/actions/create-test-instance + uses: ./.github/actions/create-test-instance-bullseye with: - version: "${{ steps.find-version.outputs.previous_version }}" - uid: "${{ github.run_id }}-update" + version: "${{ env.PREVIOUS_VERSION }}" + uid: "${{ env.UID }}" hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} server_type: "cx11" - - run-installation-test: - needs: - - setup-installation-test-instance - runs-on: ubuntu-latest - - container: - image: thecalcaholic/ncp-test-automation:latest - env: - HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" - UID: "${{ github.run_id }}-install" - env: - VERSION: ${{ needs.setup-installation-test-instance.outputs.version }} - SERVER_ADDRESS: "${{ needs.setup-installation-test-instance.outputs.server_address }}" - SNAPSHOT_ID: "${{ needs.setup-installation-test-instance.outputs.snapshot_id }}" - HOME: /root - defaults: - run: - shell: bash - steps: + - 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 with: repository: 'theCalcaholic/ncp-test-automation' - - name: download ssh private key from artifact store - uses: actions/download-artifact@v3 - with: - name: ${{ github.run_id }}-install-ssh-privkey - path: .ssh - - name: Test postinstall VM + 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 ./.ssh/automation_ssh_key + chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key eval "$(ssh-agent)" - ssh-add ./.ssh/automation_ssh_key + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - cd bin source ./library.sh trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 @@ -146,8 +201,8 @@ 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" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { - + 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 "===========================================" @@ -159,44 +214,123 @@ jobs: 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 - run-update-test: - needs: - - setup-update-test-instance - runs-on: ubuntu-latest + 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 + id: final_test + 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 '[ $? -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:latest + image: thecalcaholic/ncp-test-automation:bullseye env: HCLOUD_TOKEN: "${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }}" - UID: "${{ github.run_id }}-update" - env: - PREVIOUS_VERSION: ${{ needs.setup-update-test-instance.outputs.previous_version }} - VERSION: ${{ needs.setup-update-test-instance.outputs.version }} - SERVER_ADDRESS: "${{ needs.setup-update-test-instance.outputs.server_address }}" - SNAPSHOT_ID: "${{ needs.setup-update-test-instance.outputs.snapshot_id }}" - HOME: /root + 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" steps: - uses: actions/checkout@v3 with: - repository: 'theCalcaholic/ncp-test-automation' - - name: download ssh private key from artifact store - uses: actions/download-artifact@v3 + 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@v3 + with: + name: "${{ env.SSH_ARTIFACT_NAME }}" + path: /__w/nextcloudpi/nextcloudpi/.ssh + if-no-files-found: error + - id: create-test-instance + uses: ./.github/actions/create-test-instance-bullseye with: - name: ${{ github.run_id }}-update-ssh-privkey - path: .ssh + version: "${{ env.PREVIOUS_VERSION }}" + uid: "${{ env.UID }}" + hcloud_token: ${{ secrets.TEST_AUTOMATION_HCLOUD_API_TOKEN }} + server_type: "cx11" + - 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 + 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 ./.ssh/automation_ssh_key + chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key eval "$(ssh-agent)" - ssh-add ./.ssh/automation_ssh_key + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - cd bin source ./library.sh trap 'terminate-ssh-port-forwarding "${SERVER_ADDRESS}"' EXIT 1 2 @@ -205,7 +339,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" "root@${SERVER_ADDRESS}" "localhost" "8443" "9443" || { + 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:" @@ -219,32 +353,86 @@ jobs: exit 1 } - name: perform update + working-directory: /__w/nextcloudpi/nextcloudpi/ncp-test-automation/bin run: | set -e echo "Setup ssh" - chmod 0600 ./.ssh/automation_ssh_key + chmod 0600 /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key eval "$(ssh-agent)" - ssh-add ./.ssh/automation_ssh_key + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - . ./bin/library.sh + 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 + - 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 ./.ssh/automation_ssh_key + ssh-add /__w/nextcloudpi/nextcloudpi/.ssh/automation_ssh_key - cd bin 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 "${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 + } + + - 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: 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" @@ -255,18 +443,20 @@ jobs: echo "===========================================" ssh "${SSH_OPTIONS[@]}" "root@${SERVER_ADDRESS}" tail /var/log/ncp-install.log; echo "===========================================" - echo "and ncp.log:" + 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" install-postactivation-snapshot: if: ${{ always() }} needs: - - setup-installation-test-instance - - run-installation-test + - installation-test runs-on: ubuntu-latest container: image: thecalcaholic/ncp-test-automation:latest @@ -275,28 +465,28 @@ jobs: env: TEST_TYPE: install - SERVER_ADDRESS: ${{ needs.setup-installation-test-instance.outputs.server_address }} - TEST_RESULT: ${{ needs.setup-installation-test-instance.result }} - TEST_SERVER_ID: ${{ needs.setup-installation-test-instance.outputs.test_server_id }} - VERSION: ${{ needs.setup-installation-test-instance.outputs.version }} - + 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: - name: download ssh private key from artifact store uses: actions/download-artifact@v3 if: ${{ contains('success|failure', env.TEST_RESULT) }} with: - name: ${{ github.run_id }}-${{ env.TEST_TYPE }}-ssh-privkey + name: ${{ env.SSH_ARTIFACT_NAME }} path: /github/workspace/.ssh - name: Shutdown server if: ${{ contains('success|failure', env.TEST_RESULT) }} run: | - chmod 0600 /github/workspace/.ssh/automation_ssh_key - export SSH_PUBLIC_KEY="$(cat /github/workspace/.ssh/automation_ssh_key.pub)" + 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 /github/workspace/.ssh/automation_ssh_key - + ssh-add /github/workspace/.ssh/automation_ssh_key + ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" "root@${SERVER_ADDRESS?}" <&2; exit 1; } - -APTINSTALL="apt-get install -y --no-install-recommends" -export DEBIAN_FRONTEND=noninteractive - -echo " ->>> ATTENTION <<< -This is a dangerous process that is only guaranteed to work properly if you -have not made manual changes in the system. Backup the SD card first and -proceed at your own risk. - -Note that this is not a requirement for NCP to continue working properly. -The current distribution will keep receiving updates for some time. - -Do you want to continue? [y/N]" - -read key -[[ "$key" == y ]] || exit 0 - -source /usr/local/etc/library.sh # sets NCPCFG RELEASE PHPVER -old_cfg="${NCPCFG}" - -trap "echo 'Something went wrong. Fix it and try again'" EXIT - -save_maintenance_mode - -# Fix grub-pc issue in VM -if apt show grub-pc-bin &>/dev/null; then - $APTINSTALL grub -fi - -apt-get update -apt-get upgrade -y - -# remove old PHP version -set +e -apt-get purge -y php${PHPVER} php${PHPVER}-curl php${PHPVER}-gd php${PHPVER}-fpm php${PHPVER}-cli php${PHPVER}-opcache \ - php${PHPVER}-mbstring php${PHPVER}-xml php${PHPVER}-zip php${PHPVER}-fileinfo php${PHPVER}-ldap \ - php${PHPVER}-intl php${PHPVER}-bz2 php${PHPVER}-json -apt-get purge -y php${PHPVER}-mysql -apt-get purge -y php${PHPVER}-redis -apt-get purge -y php${PHPVER}-exif -apt-get purge -y php${PHPVER}-bcmath -apt-get purge -y php${PHPVER}-gmp -apt-get purge -y php${PHPVER}-imagick set -e -# update sources -sed -i 's/buster/bullseye/g' /etc/apt/sources.list -sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/* || true -sed -i 's/bullseye\/updates/bullseye-security/g' /etc/apt/sources.list -rm -f /etc/apt/sources.list.d/php.list - -# fix DHCP systemd service command https://forums.raspberrypi.com/viewtopic.php?t=320383 in raspbian -if [[ -f /usr/bin/raspi-config ]]; then - sed -i 's|ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w|ExecStart=/usr/sbin/dhcpcd -q -w|g' /etc/systemd/system/dhcpcd.service.d/wait.conf +[[ "${EUID}" -eq 0 ]] || { + echo "ERROR: Must be run as root (try sudo ncp-dist-upgrade)" + exit 1 +} + +. /etc/os-release + +if [[ "$VERSION_ID" -eq 10 ]] +then + UPGRADE_CMD=(bash /usr/local/bin/ncp-dist-upgrade.d/debian-10.sh) +elif [[ "$VERSION_ID" -eq 11 ]] +then + UPGRADE_CMD=(bash /usr/local/bin/ncp-dist-upgrade.d/debian-11.sh) +else + echo "No dist-upgrade available for OS version: Debian ${VERSION}." + exit 0 fi -# install latest distro -apt-get update -apt-get dist-upgrade -y - -# install latest PHP version -release_new=$(jq -r '.release' < "${new_cfg}") -# the default repo in bullseye is bullseye-security - use bullseye if it is not available -grep -Eh '^deb ' /etc/apt/sources.list | grep 'bullseye-security' > /dev/null && release_new="${release_new}-security" -php_ver_new=$(jq -r '.php_version' < "${new_cfg}") -# PHP 8.1 is only supported via the -[[ "$php_ver_new" != 8.1 ]] || php_ver_new=7.4 - -$APTINSTALL -t ${release_new} php${php_ver_new} php${php_ver_new}-curl php${php_ver_new}-gd php${php_ver_new}-fpm php${php_ver_new}-cli php${php_ver_new}-opcache \ - php${php_ver_new}-mbstring php${php_ver_new}-xml php${php_ver_new}-zip php${php_ver_new}-fileinfo php${php_ver_new}-ldap \ - php${php_ver_new}-intl php${php_ver_new}-bz2 php${php_ver_new}-json - -$APTINSTALL php${php_ver_new}-mysql -$APTINSTALL -t ${release_new} php${php_ver_new}-redis - -$APTINSTALL -t ${release_new} smbclient exfat-fuse exfat-utils -sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop -$APTINSTALL -t ${release_new} php${php_ver_new}-exif -sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop -$APTINSTALL -t ${release_new} php${php_ver_new}-bcmath -sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop -$APTINSTALL -t ${release_new} php${php_ver_new}-gmp -#$APTINSTALL -t ${release_new} imagemagick php${php_ver_new}-imagick ghostscript - -# Reinstall prometheus-node-exporter, specifically WITH install-recommends to include collectors on bullseye and later -{ dpkg -l | grep '^ii.*prometheus-node-exporter' >/dev/null && apt-get install -y prometheus-node-exporter-collectors; } || true - -apt-get autoremove -y -apt-get clean - -cat > /etc/php/${php_ver_new}/fpm/conf.d/90-ncp.ini <&2; exit 1; } + +APTINSTALL="apt-get install -y --no-install-recommends" +export DEBIAN_FRONTEND=noninteractive + +echo " +>>> ATTENTION <<< +This is a dangerous process that is only guaranteed to work properly if you +have not made manual changes in the system. Backup the SD card first and +proceed at your own risk. + +Note that this is not a requirement for NCP to continue working properly. +The current distribution will keep receiving updates for some time. + +Do you want to continue? [y/N]" + +read key +[[ "$key" == y ]] || exit 0 + +source /usr/local/etc/library.sh # sets NCPCFG RELEASE PHPVER +old_cfg="${NCPCFG}" + +trap "echo 'Something went wrong. Fix it and try again'" EXIT + +save_maintenance_mode + +# Fix grub-pc issue in VM +if apt show grub-pc-bin &>/dev/null; then + $APTINSTALL grub +fi + +apt-get update +apt-get upgrade -y + +# remove old PHP version +set +e +apt-get purge -y php${PHPVER} php${PHPVER}-curl php${PHPVER}-gd php${PHPVER}-fpm php${PHPVER}-cli php${PHPVER}-opcache \ + php${PHPVER}-mbstring php${PHPVER}-xml php${PHPVER}-zip php${PHPVER}-fileinfo php${PHPVER}-ldap \ + php${PHPVER}-intl php${PHPVER}-bz2 php${PHPVER}-json +apt-get purge -y php${PHPVER}-mysql +apt-get purge -y php${PHPVER}-redis +apt-get purge -y php${PHPVER}-exif +apt-get purge -y php${PHPVER}-bcmath +apt-get purge -y php${PHPVER}-gmp +apt-get purge -y php${PHPVER}-imagick +set -e + +# update sources +sed -i 's/buster/bullseye/g' /etc/apt/sources.list +sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/* || true +sed -i 's/bullseye\/updates/bullseye-security/g' /etc/apt/sources.list +rm -f /etc/apt/sources.list.d/php.list + +# fix DHCP systemd service command https://forums.raspberrypi.com/viewtopic.php?t=320383 in raspbian +if [[ -f /usr/bin/raspi-config ]]; then + sed -i 's|ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w|ExecStart=/usr/sbin/dhcpcd -q -w|g' /etc/systemd/system/dhcpcd.service.d/wait.conf +fi + +# install latest distro +apt-get update +apt-get dist-upgrade -y + +# install latest PHP version +release_new=$(jq -r '.release' < "${new_cfg}") +# the default repo in bullseye is bullseye-security - use bullseye if it is not available +grep -Eh '^deb ' /etc/apt/sources.list | grep 'bullseye-security' > /dev/null && release_new="${release_new}-security" +php_ver_new=$(jq -r '.php_version' < "${new_cfg}") +# PHP 8.1 is only supported via the +[[ "$php_ver_new" != 8.1 ]] || php_ver_new=7.4 + +$APTINSTALL -t ${release_new} php${php_ver_new} php${php_ver_new}-curl php${php_ver_new}-gd php${php_ver_new}-fpm php${php_ver_new}-cli php${php_ver_new}-opcache \ + php${php_ver_new}-mbstring php${php_ver_new}-xml php${php_ver_new}-zip php${php_ver_new}-fileinfo php${php_ver_new}-ldap \ + php${php_ver_new}-intl php${php_ver_new}-bz2 php${php_ver_new}-json + +$APTINSTALL php${php_ver_new}-mysql +$APTINSTALL -t ${release_new} php${php_ver_new}-redis + +$APTINSTALL -t ${release_new} smbclient exfat-fuse exfat-utils +sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop +$APTINSTALL -t ${release_new} php${php_ver_new}-exif +sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop +$APTINSTALL -t ${release_new} php${php_ver_new}-bcmath +sleep 2 # avoid systemd thinking that PHP is in a crash/restart loop +$APTINSTALL -t ${release_new} php${php_ver_new}-gmp +#$APTINSTALL -t ${release_new} imagemagick php${php_ver_new}-imagick ghostscript + +# Reinstall prometheus-node-exporter, specifically WITH install-recommends to include collectors on bullseye and later +{ dpkg -l | grep '^ii.*prometheus-node-exporter' >/dev/null && apt-get install -y prometheus-node-exporter-collectors; } || true + +apt-get autoremove -y +apt-get clean + +cat > /etc/php/${php_ver_new}/fpm/conf.d/90-ncp.ini <&2; exit 1; } + +echo " +>>> ATTENTION <<< +This is a dangerous process that is only guaranteed to work properly if you +have not made manual changes in the system. Backup the SD card first and +proceed at your own risk. + +Note that this is not a requirement for NCP to continue working properly. +The current distribution will keep receiving updates for some time. + +Do you want to continue? [y/N]" + +if [[ "${DEBIAN_FRONTEND:-}" == "noninteractive" ]] || ! [[ -t 0 ]] +then + echo "Noninteractive environment detected. Automatically proceeding in 30 seconds..." + sleep 30 +else + read -n1 -r key + [[ "${key,,}" == y ]] || exit 0 +fi + +export DEBIAN_FRONTEND=noninteractive + +source /usr/local/etc/library.sh +is_more_recent_than "${PHPVER}.0" "8.0.0" || { + echo "You still have PHP version ${PHPVER} installed. Please update to the latest supported version of nextcloud (which will also update your PHP version) before proceeding with the distribution upgrade." + echo "Exiting." + exit 1 +} +save_maintenance_mode + +# Perform dist-upgrade + +apt-get update && apt-get upgrade -y +for aptlist in /etc/apt/sources.list /etc/apt/sources.list.d/php.list /etc/apt/sources.list.d/armbian.list +do + [ -f "$aptlist" ] && sed -i -e "s/bullseye/bookworm/g" "$aptlist" +done +for aptlist in /etc/apt/sources.list.d/*.list +do + [[ "$aptlist" =~ "/etc/apt/sources.list.d/"(php|armbian)".list" ]] || continue + echo "Disabling repositories from \"$aptlist\"" + sed -i -e "s/deb/#deb/g" "$aptlist" +done +apt-get update && apt-get upgrade -y --without-new-pkgs +if is_lxc +then + # Required to avoid breakage of /etc/resolv.conf + apt-get install -y --no-install-recommends systemd-resolved && systemctl enable --now systemd-resolved +fi +apt-get full-upgrade -y +sudo apt-get --purge autoremove -y + +apt-get install -y --no-install-recommends exfatprogs + +#mkdir -p /etc/systemd/system/php8.1-fpm.service.d +#echo '[Service]' > /etc/systemd/system/php8.1-fpm.service.d/ncp.conf +#echo 'ExecStartPre=mkdir -p /var/run/php' >> /etc/systemd/system/php8.1-fpm.service.d/ncp.conf +#[[ "$INIT_SYSTEM" != "systemd" ]] || { systemctl daemon-reload && systemctl restart php8.1-fpm; } + +restore_maintenance_mode +cfg="$(jq "." "$NCPCFG")" +cfg="$(jq ".release = \"bookworm\"" <<<"$cfg")" +echo "$cfg" > "$NCPCFG" +rm -f /etc/update-motd.d/30ncp-dist-upgrade + +echo "Update to Debian 12 (bookworm) successful." + +is_active_app unattended-upgrades && { + echo "Setting up unattended upgrades..." + run_app unattended-upgrades || true + echo "done." +} \ No newline at end of file diff --git a/bin/ncp/CONFIG/nc-init.sh b/bin/ncp/CONFIG/nc-init.sh index 96f182504..e6768af50 100644 --- a/bin/ncp/CONFIG/nc-init.sh +++ b/bin/ncp/CONFIG/nc-init.sh @@ -111,8 +111,8 @@ EOF # email ncc config:system:set mail_smtpmode --value="sendmail" ncc config:system:set mail_smtpauthtype --value="LOGIN" - ncc config:system:set mail_from_address --value="admin" - ncc config:system:set mail_domain --value="ownyourbits.com" + ncc config:system:set mail_from_address --value="noreply" + ncc config:system:set mail_domain --value="nextcloudpi.com" # Fix NCP theme [[ -e /usr/local/etc/logo ]] && { @@ -129,7 +129,7 @@ EOF mysql nextcloud < /dev/null 2>&1 || rc=$? - ! is_docker && [[ $rc -eq 3 ]] && ! [[ "$INIT_SYSTEM" =~ ^("chroot"|"unknown")$ ]] && { + [[ $rc -eq 3 ]] && ! [[ "$INIT_SYSTEM" =~ ^("chroot"|"unknown")$ ]] && command -v systemd-resolve > /dev/null || { echo "Applying workaround for dnsmasq bug (compare issue #1446)" - service systemd-resolved stop || true - service dnsmasq start - service dnsmasq status + mkdir -p /etc/systemd/resolved.conf.d + if systemctl status systemd-resolved + then + cat < /etc/systemd/resolved.conf.d/nostublistener.conf +[Resolve] +DNSStubListener=no +EOF + [[ "$INIT_SYSTEM" != "systemd" ]] || systemctl restart systemd-resolved + else + systemctl stop resolvconf + systemctl start dnsmasq + systemctl status dnsmasq + fi +# service systemd-resolved stop || true + systemctl start dnsmasq + systemctl status dnsmasq } service dnsmasq stop - [[ "$INIT_SYSTEM" == "systemd" ]] && service systemd-resolved start || true + [[ "$INIT_SYSTEM" != "systemd" ]] || systemctl start systemd-resolved || systemctl start resolvconf update-rc.d dnsmasq disable || rm /etc/systemd/system/multi-user.target.wants/dnsmasq.service - [[ "$DOCKERBUILD" == 1 ]] && { - cat > /etc/services-available.d/100dnsmasq </dev/null || true -LXC_CREATE=(lxc init -p default) +debian_version="$(. etc/library.sh > /dev/null 2>&1; echo "${RELEASE%%-security}")" + +LXC_CMD=lxc +[[ "$USE_INCUS" == "yes" ]] && LXC_CMD=incus + +$LXC_CMD delete -f ncp 2>/dev/null || true +LXC_CREATE=($LXC_CMD init -p default) [[ -n "$LXD_EXTRA_PROFILE" ]] && LXC_CREATE+=(-p "$LXD_EXTRA_PROFILE") if [[ -n "$LXD_ARCH" ]] && [[ "$LXD_ARCH" != "x86" ]] then echo "Building for architecture: $LXD_ARCH" - LXC_CREATE+=("images:debian/bullseye/$LXD_ARCH") + LXC_CREATE+=("images:debian/${debian_version}/$LXD_ARCH") else - LXC_CREATE+=('images:debian/bullseye') + LXC_CREATE+=("images:debian/${debian_version}") fi LXC_CREATE+=(ncp) "${LXC_CREATE[@]}" @@ -56,19 +61,20 @@ LXC_CREATE+=(ncp) # fi #fi -systemd-run --user --scope -p "Delegate=yes" lxc start ncp -q || \ -sudo systemd-run --scope -p "Delegate=yes" lxc start ncp -q -lxc config device add ncp buildcode disk source="$(pwd)" path=/build -lxc exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' -lxc exec ncp -- bash -c 'CODE_DIR=/build DBG=x bash /build/install.sh' -lxc exec ncp -- bash -c 'source /build/etc/library.sh; run_app_unsafe /build/post-inst.sh' -lxc exec ncp -- bash -c "echo '$(basename "$IMG")' > /usr/local/etc/ncp-baseimage" -lxc stop ncp -lxc config device remove ncp buildcode -lxc publish -q ncp -f --alias ncp/"${version}" +set -x +systemd-run --user --scope -p "Delegate=yes" $LXC_CMD start ncp -q || \ +sudo systemd-run --scope -p "Delegate=yes" $LXC_CMD start ncp -q +$LXC_CMD config device add ncp buildcode disk source="$(pwd)" path=/build +$LXC_CMD exec ncp -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' +$LXC_CMD exec ncp -- bash -c 'CODE_DIR=/build DBG=x bash /build/install.sh' +$LXC_CMD exec ncp -- bash -c 'source /build/etc/library.sh; run_app_unsafe /build/post-inst.sh' +$LXC_CMD exec ncp -- bash -c "echo '$(basename "$IMG")' > /usr/local/etc/ncp-baseimage" +$LXC_CMD stop ncp +$LXC_CMD config device remove ncp buildcode +$LXC_CMD publish -q ncp -f --alias ncp/"${version}" ## pack -[[ " $* " =~ .*" --pack ".* ]] && lxc image export -q ncp/"${version}" "$TAR" +[[ " $* " =~ .*" --pack ".* ]] && $LXC_CMD image export -q ncp/"${version}" "$TAR" exit 0 diff --git a/build/buildlib.sh b/build/buildlib.sh index 5870ab8f5..5398cf555 100644 --- a/build/buildlib.sh +++ b/build/buildlib.sh @@ -335,43 +335,6 @@ function generate_changelog() sed 's|* \[tag: |\n[|' > changelog.md } -function upload_ftp() -{ - local IMGNAME="$1" - echo -e "\n\e[1m[ Upload FTP ]\e[0m" - echo "* $IMGNAME..." - [[ -f torrent/"$IMGNAME"/"$IMGNAME".tar.bz2 ]] || { echo "No image file found, abort"; return 1; } - [[ "$FTPPASS" == "" ]] && { echo "No FTPPASS variable found, skip upload"; return 0; } - - cd torrent - - ftp -np ftp.ownyourbits.com </dev/null && echo ">>> WARNING: existing mysqld configuration will be changed <<<" type mysqld &>/dev/null && mysql -e 'use nextcloud' &>/dev/null && { echo "The 'nextcloud' database already exists. Aborting"; exit 1; } +[[ "$DEBIAN_FRONTEND" == "noninteractive" ]] || { + echo "WARNING: This installer will disable SSH login for the root user and reset its password. +If you need to login with root, you should make sure, you have a root session open that you can use, +to revert these changes afterwards (set PermitRootLogin to 'yes' in /etc/ssh/sshd_config and run passwd as root)." + for i in {1..10} + do + echo "Continuing in $((30-(3*i)))s (press Ctrl+C to abort)..." + sleep 3 + done +} + # get dependencies apt-get update -apt-get install --no-install-recommends -y git ca-certificates sudo lsb-release wget +DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y git ca-certificates sudo lsb-release wget jq # get install code if [[ "${CODE_DIR}" == "" ]]; then @@ -63,6 +74,11 @@ cp etc/ncp.cfg /usr/local/etc/ cp -r etc/ncp-templates /usr/local/etc/ install_app lamp.sh +if [[ -d "/run/systemd/system" ]] && is_lxc +then + DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y systemd-resolved + systemctl enable systemd-resolved +fi install_app bin/ncp/CONFIG/nc-nextcloud.sh run_app_unsafe bin/ncp/CONFIG/nc-nextcloud.sh rm /usr/local/etc/ncp-config.d/nc-nextcloud.cfg # armbian overlay is ro diff --git a/lamp.sh b/lamp.sh index aadff56ce..7a1cdf134 100644 --- a/lamp.sh +++ b/lamp.sh @@ -37,13 +37,6 @@ install() apache2ctl -V || true # Create systemd users to keep uids persistent between containers - id -u systemd-resolve || { - addgroup --quiet --system systemd-journal - adduser --quiet -u 180 --system --group --no-create-home --home /run/systemd \ - --gecos "systemd Network Management" systemd-network - adduser --quiet -u 181 --system --group --no-create-home --home /run/systemd \ - --gecos "systemd Resolver" systemd-resolve - } install_with_shadow_workaround --no-install-recommends systemd $APTINSTALL -t $RELEASE php${PHPVER} php${PHPVER}-curl php${PHPVER}-gd php${PHPVER}-fpm php${PHPVER}-cli php${PHPVER}-opcache \ php${PHPVER}-mbstring php${PHPVER}-xml php${PHPVER}-zip php${PHPVER}-fileinfo php${PHPVER}-ldap \ @@ -67,7 +60,7 @@ install() install_template apache2/http2.conf.sh /etc/apache2/conf-available/http2.conf --defaults - # CONFIGURE PHP7 + # CONFIGURE PHP ########################################## install_template "php/opcache.ini.sh" "/etc/php/${PHPVER}/mods-available/opcache.ini" --defaults @@ -97,7 +90,7 @@ install() # launch mariadb if not already running if ! [[ -f /run/mysqld/mysqld.pid ]]; then echo "Starting mariaDB" - mysqld & + sudo -u mysql mysqld & fi # wait for mariadb diff --git a/ncp-app/appinfo/info.xml b/ncp-app/appinfo/info.xml index 9688a0e48..f182f0487 100644 --- a/ncp-app/appinfo/info.xml +++ b/ncp-app/appinfo/info.xml @@ -7,7 +7,7 @@ 0.0.2 agpl - nachoparker + Tobias Knöppler NextcloudPi tools https://github.com/nextcloud/nextcloudpi/issues diff --git a/ncp-app/package-lock.json b/ncp-app/package-lock.json index dccd68a06..8e7c5ed2e 100644 --- a/ncp-app/package-lock.json +++ b/ncp-app/package-lock.json @@ -9,10 +9,10 @@ "version": "0.0.1", "license": "agpl", "dependencies": { - "@nextcloud/axios": "^1.10.0", + "@nextcloud/axios": "^2.4.0", "@nextcloud/dialogs": "^3.1.4", "@nextcloud/router": "^2.0.0", - "@nextcloud/vue": "^5.4.0", + "@nextcloud/vue": "^8.11.2", "vue": "^2.7.0" }, "devDependencies": { @@ -1549,28 +1549,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/polyfill": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz", - "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==", - "deprecated": "🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information.", - "dependencies": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/polyfill/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/@babel/polyfill/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, "node_modules/@babel/preset-env": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", @@ -2028,6 +2006,28 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.4.tgz", + "integrity": "sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -2833,6 +2833,7 @@ "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==", + "dev": true, "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -2860,28 +2861,73 @@ "dev": true, "peer": true }, + "node_modules/@linusborg/vue-simple-portal": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@linusborg/vue-simple-portal/-/vue-simple-portal-0.1.5.tgz", + "integrity": "sha512-dq+oubEVW4UabBoQxmH97GiDa+F6sTomw4KcXFHnXEpw69rdkXFCxo1WzwuvWjoLiUVYJTyN1dtlUvTa50VcXg==", + "dependencies": { + "nanoid": "^3.1.20" + }, + "peerDependencies": { + "vue": "^2.6.6" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz", + "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==", + "dependencies": { + "unist-util-visit": "^1.4.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "dependencies": { + "unist-util-visit-parents": "^2.0.0" + } + }, + "node_modules/@mapbox/hast-util-table-cell-style/node_modules/unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "dependencies": { + "unist-util-is": "^3.0.0" + } + }, "node_modules/@nextcloud/auth": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-1.3.0.tgz", - "integrity": "sha512-GfwRM9W7hat4psNdAt74UHEV+drEXQ53klCVp6JpON66ZLPeK5eJ1LQuiQDkpUxZpqNeaumXjiB98h5cug/uQw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-2.3.0.tgz", + "integrity": "sha512-PCkRJbML9sXvBENY43vTIERIZJFk2azu08IK6zYOnOZ7cFkD1QlFJtdTCZTImQLg01IXhIm0j0ExEdatHoqz7g==", "dependencies": { - "@nextcloud/event-bus": "^1.1.3", - "@nextcloud/typings": "^0.2.2", - "core-js": "^3.6.4" + "@nextcloud/event-bus": "^3.2.0" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" } }, "node_modules/@nextcloud/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-NyaiSC2GX2CPaH/MUGGMTTTza/TW9ZqWNGWq6LJ+pLER8nqZ9BQkwJ5kXUYGo+i3cka68PO+9WhcDv4fSABpuQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.4.0.tgz", + "integrity": "sha512-ARGzT9p45L0sjRIV3JZWGPtMbwgxd4eEMcMJNn58NA7UQIsMkTwHb5pXQjL+5elXY9zp/JMz7n/7SHTp0bkuXQ==", "dependencies": { - "@nextcloud/auth": "^1.3.0", - "axios": "^0.27.1", - "core-js": "^3.6.4" + "@nextcloud/auth": "^2.1.0", + "@nextcloud/router": "^2.1.2", + "axios": "^1.4.0" }, "engines": { - "node": "^16.0.0", - "npm": "^7.0.0 || ^8.0.0" + "node": "^20.0.0", + "npm": "^9.0.0" } }, "node_modules/@nextcloud/babel-config": { @@ -2899,18 +2945,21 @@ } }, "node_modules/@nextcloud/browser-storage": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nextcloud/browser-storage/-/browser-storage-0.1.1.tgz", - "integrity": "sha512-bWzs/A44rEK8b3CMOFw0ZhsenagrWdsB902LOEwmlMCcFysiFgWiOPbF4/0/ODlOYjvPrO02wf6RigWtb8P+gA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nextcloud/browser-storage/-/browser-storage-0.3.0.tgz", + "integrity": "sha512-vqc26T4WQ3y9EbFpHh4dl/FN7ahEfEoc0unQmsdJ2YSZNTxTvAXAasWI6HFNcHi10b5rEYxxEYjAwKF34th3Aw==", "dependencies": { - "core-js": "3.6.1" + "core-js": "3.33.0" + }, + "engines": { + "node": "^20.0.0", + "npm": "^9.0.0" } }, "node_modules/@nextcloud/browser-storage/node_modules/core-js": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.1.tgz", - "integrity": "sha512-186WjSik2iTGfDjfdCZAxv2ormxtKgemjC3SI6PL31qOA0j5LhTDVjHChccoc7brwLvpvLPiMyRlcO88C4l1QQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.0.tgz", + "integrity": "sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -2922,19 +2971,6 @@ "resolved": "https://registry.npmjs.org/@nextcloud/browserslist-config/-/browserslist-config-2.2.0.tgz", "integrity": "sha512-kC42RQW5rZjZZsRaEjVlIQpp6aW/yxm+zZdETnrRQnUzcPwBgF4wO4makfGT63Ckd+LkgUW+geesPiPRqxFVew==" }, - "node_modules/@nextcloud/calendar-js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@nextcloud/calendar-js/-/calendar-js-3.2.0.tgz", - "integrity": "sha512-20EeeUFbHJZ+IKY42Un6UmfpzaHRl4lJWmZXaHg0EGF1825BXn41CcRwS793qwDDkKTeuL3i4AzGpl+o9AOvEA==", - "engines": { - "node": ">=14.0.0", - "npm": ">=7.0.0" - }, - "peerDependencies": { - "ical.js": "^1.5.0", - "uuid": "^8.3.2" - } - }, "node_modules/@nextcloud/capabilities": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@nextcloud/capabilities/-/capabilities-1.1.0.tgz", @@ -3005,28 +3041,6 @@ "npm": "^7.0.0 || ^8.0.0" } }, - "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/typings": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.7.0.tgz", - "integrity": "sha512-fK1i09FYTfSUBdXswyiCr8ng5MwdWjEWOF7hRvNvq5i+XFUSmGjSsRmpQZFM2AONroHqGGQBkvQqpONUshFBJQ==", - "dependencies": { - "@types/jquery": "3.5.16", - "vue": "^2.7.14", - "vue-router": "<4" - }, - "engines": { - "node": "^16.0.0", - "npm": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@nextcloud/dialogs/node_modules/@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", - "dependencies": { - "@types/sizzle": "*" - } - }, "node_modules/@nextcloud/eslint-config": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-8.3.0.tgz", @@ -3072,13 +3086,16 @@ } }, "node_modules/@nextcloud/event-bus": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/event-bus/-/event-bus-1.3.0.tgz", - "integrity": "sha512-+U5MnCvfnNWvf0lvdqJg8F+Nm8wN+s9ayuBjtiEQxTAcootv7lOnlMgfreqF3l2T0Wet2uZh4JbFVUWf8l3w7g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@nextcloud/event-bus/-/event-bus-3.2.0.tgz", + "integrity": "sha512-5F3Zjqv12r/VCkzXFnsMZb/lb12eVv7/oDSUFV3njNJoPdu7x6k5kjRM/N4THHoDDRRgBQjgKr9Uyqgppqj6XA==", "dependencies": { - "@types/semver": "^7.3.5", - "core-js": "^3.11.2", - "semver": "^7.3.5" + "@types/node": "^20.12.7", + "semver": "^7.6.0" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" } }, "node_modules/@nextcloud/event-bus/node_modules/lru-cache": { @@ -3142,60 +3159,6 @@ "npm": "^9.0.0" } }, - "node_modules/@nextcloud/logger/node_modules/@nextcloud/auth": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-2.2.1.tgz", - "integrity": "sha512-zYtgrg9NMZfN8kmL5JPCsh5jDhpTCEslhnZWMvbhTiQ7hrOnji/67ok6VMK0CTJ1a92Vr67Ow72lW7YRX69zEA==", - "dependencies": { - "@nextcloud/event-bus": "^3.1.0" - }, - "engines": { - "node": "^20.0.0", - "npm": "^9.0.0" - } - }, - "node_modules/@nextcloud/logger/node_modules/@nextcloud/event-bus": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nextcloud/event-bus/-/event-bus-3.1.0.tgz", - "integrity": "sha512-purXQsXbhbmpcDsbDuR0i7vwUgOsqnIUa7QAD3lV/UZUkUT94SmxBM5LgQ8iV8TQBWWleEwQHy5kYfHeTGF9wg==", - "dependencies": { - "semver": "^7.5.1" - }, - "engines": { - "node": "^16.0.0", - "npm": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@nextcloud/logger/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nextcloud/logger/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nextcloud/logger/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@nextcloud/router": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-2.2.1.tgz", @@ -3209,28 +3172,6 @@ "npm": "^10.0.0" } }, - "node_modules/@nextcloud/router/node_modules/@nextcloud/typings": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.7.0.tgz", - "integrity": "sha512-fK1i09FYTfSUBdXswyiCr8ng5MwdWjEWOF7hRvNvq5i+XFUSmGjSsRmpQZFM2AONroHqGGQBkvQqpONUshFBJQ==", - "dependencies": { - "@types/jquery": "3.5.16", - "vue": "^2.7.14", - "vue-router": "<4" - }, - "engines": { - "node": "^16.0.0", - "npm": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@nextcloud/router/node_modules/@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", - "dependencies": { - "@types/sizzle": "*" - } - }, "node_modules/@nextcloud/stylelint-config": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@nextcloud/stylelint-config/-/stylelint-config-2.4.0.tgz", @@ -3247,92 +3188,148 @@ } }, "node_modules/@nextcloud/typings": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-0.2.4.tgz", - "integrity": "sha512-49M8XUDQH27VIQE+13KrqSOYcyOsDUk6Yfw17jbBVtXFoDJ3YBSYYq8YaKeAM3Lz2JVbEpqQW9suAT+EyYSb6g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.8.0.tgz", + "integrity": "sha512-q9goE0wc+1BCI9Ku0MebCHmqOMwz2K7ESKQrcHDs6O+HqbKA8zGiEtXL5XGrMS7Ovtl1YOIwxlP9kEvgvXt52Q==", "dependencies": { - "@types/jquery": "2.0.54" + "@types/jquery": "3.5.16", + "vue": "^2.7.15", + "vue-router": "<4" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" } }, "node_modules/@nextcloud/vue": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-5.4.0.tgz", - "integrity": "sha512-YybOMuStBKtCwbssxMNEd0A8k/Qr5+zm9vnSOaLaMxeB8iaUU+PgBNiYGo8O24UJjSS6FqFwg02V4XzI1Sd6Lw==", - "dependencies": { - "@nextcloud/auth": "^1.2.3", - "@nextcloud/axios": "^1.3.2", - "@nextcloud/browser-storage": "^0.1.1", - "@nextcloud/calendar-js": "^3.0.0", - "@nextcloud/capabilities": "^1.0.2", - "@nextcloud/dialogs": "^3.0.0", - "@nextcloud/event-bus": "^2.0.0", - "@nextcloud/l10n": "^1.2.3", - "@nextcloud/logger": "^2.0.0", - "@nextcloud/router": "^2.0.0", - "debounce": "1.2.1", - "emoji-mart-vue-fast": "^10.2.1", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.11.2.tgz", + "integrity": "sha512-mjA3Ni2CB3gOkKFMYFhQUjqaUos8hnwglfvz3lPp5LVrORsXaHa3C2ZudVp+hAKslVsRKkjfMYOKrlquw8vxQw==", + "dependencies": { + "@floating-ui/dom": "^1.1.0", + "@linusborg/vue-simple-portal": "^0.1.5", + "@nextcloud/auth": "^2.2.1", + "@nextcloud/axios": "^2.4.0", + "@nextcloud/browser-storage": "^0.3.0", + "@nextcloud/calendar-js": "^6.1.0", + "@nextcloud/capabilities": "^1.1.0", + "@nextcloud/event-bus": "^3.1.0", + "@nextcloud/initial-state": "^2.1.0", + "@nextcloud/l10n": "^2.2.0", + "@nextcloud/logger": "^2.7.0", + "@nextcloud/router": "^3.0.0", + "@nextcloud/vue-select": "^3.25.0", + "@vueuse/components": "^10.9.0", + "@vueuse/core": "^10.9.0", + "clone": "^2.1.2", + "debounce": "2.0.0", + "dompurify": "^3.0.5", + "emoji-mart-vue-fast": "^15.0.1", "escape-html": "^1.0.3", - "focus-trap": "^6.8.1", - "hammerjs": "^2.0.8", - "linkify-string": "^3.0.2", - "md5": "^2.2.1", - "splitpanes": "^2.3.6", - "string-length": "^5.0.0", - "striptags": "^3.1.1", - "style-loader": "^3.3.1", + "floating-vue": "^1.0.0-beta.19", + "focus-trap": "^7.4.3", + "linkify-string": "^4.0.0", + "md5": "^2.3.0", + "rehype-external-links": "^3.0.0", + "rehype-react": "^7.1.2", + "remark-breaks": "^4.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "splitpanes": "^2.4.1", + "string-length": "^5.0.1", + "striptags": "^3.2.0", "tributejs": "^5.1.3", - "v-click-outside": "^3.0.1", - "v-tooltip": "^2.0.3", - "vue": "^2.6.14", - "vue-color": "^2.7.1", - "vue-material-design-icons": "^5.0.0", - "vue-multiselect": "^2.1.6", - "vue2-datepicker": "^3.6.3" + "unified": "^11.0.1", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vue": "^2.7.16", + "vue-color": "^2.8.1", + "vue-frag": "^1.4.3", + "vue2-datepicker": "^3.11.0" }, "engines": { - "node": "^14.0.0", - "npm": "^7.0.0" + "node": "^20.0.0", + "npm": "^9.0.0" + } + }, + "node_modules/@nextcloud/vue-select": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/@nextcloud/vue-select/-/vue-select-3.25.0.tgz", + "integrity": "sha512-zILFuJmUxp2oY09QUE65u69SxoQaR0RJdfnkpQlj2hcvzyOTLkYuyZwpxvseCf31WZnh9i2MO5mAddhsDCmw5g==", + "engines": { + "node": "^20.0.0" + }, + "peerDependencies": { + "vue": "2.x" } }, - "node_modules/@nextcloud/vue/node_modules/@nextcloud/event-bus": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nextcloud/event-bus/-/event-bus-2.1.1.tgz", - "integrity": "sha512-YEui6N+23uyjBSIUZhf8rEjG9vol7UGgxcgxMddEbO0HS7M/sh1cocRqtn+ZVi/yPybeToGmt68SDPCgwHQHKw==", - "dependencies": { - "@types/semver": "^7.1.0", - "core-js": "^3.6.2", - "semver": "^7.3.2" + "node_modules/@nextcloud/vue/node_modules/@nextcloud/calendar-js": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/calendar-js/-/calendar-js-6.1.0.tgz", + "integrity": "sha512-thVS6Bz+TV7rUB+LO5yFbOhdm65zICDRKcHDUquaZiWL9r6TyV9hCYDcP7cDRV+62wZJh8QPmf1E+d7ZFUOVeA==", + "engines": { + "node": "^20.0.0", + "npm": "^9.0.0" + }, + "peerDependencies": { + "ical.js": "^1.5.0", + "uuid": "^9.0.0" } }, - "node_modules/@nextcloud/vue/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@nextcloud/vue/node_modules/@nextcloud/l10n": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-2.2.0.tgz", + "integrity": "sha512-UAM2NJcl/NR46MANSF7Gr7q8/Up672zRyGrxLpN3k4URNmWQM9upkbRME+1K3T29wPrUyOIbQu710ZjvZafqFA==", "dependencies": { - "yallist": "^4.0.0" + "@nextcloud/router": "^2.1.2", + "@nextcloud/typings": "^1.7.0", + "dompurify": "^3.0.3", + "escape-html": "^1.0.3", + "node-gettext": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^20.0.0", + "npm": "^9.0.0" } }, - "node_modules/@nextcloud/vue/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@nextcloud/vue/node_modules/@nextcloud/l10n/node_modules/@nextcloud/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-2.2.0.tgz", + "integrity": "sha512-M4AVGnB5tt3MYO5RpH/R2jq7z/nW05AmRhk4Lh68krVwRIYGo8pgNikKrPGogHd2Q3UgzF5Py1drHz3uuV99bQ==", "dependencies": { - "lru-cache": "^6.0.0" + "@nextcloud/typings": "^1.7.0", + "core-js": "^3.6.4" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^20.0.0", + "npm": "^9.0.0" + } + }, + "node_modules/@nextcloud/vue/node_modules/@nextcloud/router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.0.1.tgz", + "integrity": "sha512-Ci/uD3x8OKHdxSqXL6gRJ+mGJOEXjeiHjj7hqsZqVTsT7kOrCjDf0/J8z5RyLlokKZ0IpSe+hGxgi3YB7Gpw3Q==", + "dependencies": { + "@nextcloud/typings": "^1.7.0" }, "engines": { - "node": ">=10" + "node": "^20.0.0", + "npm": "^10.0.0" } }, - "node_modules/@nextcloud/vue/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/@nextcloud/vue/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } }, "node_modules/@nextcloud/webpack-vue-config": { "version": "5.5.1", @@ -3513,10 +3510,19 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "8.56.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", + "dev": true, "peer": true, "dependencies": { "@types/estree": "*", @@ -3527,6 +3533,7 @@ "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==", + "dev": true, "peer": true, "dependencies": { "@types/eslint": "*", @@ -3537,6 +3544,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, "peer": true }, "node_modules/@types/express": { @@ -3573,6 +3581,14 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -3612,14 +3628,18 @@ } }, "node_modules/@types/jquery": { - "version": "2.0.54", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.54.tgz", - "integrity": "sha512-D/PomKwNkDfSKD13DEVQT/pq2TUjN54c6uB341fEZanIzkjfGe7UaFuuaLZbpEiS5j7Wk2MUHAZqZIoECw29lg==" + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", + "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "dependencies": { + "@types/sizzle": "*" + } }, "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==", + "dev": true, "peer": true }, "node_modules/@types/json5": { @@ -3629,6 +3649,14 @@ "dev": true, "peer": true }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -3643,10 +3671,15 @@ "dev": true, "peer": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dependencies": { "undici-types": "~5.26.4" } @@ -3668,6 +3701,12 @@ "dev": true, "peer": true }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "peer": true + }, "node_modules/@types/qs": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", @@ -3682,6 +3721,16 @@ "dev": true, "peer": true }, + "node_modules/@types/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -3692,7 +3741,9 @@ "node_modules/@types/semver": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", - "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==" + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "dev": true, + "peer": true }, "node_modules/@types/send": { "version": "0.17.4", @@ -3747,6 +3798,16 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", @@ -4092,9 +4153,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "peer": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vue/compiler-sfc": { "version": "2.7.16", @@ -4197,38 +4256,161 @@ } } }, - "node_modules/@webassemblyjs/ast": { - "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, + "node_modules/@vueuse/components": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.9.0.tgz", + "integrity": "sha512-BHQpA0yIi3y7zKa1gYD0FUzLLkcRTqVhP8smnvsCK6GFpd94Nziq1XVPD7YpFeho0k5BzbBiNZF7V/DpkJ967A==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { + "node_modules/@vueuse/components/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "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==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", @@ -4240,12 +4422,14 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -4258,6 +4442,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -4267,6 +4452,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, "peer": true, "dependencies": { "@xtuc/long": "4.2.2" @@ -4276,12 +4462,14 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -4298,6 +4486,7 @@ "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==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -4311,6 +4500,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -4323,6 +4513,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -4337,6 +4528,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", @@ -4394,12 +4586,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true }, "node_modules/abort-controller": { @@ -4433,6 +4627,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "peer": true, "bin": { "acorn": "bin/acorn" @@ -4445,6 +4640,7 @@ "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==", + "dev": true, "peer": true, "peerDependencies": { "acorn": "^8" @@ -4464,6 +4660,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -4522,6 +4719,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peer": true, "peerDependencies": { "ajv": "^6.9.1" @@ -4839,12 +5037,13 @@ } }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/babel-code-frame": { @@ -5261,6 +5460,15 @@ "babylon": "bin/babylon.js" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5788,6 +5996,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5809,6 +6026,15 @@ "node": ">=12.20" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -5845,6 +6071,7 @@ "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==", + "dev": true, "peer": true, "engines": { "node": ">=6.0" @@ -5898,6 +6125,14 @@ "node": ">=12" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -5978,6 +6213,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -6525,9 +6769,15 @@ "peer": true }, "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz", + "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/debug": { "version": "4.3.4", @@ -6595,6 +6845,18 @@ "node": ">=0.10.0" } }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -6700,6 +6962,14 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/des.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", @@ -6737,6 +7007,18 @@ "dev": true, "peer": true }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -6860,6 +7142,11 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.1.tgz", + "integrity": "sha512-tVP8C/GJwnABOn/7cx/ymx/hXpmBfWIPihC1aOEvS8GbMqy3pgeYtJk1HXN3CO7tu+8bpY18f6isjR5Cymj0TQ==" + }, "node_modules/domutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", @@ -6922,13 +7209,12 @@ } }, "node_modules/emoji-mart-vue-fast": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-10.2.2.tgz", - "integrity": "sha512-SO37LI60Oksog3RhNpEUoQjfceBXfZ3yW9ALhlQgyut7hE6MghHsBJrGPeI6KKK8bQfTMBYlci/RWKsUsmbkPw==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.2.tgz", + "integrity": "sha512-q7VaE6yRrlQd+jpHPToh1XnIatgACkQjBj0vQ7uNaWrbVsKlhZaOsqZVoegT5IZt5XkYoR2x4MHMNep/BJP9rw==", "dependencies": { - "@babel/polyfill": "^7.12.1", - "@babel/runtime": "^7.16.3", - "vue-virtual-scroller": "^1.0.10" + "@babel/runtime": "^7.18.6", + "core-js": "^3.23.5" }, "peerDependencies": { "vue": ">2.0.0" @@ -6963,6 +7249,7 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, "peer": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7096,6 +7383,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, "peer": true }, "node_modules/es-set-tostringtag": { @@ -7717,6 +8005,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "peer": true, "dependencies": { "esrecurse": "^4.3.0", @@ -8070,6 +8359,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "peer": true, "dependencies": { "estraverse": "^5.2.0" @@ -8082,6 +8372,7 @@ "version": "5.3.0", "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" @@ -8091,6 +8382,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "peer": true, "engines": { "node": ">=4.0" @@ -8135,6 +8427,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "peer": true, "engines": { "node": ">=0.8.x" @@ -8272,10 +8565,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/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==", + "dev": true, "peer": true }, "node_modules/fast-glob": { @@ -8479,18 +8778,43 @@ "dev": true, "peer": true }, + "node_modules/floating-vue": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/floating-vue/-/floating-vue-1.0.0-beta.19.tgz", + "integrity": "sha512-OcM7z5Ua4XAykqolmvPj3l1s+KqUKj6Xz2t66eqjgaWfNBjtuifmxO5+4rRXakIch/Crt8IH+vKdKcR3jOUaoQ==", + "dependencies": { + "@floating-ui/dom": "^0.1.10", + "vue-resize": "^1.0.0" + }, + "peerDependencies": { + "vue": "^2.6.10" + } + }, + "node_modules/floating-vue/node_modules/@floating-ui/core": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.3.1.tgz", + "integrity": "sha512-ensKY7Ub59u16qsVIFEo2hwTCqZ/r9oZZFh51ivcLGHfUwTn8l1Xzng8RJUe91H/UP8PeqeBronAGx0qmzwk2g==" + }, + "node_modules/floating-vue/node_modules/@floating-ui/dom": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.1.10.tgz", + "integrity": "sha512-4kAVoogvQm2N0XE0G6APQJuCNuErjOfPW8Ux7DFxh8+AfugWflwVJ5LDlHOwrwut7z/30NUvdtHzQ3zSip4EzQ==", + "dependencies": { + "@floating-ui/core": "^0.3.0" + } + }, "node_modules/focus-trap": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.4.tgz", - "integrity": "sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", "dependencies": { - "tabbable": "^5.3.3" + "tabbable": "^6.2.0" } }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -8737,6 +9061,7 @@ "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==", + "dev": true, "peer": true }, "node_modules/glob/node_modules/brace-expansion": { @@ -8887,14 +9212,6 @@ "dev": true, "peer": true }, - "node_modules/hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -9063,6 +9380,49 @@ "node": ">= 0.4" } }, + "node_modules/hast-to-hyperscript": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-10.0.3.tgz", + "integrity": "sha512-NuBoUStp4fRwmvlfbidlEiRSTk0gSHm+97q4Xn9CJ10HO+Py7nlTuDi6RhM1qLOureukGrCXLG7AAxaGqqyslQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-to-hyperscript/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -9503,6 +9863,11 @@ "dev": true, "peer": true }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -9546,6 +9911,17 @@ "node": ">= 10" } }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -11680,6 +12056,7 @@ "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==", + "dev": true, "peer": true }, "node_modules/json-stable-stringify-without-jsonify": { @@ -11779,23 +12156,24 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/linkify-string": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-3.0.4.tgz", - "integrity": "sha512-OnNqqRjlYXaXipIAbBC8sDXsSumI1ftatzFg141Pw9HEXWjTVLFcMZoKbFupshqWRavtNJ6QHLa+u6AlxxgeRw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkify-string/-/linkify-string-4.1.3.tgz", + "integrity": "sha512-6dAgx4MiTcvEX87OS5aNpAioO7cSELUXp61k7azOvMYOLSmREx0w4yM1Uf0+O3JLC08YdkUyZhAX+YkasRt/mw==", "peerDependencies": { - "linkifyjs": "^3.0.0" + "linkifyjs": "^4.0.0" } }, "node_modules/linkifyjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", - "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", + "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", "peer": true }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, "peer": true, "engines": { "node": ">=6.11.5" @@ -11874,6 +12252,15 @@ "dev": true, "peer": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -11939,6 +12326,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -11988,39 +12384,260 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "peer": 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" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "peer": true, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", "dependencies": { - "fs-monkey": "^1.0.4" + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-newline-to-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", + "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-find-and-replace": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "peer": 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" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "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" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", "dev": true, "peer": true, @@ -12100,6 +12717,541 @@ "node": ">= 0.6" } }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -12291,6 +13443,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, "peer": true }, "node_modules/node-forge": { @@ -12987,16 +14140,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -13277,6 +14420,15 @@ "node": ">= 6" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -13301,6 +14453,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -13334,6 +14491,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "peer": true, "engines": { "node": ">=6" @@ -13418,6 +14576,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "peer": true, "dependencies": { "safe-buffer": "^5.1.0" @@ -13646,87 +14805,303 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "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", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-7.2.0.tgz", + "integrity": "sha512-MHYyCHka+3TtzBMKtcuvVOBAbI1HrfoYA+XH9m7/rlrQQATCPwtJnPdkxKKcIGF8vc9mxqQja9r9f+FHItQeWg==", + "dependencies": { + "@mapbox/hast-util-table-cell-style": "^0.2.0", + "@types/hast": "^2.0.0", + "hast-to-hyperscript": "^10.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=17" + } + }, + "node_modules/rehype-react/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/rehype-react/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/rehype-react/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/rehype-react/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rehype-react/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/rehype-react/node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dependencies": { - "regenerate": "^1.4.2" + "@types/unist": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "node_modules/rehype-react/node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "node_modules/rehype-react/node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dependencies": { - "@babel/runtime": "^7.8.4" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "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, + "node_modules/remark-breaks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", + "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "@types/mdast": "^4.0.0", + "mdast-util-newline-to-break": "^2.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", "dependencies": { - "jsesc": "~0.5.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, - "bin": { - "regjsparser": "bin/parser" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/require-directory": { @@ -13912,6 +15287,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -14066,11 +15442,6 @@ "dev": true, "peer": true }, - "node_modules/scrollparent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.1.0.tgz", - "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -14153,6 +15524,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, "peer": true, "dependencies": { "randombytes": "^2.1.0" @@ -14503,6 +15875,15 @@ "source-map": "^0.6.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -14864,6 +16245,8 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "peer": true, "engines": { "node": ">= 12.13.0" }, @@ -14882,6 +16265,14 @@ "dev": true, "peer": true }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/stylelint": { "version": "15.11.0", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz", @@ -15181,9 +16572,9 @@ "peer": true }, "node_modules/tabbable": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", - "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/table": { "version": "6.8.1", @@ -15230,6 +16621,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "peer": true, "engines": { "node": ">=6" @@ -15239,6 +16631,7 @@ "version": "5.27.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", + "dev": true, "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -15257,6 +16650,7 @@ "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==", + "dev": true, "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", @@ -15291,6 +16685,7 @@ "version": "4.0.0", "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" @@ -15300,6 +16695,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "peer": true, "dependencies": { "@types/node": "*", @@ -15314,6 +16710,7 @@ "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==", + "dev": true, "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -15332,6 +16729,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -15347,12 +16745,14 @@ "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==", + "dev": true, "peer": true }, "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==", + "dev": true, "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -15468,6 +16868,15 @@ "resolved": "https://registry.npmjs.org/tributejs/-/tributejs-5.1.3.tgz", "integrity": "sha512-B5CXihaVzXw+1UHhNFyAwUTMDk1EfoLP5Tj1VhD9yybZ1I8DZJEv8tZ1l0RJo0t0tk9ZhR8eG5tEsaCvRigmdQ==" }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trim-newlines": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", @@ -15481,6 +16890,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", @@ -15731,6 +17149,110 @@ "node": ">=4" } }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-builder": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", + "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -15774,6 +17296,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "peer": true, "dependencies": { "punycode": "^2.1.0" @@ -15832,30 +17355,12 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, "peer": true, "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/v-click-outside": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v-click-outside/-/v-click-outside-3.2.0.tgz", - "integrity": "sha512-QD0bDy38SHJXQBjgnllmkI/rbdiwmq9RC+/+pvrFjYJKTn8dtp7Penf9q1lLBta280fYG2q53mgLhQ+3l3z74w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/v-tooltip": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz", - "integrity": "sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "lodash": "^4.17.21", - "popper.js": "^1.16.1", - "vue-resize": "^1.0.1" - } - }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -15901,6 +17406,33 @@ "node": ">= 0.8" } }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -16040,6 +17572,17 @@ "dev": true, "peer": true }, + "node_modules/vue-frag": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/vue-frag/-/vue-frag-1.4.3.tgz", + "integrity": "sha512-pQZj03f/j9LRhzz9vKaXTCXUHVYHuAXicshFv76VFqwz4MG3bcb+sPZMAbd0wmw7THjkrTPuoM0EG9TbG8CgMQ==", + "funding": { + "url": "https://github.com/privatenumber/vue-frag?sponsor=1" + }, + "peerDependencies": { + "vue": "^2.6.0" + } + }, "node_modules/vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", @@ -16076,25 +17619,6 @@ } } }, - "node_modules/vue-material-design-icons": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.3.0.tgz", - "integrity": "sha512-wnbRh+48RwX/Gt+iqwCSdWpm0hPBwwv9F7MSouUzZ2PsphYVMJB9KkG9iGs+tgBiT57ZiurFEK07Y/rFKx+Ekg==" - }, - "node_modules/vue-multiselect": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/vue-multiselect/-/vue-multiselect-2.1.8.tgz", - "integrity": "sha512-bgpvWZlT4EiUUCcwLAR655LdiifeqF62BDL2TLVddKfS/NcdIYVlvOr456N7GQIlBFNbb7vHfq+qOl8mpGAOJw==", - "engines": { - "node": ">= 4.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/vue-observe-visibility": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz", - "integrity": "sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q==" - }, "node_modules/vue-resize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", @@ -16140,27 +17664,6 @@ "dev": true, "peer": true }, - "node_modules/vue-virtual-scroller": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vue-virtual-scroller/-/vue-virtual-scroller-1.1.2.tgz", - "integrity": "sha512-SkUyc7QHCJFB5h1Fya7LxVizlVzOZZuFVipBGHYoTK8dwLs08bIz/tclvRApYhksaJIm/nn51inzO2UjpGJPMQ==", - "dependencies": { - "scrollparent": "^2.0.1", - "vue-observe-visibility": "^0.4.4", - "vue-resize": "^0.4.5" - }, - "peerDependencies": { - "vue": "^2.6.11" - } - }, - "node_modules/vue-virtual-scroller/node_modules/vue-resize": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-0.4.5.tgz", - "integrity": "sha512-bhP7MlgJQ8TIkZJXAfDf78uJO+mEI3CaLABLjv0WNzr4CcGRGPIAItyWYnP6LsPA4Oq0WE+suidNs6dgpO4RHg==", - "peerDependencies": { - "vue": "^2.3.0" - } - }, "node_modules/vue2-datepicker": { "version": "3.11.1", "resolved": "https://registry.npmjs.org/vue2-datepicker/-/vue2-datepicker-3.11.1.tgz", @@ -16184,6 +17687,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -16203,10 +17707,20 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/webpack": { "version": "5.90.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -16409,6 +17923,7 @@ "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==", + "dev": true, "peer": true, "engines": { "node": ">=10.13.0" @@ -16418,6 +17933,7 @@ "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==", + "dev": true, "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -16678,6 +18194,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/ncp-app/package.json b/ncp-app/package.json index f0aa59003..753792dcb 100644 --- a/ncp-app/package.json +++ b/ncp-app/package.json @@ -20,10 +20,10 @@ "stylelint:fix": "stylelint css/*.css css/*.scss ../../src/**/*.scss src/**/*.vue --fix" }, "dependencies": { - "@nextcloud/axios": "^1.10.0", + "@nextcloud/axios": "^2.4.0", "@nextcloud/dialogs": "^3.1.4", "@nextcloud/router": "^2.0.0", - "@nextcloud/vue": "^5.4.0", + "@nextcloud/vue": "^8.11.2", "vue": "^2.7.0" }, "browserslist": [ diff --git a/ncp.sh b/ncp.sh index bbe57b6a5..4eff4a150 100644 --- a/ncp.sh +++ b/ncp.sh @@ -22,7 +22,7 @@ install() { # NCP-CONFIG apt-get update - $APTINSTALL git dialog whiptail jq file lsb-release + $APTINSTALL git dialog whiptail jq file lsb-release tmux mkdir -p "$CONFDIR" "$BINDIR" # This has changed, pi user no longer exists by default, the user needs to create it with Raspberry Pi imager @@ -82,7 +82,8 @@ EOF echo -e "$WEBPASSWD\n$WEBPASSWD" | passwd "$WEBADMIN" is_docker || is_lxc || { chsh -s /usr/sbin/nologin "$WEBADMIN" - chsh -s /usr/sbin/nologin root + passwd -l root + sed -i -e 's/^PermitRootLogin.*$/PermitRootLogin No/' /etc/ssh/sshd_config } ## NCP LAUNCHER @@ -244,6 +245,10 @@ EOF #!/bin/bash /usr/local/bin/ncp-check-updates EOF + + echo ' +NCP is not activated yet. Please enter https://nextcloudpi.local or this instance'"'"'s local IP address in your webbrowser to complete activation. You can find detailed instructions at https://nextcloudpi.com/activate +' >> /etc/issue chmod a+x /etc/update-motd.d/* ## HOSTNAME AND mDNS diff --git a/staged_rollouts/v1.54.0.txt b/staged_rollouts/v1.54.0.txt new file mode 100644 index 000000000..9db674ceb --- /dev/null +++ b/staged_rollouts/v1.54.0.txt @@ -0,0 +1,10 @@ +39 +21 +52 +77 +71 +80 +90 +29 +6 +62 \ No newline at end of file diff --git a/tests/nextcloud_tests.py b/tests/nextcloud_tests.py index b2e4cfc4b..5be92aced 100755 --- a/tests/nextcloud_tests.py +++ b/tests/nextcloud_tests.py @@ -140,7 +140,7 @@ def close_first_run_wizard(driver: WebDriver): time.sleep(3) -def test_nextcloud(IP: str, nc_port: str, driver: WebDriver): +def test_nextcloud(IP: str, nc_port: str, driver: WebDriver, skip_release_check: bool): """ Login and assert admin page checks""" test = Test() test.new("nextcloud page") @@ -263,8 +263,11 @@ def test_nextcloud(IP: str, nc_port: str, driver: WebDriver): expected['ncp_version'] = True elif 'php version' in divs[0].text.lower() and divs[1].text == ncp_cfg['php_version']: expected['php_version'] = True - elif 'debian release' in divs[0].text.lower() and divs[1].text == ncp_cfg['release']: - expected['debian_release'] = True + elif 'debian release' in divs[0].text.lower(): + if divs[1].text == ncp_cfg['release'] or skip_release_check: + expected['debian_release'] = True + else: + print(f"{tc.yellow}{divs[1].text} != {ncp_cfg['release']}") failed = list(map(lambda item: item[0], filter(lambda item: not item[1], expected.items()))) test.check(len(failed) == 0, f"checks failed for admin section: [{', '.join(failed)}]") except Exception as e: @@ -302,11 +305,12 @@ def test_nextcloud(IP: str, nc_port: str, driver: WebDriver): # parse options try: - opts, args = getopt.getopt(sys.argv[1:], 'hn', ['help', 'new', 'no-gui']) + opts, args = getopt.getopt(sys.argv[1:], 'hn', ['help', 'new', 'no-gui', 'skip-release-check']) except getopt.GetoptError: usage() sys.exit(2) + skip_release_check = False options = webdriver.FirefoxOptions() for opt, arg in opts: if opt in ('-h', '--help'): @@ -317,6 +321,8 @@ def test_nextcloud(IP: str, nc_port: str, driver: WebDriver): os.unlink(test_cfg) elif opt == '--no-gui': options.add_argument("-headless") + elif opt == '--skip-release-check': + skip_release_check = True else: usage() sys.exit(2) @@ -355,7 +361,7 @@ def test_nextcloud(IP: str, nc_port: str, driver: WebDriver): driver = webdriver.Firefox(options=options) failed=False try: - test_nextcloud(IP, nc_port, driver) + test_nextcloud(IP, nc_port, driver, skip_release_check) except Exception as e: print(e) print(traceback.format_exc()) diff --git a/tests/system_tests.py b/tests/system_tests.py index 61877e937..b3124604d 100755 --- a/tests/system_tests.py +++ b/tests/system_tests.py @@ -59,6 +59,10 @@ '/.ncp-image', ] +lxc_command = 'lxc' +if 'USE_INCUS' in os.environ and os.environ['USE_INCUS'] == 'yes': + lxc_command = 'incus' + class tc: "terminal colors" @@ -226,8 +230,13 @@ def set_cohorte_id(cohorte_id: int) -> CompletedProcess: return False set_cohorte_id(99) - handle_error(run(pre_cmd + ['/usr/local/bin/ncp-check-version'], stdout=PIPE, stderr=PIPE)) - result = handle_error(run(pre_cmd + ['cat', '/var/run/.ncp-latest-version'], stdout=PIPE, stderr=PIPE)) + chk_version = handle_error(run(pre_cmd + ['/usr/local/bin/ncp-check-version'], stdout=PIPE, stderr=PIPE)) + try: + result = handle_error(run(pre_cmd + ['cat', '/var/run/.ncp-latest-version'], stdout=PIPE, stderr=PIPE)) + except ProcessExecutionException as e: + print("stderr:", chk_version.stderr) + print("stdout:", chk_version.stdout) + raise e if 'v99.99.99' not in result.stdout: print(f"{tc.red}error{tc.normal} Expected latest detected version to be v99.99.99, was {result.stdout}") return False @@ -291,7 +300,7 @@ def set_cohorte_id(cohorte_id: int) -> CompletedProcess: # detect if we are running this in a LXC instance try: - lxc_running = run(['lxc', 'info', 'ncp'], stdout=PIPE, check = True) + lxc_running = run([lxc_command, 'info', 'ncp'], stdout=PIPE, check = True) except: lxc_running = False @@ -319,7 +328,7 @@ def set_cohorte_id(cohorte_id: int) -> CompletedProcess: # LXC method elif lxc_running: print( tc.brown + "* local LXC instance detected" + tc.normal) - pre_cmd = ['lxc', 'exec', 'ncp', '--'] + pre_cmd = [lxc_command, 'exec', 'ncp', '--'] elif systemd_container_running: pre_cmd = ['systemd-run', '--wait', '-P', '--machine=ncp'] diff --git a/update.sh b/update.sh index 78e9fed2b..88a5e65c5 100755 --- a/update.sh +++ b/update.sh @@ -201,9 +201,7 @@ check_distro "$NCPCFG" && check_distro etc/ncp.cfg || { cfg="$(jq '.release = "'$release_new'"' <<<"$cfg")" echo "$cfg" > /usr/local/etc/ncp-recommended.cfg - [[ -f /.dockerenv ]] && \ - msg="Update to $release_new available. Get the latest container to upgrade" || \ - msg="Update to $release_new available. Type 'sudo ncp-dist-upgrade' to upgrade" + msg="Update to $release_new available. Type 'sudo ncp-dist-upgrade' to upgrade" echo "${msg}" notify_admin "New distribution available" "${msg}" wall "${msg}" diff --git a/updates/1.54.0.sh b/updates/1.54.0.sh new file mode 100644 index 000000000..105877884 --- /dev/null +++ b/updates/1.54.0.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +if getent passwd "root" | grep -e '/usr/sbin/nologin' +then + chsh -s /bin/bash root + passwd -l root + sed -i -e 's/^PermitRootLogin.*$/PermitRootLogin No/' /etc/ssh/sshd_config +fi + +for i in {10..15} +do + proxy="$(ncc config:system:get trusted_proxies "$i")" + [[ -z "$proxy" ]] || python3 -c "import ipaddress; ipaddress.ip_address('${proxy}')" || ncc config:system:delete trusted_proxies "$i" +done + +apt-get update +apt-get install --no-install-recommends -y tmux