diff --git a/.github/workflows/build-branch.yml b/.github/workflows/build-branch.yml index 0141f7a15..6c75af134 100644 --- a/.github/workflows/build-branch.yml +++ b/.github/workflows/build-branch.yml @@ -290,5 +290,6 @@ jobs: ${{ github.workspace }}/deploy/selfhost/setup.sh ${{ github.workspace }}/deploy/selfhost/swarm.sh ${{ github.workspace }}/deploy/selfhost/restore.sh + ${{ github.workspace }}/deploy/selfhost/restore-airgapped.sh ${{ github.workspace }}/deploy/selfhost/docker-compose.yml ${{ github.workspace }}/deploy/selfhost/variables.env diff --git a/admin/package.json b/admin/package.json index 3b6cf3e6b..d754dbfaf 100644 --- a/admin/package.json +++ b/admin/package.json @@ -29,7 +29,7 @@ "lucide-react": "^0.469.0", "mobx": "^6.12.0", "mobx-react": "^9.1.1", - "next": "^14.2.26", + "next": "^14.2.29", "next-themes": "^0.2.1", "postcss": "^8.4.38", "react": "^18.3.1", diff --git a/apiserver/requirements/base.txt b/apiserver/requirements/base.txt index ad48a32ec..6cdb4d8b2 100644 --- a/apiserver/requirements/base.txt +++ b/apiserver/requirements/base.txt @@ -1,7 +1,7 @@ # base requirements # django -Django==4.2.20 +Django==4.2.21 # rest framework djangorestframework==3.15.2 # postgres diff --git a/deploy/selfhost/README.md b/deploy/selfhost/README.md index e5a8089e6..ba7af0e6c 100644 --- a/deploy/selfhost/README.md +++ b/deploy/selfhost/README.md @@ -486,7 +486,7 @@ When you want to restore the previously backed-up data, follow the instructions 1. Download the restore script using the command below. We suggest downloading it in the same folder as `setup.sh`. ```bash - curl -fsSL -o restore.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/restore.sh + curl -fsSL -o restore.sh https://github.com/makeplane/plane/releases/latest/download/restore.sh chmod +x restore.sh ``` @@ -529,6 +529,31 @@ When you want to restore the previously backed-up data, follow the instructions --- +### Restore for Commercial Air-Gapped (Docker Compose) + +When you want to restore the previously backed-up data on Plane Commercial Air-Gapped version, follow the instructions below. + +1. Download the restore script using the command below + + ```bash + curl -fsSL -o restore-airgapped.sh https://github.com/makeplane/plane/releases/latest/download/restore-airgapped.sh + chmod +x restore-airgapped.sh + ``` + +1. Copy the backup folder and the `restore-airgapped.sh` to `Commercial Airgapped Edition` server + +1. Make sure that Plane Commercial (Airgapped) is extracted and ready to get started. In case it is running, you would need to stop that. + +1. Execute the command below to restore your data. + + ```bash + ./restore-airgapped.sh + ``` + +1. After restoration, you are ready to start Plane Commercial (Airgapped) will all your previously saved data. + +--- +

Upgrading from v0.13.2 to v0.14.x

diff --git a/deploy/selfhost/install.sh b/deploy/selfhost/install.sh index 5ce2d5964..9f0065f66 100755 --- a/deploy/selfhost/install.sh +++ b/deploy/selfhost/install.sh @@ -366,7 +366,7 @@ function startServices() { local api_container_id=$(docker container ls -q -f "name=$SERVICE_FOLDER-api") local idx2=0 - while ! docker logs $api_container_id 2>&1 | grep -m 1 -i "Application startup complete" | grep -q "."; + while ! docker exec $api_container_id python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/')" > /dev/null 2>&1; do local message=">> Waiting for API Service to Start" local dots=$(printf '%*s' $idx2 | tr ' ' '.') @@ -508,43 +508,69 @@ function viewLogs(){ echo "INVALID SERVICE NAME SUPPLIED" fi } -function backupSingleVolume() { - backupFolder=$1 - selectedVolume=$2 - # Backup data from Docker volume to the backup folder - # docker run --rm -v "$selectedVolume":/source -v "$backupFolder":/backup busybox sh -c 'cp -r /source/* /backup/' - local tobereplaced="plane-app_" - local replacewith="" +function backup_container_dir() { + local BACKUP_FOLDER=$1 + local CONTAINER_NAME=$2 + local CONTAINER_DATA_DIR=$3 + local SERVICE_FOLDER=$4 - local svcName="${selectedVolume//$tobereplaced/$replacewith}" + echo "Backing up $CONTAINER_NAME data..." + local CONTAINER_ID=$(/bin/bash -c "$COMPOSE_CMD -f $DOCKER_FILE_PATH ps -q $CONTAINER_NAME") + if [ -z "$CONTAINER_ID" ]; then + echo "Error: $CONTAINER_NAME container not found. Make sure the services are running." + return 1 + fi - docker run --rm \ - -e TAR_NAME="$svcName" \ - -v "$selectedVolume":/"$svcName" \ - -v "$backupFolder":/backup \ - busybox sh -c 'tar -czf "/backup/${TAR_NAME}.tar.gz" /${TAR_NAME}' + # Create a temporary directory for the backup + mkdir -p "$BACKUP_FOLDER/$SERVICE_FOLDER" + + # Copy the data directory from the running container + echo "Copying $CONTAINER_NAME data directory..." + docker cp -q "$CONTAINER_ID:$CONTAINER_DATA_DIR/." "$BACKUP_FOLDER/$SERVICE_FOLDER/" + local cp_status=$? + + if [ $cp_status -ne 0 ]; then + echo "Error: Failed to copy $SERVICE_FOLDER data" + rm -rf $BACKUP_FOLDER/$SERVICE_FOLDER + return 1 + fi + + # Create tar.gz of the data + cd "$BACKUP_FOLDER" + tar -czf "${SERVICE_FOLDER}.tar.gz" "$SERVICE_FOLDER/" + local tar_status=$? + if [ $tar_status -eq 0 ]; then + rm -rf "$SERVICE_FOLDER/" + fi + cd - > /dev/null + + if [ $tar_status -ne 0 ]; then + echo "Error: Failed to create tar archive" + return 1 + fi + + echo "Successfully backed up $SERVICE_FOLDER data" } + function backupData() { local datetime=$(date +"%Y%m%d-%H%M") local BACKUP_FOLDER=$PLANE_INSTALL_DIR/backup/$datetime mkdir -p "$BACKUP_FOLDER" - volumes=$(docker volume ls -f "name=$SERVICE_FOLDER" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") - # Check if there are any matching volumes - if [ -z "$volumes" ]; then - echo "No volumes found starting with '$SERVICE_FOLDER'" + # Check if docker-compose.yml exists + if [ ! -f "$DOCKER_FILE_PATH" ]; then + echo "Error: docker-compose.yml not found at $DOCKER_FILE_PATH" exit 1 fi - for vol in $volumes; do - echo "Backing Up $vol" - backupSingleVolume "$BACKUP_FOLDER" "$vol" - done + backup_container_dir "$BACKUP_FOLDER" "plane-db" "/var/lib/postgresql/data" "pgdata" || exit 1 + backup_container_dir "$BACKUP_FOLDER" "plane-minio" "/export" "uploads" || exit 1 + backup_container_dir "$BACKUP_FOLDER" "plane-mq" "/var/lib/rabbitmq" "rabbitmq_data" || exit 1 + backup_container_dir "$BACKUP_FOLDER" "plane-redis" "/data" "redisdata" || exit 1 echo "" echo "Backup completed successfully. Backup files are stored in $BACKUP_FOLDER" echo "" - } function askForAction() { local DEFAULT_ACTION=$1 diff --git a/deploy/selfhost/restore-airgapped.sh b/deploy/selfhost/restore-airgapped.sh new file mode 100755 index 000000000..9da02fd86 --- /dev/null +++ b/deploy/selfhost/restore-airgapped.sh @@ -0,0 +1,144 @@ +#!/bin/bash ++set -euo pipefail + +function print_header() { +clear + +cat <<"EOF" +-------------------------------------------- + ____ _ ///////// +| _ \| | __ _ _ __ ___ ///////// +| |_) | |/ _` | '_ \ / _ \ ///// ///// +| __/| | (_| | | | | __/ ///// ///// +|_| |_|\__,_|_| |_|\___| //// + //// +-------------------------------------------- +Project management tool from the future +-------------------------------------------- +EOF +} + +function restoreData() { + + echo "" + echo "****************************************************" + echo "We are about to restore your data from the backup files." + echo "****************************************************" + echo "" + + # set the backup folder path + BACKUP_FOLDER=${1} + + if [ -z "$BACKUP_FOLDER" ]; then + BACKUP_FOLDER="$PWD/backup" + read -p "Enter the backup folder path [$BACKUP_FOLDER]: " BACKUP_FOLDER + if [ -z "$BACKUP_FOLDER" ]; then + BACKUP_FOLDER="$PWD/backup" + fi + fi + + # check if the backup folder exists + if [ ! -d "$BACKUP_FOLDER" ]; then + echo "Error: Backup folder not found at $BACKUP_FOLDER" + exit 1 + fi + + # check if there are any .tar.gz files in the backup folder + if ! ls "$BACKUP_FOLDER"/*.tar.gz 1> /dev/null 2>&1; then + echo "Error: Backup folder does not contain .tar.gz files" + exit 1 + fi + + echo "" + echo "Using backup folder: $BACKUP_FOLDER" + echo "" + + # ask for current install path + AIRGAPPED_INSTALL_PATH="$HOME/planeairgapped" + read -p "Enter the airgapped instance install path [$AIRGAPPED_INSTALL_PATH]: " AIRGAPPED_INSTALL_PATH + if [ -z "$AIRGAPPED_INSTALL_PATH" ]; then + AIRGAPPED_INSTALL_PATH="$HOME/planeairgapped" + fi + + # check if the airgapped instance install path exists + if [ ! -d "$AIRGAPPED_INSTALL_PATH" ]; then + echo "Error: Airgapped instance install path not found at $AIRGAPPED_INSTALL_PATH" + exit 1 + fi + + echo "" + echo "Using airgapped instance install path: $AIRGAPPED_INSTALL_PATH" + echo "" + + # check if the docker-compose.yaml exists + if [ ! -f "$AIRGAPPED_INSTALL_PATH/docker-compose.yml" ]; then + echo "Error: docker-compose.yml not found at $AIRGAPPED_INSTALL_PATH/docker-compose.yml" + exit 1 + fi + + local dockerServiceStatus + if command -v jq &> /dev/null; then + dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped --format=json | jq -r .[0].Status) + else + dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped | grep -o "running" | head -n 1) + fi + + if [[ $dockerServiceStatus == "running" ]]; then + echo "Plane Airgapped is running. Please STOP the Plane Airgapped before restoring data." + exit 1 + fi + + CURRENT_USER_ID=$(id -u) + CURRENT_GROUP_ID=$(id -g) + + # if the data folder not exists, create it + if [ ! -d "$AIRGAPPED_INSTALL_PATH/data" ]; then + mkdir -p "$AIRGAPPED_INSTALL_PATH/data" + chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$AIRGAPPED_INSTALL_PATH/data" + fi + + for BACKUP_FILE in "$BACKUP_FOLDER/*.tar.gz"; do + if [ -e "$BACKUP_FILE" ]; then + + # get the basefilename without the extension + BASE_FILE_NAME=$(basename "$BACKUP_FILE" ".tar.gz") + + # extract the restoreFile to the airgapped instance install path + echo "Restoring $BASE_FILE_NAME" + rm -rf "$AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME" || true + + tar -xvzf "$BACKUP_FILE" -C "$AIRGAPPED_INSTALL_PATH/data/" + if [ $? -ne 0 ]; then + echo "Error: Failed to extract $BACKUP_FILE" + exit 1 + fi + chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME" + if [ $? -ne 0 ]; then + echo "Error: Failed to change ownership of $AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME" + exit 1 + fi + else + echo "No .tar.gz files found in the current directory." + echo "" + echo "Please provide the path to the backup file." + echo "" + echo "Usage: $0 /path/to/backup" + exit 1 + fi + done + + echo "" + echo "Restore completed successfully." + echo "" +} + +# if docker-compose is installed +if command -v docker-compose &> /dev/null +then + COMPOSE_CMD="docker-compose" +else + COMPOSE_CMD="docker compose" +fi + +print_header +restoreData "$@" diff --git a/deploy/selfhost/restore.sh b/deploy/selfhost/restore.sh index cd453b2a7..23b8de6cf 100755 --- a/deploy/selfhost/restore.sh +++ b/deploy/selfhost/restore.sh @@ -66,8 +66,10 @@ function restoreData() { exit 1 fi + local volume_suffix + volume_suffix="_pgdata|_redisdata|_uploads|_rabbitmq_data" local volumes - volumes=$(docker volume ls -f "name=plane-app" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") + volumes=$(docker volume ls -f "name=plane-app" --format "{{.Name}}" | grep -E "$volume_suffix") # Check if there are any matching volumes if [ -z "$volumes" ]; then echo ".....No volumes found starting with 'plane-app'" @@ -87,7 +89,7 @@ function restoreData() { echo "Found $BACKUP_FILE" local docVol - docVol=$(docker volume ls -f "name=$restoreVolName" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") + docVol=$(docker volume ls -f "name=$restoreVolName" --format "{{.Name}}" | grep -E "$volume_suffix") if [ -z "$docVol" ]; then echo "Skipping: No volume found with name $restoreVolName" diff --git a/space/package.json b/space/package.json index c5a302664..8bdc33867 100644 --- a/space/package.json +++ b/space/package.json @@ -36,7 +36,7 @@ "mobx": "^6.10.0", "mobx-react": "^9.1.1", "mobx-utils": "^6.0.8", - "next": "^14.2.26", + "next": "^14.2.29", "next-themes": "^0.2.1", "nprogress": "^0.2.0", "react": "^18.3.1", diff --git a/web/package.json b/web/package.json index c04564b30..de0f81801 100644 --- a/web/package.json +++ b/web/package.json @@ -51,7 +51,7 @@ "mobx": "^6.10.0", "mobx-react": "^9.1.1", "mobx-utils": "^6.0.8", - "next": "^14.2.26", + "next": "^14.2.29", "next-themes": "^0.2.1", "nprogress": "^0.2.0", "posthog-js": "^1.131.3", diff --git a/yarn.lock b/yarn.lock index 4063af1c4..0d4b65ecd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1613,10 +1613,10 @@ prop-types "^15.8.1" react-is "^19.0.0" -"@next/env@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.26.tgz#5d55f72d2edb7246607c78f61e7d3ff21516bc2e" - integrity sha512-vO//GJ/YBco+H7xdQhzJxF7ub3SUwft76jwaeOyVVQFHCi5DCnkP16WHB+JBylo4vOKPoZBlR94Z8xBxNBdNJA== +"@next/env@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.29.tgz#febceb77ab90e44a683c10748a62d1bc10f20d19" + integrity sha512-UzgLR2eBfhKIQt0aJ7PWH7XRPYw7SXz0Fpzdl5THjUnvxy4kfBk9OU4RNPNiETewEEtaBcExNFNn1QWH8wQTjg== "@next/eslint-plugin-next@14.2.24": version "14.2.24" @@ -1625,50 +1625,50 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.26.tgz#84b31a22149b2c49f5c5b29cddd7acb3a84d7e1c" - integrity sha512-zDJY8gsKEseGAxG+C2hTMT0w9Nk9N1Sk1qV7vXYz9MEiyRoF5ogQX2+vplyUMIfygnjn9/A04I6yrUTRTuRiyQ== +"@next/swc-darwin-arm64@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.29.tgz#615cf42d1533272fcea468489387a089f1ab01c4" + integrity sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA== -"@next/swc-darwin-x64@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.26.tgz#50a5eb37972d313951f76f36f1f0b7100d063ebd" - integrity sha512-U0adH5ryLfmTDkahLwG9sUQG2L0a9rYux8crQeC92rPhi3jGQEY47nByQHrVrt3prZigadwj/2HZ1LUUimuSbg== +"@next/swc-darwin-x64@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.29.tgz#2bf21a5f25f784c456cc58f0f273ede6898a3c96" + integrity sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg== -"@next/swc-linux-arm64-gnu@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.26.tgz#c4278c157623b05886e37ff17194811aca1c2d00" - integrity sha512-SINMl1I7UhfHGM7SoRiw0AbwnLEMUnJ/3XXVmhyptzriHbWvPPbbm0OEVG24uUKhuS1t0nvN/DBvm5kz6ZIqpg== +"@next/swc-linux-arm64-gnu@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.29.tgz#408f86e4ae787342f93513a562a226545e971953" + integrity sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw== -"@next/swc-linux-arm64-musl@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.26.tgz#5751132764b7a1f13a5a3fe447b03d564eb29705" - integrity sha512-s6JaezoyJK2DxrwHWxLWtJKlqKqTdi/zaYigDXUJ/gmx/72CrzdVZfMvUc6VqnZ7YEvRijvYo+0o4Z9DencduA== +"@next/swc-linux-arm64-musl@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.29.tgz#94071e41c222b68cbbf82fa3a3a33f5b5ca19a94" + integrity sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw== -"@next/swc-linux-x64-gnu@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.26.tgz#74312cac45704762faa73e0880be6549027303af" - integrity sha512-FEXeUQi8/pLr/XI0hKbe0tgbLmHFRhgXOUiPScz2hk0hSmbGiU8aUqVslj/6C6KA38RzXnWoJXo4FMo6aBxjzg== +"@next/swc-linux-x64-gnu@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.29.tgz#757a87136f9dd40d7dd0b8624b20b275701c3dcc" + integrity sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA== -"@next/swc-linux-x64-musl@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.26.tgz#5d96464d71d2000ec704e650a1a86bb9d73f760d" - integrity sha512-BUsomaO4d2DuXhXhgQCVt2jjX4B4/Thts8nDoIruEJkhE5ifeQFtvW5c9JkdOtYvE5p2G0hcwQ0UbRaQmQwaVg== +"@next/swc-linux-x64-musl@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.29.tgz#84a6429f212a08c629a3bfca19842a1053653217" + integrity sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw== -"@next/swc-win32-arm64-msvc@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.26.tgz#859472b532b11499b8f5c2237f54401456286913" - integrity sha512-5auwsMVzT7wbB2CZXQxDctpWbdEnEW/e66DyXO1DcgHxIyhP06awu+rHKshZE+lPLIGiwtjo7bsyeuubewwxMw== +"@next/swc-win32-arm64-msvc@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.29.tgz#e79ac6ef251d8e380f5bb406f39dcd144fc0408b" + integrity sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A== -"@next/swc-win32-ia32-msvc@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.26.tgz#e52e9bd0c43b7a469b03eda6d7a07c3d0c28f549" - integrity sha512-GQWg/Vbz9zUGi9X80lOeGsz1rMH/MtFO/XqigDznhhhTfDlDoynCM6982mPCbSlxJ/aveZcKtTlwfAjwhyxDpg== +"@next/swc-win32-ia32-msvc@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.29.tgz#e8bfabeb2bf004f228063358c862a1159ff94b29" + integrity sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA== -"@next/swc-win32-x64-msvc@14.2.26": - version "14.2.26" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.26.tgz#6f42a3ae16ae15c5c5e36efa9b7e291c86ab1275" - integrity sha512-2rdB3T1/Gp7bv1eQTTm9d1Y1sv9UuJ2LAwOE0Pe2prHKe32UNscj7YS13fRB37d0GAiGNR+Y7ZcW8YjDI8Ns0w== +"@next/swc-win32-x64-msvc@14.2.29": + version "14.2.29" + resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.29.tgz#9097b85893a51ca9ba3b9d1733a4aab954edeab5" + integrity sha512-iPPwUEKnVs7pwR0EBLJlwxLD7TTHWS/AoVZx1l9ZQzfQciqaFEr5AlYzA2uB6Fyby1IF18t4PL0nTpB+k4Tzlw== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -8419,12 +8419,12 @@ next-themes@^0.2.1: resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== -next@^14.2.26: - version "14.2.26" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.26.tgz#b918b3fc5c55e1a67aada1347907675713687721" - integrity sha512-b81XSLihMwCfwiUVRRja3LphLo4uBBMZEzBBWMaISbKTwOmq3wPknIETy/8000tr7Gq4WmbuFYPS7jOYIf+ZJw== +next@^14.2.29: + version "14.2.29" + resolved "https://registry.npmjs.org/next/-/next-14.2.29.tgz#f67610f8368ef863065b3b791e23b9198f0df615" + integrity sha512-s98mCOMOWLGGpGOfgKSnleXLuegvvH415qtRZXpSp00HeEgdmrxmwL9cgKU+h4XrhB16zEI5d/7BnkS3ATInsA== dependencies: - "@next/env" "14.2.26" + "@next/env" "14.2.29" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -8432,15 +8432,15 @@ next@^14.2.26: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.26" - "@next/swc-darwin-x64" "14.2.26" - "@next/swc-linux-arm64-gnu" "14.2.26" - "@next/swc-linux-arm64-musl" "14.2.26" - "@next/swc-linux-x64-gnu" "14.2.26" - "@next/swc-linux-x64-musl" "14.2.26" - "@next/swc-win32-arm64-msvc" "14.2.26" - "@next/swc-win32-ia32-msvc" "14.2.26" - "@next/swc-win32-x64-msvc" "14.2.26" + "@next/swc-darwin-arm64" "14.2.29" + "@next/swc-darwin-x64" "14.2.29" + "@next/swc-linux-arm64-gnu" "14.2.29" + "@next/swc-linux-arm64-musl" "14.2.29" + "@next/swc-linux-x64-gnu" "14.2.29" + "@next/swc-linux-x64-musl" "14.2.29" + "@next/swc-win32-arm64-msvc" "14.2.29" + "@next/swc-win32-ia32-msvc" "14.2.29" + "@next/swc-win32-x64-msvc" "14.2.29" no-case@^3.0.4: version "3.0.4"