diff --git a/.github/workflows/container-creation-tests.yml b/.github/workflows/container-creation-tests.yml index f2d0e6c1..3ca2c5be 100644 --- a/.github/workflows/container-creation-tests.yml +++ b/.github/workflows/container-creation-tests.yml @@ -4,11 +4,11 @@ on: push: branches: [ main, develop ] paths: - - 'container-creation/js/**' + - 'container-creation/container-creation/root-bin/js/**' pull_request: branches: [ main, develop ] paths: - - 'container-creation/js/**' + - 'container-creation/container-creation/root-bin/js/**' jobs: test: @@ -27,25 +27,25 @@ jobs: with: node-version: ${{ matrix.node-version }} cache: 'npm' - cache-dependency-path: 'container-creation/js/package-lock.json' + cache-dependency-path: 'container-creation/container-creation/root-bin/js/package-lock.json' - name: Install dependencies - working-directory: ./container-creation/js + working-directory: ./container-creation/container-creation/root-bin/js run: npm ci - name: Run tests - working-directory: ./container-creation/js + working-directory: ./container-creation/container-creation/root-bin/js run: npm test - name: Run tests with coverage - working-directory: ./container-creation/js + working-directory: ./container-creation/container-creation/root-bin/js run: npm run test:coverage - name: Upload coverage reports if: matrix.node-version == '20' uses: codecov/codecov-action@v3 with: - file: ./container-creation/js/coverage/lcov.info + file: ./container-creation/container-creation/root-bin/js/coverage/lcov.info flags: container-creation-js name: container-creation-js-coverage fail_ci_if_error: false \ No newline at end of file diff --git a/.gitignore b/.gitignore index d5300330..37d7e734 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,2 @@ -Wazuh/node_modules/ -Wazuh/package-lock.json -Wazuh/package.json -Wazuh/.env -Wazuh/.gitignore - +node_modules +.env diff --git a/Wazuh/register-agent.sh b/Wazuh/register-agent.sh deleted file mode 100644 index 724cd93a..00000000 --- a/Wazuh/register-agent.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Wazuh Registration Script to register an agent with the Wazuh manager -# Last Modified on August 6th, 2025 by Maxwell Klema -# ------------------------------------------------- - - -KEY=$(node /var/lib/vz/snippets/Wazuh/runner.js addAgent "$CONTAINER_NAME" "$CONTAINER_IP" | sed -n '2p') -MANAGER_IP="10.15.173.19" - -if [ "$KEY" == "fail" ]; then - echo "Failed to register agent with Wazuh manager." - exit 1 -fi - -# Install all necessary dependencies and register the agent to the manager - -pct enter "$CONTAINER_ID" -- <> "$LOG_FILE" +} + +# Function to remove temporary environment variable Folders +removeTempEnvVars() { + TEMP_ENV_FOLDER="/root/bin/env" + while read -r line; do + if [[ "$line" == /root/bin/env/env_* ]]; then + rm -rf "$line" > /dev/null 2>&1 + writeLog "Removed temporary environment variable folder: $line" + fi + done < <(find "$TEMP_ENV_FOLDER" -maxdepth 1 -type d -name "env_*") +} + +# Function to remove temporary services file +removeTempServices() { + TEMP_SERVICES_FOLDER="/root/bin/services" + while read -r line; do + if [[ "$line" == /root/bin/services/services_* ]]; then + rm -f "$line" + writeLog "Removed temporary services file: $line" + fi + done < <(find "$TEMP_SERVICES_FOLDER" -maxdepth 1 -type f -name "services_*") +} + +# Function to remove temporary public key files +removeTempPublicKeys() { + TEMP_PUB_FOLDER="/root/bin/ssh/temp_pubs" + while read -r line; do + if [[ "$line" == /root/bin/ssh/temp_pubs/key_* ]]; + then + rm -f "$line" + writeLog "Removed temporary public key file: $line" + fi + done < <(find "$TEMP_PUB_FOLDER" -maxdepth 1 -type f -name "key_*") +} + +# Function to remove temporary protocol files +removeTempProtocols() { + TEMP_PROTOCOL_FOLDER="/root/bin/protocols" + while read -r line; do + if [[ "$line" == /root/bin/protocols/protocol_list* ]]; then + rm -f "$line" + writeLog "Removed temporary protocol file: $line" + fi + done < <(find "$TEMP_PROTOCOL_FOLDER" -maxdepth 1 -type f -name "protocol_list*") +} + +# Main function to prune all temporary files +pruneTempFiles() { + writeLog "Starting to prune temporary files..." + removeTempEnvVars + removeTempServices + removeTempPublicKeys + removeTempProtocols + writeLog "Finished pruning temporary files." +} + +# Execute the main function +pruneTempFiles +exit 0 \ No newline at end of file diff --git a/container-creation/get-lxc-container-details.sh b/container-creation/container-creation/root-bin/create-lxc-container.sh old mode 100644 new mode 100755 similarity index 88% rename from container-creation/get-lxc-container-details.sh rename to container-creation/container-creation/root-bin/create-lxc-container.sh index 5e4ee9b6..a1cbe5d1 --- a/container-creation/get-lxc-container-details.sh +++ b/container-creation/container-creation/root-bin/create-lxc-container.sh @@ -126,7 +126,7 @@ else fi echo "โŒ \"$PUBLIC_KEY\" is not a valid key. Enter either a valid key or leave blank to skip." writeLog "Invalid public key entered: $PUBLIC_KEY" - read -p "Enter Public Key (Allows Easy Access to Container) [OPTIONAL - LEAVE BLANK TO SKIP] โ†’ " PUBLIC_KEY + read -p "Enter Public Key (Allows Easy Access to Container) [OPTIONAL - LEAVE BLANK TO SKIP] โ†’ " PUBLIC_KEY done if [ "$PUBLIC_KEY" != "" ]; then @@ -173,21 +173,6 @@ protocol_duplicate() { return 1 # Protocol is not a duplicate } -show_available_protocols() { - echo "" - echo "๐Ÿ“‹ Available Protocols:" - echo "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”" - # Display protocols in a more readable format showing abbreviation, port, and type - while read line; do - protocol_abbrev=$(echo "$line" | awk '{print $1}') - protocol_port=$(echo "$line" | awk '{print $2}') - protocol_type=$(echo "$line" | awk '{print $3}') - printf "%-12s Port %-6s (%s)\n" "$protocol_abbrev" "$protocol_port" "$protocol_type" - done < "/root/bin/protocols/master_protocol_list.txt" - echo "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”" - echo "" -} - read -p "Does your Container require any protocols other than SSH and HTTP? (y/n) โ†’ " USE_OTHER_PROTOCOLS while [ "${USE_OTHER_PROTOCOLS^^}" != "Y" ] && [ "${USE_OTHER_PROTOCOLS^^}" != "N" ] && [ "${USER_OTHER_PROTOCOLS^^}" != "" ]; do echo "Please answer 'y' for yes or 'n' for no." @@ -202,18 +187,13 @@ if [ "${USE_OTHER_PROTOCOLS^^}" == "Y" ]; then touch "$PROTOCOL_FILE" LIST_PROTOCOLS=() - read -p "Enter the protocol abbreviation (e.g, LDAP for Lightweight Directory Access Protocol). Type \"list\" to see available protocols or \"e\" to exit โ†’ " PROTOCOL_NAME + read -p "Enter the protocol abbreviation (e.g, LDAP for Lightweight Directory Access Protocol). Type \"e\" to exit โ†’ " PROTOCOL_NAME while [ "${PROTOCOL_NAME^^}" != "E" ]; do - if [ "${PROTOCOL_NAME^^}" == "LIST" ]; then - show_available_protocols - read -p "Enter the protocol abbreviation (e.g, LDAP for Lightweight Directory Access Protocol). Type \"list\" to see available protocols or \"e\" to exit โ†’ " PROTOCOL_NAME - continue - fi FOUND=0 #keep track if protocol was found while read line; do PROTOCOL_ABBRV=$(echo "$line" | awk '{print $1}') protocol_duplicate "$PROTOCOL_ABBRV" "${LIST_PROTOCOLS[@]}" - IS_PROTOCOL_DUPLICATE=$? + IS_PROTOCOL_DUPLICATE=$? if [[ "$PROTOCOL_ABBRV" == "${PROTOCOL_NAME^^}" && "$IS_PROTOCOL_DUPLICATE" -eq 1 ]]; then LIST_PROTOCOLS+=("$PROTOCOL_ABBRV") PROTOCOL_UNDRLYING_NAME=$(echo "$line" | awk '{print $3}') @@ -227,13 +207,13 @@ if [ "${USE_OTHER_PROTOCOLS^^}" == "Y" ]; then FOUND=2 #protocol was a duplicate break fi - done < <(cat "/root/bin/protocols/master_protocol_list.txt" | grep "^${PROTOCOL_NAME^^}") + done < <(cat "/root/bin/protocols/master_protocol_list.txt" | grep "^${PROTOCOL_NAME^^}") if [ $FOUND -eq 0 ]; then #if no results found, let user know. echo "โŒ Protocol ${PROTOCOL_NAME^^} not found. Please try again." fi - read -p "Enter the protocol abbreviation (e.g, LDAP for Lightweight Directory Access Protocol). Type \"list\" to see available protocols or \"e\" to exit โ†’ " PROTOCOL_NAME + read -p "Enter the protocol abbreviation (e.g, LDAP for Lightweight Directory Access Protocol). Type \"e\" to exit โ†’ " PROTOCOL_NAME done fi @@ -294,6 +274,7 @@ INSTALL_COMMAND_B64=$(echo -n "$INSTALL_COMMAND" | base64) BUILD_COMMAND_B64=$(echo -n "$BUILD_COMMAND" | base64) RUNTIME_LANGUAGE_B64=$(echo -n "$RUNTIME_LANGUAGE" | base64) START_COMMAND_B64=$(echo -n "$START_COMMAND" | base64) +VERSIONS_DICT_B64=$(echo -n "$VERSIONS_DICT" | base64) REMOTE_CMD=( /var/lib/vz/snippets/create-container.sh @@ -316,6 +297,8 @@ REMOTE_CMD=( "$LINUX_DISTRIBUTION" "$MULTI_COMPONENT" "$ROOT_START_COMMAND" +"$SELF_HOSTED_RUNNER" +"$VERSIONS_DICT_B64" ) QUOTED_REMOTE_CMD=$(printf ' %q' "${REMOTE_CMD[@]}") diff --git a/container-creation/get-deployment-details.sh b/container-creation/container-creation/root-bin/deploy-application.sh similarity index 92% rename from container-creation/get-deployment-details.sh rename to container-creation/container-creation/root-bin/deploy-application.sh index 992cd256..4d2d63f7 100755 --- a/container-creation/get-deployment-details.sh +++ b/container-creation/container-creation/root-bin/deploy-application.sh @@ -105,6 +105,10 @@ if [[ "$PROJECT_ROOT" == "/*" ]]; then PROJECT_ROOT="${PROJECT_ROOT:1}" fi +if [ "$PROJECT_ROOT" == "" ]; then + PROJECT_ROOT="." +fi + # Check if the App has multiple components (backend, frontend, multiple servers, etc.) ======== if [ -z "$MULTI_COMPONENT" ]; then @@ -144,7 +148,7 @@ gatherComponentDir() { # Check that component path is valid VALID_COMPONENT_PATH=$(node /root/bin/js/runner.js authenticateRepo "$PROJECT_REPOSITORY" "$PROJECT_BRANCH" "$COMPONENT_PATH") writeLog "Validating component path: $COMPONENT_PATH" - + while [ "$VALID_COMPONENT_PATH" == "false" ] && [ "$COMPONENT_PATH" != "" ]; do if [ "${GH_ACTION^^}" == "Y" ]; then outputError "Invalid Component Path: \"$COMPONENT_PATH\". Make sure your path exists on the repository." @@ -164,7 +168,7 @@ gatherComponentDir() { if [[ "$COMPONENT_PATH" == /* ]]; then COMPONENT_PATH="${COMPONENT_PATH:1}" # remove leading slash fi - + if [ "$COMPONENT_PATH" != "" ]; then writeLog "Component path validated: $COMPONENT_PATH" fi @@ -193,11 +197,15 @@ source /root/bin/deployment-scripts/gatherEnvVars.sh # Gather Environment Variab writeLog "Gathering build commands" gatherSetupCommands "BUILD" "๐Ÿ—๏ธ Enter the build command (leave blank if no build command) โ†’ " # Gather Build Command(s) -writeLog "Gathering install commands" -gatherSetupCommands "INSTALL" "๐Ÿ“ฆ Enter the install command (e.g., 'npm install') โ†’ " # Gather Install Command(s) +if [ ! -z "$INSTALL_COMMAND" ] || [ -z "$ROOT_START_COMMAND" ]; then + writeLog "Gathering install commands" + gatherSetupCommands "INSTALL" "๐Ÿ“ฆ Enter the install command (e.g., 'npm install') โ†’ " # Gather Install Command(s) +fi -writeLog "Gathering start commands" -gatherSetupCommands "START" "๐Ÿšฆ Enter the start command (e.g., 'npm start', 'python app.py') โ†’ " # Gather Start Command(s) +if [ ! -z "$START_COMMAND" ] || [ -z "$ROOT_START_COMMAND" ]; then + writeLog "Gathering start commands" + gatherSetupCommands "START" "๐Ÿšฆ Enter the start command (e.g., 'npm start', 'python app.py') โ†’ " # Gather Start Command(s) +fi if [ "${MULTI_COMPONENT^^}" == "Y" ]; then if [ -z "$ROOT_START_COMMAND" ]; then @@ -211,12 +219,14 @@ fi # Get Runtime Language ======== -writeLog "Sourcing runtime languages script" -source /root/bin/deployment-scripts/gatherRuntimeLangs.sh +if [ ! -z "$RUNTIME_LANGUAGE" ] || [ -z "$ROOT_START_COMMAND" ]; then + writeLog "Sourcing runtime languages script" + source /root/bin/deployment-scripts/gatherRuntimeLangs.sh +fi # Get Services ======== writeLog "Sourcing services script" source /root/bin/deployment-scripts/gatherServices.sh writeLog "Deployment process finished successfully" -echo -e "\nโœ… Deployment Process Finished.\n" \ No newline at end of file +echo -e "\nโœ… Deployment Process Finished.\n" diff --git a/container-creation/deployment-scripts/gatherEnvVars.sh b/container-creation/container-creation/root-bin/deployment-scripts/gatherEnvVars.sh similarity index 99% rename from container-creation/deployment-scripts/gatherEnvVars.sh rename to container-creation/container-creation/root-bin/deployment-scripts/gatherEnvVars.sh index 9453c065..ad7e4827 100644 --- a/container-creation/deployment-scripts/gatherEnvVars.sh +++ b/container-creation/container-creation/root-bin/deployment-scripts/gatherEnvVars.sh @@ -90,7 +90,7 @@ if [ "${REQUIRE_ENV_VARS^^}" == "Y" ]; then ENV_FILE="env_$RANDOM_NUM.txt" ENV_FILE_PATH="/root/bin/env/$ENV_FOLDER/$ENV_FILE" touch "$ENV_FILE_PATH" - + if [ ! -z "$CONTAINER_ENV_VARS" ]; then # Environment Variables if echo "$CONTAINER_ENV_VARS" | jq -e > /dev/null 2>&1; then #if exit status of jq is 0 (valid JSON) // success echo "$CONTAINER_ENV_VARS " | jq -r 'to_entries[] | "\(.key)=\(.value)"' > "$ENV_FILE_PATH" #k=v pairs @@ -108,4 +108,4 @@ if [ "${REQUIRE_ENV_VARS^^}" == "Y" ]; then gatherEnvVars "$ENV_FILE_PATH" fi fi -fi \ No newline at end of file +fi diff --git a/container-creation/container-creation/root-bin/deployment-scripts/gatherRuntimeLangs.sh b/container-creation/container-creation/root-bin/deployment-scripts/gatherRuntimeLangs.sh new file mode 100755 index 00000000..f78c5151 --- /dev/null +++ b/container-creation/container-creation/root-bin/deployment-scripts/gatherRuntimeLangs.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +# Keep track of the runtime languages and versions for each component +VERSIONS_DICT={} + +gatherRunTime() { + COMPONENT_PATH="$1" + + if [ -z "${RUNTIME_LANGUAGE}" ] || [ "$RT_ENV_VAR" != "true" ]; then + read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " RUNTIME_LANGUAGE + fi + + RUNTIME_LANGUAGE_REGEX="^(python|nodejs)(@([0-9]+(\.[0-9]+){0,2}))?$" + + while [[ ! ${RUNTIME_LANGUAGE,,} =~ $RUNTIME_LANGUAGE_REGEX ]]; do + echo "โš ๏ธ Sorry, that runtime environment is not yet supported. Only \"nodejs\" and \"python\" are currently supported." + writeLog "Unsupported runtime environment entered: $RUNTIME_LANGUAGE for component: $COMPONENT_PATH" + if [ "${GH_ACTION^^}" == "Y" ]; then + exit 17 + fi + read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " RUNTIME_LANGUAGE + done + + # Scrape runtime version + if [[ "${RUNTIME_LANGUAGE,,}" == *"@"* ]]; then + if [ "${MULTI_COMPONENT^^}" == "Y" ]; then + RUNTIME_VERSION=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/.*@([0-9]+(\.[0-9]+){0,2}).*/\1/') + UPDATED_VERSIONS_DICT=$(echo "$VERSIONS_DICT" | jq --arg k "$COMPONENT_PATH" --arg v "$RUNTIME_VERSION" '. + {($k): $v}') + VERSIONS_DICT=$UPDATED_VERSIONS_DICT + else + RUNTIME_VERSION=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/.*@([0-9]+(\.[0-9]+){0,2}).*/\1/') + UPDATED_VERSIONS_DICT=$(echo "$VERSIONS_DICT" | jq --arg k "default" --arg v "$RUNTIME_VERSION" '. + {($k): $v}') + VERSIONS_DICT=$UPDATED_VERSIONS_DICT + fi + fi + RUNTIME_LANGUAGE=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/@.*//') +} + +# Helper function to remove an item from a list +removeFromList() { + ITEM_TO_REMOVE="$1" + NEW_LIST=() + for ITEM in "${UNIQUE_COMPONENTS_CLONE[@]}"; do + if [ "$ITEM" != "$ITEM_TO_REMOVE" ]; then + NEW_LIST+=("$ITEM") + fi + done + UNIQUE_COMPONENTS_CLONE=("${NEW_LIST[@]}") +} + +UNIQUE_COMPONENTS_CLONE=("${UNIQUE_COMPONENTS[@]}") +RUNTIME_LANGUAGE_DICT={} + + +if [ "${MULTI_COMPONENT^^}" == 'Y' ]; then + if [ ! -z "$RUNTIME_LANGUAGE" ]; then # Environment Variable Passed + if echo "$RUNTIME_LANGUAGE" | jq -e > /dev/null 2>&1; then # Valid JSON + for key in $(echo "$RUNTIME_LANGUAGE" | jq -r 'keys[]'); do + RUNTIME_LANGUAGE_REGEX="^(python|nodejs)(@([0-9]+(\.[0-9]+){0,2}))?$" + COMPONENT_RUNTIME_LANGUAGE=$(echo "$RUNTIME_LANGUAGE" | jq -r --arg key "$key" '.[$key]') + while [[ ! ${COMPONENT_RUNTIME_LANGUAGE,,} =~ $RUNTIME_LANGUAGE_REGEX ]]; do + outputError "โš ๏ธ Sorry, that runtime environment is not yet supported. Only \"nodejs\" and \"python\" are currently supported." + writeLog "Unsupported runtime environment entered: $COMPONENT_RUNTIME_LANGUAGE for component: $COMPONENT_PATH (GH_ACTION mode)" + if [ "${GH_ACTION^^}" == "Y" ]; then + exit 17 + fi + read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " COMPONENT_RUNTIME_LANGUAGE + done + + # Scrape runtime version + if [[ "${COMPONENT_RUNTIME_LANGUAGE,,}" == *"@"* ]]; then + RUNTIME_VERSION=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/.*@([0-9]+(\.[0-9]+){0,2}).*/\1/') + UPDATED_VERSIONS_DICT=$(echo "$VERSIONS_DICT" | jq --arg k "$key" --arg v "$RUNTIME_VERSION" '. + {($k): $v}') + VERSIONS_DICT=$UPDATED_VERSIONS_DICT + fi + COMPONENT_RUNTIME_LANGUAGE=$(echo "${COMPONENT_RUNTIME_LANGUAGE,,}" | sed -E 's/@.*//') + RUNTIME_LANGUAGE=$(echo "$RUNTIME_LANGUAGE" \ + | jq -c --arg k "$key" --arg v "$COMPONENT_RUNTIME_LANGUAGE" '.[$k] = $v') + + removeFromList "$key" + + done + if [ ${#UNIQUE_COMPONENTS_CLONE[@]} -gt 0 ]; then #if there are still components in the list, then not all runtimes were provided, so exit on error + echo "โš ๏ธ You did not provide runtime languages for these components: \"${UNIQUE_COMPONENTS_CLONE[@]}\"." + writeLog "Missing runtime languages for components: ${UNIQUE_COMPONENTS_CLONE[@]}" + exit 18 + fi + else + echo "โš ๏ธ Your \"$RUNTIME_LANGUAGE\" is not valid JSON. Please re-format and try again." + writeLog "Invalid JSON in RUNTIME_LANGUAGE" + exit 16 + fi + else # No Environment Variable Passed + for CURRENT in "${UNIQUE_COMPONENTS[@]}"; do + gatherRunTime "$CURRENT" + RUNTIME_LANGUAGE_DICT=$(echo "$RUNTIME_LANGUAGE_DICT" | jq --arg k "$CURRENT" --arg v "$RUNTIME_LANGUAGE" '. + {($k): $v}') + done + RUNTIME_LANGUAGE=$RUNTIME_LANGUAGE_DICT + fi +else + if [ ! -z "$RUNTIME_LANGUAGE" ]; then + RT_ENV_VAR="true" + fi + gatherRunTime "$PROJECT_REPOSITORY" +fi diff --git a/container-creation/deployment-scripts/gatherServices.sh b/container-creation/container-creation/root-bin/deployment-scripts/gatherServices.sh similarity index 100% rename from container-creation/deployment-scripts/gatherServices.sh rename to container-creation/container-creation/root-bin/deployment-scripts/gatherServices.sh diff --git a/container-creation/deployment-scripts/gatherSetupCommands.sh b/container-creation/container-creation/root-bin/deployment-scripts/gatherSetupCommands.sh similarity index 100% rename from container-creation/deployment-scripts/gatherSetupCommands.sh rename to container-creation/container-creation/root-bin/deployment-scripts/gatherSetupCommands.sh diff --git a/container-creation/js/authenticateRepo.js b/container-creation/container-creation/root-bin/js/authenticateRepo.js similarity index 100% rename from container-creation/js/authenticateRepo.js rename to container-creation/container-creation/root-bin/js/authenticateRepo.js diff --git a/container-creation/js/authenticateRepo.test.js b/container-creation/container-creation/root-bin/js/authenticateRepo.test.js similarity index 100% rename from container-creation/js/authenticateRepo.test.js rename to container-creation/container-creation/root-bin/js/authenticateRepo.test.js diff --git a/container-creation/js/authenticateUser.js b/container-creation/container-creation/root-bin/js/authenticateUser.js similarity index 100% rename from container-creation/js/authenticateUser.js rename to container-creation/container-creation/root-bin/js/authenticateUser.js diff --git a/container-creation/js/authenticateUser.test.js b/container-creation/container-creation/root-bin/js/authenticateUser.test.js similarity index 100% rename from container-creation/js/authenticateUser.test.js rename to container-creation/container-creation/root-bin/js/authenticateUser.test.js diff --git a/container-creation/js/package-lock.json b/container-creation/container-creation/root-bin/js/package-lock.json similarity index 88% rename from container-creation/js/package-lock.json rename to container-creation/container-creation/root-bin/js/package-lock.json index f130c21b..9593da07 100644 --- a/container-creation/js/package-lock.json +++ b/container-creation/container-creation/root-bin/js/package-lock.json @@ -16,26 +16,11 @@ "jest": "^29.7.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -46,32 +31,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, - "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -91,7 +74,6 @@ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", @@ -108,7 +90,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", @@ -125,7 +106,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -135,7 +115,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -149,7 +128,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", @@ -167,7 +145,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -177,7 +154,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -187,7 +163,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -197,33 +172,30 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -237,7 +209,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -250,7 +221,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -263,7 +233,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -276,7 +245,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -292,7 +260,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -308,7 +275,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -321,7 +287,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -334,7 +299,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -350,7 +314,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -363,7 +326,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -376,7 +338,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -389,7 +350,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -402,7 +362,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -415,7 +374,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -428,7 +386,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -444,7 +401,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -460,7 +416,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -476,7 +431,6 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", @@ -487,18 +441,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.4", "debug": "^4.3.1" }, "engines": { @@ -506,11 +459,10 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" @@ -523,15 +475,13 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -548,7 +498,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -558,7 +507,6 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -576,7 +524,6 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -624,7 +571,6 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", @@ -640,7 +586,6 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -654,7 +599,6 @@ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -667,7 +611,6 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", @@ -685,7 +628,6 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -701,7 +643,6 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -745,7 +686,6 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, - "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -758,7 +698,6 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -773,7 +712,6 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -789,7 +727,6 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -805,7 +742,6 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -832,7 +768,6 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -850,18 +785,26 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -870,15 +813,13 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -888,15 +829,13 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } @@ -906,7 +845,6 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } @@ -916,7 +854,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -930,7 +867,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -940,7 +876,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -951,7 +886,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" } @@ -961,7 +895,6 @@ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -970,15 +903,13 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -988,34 +919,30 @@ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.0.tgz", + "integrity": "sha512-MKNwXh3seSK8WurXF7erHPJ2AONmMwkI7zAMrXZDPIru8jRqkk6rGDBVbw4mLwfqA+ZZliiDPg05JQ3uW66tKQ==", "dev": true, - "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -1024,15 +951,13 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -1048,7 +973,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1058,7 +982,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1074,7 +997,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1088,7 +1010,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -1096,14 +1017,12 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.1.tgz", - "integrity": "sha512-Kn4kbSXpkFHCGE6rBFNwIv0GQs4AvDT80jlveJDKFxjbTYMUeB4QtsdPCv6H8Cm19Je7IU6VFtRl2zWZI0rudQ==", - "license": "MIT", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -1115,7 +1034,6 @@ "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -1129,7 +1047,6 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -1151,7 +1068,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -1168,7 +1084,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -1185,7 +1100,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -1201,7 +1115,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -1228,7 +1141,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -1244,15 +1156,22 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz", + "integrity": "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==", "dev": true, - "license": "MIT" + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1263,7 +1182,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1272,9 +1190,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", - "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, "funding": [ { @@ -1290,11 +1208,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001737", - "electron-to-chromium": "^1.5.211", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -1309,7 +1227,6 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -1318,13 +1235,10 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1336,8 +1250,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1355,7 +1267,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1365,15 +1276,14 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001739", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", - "integrity": "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==", + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", "dev": true, "funding": [ { @@ -1388,15 +1298,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1413,7 +1321,6 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -1429,7 +1336,6 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } @@ -1438,15 +1344,13 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -1461,25 +1365,22 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1491,14 +1392,12 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1510,22 +1409,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -1547,7 +1443,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1558,11 +1453,10 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1580,7 +1474,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, - "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -1595,7 +1488,6 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1604,7 +1496,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1614,7 +1505,6 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1624,15 +1514,12 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -1644,18 +1531,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.214", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.214.tgz", - "integrity": "sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==", - "dev": true, - "license": "ISC" + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "dev": true }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -1667,23 +1552,19 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1691,8 +1572,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1700,8 +1579,6 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1714,7 +1591,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -1730,7 +1606,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -1740,7 +1615,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1750,7 +1624,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1764,7 +1637,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -1797,7 +1669,6 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -1813,22 +1684,19 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -1838,7 +1706,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1851,7 +1718,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1861,9 +1727,7 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.15.9", "funding": [ { "type": "individual", @@ -1884,7 +1748,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1900,8 +1763,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -1909,7 +1771,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -1920,8 +1781,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1932,7 +1791,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1942,15 +1800,12 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1976,15 +1831,12 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -1999,7 +1851,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2013,7 +1864,6 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2031,8 +1881,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2045,23 +1893,19 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2074,7 +1918,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -2087,8 +1930,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2101,15 +1942,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } @@ -2119,7 +1958,6 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -2139,7 +1977,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2150,7 +1987,6 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2160,15 +1996,13 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-buffer": { "version": "2.0.5", @@ -2189,7 +2023,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "engines": { "node": ">=4" } @@ -2199,7 +2032,6 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -2215,7 +2047,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2225,7 +2056,6 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2235,7 +2065,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2245,7 +2074,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -2257,15 +2085,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -2275,7 +2101,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -2288,11 +2113,10 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2305,7 +2129,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -2320,7 +2143,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -2335,7 +2157,6 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -2349,7 +2170,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -2376,7 +2196,6 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -2391,7 +2210,6 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -2423,7 +2241,6 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -2457,7 +2274,6 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -2503,7 +2319,6 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -2519,7 +2334,6 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -2532,7 +2346,6 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -2549,7 +2362,6 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -2567,7 +2379,6 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -2577,7 +2388,6 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -2603,7 +2413,6 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -2617,7 +2426,6 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -2633,7 +2441,6 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -2654,7 +2461,6 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2669,7 +2475,6 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -2687,7 +2492,6 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -2697,7 +2501,6 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -2718,7 +2521,6 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -2732,7 +2534,6 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -2765,7 +2566,6 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -2799,7 +2599,6 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -2827,11 +2626,10 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2844,7 +2642,6 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2862,7 +2659,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", @@ -2880,7 +2676,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -2893,7 +2688,6 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -2913,7 +2707,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -2929,7 +2722,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2944,15 +2736,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2966,7 +2756,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -2978,15 +2767,13 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -2999,7 +2786,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3009,7 +2795,6 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3018,15 +2803,13 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3039,7 +2822,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -3049,7 +2831,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -3061,11 +2842,10 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3078,15 +2858,12 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3096,15 +2873,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -3117,7 +2892,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3126,7 +2900,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3139,7 +2912,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3149,7 +2921,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3161,36 +2932,31 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", + "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3200,7 +2966,6 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -3210,8 +2975,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -3225,7 +2988,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -3235,7 +2997,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -3251,7 +3012,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3267,7 +3027,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3280,7 +3039,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3296,7 +3054,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3306,7 +3063,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -3325,7 +3081,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3335,7 +3090,6 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3345,7 +3099,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3354,22 +3107,19 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3382,7 +3132,6 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -3392,7 +3141,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -3405,7 +3153,6 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, - "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -3420,7 +3167,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3433,7 +3179,6 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -3444,8 +3189,6 @@ }, "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==", "license": "MIT" }, "node_modules/pure-rand": { @@ -3462,13 +3205,10 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -3484,15 +3224,13 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3502,7 +3240,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -3523,7 +3260,6 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -3536,7 +3272,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3546,7 +3281,6 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -3556,7 +3290,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3566,7 +3299,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3579,15 +3311,12 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3605,8 +3334,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3621,8 +3348,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -3639,8 +3364,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -3660,22 +3383,19 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3685,7 +3405,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3695,7 +3414,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3705,15 +3423,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -3726,7 +3442,6 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -3740,7 +3455,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3755,7 +3469,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3768,7 +3481,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3778,7 +3490,6 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3788,7 +3499,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -3801,7 +3511,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3814,7 +3523,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3827,7 +3535,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -3841,15 +3548,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -3862,7 +3567,6 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -3872,7 +3576,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3881,11 +3584,10 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, - "license": "MIT" + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true }, "node_modules/update-browserslist-db": { "version": "1.1.3", @@ -3906,7 +3608,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -3923,7 +3624,6 @@ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -3938,7 +3638,6 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -3948,7 +3647,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3964,7 +3662,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3981,15 +3678,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -4003,7 +3698,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -4012,15 +3706,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -4039,7 +3731,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } @@ -4049,7 +3740,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, diff --git a/container-creation/js/package.json b/container-creation/container-creation/root-bin/js/package.json similarity index 100% rename from container-creation/js/package.json rename to container-creation/container-creation/root-bin/js/package.json diff --git a/container-creation/js/runner.js b/container-creation/container-creation/root-bin/js/runner.js similarity index 100% rename from container-creation/js/runner.js rename to container-creation/container-creation/root-bin/js/runner.js diff --git a/container-creation/container-creation/root-bin/opensource-server b/container-creation/container-creation/root-bin/opensource-server new file mode 120000 index 00000000..a8a4f8c2 --- /dev/null +++ b/container-creation/container-creation/root-bin/opensource-server @@ -0,0 +1 @@ +../../.. \ No newline at end of file diff --git a/container-creation/protocols/master_protocol_list.txt b/container-creation/container-creation/root-bin/protocols/master_protocol_list.txt similarity index 100% rename from container-creation/protocols/master_protocol_list.txt rename to container-creation/container-creation/root-bin/protocols/master_protocol_list.txt diff --git a/container-creation/services/service_map_debian.json b/container-creation/container-creation/root-bin/services/service_map_debian.json similarity index 96% rename from container-creation/services/service_map_debian.json rename to container-creation/container-creation/root-bin/services/service_map_debian.json index 2c99c524..e490361d 100644 --- a/container-creation/services/service_map_debian.json +++ b/container-creation/container-creation/root-bin/services/service_map_debian.json @@ -1,7 +1,5 @@ { - "meteor": [ - "curl https://install.meteor.com/ | sh" - ], + "meteor": ["curl https://install.meteor.com/ | sh"], "mongodb": [ "sudo apt update -y", "sudo apt install -y gnupg curl", @@ -44,7 +42,7 @@ "curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg", "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable' | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", "sudo apt update -y", - "sudo apt install -y docker-ce docker-ce-cli containerd.io", + "sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin", "sudo systemctl enable docker", "sudo systemctl start docker" ], @@ -66,4 +64,4 @@ "sudo systemctl enable mariadb", "sudo systemctl start mariadb" ] -} \ No newline at end of file +} diff --git a/container-creation/services/service_map_rocky.json b/container-creation/container-creation/root-bin/services/service_map_rocky.json similarity index 97% rename from container-creation/services/service_map_rocky.json rename to container-creation/container-creation/root-bin/services/service_map_rocky.json index 1b661433..7b7cda85 100644 --- a/container-creation/services/service_map_rocky.json +++ b/container-creation/container-creation/root-bin/services/service_map_rocky.json @@ -1,8 +1,5 @@ { - "meteor": [ - "dnf install tar -y", - "curl https://install.meteor.com/ | sh" - ], + "meteor": ["dnf install tar -y", "curl https://install.meteor.com/ | sh"], "mongodb": [ "sudo dnf install -y epel-release", "sudo dnf update -y", @@ -96,4 +93,4 @@ "sudo systemctl enable mariadb", "sudo systemctl start mariadb" ] -} \ No newline at end of file +} diff --git a/container-creation/ssh/detectPublicKey.sh b/container-creation/container-creation/root-bin/ssh/detectPublicKey.sh similarity index 80% rename from container-creation/ssh/detectPublicKey.sh rename to container-creation/container-creation/root-bin/ssh/detectPublicKey.sh index 29edf5ab..e9512e3c 100755 --- a/container-creation/ssh/detectPublicKey.sh +++ b/container-creation/container-creation/root-bin/ssh/detectPublicKey.sh @@ -1,20 +1,18 @@ #!/bin/bash # Detect if the user in the current session logged in via an SSH public key -# Last Updated June 26, 2025 Maxwell Klema +# Last Updated June 17th 2025 Maxwell Klema USER="create-container" #Change Later PUBLIC_KEY_LIST="/root/.ssh/authorized_keys" - KEY_FINGERPRINT="$1" TEMP_PUB_FILE="$2" if [ "$KEY_FINGERPRINT" != "" ]; then # Iterate over each public key, compute fingerprint, see if there is a match - - while read line; do + while read line; do echo "$line" > "$TEMP_PUB_FILE" - PUB_FINGERPRINT=$(ssh-keygen -lf "$TEMP_PUB_FILE" | awk '{print $2}') + PUB_FINGERPRINT=$(ssh-keygen -lf "$TEMP_PUB_FILE" 2>/dev/null | awk '{print $2}') if [[ "$PUB_FINGERPRINT" == "$KEY_FINGERPRINT" ]]; then echo "Public key found for $USER" exit 0 diff --git a/container-creation/ssh/publicKeyAppendJumpHost.sh b/container-creation/container-creation/root-bin/ssh/publicKeyAppendJumpHost.sh old mode 100644 new mode 100755 similarity index 91% rename from container-creation/ssh/publicKeyAppendJumpHost.sh rename to container-creation/container-creation/root-bin/ssh/publicKeyAppendJumpHost.sh index 0a92b167..5e5c7012 --- a/container-creation/ssh/publicKeyAppendJumpHost.sh +++ b/container-creation/container-creation/root-bin/ssh/publicKeyAppendJumpHost.sh @@ -1,6 +1,6 @@ #!/bin/bash # A script that appends a user's public key to the SSH jump host container to prevent them having to enter a password -# June 25th, 2025 Maxwell Klema +# June 24th, 2025 Maxwell Klema PUBLIC_KEY=$1 JUMP_HOST="10.15.0.4" #temporary until jump server ready diff --git a/container-creation/container-creation/root-bin/test.sh b/container-creation/container-creation/root-bin/test.sh new file mode 100755 index 00000000..abfad803 --- /dev/null +++ b/container-creation/container-creation/root-bin/test.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# VERSIONS_DICT={} + +# gatherRunTime() { +# COMPONENT_PATH="$1" + +# if [ -z "${RUNTIME_LANGUAGE}" ] || [ "$RT_ENV_VAR" != "true" ]; then +# read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " RUNTIME_LANGUAGE +# fi + +# RUNTIME_LANGUAGE_REGEX="^(python|nodejs)(@([0-9]+(\.[0-9]+){0,2}))?$" + +# while [[ ! ${RUNTIME_LANGUAGE,,} =~ $RUNTIME_LANGUAGE_REGEX ]]; do +# echo "โš ๏ธ Sorry, that runtime environment is not yet supported. Only \"nodejs\" and \"python\" are currently supported." +# # writeLog "Unsupported runtime environment entered: $RUNTIME_LANGUAGE for component: $COMPONENT_PATH" +# if [ "${GH_ACTION^^}" == "Y" ]; then +# outputError "โš ๏ธ Sorry, that runtime environment is not yet supported. Only \"nodejs\" and \"python\" are currently supported." +# # writeLog "Unsupported runtime environment entered: $RUNTIME_LANGUAGE (GH_ACTION mode)" +# exit 17 +# fi +# read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " RUNTIME_LANGUAGE +# done + +# # Scrape runtime version +# if [[ "${RUNTIME_LANGUAGE,,}" == *"@"* ]]; then +# if [ "${MULTI_COMPONENT^^}" == "Y" ]; then +# RUNTIME_VERSION=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/.*@([0-9]+(\.[0-9]+){0,2}).*/\1/') +# UPDATED_VERSIONS_DICT=$(echo "$VERSIONS_DICT" | jq --arg k "$COMPONENT_PATH" --arg v "$RUNTIME_VERSION" '. + {($k): $v}') +# VERSIONS_DICT=$UPDATED_VERSIONS_DICT +# else +# RUNTIME_VERSION=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/.*@([0-9]+(\.[0-9]+){0,2}).*/\1/') +# UPDATED_VERSIONS_DICT=$(echo "$VERSIONS_DICT" | jq --arg k "default" --arg v "$RUNTIME_VERSION" '. + {($k): $v}') +# VERSIONS_DICT=$UPDATED_VERSIONS_DICT +# fi +# fi +# RUNTIME_LANGUAGE=$(echo "${RUNTIME_LANGUAGE,,}" | sed -E 's/@.*//') +# } + +# gatherRunTime "test" + +RUNTIME_LANGUAGE='{"frontend": "nodejs", "backend": "python@3.10"}' +echo "$RUNTIME_LANGUAGE" +RUNTIME_LANGUAGE=$(echo "$RUNTIME_LANGUAGE" \ + | jq -c '.frontend = "nodejs@3"') +echo "$RUNTIME_LANGUAGE" diff --git a/container-creation/deployment-scripts/gatherRuntimeLangs.sh b/container-creation/deployment-scripts/gatherRuntimeLangs.sh deleted file mode 100755 index 508eff5c..00000000 --- a/container-creation/deployment-scripts/gatherRuntimeLangs.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -gatherRunTime() { - COMPONENT_PATH="$1" - - if [ -z "${RUNTIME_LANGUAGE}" ] || [ "$RT_ENV_VAR" != "true" ]; then - read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " RUNTIME_LANGUAGE - fi - - while [ "${RUNTIME_LANGUAGE^^}" != "NODEJS" ] && [ "${RUNTIME_LANGUAGE^^}" != "PYTHON" ]; do - echo "โš ๏ธ Sorry, that runtime environment is not yet supported. Only \"nodejs\" and \"python\" are currently supported." - writeLog "Unsupported runtime environment entered: $RUNTIME_LANGUAGE for component: $COMPONENT_PATH" - if [ "${GH_ACTION^^}" == "Y" ]; then - outputError "โš ๏ธ Sorry, that runtime environment is not yet supported. Only \"nodejs\" and \"python\" are currently supported." - writeLog "Unsupported runtime environment entered: $RUNTIME_LANGUAGE (GH_ACTION mode)" - exit 17 - fi - read -p "๐Ÿ–ฅ๏ธ Enter the underlying runtime environment for \"$COMPONENT_PATH\" (e.g., 'nodejs', 'python') โ†’ " RUNTIME_LANGUAGE - done -} - -# Helper function to remove an item from a list -removeFromList() { - ITEM_TO_REMOVE="$1" - NEW_LIST=() - for ITEM in "${UNIQUE_COMPONENTS_CLONE[@]}"; do - if [ "$ITEM" != "$ITEM_TO_REMOVE" ]; then - NEW_LIST+=("$ITEM") - fi - done - UNIQUE_COMPONENTS_CLONE=("${NEW_LIST[@]}") -} - -UNIQUE_COMPONENTS_CLONE=("${UNIQUE_COMPONENTS[@]}") -RUNTIME_LANGUAGE_DICT={} - - -if [ "${MULTI_COMPONENT^^}" == 'Y' ]; then - if [ ! -z "$RUNTIME_LANGUAGE" ]; then # Environment Variable Passed - if echo "$RUNTIME_LANGUAGE" | jq -e > /dev/null 2>&1; then # Valid JSON - for key in $(echo "$RUNTIME_LANGUAGE" | jq -r 'keys[]'); do - removeFromList "$key" - done - if [ ${#UNIQUE_COMPONENTS_CLONE[@]} -gt 0 ]; then #if there are still components in the list, then not all runtimes were provided, so exit on error - if [ "${GH_ACTION^^}" == "Y" ]; then - outputError "You did not provide runtime languages for these components: \"${UNIQUE_COMPONENTS_CLONE[@]}\"." - writeLog "Missing runtime languages for components: ${UNIQUE_COMPONENTS_CLONE[@]} (GH_ACTION mode)" - exit 18 - fi - echo "โš ๏ธ You did not provide runtime languages for these components: \"${UNIQUE_COMPONENTS_CLONE[@]}\"." - writeLog "Missing runtime languages for components: ${UNIQUE_COMPONENTS_CLONE[@]}" - exit 18 - fi - else - if [ "${GH_ACTION^^}" == "Y" ]; then - outputError "Your \"$RUNTIME_LANGUAGE\" is not valid JSON. Please re-format and try again." - writeLog "Invalid JSON in RUNTIME_LANGUAGE (GH_ACTION mode)" - exit 16 - fi - echo "โš ๏ธ Your \"$RUNTIME_LANGUAGE\" is not valid JSON. Please re-format and try again." - writeLog "Invalid JSON in RUNTIME_LANGUAGE" - exit 16 - fi - else # No Environment Variable Passed - for CURRENT in "${UNIQUE_COMPONENTS[@]}"; do - gatherRunTime "$CURRENT" - RUNTIME_LANGUAGE_DICT=$(echo "$RUNTIME_LANGUAGE_DICT" | jq --arg k "$CURRENT" --arg v "$RUNTIME_LANGUAGE" '. + {($k): $v}') - done - RUNTIME_LANGUAGE=$RUNTIME_LANGUAGE_DICT - fi -else - if [ ! -z "$RUNTIME_LANGUAGE" ]; then - RT_ENV_VAR="true" - fi - gatherRunTime "$PROJECT_REPOSITORY" -fi \ No newline at end of file diff --git a/container-creation/helper-scripts/configureLDAP.sh b/container-creation/helper-scripts/configureLDAP.sh deleted file mode 100644 index bf8ec3fa..00000000 --- a/container-creation/helper-scripts/configureLDAP.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# Script to connect a container to the LDAP server via SSSD -# Last Modified by Carter Myers on Aug 28th, 2025 -# ----------------------------------------------------- - -run_pct_exec() { - local ctid="$1" - shift - if [ "${AI_CONTAINER^^}" == "Y" ]; then - # Use printf %q to safely quote all arguments for the remote shell - local remote_cmd - printf -v remote_cmd '%q ' "$@" - ssh root@10.15.0.6 "pct exec $ctid -- $remote_cmd" - else - pct exec "$ctid" -- "$@" - fi -} - -run_pct() { - # $@ = full pct command, e.g., clone, set, start, etc. - if [ "${AI_CONTAINER^^}" == "Y" ]; then - ssh root@10.15.0.6 "pct $*" - else - pct "$@" - fi -} - -# Curl Pown.sh script to install SSSD and configure LDAP -run_pct_exec $CONTAINER_ID bash -c " -cd /root && \ -curl -O https://raw.githubusercontent.com/anishapant21/pown.sh/main/pown.sh > /dev/null 2>&1 && \ -chmod +x pown.sh -" - -# Copy .env file to container (safe for SSH / AI_CONTAINER) -ENV_FILE="/var/lib/vz/snippets/.env" -ENV_CONTENT=$(<"$ENV_FILE" sed 's/["\$`]/\\&/g') # Escape special characters -run_pct_exec $CONTAINER_ID bash -c "printf '%s\n' \"$ENV_CONTENT\" > /root/.env" - -# Run the pown.sh script to configure LDAP -run_pct_exec $CONTAINER_ID bash -c "cd /root && ./pown.sh" > /dev/null 2>&1 - -# Remove ldap_tls_cert from /etc/sssd/sssd.conf -run_pct_exec $CONTAINER_ID sed -i '/ldap_tls_cacert/d' /etc/sssd/sssd.conf > /dev/null 2>&1 - -# Add TLS_REQCERT to never in ROCKY -if [ "${LINUX_DISTRO^^}" == "ROCKY" ]; then - run_pct_exec $CONTAINER_ID bash -c "echo 'TLS_REQCERT never' >> /etc/openldap/ldap.conf" > /dev/null 2>&1 - run_pct_exec $CONTAINER_ID bash -c "authselect select sssd --force" > /dev/null 2>&1 - run_pct_exec $CONTAINER_ID bash -c "systemctl restart sssd" > /dev/null 2>&1 -fi diff --git a/container-creation/helper-scripts/deployOnStart.sh b/container-creation/helper-scripts/deployOnStart.sh deleted file mode 100644 index c0c90586..00000000 --- a/container-creation/helper-scripts/deployOnStart.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/bash -# Automation Script for attempting to automatically deploy projects and services on a container -# Last Modifided by Maxwell Klema on August 16th, 2025 -# ----------------------------------------------------- - -echo "๐Ÿš€ Attempting Automatic Deployment" -REPO_BASE_NAME=$(basename -s .git "$PROJECT_REPOSITORY") - -# Helper function to normalize paths by removing duplicate slashes -normalize_path() { - echo "$1" | sed 's#/\+#/#g' -} - -# Clone github repository from correct branch ==== - -pct enter $CONTAINER_ID < /dev/null 2>&1 && \ -cd /root/$REPO_BASE_NAME && \ -git checkout $PROJECT_BRANCH > /dev/null 2>&1 -else -cd /root/$REPO_BASE_NAME && git fetch > /dev/null 2>&1 && git pull > /dev/null 2>&1 && \ -git checkout $PROJECT_BRANCH > /dev/null 2>&1 -fi -EOF - -pct exec $CONTAINER_ID -- bash -c "chmod 700 ~/.bashrc" # enable full R/W/X permissions - -# Copy over ENV variables ==== - -ENV_BASE_FOLDER="/var/lib/vz/snippets/container-env-vars/${ENV_BASE_FOLDER}" - -echo "$REPO_BASE_NAME" -echo "$PROJECT_ROOT" -if [ -d "$ENV_BASE_FOLDER" ]; then - if [ "${MULTI_COMPONENTS^^}" == "Y" ]; then - for FILE in $ENV_BASE_FOLDER/*; do - FILE_BASENAME=$(basename "$FILE") - FILE_NAME="${FILE_BASENAME%.*}" - ENV_ROUTE=$(echo "$FILE_NAME" | tr '_' '/') # acts as the route to the correct folder to place .env file in. - - ENV_VARS=$(cat $ENV_BASE_FOLDER/$FILE_BASENAME) - COMPONENT_PATH=$(normalize_path "/root/$REPO_BASE_NAME/$PROJECT_ROOT/$ENV_ROUTE") - pct exec $CONTAINER_ID -- bash -c "if [ ! -f \"$COMPONENT_PATH/.env\" ]; then touch \"$COMPONENT_PATH/.env\"; fi; echo \"$ENV_VARS\" >> \"$COMPONENT_PATH/.env\"" > /dev/null 2>&1 - done - else - ENV_FOLDER_BASE_NAME=$(basename "$ENV_BASE_FOLDER") - ENV_VARS=$(cat $ENV_BASE_FOLDER/$ENV_FOLDER_BASE_NAME.txt || true) - COMPONENT_PATH=$(normalize_path "/root/$REPO_BASE_NAME/$PROJECT_ROOT") - pct exec $CONTAINER_ID -- bash -c "if [ ! -f \"$COMPONENT_PATH/.env\" ]; then touch \"$COMPONENT_PATH/.env\"; fi; echo \"$ENV_VARS\" >> \"$COMPONENT_PATH/.env\"" > /dev/null 2>&1 - fi -fi - -# Install Specific Runtime Versions (if Needed) - -echo "VERSIONS_DICT: $VERSIONS_DICT" -echo "RUNTIME_LANGUAGE: $RUNTIME_LANGUAGE" - -pct set $CONTAINER_ID --memory 4096 --swap 0 --cores 8 > /dev/null 2>&1 - -# Function to handle runtime installation -install_runtime() { - local runtime_language=$1 - local version=$2 - - if [ "${runtime_language,,}" == "nodejs" ]; then - local major=$(echo "$version" | cut -d. -f1) - local node_version_exists=$(curl -s https://nodejs.org/dist/index.json | grep "version\":\"v$major") - if [ ! -z "$node_version_exists" ]; then - source /var/lib/vz/snippets/helper-scripts/node_runtime_install.sh "$major" - else - echo "Node.js version $version ($major) is not available. Please check the version number. Using latest version instead." - fi - elif [ "${runtime_language,,}" == "python" ]; then - IFS='.' read -r -a parts <<< "$version" - - # Fill missing parts with 0 - while [ "${#parts[@]}" -lt 3 ]; do - parts+=("0") - done - - version="${parts[0]}.${parts[1]}.${parts[2]}" - local python_version_exists=$(curl -s https://www.python.org/ftp/python/ | grep "$version") - if [ ! -z "$python_version_exists" ]; then - source /var/lib/vz/snippets/helper-scripts/python_runtime_install.sh "${LINUX_DISTRO,,}" "$version" - else - echo "Python version $version is not available. Please check the version number. Using latest version instead." - fi - fi -} - -for key in $(echo "$VERSIONS_DICT" | jq -r 'keys[]'); do - if [ "$key" == "default" ] && [ "${MULTI_COMPONENT^^}" != "Y" ]; then - version=$(echo "$VERSIONS_DICT" | jq --arg k "$key" '.[$k]') - if [ "$version" != "null" ]; then - version=$(echo "$version" | sed 's/"//g') - install_runtime "$RUNTIME_LANGUAGE" "$version" - fi - else - value=$(echo "$RUNTIME_LANGUAGE" | jq --arg k "$key" '.[$k]') - value=$(echo "$value" | sed 's/"//g') - version=$(echo "$VERSIONS_DICT" | jq --arg k "$key" '.[$k]') - if [ "$version" != "null" ]; then - version=$(echo "$version" | sed 's/"//g') - install_runtime "$value" "$version" - fi - fi -done - -# Run Installation Commands ==== - -runInstallCommands() { - - RUNTIME="$1" - COMP_DIR="$2" - - # Create normalized path - WORK_DIR=$(normalize_path "/root/$REPO_BASE_NAME/$PROJECT_ROOT/$COMP_DIR") - - if [ "${RUNTIME^^}" == "NODEJS" ]; then - pct exec $CONTAINER_ID -- bash -c "cd $WORK_DIR && sudo $INSTALL_CMD" > /dev/null 2>&1 - elif [ "${RUNTIME^^}" == "PYTHON" ]; then - pct enter $CONTAINER_ID < /dev/null -cd $WORK_DIR && \ -python3 -m venv venv && source venv/bin/activate && \ -pip install --upgrade pip && \ -$INSTALL_CMD -EOF - fi -} - -if [ "${MULTI_COMPONENTS^^}" == "Y" ]; then - for COMPONENT in $(echo "$RUNTIME_LANGUAGE" | jq -r 'keys[]'); do - RUNTIME=$(echo "$RUNTIME_LANGUAGE" | jq -r --arg k "$COMPONENT" '.[$k]') #get runtime env - INSTALL_CMD=$(echo "$INSTALL_COMMAND" | jq -r --arg k "$COMPONENT" '.[$k]') #get install command - if [ "$INSTALL_CMD" != "null" ]; then - runInstallCommands "$RUNTIME" "$COMPONENT" - fi - done -else - INSTALL_CMD=$INSTALL_COMMAND - runInstallCommands "$RUNTIME_LANGUAGE" "." -fi - -# Install Services ==== - -if [ -f "/var/lib/vz/snippets/container-services/$SERVICES_BASE_FILE" ]; then - while read line; do - pct exec $CONTAINER_ID -- bash -c "$line" > /dev/null 2>&1 - done < "/var/lib/vz/snippets/container-services/$SERVICES_BASE_FILE" -fi \ No newline at end of file diff --git a/container-creation/helper-scripts/python_runtime_install.sh b/container-creation/helper-scripts/python_runtime_install.sh deleted file mode 100644 index 8680e573..00000000 --- a/container-creation/helper-scripts/python_runtime_install.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -# Script to install a specific Python runtime version -# Last Modified by Maxwell Klema on August 18th, 2025 -# ---------------------------------------------------------- - -if [ "$#" -ne 2 ]; then - echo "Usage: $0 " - echo "Example: $0 debian 3.8.9" - exit 1 -fi - -OS=$1 -PYTHON_VERSION=$2 -PYTHON_URL="https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tgz" - -# Function to install dependencies based on OS -install_dependencies() { - case "${OS,,}" in - debian) - pct exec $CONTAINER_ID -- bash -c "sudo apt update -y && sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget" > /dev/null 2>&1 - ;; - rocky) - pct exec $CONTAINER_ID -- bash -c "sudo dnf update -y && sudo dnf install -y gcc zlib-devel ncurses-devel gdbm-devel nss-devel openssl-devel readline-devel wget libffi-devel" > /dev/null 2>&1 - ;; - esac -} - -# Function to install Python -install_python() { - echo "โณ Installing Python $PYTHON_VERSION... This may take a while." - pct exec "$CONTAINER_ID" -- bash -c "cd /usr/src && sudo wget $PYTHON_URL && sudo tar xzf Python-$PYTHON_VERSION.tgz && \ - cd Python-$PYTHON_VERSION && sudo ./configure --enable-optimizations && \ - sudo make -j$(nproc) && sudo make altinstall && \ - sudo ln -sfn /usr/local/bin/python${PYTHON_VERSION%.*} /usr/local/bin/python3 && \ - python3 -m ensurepip --upgrade && python3 -m pip install --upgrade pip" - echo "Python $PYTHON_VERSION installed successfully." > /dev/null 2>&1 -} - -install_dependencies -install_python \ No newline at end of file diff --git a/container-creation/intern-phxdc-pve1/etc-ssh/sshd_config b/container-creation/intern-phxdc-pve1/etc-ssh/sshd_config new file mode 100644 index 00000000..64f1e909 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/etc-ssh/sshd_config @@ -0,0 +1,141 @@ +# This is the sshd server system-wide configuration file. See +# sshd_config(5) for more information. + +# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/bin:/usr/games + +# The strategy used for options in the default sshd_config shipped with +# OpenSSH is to specify options with their default value where +# possible, but leave them commented. Uncommented options override the +# default value. + +Include /etc/ssh/sshd_config.d/*.conf + +#Port 22 +#AddressFamily any +#ListenAddress 0.0.0.0 +#ListenAddress :: + +#HostKey /etc/ssh/ssh_host_rsa_key +#HostKey /etc/ssh/ssh_host_ecdsa_key +#HostKey /etc/ssh/ssh_host_ed25519_key + +# Ciphers and keying +#RekeyLimit default none + +# Logging +#SyslogFacility AUTH +#LogLevel INFO + +# Authentication: + +#LoginGraceTime 2m +PermitRootLogin yes +#StrictModes yes +#MaxAuthTries 6 +#MaxSessions 10 + +PubkeyAuthentication yes + +# Expect .ssh/authorized_keys2 to be disregarded by default in future. +#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 + +#AuthorizedPrincipalsFile none + +#AuthorizedKeysCommand none +#AuthorizedKeysCommandUser nobody + +# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts +#HostbasedAuthentication no +# Change to yes if you don't trust ~/.ssh/known_hosts for +# HostbasedAuthentication +#IgnoreUserKnownHosts no +# Don't read the user's ~/.rhosts and ~/.shosts files +#IgnoreRhosts yes + +# To disable tunneled clear text passwords, change to no here! +PasswordAuthentication yes +#PermitEmptyPasswords no + +# Change to yes to enable challenge-response passwords (beware issues with +# some PAM modules and threads) +KbdInteractiveAuthentication no + +# Kerberos options +#KerberosAuthentication no +#KerberosOrLocalPasswd yes +#KerberosTicketCleanup yes +#KerberosGetAFSToken no + +# GSSAPI options +#GSSAPIAuthentication no +#GSSAPICleanupCredentials yes +#GSSAPIStrictAcceptorCheck yes +#GSSAPIKeyExchange no + +# Set this to 'yes' to enable PAM authentication, account processing, +# and session processing. If this is enabled, PAM authentication will +# be allowed through the KbdInteractiveAuthentication and +# PasswordAuthentication. Depending on your PAM configuration, +# PAM authentication via KbdInteractiveAuthentication may bypass +# the setting of "PermitRootLogin prohibit-password". +# If you just want the PAM account and session checks to run without +# PAM authentication, then enable this but set PasswordAuthentication +# and KbdInteractiveAuthentication to 'no'. +UsePAM yes + +#AllowAgentForwarding yes +#AllowTcpForwarding yes +#GatewayPorts no +X11Forwarding yes +#X11DisplayOffset 10 +#X11UseLocalhost yes +#PermitTTY yes +PrintMotd no +#PrintLastLog yes +#TCPKeepAlive yes +PermitUserEnvironment yes +#Compression delayed +#ClientAliveInterval 0 +#ClientAliveCountMax 3 +#UseDNS no +#PidFile /run/sshd.pid +#MaxStartups 10:30:100 +#PermitTunnel no +#ChrootDirectory none +#VersionAddendum none + +# no default banner path +#Banner none + +# Allow client to pass locale environment variables +AcceptEnv LANG LC_* + +# override default of no subsystems +Subsystem sftp /usr/lib/openssh/sftp-server + +# Example of overriding settings on a per-user basis +Match User create-container + AcceptEnv AcceptEnv SSH_KEY_FP PUBLIC_KEY PROXMOX_USERNAME PROXMOX_PASSWORD CONTAINER_NAME CONTAINER_PASSWORD HTTP_PORT DEPLOY_ON_START PROJECT_REPOSITORY PROJECT_BRANCH PROJECT_ROOT REQUIRE_ENV_VARS CONTAINER_ENV_VARS INSTALL_COMMAND BUILD_COMMAND START_COMMAND RUNTIME_LANGUAGE SERVICES REQUIRE_SERVICES CUSTOM_SERVICES LINUX_DISTRIBUTION MULTI_COMPONENT ROOT_START_COMMAND GH_ACTION GITHUB_PAT SELF_HOSTED_RUNNER VERSIONS_DICT + ForceCommand /home/create-container/bin/extract-fingerprint.sh + PermitTTY yes + +Match User update-container + AcceptEnv CONTAINER_NAME PROXMOX_USERNAME PROXMOX_PASSWORD PROJECT_BRANCH PROJECT_ROOT PROJECT_REPOSITORY INSTALL_COMMAND BUILD_COMMAND START_COMMAND RUNTIME_LANGUAGE MULTI_COMPONENT ROOT_START_COMMAND DEPLOY_ON_START SERVICES CUSTOM_SERVICES REQUIRE_SERVICES LINUX_DISTRIBUTION GH_ACTION HTTP_PORT CONTAINER_ENV_VARS + ForceCommand sudo -E /var/lib/vz/snippets/update-container.sh + PermitTTY yes + +Match User container-exists + AcceptEnv PROXMOX_PASSWORD PROXMOX_USERNAME CONTAINER_NAME PROJECT_REPOSITORY DEPLOY_ON_START + ForceCommand sudo -E /var/lib/vz/snippets/container-exists.sh + PermitTTY yes + +Match User delete-container + AcceptEnv PROXMOX_PASSWORD PROXMOX_USERNAME CONTAINER_NAME PROJECT_REPOSITORY GITHUB_PAT + ForceCommand sudo -E /var/lib/vz/snippets/delete-container.sh + PermitTTY yes + +Match User setup-runner + AcceptEnv PROXMOX_USERNAME PROXMOX_PASSWORD CONTAINER_NAME CONTAINER_PASSWORD LINUX_DISTRIBUTION PROJECT_REPOSITORY GITHUB_PAT PROJECT_REPOSITORY + PermitTTY yes + ForceCommand sudo -E /var/lib/vz/snippets/setup-runner.sh + diff --git a/container-creation/intern-phxdc-pve1/home-create-container-bin/extract-fingerprint.sh b/container-creation/intern-phxdc-pve1/home-create-container-bin/extract-fingerprint.sh new file mode 100755 index 00000000..32e0e70b --- /dev/null +++ b/container-creation/intern-phxdc-pve1/home-create-container-bin/extract-fingerprint.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# A script to collect the client's SSH fingerprint and pass that to the content creation container +# Last Modified July 11, 2025 by Maxwell Klema +# --------------------- + +CURRENT_TIME=$(date +"%B %d %T") + +USER=$(whoami) +SSH_CLIENT_IP=$(echo $SSH_CLIENT | awk '{print $1}') +RECENT_LOG=$(journalctl --no-pager -r _COMM=sshd | grep "Accepted publickey for $USER from $SSH_CLIENT_IP" | head -n 1) +LOGGED_TIME=$(echo $RECENT_LOG | awk '{print $3}') + +#check most recent logged time and current time are only max 2 seconds off since multiple users may log in from same IP over time + +epoch1=$(date -d "today $CURRENT_TIME" +%s) +epoch2=$(date -d "today $LOGGED_TIME" +%s) +diff=$((epoch1 - epoch2)) + +KEY_FINGERPRINT="" + +if [ "$diff" -ge 0 ] && [ "$diff" -le 2 ]; then + KEY_FINGERPRINT=$(echo $RECENT_LOG | grep -o 'SHA256[^ ]*') +fi +export SSH_KEY_FP="$KEY_FINGERPRINT" + +# Export environment variables + +if [ "$USER" == "create-container" ]; then + VARS="AcceptEnv SSH_KEY_FP PUBLIC_KEY PROXMOX_USERNAME PROXMOX_PASSWORD CONTAINER_NAME CONTAINER_PASSWORD HTTP_PORT DEPLOY_ON_START PROJECT_REPOSITORY PROJECT_BRANCH PROJECT_ROOT REQUIRE_ENV_VARS CONTAINER_ENV_VARS INSTALL_COMMAND BUILD_COMMAND START_COMMAND RUNTIME_LANGUAGE SERVICES REQUIRE_SERVICES CUSTOM_SERVICES LINUX_DISTRIBUTION MULTI_COMPONENT ROOT_START_COMMAND GH_ACTION GITHUB_PAT SELF_HOSTED_RUNNER" + + for var in $VARS; do + export "$var"="${!var}" + done + + SEND_ENV=$(echo "$VARS" | tr '\n' ' '); + SEND_ENV="SSH_KEY_FP $SEND_ENV" + + ssh -o SendEnv="$SEND_ENV" create-container@10.15.234.122 +fi diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/.gitignore b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/.gitignore new file mode 100644 index 00000000..50f4e4e0 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/.gitignore @@ -0,0 +1,4 @@ +container-env-vars +container-port-maps +container-public-keys +container-services \ No newline at end of file diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/Wazuh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/Wazuh new file mode 120000 index 00000000..f7718ffd --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/Wazuh @@ -0,0 +1 @@ +../../../Wazuh \ No newline at end of file diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/container-exists.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/container-exists.sh new file mode 100755 index 00000000..ba0b2c9a --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/container-exists.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Script to check if a container exists, and if so, whether it needs to be updated or cloned. +# Last Modified by Maxwell Klema on July 13th, 2025 +# ----------------------------------------------------- + +outputError() { + echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + echo -e "${BOLD}${MAGENTA}โŒ Script Failed. Exiting... ${RESET}" + echo -e "$2" + echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + exit $1 +} + +RESET="\033[0m" +BOLD="\033[1m" +MAGENTA='\033[35m' + +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" +echo -e "${BOLD}${MAGENTA}๐Ÿ”Ž Check Container Exists ${RESET}" +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + +TYPE_RUNNER="true" +source /var/lib/vz/snippets/helper-scripts/PVE_user_authentication.sh +source /var/lib/vz/snippets/helper-scripts/verify_container_ownership.sh + +STATUS=$? +if [ "$STATUS" != 0 ]; then + exit 1; +fi + +REPO_BASE_NAME=$(basename -s .git "$PROJECT_REPOSITORY") + +# Check if repository folder is present. +if [ "$PVE1" == "true" ]; then + if [ ! -z "$CONTAINER_ID" ] && pct exec $CONTAINER_ID -- test -f /root/container-updates.log; then + exit 2; # Update Repository + else + exit 0; # Clone Repository + fi +else + if [ ! -z "$CONTAINER_ID" ] && ssh 10.15.0.5 "pct exec $CONTAINER_ID -- test -f /root/container-updates.log" ; then + exit 2; # Update Repository + else + exit 0; # Clone Repository + fi +fi \ No newline at end of file diff --git a/container-creation/create-container-new.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/create-container-new.sh old mode 100644 new mode 100755 similarity index 99% rename from container-creation/create-container-new.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/create-container-new.sh index 7890ede7..d37c5ad9 --- a/container-creation/create-container-new.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/create-container-new.sh @@ -356,4 +356,4 @@ if [[ -n "${CMD[*]}" ]]; then tmux new-session -d -s "$CONTAINER_NAME" "$QUOTED_CMD" fi -exit 0 \ No newline at end of file +exit 0 diff --git a/container-creation/create-container.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/create-container.sh old mode 100644 new mode 100755 similarity index 98% rename from container-creation/create-container.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/create-container.sh index 66ac88c2..6697ee91 --- a/container-creation/create-container.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/create-container.sh @@ -72,6 +72,9 @@ LINUX_DISTRO="${17}" MULTI_COMPONENTS="${18}" ROOT_START_COMMAND="${19}" SELF_HOSTED_RUNNER="${20}" +VERSIONS_DICT=$(echo "${21}" | base64 -d) + +echo "PROJECT ROOT: \"$PROJECT_ROOT\"" # Pick the correct template to clone ===== @@ -115,7 +118,7 @@ if [ "${GH_ACTION^^}" != "Y" ] || [ "${SELF_HOSTED_RUNNER^^}" == "N" ]; then --onboot 1 > /dev/null 2>&1 pct start $CONTAINER_ID > /dev/null 2>&1 - pveum aclmod /vms/$CONTAINER_ID --user "$PROXMOX_USERNAME@pve" --role PVEVMUser > /dev/null 2>&1 + pveum aclmod /vms/$CONTAINER_ID --user "$PROXMOX_USERNAME@pve" --role VMUser2 > /dev/null 2>&1 # Get the Container IP Address and install some packages diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/delete-container.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/delete-container.sh new file mode 100755 index 00000000..d46ce23b --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/delete-container.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Script to delete a container permanently +# Last Modified by Maxwell Klema on July 13th, 2025 +# ----------------------------------------------------- + +RESET="\033[0m" +BOLD="\033[1m" +MAGENTA='\033[35m' + +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" +echo -e "${BOLD}${MAGENTA}๐Ÿ—‘๏ธ Delete Container ${RESET}" +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + +CMD=( +bash /var/lib/vz/snippets/helper-scripts/delete-runner.sh +"$PROJECT_REPOSITORY" +"$GITHUB_PAT" +"$PROXMOX_USERNAME" +"$PROXMOX_PASSWORD" +"$CONTAINER_NAME" +) + +# Safely quote each argument for the shell +QUOTED_CMD=$(printf ' %q' "${CMD[@]}") + +tmux new-session -d -s delete-runner "$QUOTED_CMD" + +echo "โœ… Container with name \"$CONTAINER_NAME\" will be permanently deleted." +exit 0 # Container Deleted Successfully \ No newline at end of file diff --git a/container-creation/helper-scripts/PVE_user_authentication.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/PVE_user_authentication.sh old mode 100644 new mode 100755 similarity index 68% rename from container-creation/helper-scripts/PVE_user_authentication.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/PVE_user_authentication.sh index 050d7b56..4d814100 --- a/container-creation/helper-scripts/PVE_user_authentication.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/PVE_user_authentication.sh @@ -6,18 +6,18 @@ # Authenticate User (Only Valid Users can Create Containers) if [ -z "$PROXMOX_USERNAME" ]; then - read -p "Enter Proxmox Username โ†’ " PROXMOX_USERNAME + read -p "Enter Proxmox Username โ†’ " PROXMOX_USERNAME fi if [ -z "$PROXMOX_PASSWORD" ]; then - read -sp "Enter Proxmox Password โ†’ " PROXMOX_PASSWORD - echo "" + read -sp "Enter Proxmox Password โ†’ " PROXMOX_PASSWORD + echo "" fi USER_AUTHENTICATED=$(ssh root@create-container "node /root/bin/js/runner.js authenticateUser \"$PROXMOX_USERNAME\" \"$PROXMOX_PASSWORD\"") if [ "$USER_AUTHENTICATED" == "false" ]; then - outputError 1 "Your Proxmox account, $PROXMOX_USERNAME@pve, was not authenticated. Retry with valid credentials." + outputError 1 "Your Proxmox account, $PROXMOX_USERNAME@pve, was not authenticated. Retry with valid credentials." fi -echo "๐ŸŽ‰ Your proxmox account, $PROXMOX_USERNAME@pve, has been authenticated" \ No newline at end of file +echo "๐ŸŽ‰ Your proxmox account, $PROXMOX_USERNAME@pve, has been authenticated" diff --git a/container-creation/configureLDAP.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/configureLDAP.sh similarity index 99% rename from container-creation/configureLDAP.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/configureLDAP.sh index a9b750fd..9f601082 100755 --- a/container-creation/configureLDAP.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/configureLDAP.sh @@ -67,4 +67,4 @@ if [ "${LINUX_DISTRO^^}" == "ROCKY" ]; then run_pct_exec $CONTAINER_ID bash -c "echo 'TLS_REQCERT never' >> /etc/openldap/ldap.conf" > /dev/null 2>&1 run_pct_exec $CONTAINER_ID bash -c "authselect select sssd --force" > /dev/null 2>&1 run_pct_exec $CONTAINER_ID bash -c "systemctl restart sssd" > /dev/null 2>&1 -fi \ No newline at end of file +fi diff --git a/container-creation/helper-scripts/create-template.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/create-template.sh old mode 100644 new mode 100755 similarity index 100% rename from container-creation/helper-scripts/create-template.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/create-template.sh diff --git a/container-creation/helper-scripts/delete-runner.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/delete-runner.sh old mode 100644 new mode 100755 similarity index 100% rename from container-creation/helper-scripts/delete-runner.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/delete-runner.sh diff --git a/container-creation/deployOnStart.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/deployOnStart.sh similarity index 100% rename from container-creation/deployOnStart.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/deployOnStart.sh diff --git a/container-creation/helper-scripts/node_runtime_install.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/node_runtime_install.sh old mode 100644 new mode 100755 similarity index 99% rename from container-creation/helper-scripts/node_runtime_install.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/node_runtime_install.sh index fc96cec5..d0294da5 --- a/container-creation/helper-scripts/node_runtime_install.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/node_runtime_install.sh @@ -10,4 +10,4 @@ pct enter "$CONTAINER_ID" -- < /dev/null $PACKAGE_MANAGER remove nodejs && \ curl -fsSL https://deb.nodesource.com/setup_$MAJOR_VERSION.x | sudo -E bash - && \ $PACKAGE_MANAGER install -y nodejs -EOF \ No newline at end of file +EOF diff --git a/container-creation/python_runtime_install.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/python_runtime_install.sh similarity index 100% rename from container-creation/python_runtime_install.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/python_runtime_install.sh diff --git a/container-creation/helper-scripts/repository_status.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/repository_status.sh old mode 100644 new mode 100755 similarity index 100% rename from container-creation/helper-scripts/repository_status.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/repository_status.sh diff --git a/container-creation/helper-scripts/verify_container_ownership.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/verify_container_ownership.sh old mode 100644 new mode 100755 similarity index 98% rename from container-creation/helper-scripts/verify_container_ownership.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/verify_container_ownership.sh index 2fb215b8..a6e58068 --- a/container-creation/helper-scripts/verify_container_ownership.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/helper-scripts/verify_container_ownership.sh @@ -21,4 +21,5 @@ fi if [ "$CONTAINER_OWNERSHIP" != "$PROXMOX_USERNAME" ] && [ "$CONTAINER_OWNERSHIP" != "null" ]; then echo "โŒ You do not own the container with name \"$CONTAINER_NAME\"." - outputError 1 "You do not own the container with name \"$CONTAINER_NAME\"." \ No newline at end of file + outputError 1 "You do not own the container with name \"$CONTAINER_NAME\"." +fi \ No newline at end of file diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/opensource-server b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/opensource-server new file mode 120000 index 00000000..a8a4f8c2 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/opensource-server @@ -0,0 +1 @@ +../../.. \ No newline at end of file diff --git a/container-creation/register-container.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/register-container.sh old mode 100644 new mode 100755 similarity index 99% rename from container-creation/register-container.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/register-container.sh index a3fae91d..77f82de2 --- a/container-creation/register-container.sh +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/register-container.sh @@ -257,4 +257,4 @@ if [ ! -z "$ADDITIONAL_PROTOCOLS" ]; then fi # Bottom border -echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”" \ No newline at end of file +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”" diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/register_proxy_hook.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/register_proxy_hook.sh new file mode 100755 index 00000000..093a4601 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/register_proxy_hook.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# /var/lib/vz/snippets/register_proxy_hook.sh + +# echo "DEBUG: Hook script /var/lib/vz/snippets/register_proxy_hook.sh started. Event: $2, CTID: $1" >> /tmp/hook_debug.log + +# # Hook script for container events +# case "$2" in +# post-start) +# echo "DEBUG: Calling register-container.sh for CTID: $1" >> /tmp/hook_debug.log +# /var/lib/vz/snippets/register-container.sh "$1" >> /tmp/hook_debug.log 2>&1 +# echo "DEBUG: register-container.sh finished." >> /tmp/hook_debug.log +# ;; +# *) +# echo "DEBUG: Unhandled hook event: $2 for CTID: $1" >> /tmp/hook_debug.log +# ;; +# esac +# echo "DEBUG: Hook script /var/lib/vz/snippets/register_proxy_hook.sh finished." >> /tmp/hook_debug.log \ No newline at end of file diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/setup-runner.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/setup-runner.sh new file mode 100755 index 00000000..f56ddb26 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/setup-runner.sh @@ -0,0 +1,141 @@ +#!/bin/bash +# A script for cloning a Distro template, installing, and starting a runner on it. +# Last Modified by Maxwell Klema on August 5th, 2025 +# ------------------------------------------------ + +outputError() { + echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + echo -e "${BOLD}${MAGENTA}โŒ Script Failed. Exiting... ${RESET}" + echo -e "$2" + echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + exit $1 +} + +BOLD='\033[1m' +RESET='\033[0m' + +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" +echo "๐Ÿงฌ Cloning a Template and installing a Runner" +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + +# Validating Container Name ===== + +source /var/lib/vz/snippets/helper-scripts/PVE_user_authentication.sh #Authenticate User +source /var/lib/vz/snippets/helper-scripts/verify_container_ownership.sh #Ensure container does not exist. + +if [ ! -z "$CONTAINER_OWNERSHIP" ]; then + outputError 1 "You already own a container with name \"$CONTAINER_NAME\". What happened to the runner \"$CONTAINER_NAME\" in your repository? Either remove the setup-runner step from your workflow or delete the pre-existing container and try again." +fi + +# Cloning Container Template and Setting it up ===== + +REPO_BASE_NAME=$(basename -s .git "$PROJECT_REPOSITORY") +REPO_BASE_NAME_WITH_OWNER=$(echo "$PROJECT_REPOSITORY" | cut -d'/' -f4) + +TEMPLATE_NAME="template-$REPO_BASE_NAME-$REPO_BASE_NAME_WITH_OWNER" +CTID_TEMPLATE=$( { pct list; ssh root@10.15.0.5 'pct list'; } | awk -v name="$TEMPLATE_NAME" '$3 == name {print $1}') + +case "${LINUX_DISTRIBUTION^^}" in + "") PACKAGE_MANAGER="apt-get" ;; + ROCKY) PACKAGE_MANAGER="dnf" ;; +esac + +# If no template ID was provided, assign a default based on distro + +if [ -z "$CTID_TEMPLATE" ]; then + case "${LINUX_DISTRIBUTION^^}" in + "") CTID_TEMPLATE="160" ;; + ROCKY) CTID_TEMPLATE="138" ;; + esac +fi + +if [ "${LINUX_DISTRIBUTION^^}" != "ROCKY" ]; then + LINUX_DISTRIBUTION="DEBIAN" +fi + +REPO_BASE_NAME=$(basename -s .git "$PROJECT_REPOSITORY") +REPO_BASE_NAME_WITH_OWNER=$(echo "$PROJECT_REPOSITORY" | cut -d'/' -f4) + +NEXT_ID=$(pvesh get /cluster/nextid) #Get the next available LXC ID + +# Create the Container Clone +echo "โณ Cloning Container..." +pct clone $CTID_TEMPLATE $NEXT_ID \ + --hostname $CONTAINER_NAME \ + --full true > /dev/null 2>&1 + +# Set Container Options +echo "โณ Setting Container Properties..." +pct set $NEXT_ID \ + --tags "$PROXMOX_USERNAME" \ + --tags "$LINUX_DISTRIBUTION" \ + --onboot 1 \ + --cores 4 \ + --memory 4096 > /dev/null 2>&1 + +pct start $NEXT_ID > /dev/null 2>&1 +pveum aclmod /vms/$NEXT_ID --user "$PROXMOX_USERNAME@pve" --role VMUser2 > /dev/null 2>&1 + +sleep 5 +echo "โณ DHCP Allocating IP Address..." +CONTAINER_IP=$(pct exec $NEXT_ID -- hostname -I | awk '{print $1}') + +# Setting Up Github Runner ===== + +# Get Temporary Token +echo "๐Ÿช™ Getting Authentication Token..." +AUTH_TOKEN_RESPONSE=$(curl --location --request POST https://api.github.com/repos/$REPO_BASE_NAME_WITH_OWNER/$REPO_BASE_NAME/actions/runners/registration-token --header "Authorization: token $GITHUB_PAT" --write-out "HTTPSTATUS:%{http_code}" --silent) + +HTTP_STATUS=$(echo "$AUTH_TOKEN_RESPONSE" | grep -o "HTTPSTATUS:[0-9]*" | cut -d: -f2) +AUTH_TOKEN_BODY=$(echo "$AUTH_TOKEN_RESPONSE" | sed 's/HTTPSTATUS:[0-9]*$//') + +if [ "$HTTP_STATUS" != "201" ]; then + outputError 1 "Failed to get GitHub authentication token. HTTP Status: $HTTP_STATUS\nResponse: $AUTH_TOKEN_BODY" +fi + +TOKEN=$(echo "$AUTH_TOKEN_BODY" | jq -r '.token') + +pct enter $NEXT_ID < /dev/null 2>&1 +rm -rf /root/container-updates.log || true && \ +cd /actions-runner && export RUNNER_ALLOW_RUNASROOT=1 && \ +runProcess=\$(ps aux | grep "[r]un.sh" | awk '{print \$2}' | head -n 1) && \ +if [ ! -z "\$runProcess" ]; then kill -9 \$runProcess || true; fi && \ +rm -rf .runner .credentials && rm -rf _work/* /var/log/runner/* 2>/dev/null || true && \ +export RUNNER_ALLOW_RUNASROOT=1 && \ +./config.sh --url $PROJECT_REPOSITORY --token $TOKEN --labels $CONTAINER_NAME --name $CONTAINER_NAME --unattended +EOF + +# Generate RSA Keys ===== + +echo "๐Ÿ”‘ Generating RSA Key Pair..." +pct exec $NEXT_ID -- bash -c "ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q" +PUB_KEY=$(pct exec $NEXT_ID -- bash -c "cat /root/.ssh/id_rsa.pub") + +# Place public key in all necessary authorized_keys files +echo "$PUB_KEY" >> /home/create-container/.ssh/authorized_keys +echo "$PUB_KEY" >> /home/update-container/.ssh/authorized_keys +echo "$PUB_KEY" >> /home/delete-container/.ssh/authorized_keys +echo "$PUB_KEY" >> /home/container-exists/.ssh/authorized_keys + +echo "๐Ÿ”‘ Creating Service File..." +pct exec $NEXT_ID -- bash -c "cat < /etc/systemd/system/github-runner.service +[Unit] +Description=GitHub Actions Runner +After=network.target + +[Service] +Type=simple +WorkingDirectory=/actions-runner +Environment=\"RUNNER_ALLOW_RUNASROOT=1\" +ExecStart=/actions-runner/run.sh +Restart=always + +[Install] +WantedBy=multi-user.target +EOF" + +pct exec $NEXT_ID -- systemctl daemon-reload +pct exec $NEXT_ID -- systemctl enable github-runner +pct exec $NEXT_ID -- systemctl start github-runner + +exit 3 diff --git a/container-creation/start_services.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/start_services.sh old mode 100644 new mode 100755 similarity index 100% rename from container-creation/start_services.sh rename to container-creation/intern-phxdc-pve1/var-lib-vz-snippets/start_services.sh diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/test.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/test.sh new file mode 100755 index 00000000..e15b1d21 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/test.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Script to add a Wazuh Agent to an LXC Container +# Last Modified by Maxwell Klema on August 5th, 2025 +# -------------------------------------------------- + +RUNTIME_LANGUAGE='{"whisper-diarization": "python", "diarization-ui": "nodejs"}' +VERSIONS_DICT='{"whisper-diarization": "3.10"}' + +normalize_path() { + echo "$1" | sed 's#/\+#/#g' +} \ No newline at end of file diff --git a/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/update-container.sh b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/update-container.sh new file mode 100755 index 00000000..0be5e739 --- /dev/null +++ b/container-creation/intern-phxdc-pve1/var-lib-vz-snippets/update-container.sh @@ -0,0 +1,324 @@ +#!/bin/bash +# Script to automatically fetch new contents from a branch, push them to container, and restart intern +# Last Modified on August 17th, 2025 by Maxwell Klema +# ---------------------------------------- + +RESET="\033[0m" +BOLD="\033[1m" +MAGENTA='\033[35m' + +outputError() { + echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + echo -e "${BOLD}${MAGENTA}โŒ Script Failed. Exiting... ${RESET}" + echo -e "$2" + echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + exit $1 +} + + +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" +echo -e "${BOLD}${MAGENTA}๐Ÿ”„ Update Container Contents ${RESET}" +echo -e "${BOLD}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}" + +if [ -z "${RUNTIME_LANGUAGE^^}" ]; then + echo "Skipping container update because there is nothing to update." + exit 0 +fi + +source /var/lib/vz/snippets/helper-scripts/PVE_user_authentication.sh +source /var/lib/vz/snippets/helper-scripts/verify_container_ownership.sh + +# Get Project Details + +CONTAINER_NAME="${CONTAINER_NAME,,}" + +if [ -z "$PROJECT_REPOSITORY" ]; then + read -p "๐Ÿš€ Paste the link to your project repository โ†’ " PROJECT_REPOSITORY +else + DEPLOY_ON_START="y" +fi + +CheckRepository() { + PROJECT_REPOSITORY_SHORTENED=${PROJECT_REPOSITORY#*github.com/} + PROJECT_REPOSITORY_SHORTENED=${PROJECT_REPOSITORY_SHORTENED%.git} + REPOSITORY_EXISTS=$(curl -s -o /dev/null -w "%{http_code}" https://github.com/$PROJECT_REPOSITORY_SHORTENED) +} + +CheckRepository + +if [ "$REPOSITORY_EXISTS" != "200" ]; then + outputError 1 "The repository link you provided, \"$PROJECT_REPOSITORY\" was not valid." +fi + +echo "โœ… The repository link you provided, \"$PROJECT_REPOSITORY\", was valid." + +# Get Project Branch + +if [ -z "$PROJECT_BRANCH" ]; then + PROJECT_BRANCH="main" +fi + +REPOSITORY_BRANCH_EXISTS=$(curl -s -o /dev/null -w "%{http_code}" https://api.github.com/repos/$PROJECT_REPOSITORY_SHORTENED/branches/$PROJECT_BRANCH) + +if [ "$REPOSITORY_BRANCH_EXISTS" != "200" ]; then + outputError 1 "The branch you provided, \"$PROJECT_BRANCH\", does not exist on repository at \"$PROJECT_REPOSITORY\"." +fi + + +# Get Project Root Directroy + +if [ "$PROJECT_ROOT" == "." ] || [ -z "$PROJECT_ROOT" ]; then + PROJECT_ROOT="/" +fi + +VALID_PROJECT_ROOT=$(ssh root@10.15.234.122 "node /root/bin/js/runner.js authenticateRepo \"$PROJECT_REPOSITORY\" \"$PROJECT_BRANCH\" \"$PROJECT_ROOT\"") + +if [ "$VALID_PROJECT_ROOT" == "false" ]; then + outputError 1 "The root directory you provided, \"$PROJECT_ROOT\", does not exist on branch, \"$PROJECT_BRANCH\", on repository at \"$PROJECT_REPOSITORY\"." +fi + +REPO_BASE_NAME=$(basename -s .git "$PROJECT_REPOSITORY") +REPO_BASE_NAME_WITH_OWNER=$(echo "$PROJECT_REPOSITORY" | cut -d'/' -f4) + +if [ "$PROJECT_ROOT" == "" ] || [ "$PROJECT_ROOT" == "/" ]; then + PROJECT_ROOT="." +fi + +# Install Services ==== + +echo "๐Ÿ›Ž๏ธ Installing Services..." + +if [ -z "$LINUX_DISTRIBUTION" ]; then + LINUX_DISTRIBUTION="debian" +fi + +if [ ! -z "$SERVICES" ] || [ ! -z "$CUSTOM_SERVICES" ]; then + REQUIRE_SERVICES="y" +fi + +SERVICE_COMMANDS=$(ssh -o SendEnv="LINUX_DISTRIBUTION SERVICES CUSTOM_SERVICES REQUIRE_SERVICES" \ + root@10.15.234.122 \ + "/root/bin/deployment-scripts/gatherServices.sh true") + +echo "$SERVICE_COMMANDS" | while read -r line; do + pct exec $CONTAINER_ID -- bash -c "$line | true" > /dev/null 2>&1 +done + +# Change HTTP port if necessary ==== + +if [ ! -z "$HTTP_PORT" ]; then + if [ "$HTTP_PORT" -lt 80 ] || [ "$HTTP_PORT" -gt 60000 ]; then + outputError 1 "Invalid HTTP port: $HTTP_PORT. Must be between 80 and 60000." + fi + ssh root@10.15.20.69 -- \ +"jq \ '.[\"$CONTAINER_NAME\"].ports.http = $HTTP_PORT' \ + /etc/nginx/port_map.json > /tmp/port_map.json.new \ + && mv -f /tmp/port_map.json.new /etc/nginx/port_map.json " +fi + +# Clone repository if needed ==== + +if (( "$CONTAINER_ID" % 2 == 0 )); then + ssh root@10.15.0.5 " + pct enter $CONTAINER_ID < /dev/null +fi +EOF + " +else + pct enter $CONTAINER_ID < /dev/null +fi +EOF +fi + +# Update Environment Variables + +if [ ! -z "$RUNTIME_LANGUAGE" ] && echo "$RUNTIME_LANGUAGE" | jq . >/dev/null 2>&1; then # If RUNTIME_LANGUAGE is set and is valid JSON + MULTI_COMPONENT="Y" +fi + +# Helper Function to write environment variables to a file inside container +writeEnvToFile() { + env_file_path="$1" + component_path="$2" + env_vars=$(cat "$env_file_path") + if (( $CONTAINER_ID % 2 == 0 )); then + ssh 10.15.0.5 "pct exec $CONTAINER_ID -- bash -c 'if [ ! -f \"$component_path/.env\" ]; then touch \"$component_path/.env\"; fi; echo \"$env_vars\" >> \"$component_path/.env\"'" + else + pct exec $CONTAINER_ID -- bash -c "if [ ! -f \"$component_path/.env\" ]; then touch \"$component_path/.env\"; fi; echo \"$env_vars\" >> \"$component_path/.env\"" + fi +} + +# Check If there are environment variables +if [ ! -z "$CONTAINER_ENV_VARS" ]; then + # generate random temp .env folder to store all env files for different components + RANDOM_NUM=$(shuf -i 100000-999999 -n 1) + ENV_FOLDER="env_$RANDOM_NUM" + ENV_FOLDER_PATH="/var/lib/vz/snippets/container-env-vars/$ENV_FOLDER" + mkdir -p "$ENV_FOLDER_PATH" + + if [ "${MULTI_COMPONENT^^}" == "Y" ]; then # Multi-Component + if echo "$CONTAINER_ENV_VARS" | jq -e > /dev/null 2>&1; then #if exit status of jq is 0 (valid JSON) // success + for key in $(echo "$CONTAINER_ENV_VARS" | jq -r 'keys[]'); do + COMPONENT_PATH="/root/$REPO_BASE_NAME/$PROJECT_ROOT/$key" + ENV_FILE_NAME=$(echo "$COMPONENT_PATH" | tr '/' '_') + ENV_FILE_NAME="$ENV_FILE_NAME.txt" + ENV_FILE_PATH="$ENV_FOLDER_PATH/$ENV_FILE_NAME" + touch "$ENV_FILE_PATH" + echo "$CONTAINER_ENV_VARS" | jq -r --arg key "$key" '.[$key] | to_entries[] | "\(.key)=\(.value)"' > "$ENV_FILE_PATH" + writeEnvToFile "$ENV_FILE_PATH" "$COMPONENT_PATH" + done + else + outputError "Your \"CONTAINER_ENV_VARS\" is not valid JSON. Please re-format and try again." + writeLog "Invalid JSON in CONTAINER_ENV_VARS (GH_ACTION mode)" + exit 16 + fi + else # Single Component + ENV_FILE="env_$RANDOM_NUM.txt" + ENV_FILE_PATH="$ENV_FOLDER_PATH/$ENV_FILE" + touch "$ENV_FILE_PATH" + if echo "$CONTAINER_ENV_VARS" | jq -e > /dev/null 2>&1; then #if exit status of jq is 0 (valid JSON) // success + COMPONENT_PATH="/root/$REPO_BASE_NAME/$PROJECT_ROOT" + echo "$CONTAINER_ENV_VARS " | jq -r 'to_entries[] | "\(.key)=\(.value)"' > "$ENV_FILE_PATH" #k=v pairs + writeEnvToFile "$ENV_FILE_PATH" "$COMPONENT_PATH" + else + outputError "Your \"CONTAINER_ENV_VARS\" is not valid JSON. Please re-format and try again." + writeLog "Invalid JSON in CONTAINER_ENV_VARS for single component (GH_ACTION mode)" + exit 16 + fi + fi +fi + +# Update Container with New Contents from repository ===== + +startComponentPVE1() { + + RUNTIME="$1" + BUILD_CMD="$2" + START_CMD="$3" + COMP_DIR="$4" + INSTALL_CMD="$5" + + if [ "${RUNTIME^^}" == "NODEJS" ]; then + pct set $CONTAINER_ID --memory 4096 --swap 0 --cores 4 + pct exec $CONTAINER_ID -- bash -c "cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/ && git fetch origin && git reset --hard origin/$PROJECT_BRANCH && git pull" > /dev/null 2>&1 + pct exec $CONTAINER_ID -- bash -c "cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/$COMP_DIR && $INSTALL_CMD && $BUILD_CMD" > /dev/null 2>&1 + pct set $CONTAINER_ID --memory 2048 --swap 0 --cores 2 + elif [ "${RUNTIME^^}" == "PYTHON" ]; then + pct set $CONTAINER_ID --memory 4096 --swap 0 --cores 4 + pct exec $CONTAINER_ID -- bash -c "cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/ && git fetch origin && git reset --hard origin/$PROJECT_BRANCH && git pull" > /dev/null 2>&1 + pct exec $CONTAINER_ID -- bash -c "cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/$COMP_DIR && source venv/bin/activate && $INSTALL_CMD && $BUILD_CMD" > /dev/null 2>&1 + pct set $CONTAINER_ID --memory 2048 --swap 0 --cores 2 + fi +} + +startComponentPVE2() { + + RUNTIME="$1" + BUILD_CMD="$2" + START_CMD="$3" + COMP_DIR="$4" + INSTALL_CMD="$5" + + if [ "${RUNTIME^^}" == "NODEJS" ]; then + ssh root@10.15.0.5 " + pct set $CONTAINER_ID --memory 4096 --swap 0 --cores 4 && + pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/ && git fetch origin && git reset --hard origin/$PROJECT_BRANCH && git pull' > /dev/null 2>&1 + pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/$COMP_DIR && $INSTALL_CMD' && '$BUILD_CMD' > /dev/null 2>&1 + pct set $CONTAINER_ID --memory 2048 --swap 0 --cores 2 + " + elif [ "${RUNTIME^^}" == "PYTHON" ]; then + ssh root@10.15.0.5 " + pct set $CONTAINER_ID --memory 4096 --swap 0 --cores 4 && + pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT && git fetch origin && git reset --hard origin/$PROJECT_BRANCH && git pull' > /dev/null 2>&1 + pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT/$COMP_DIR && source venv/bin/activate && $INSTALL_CMD' && '$BUILD_CMD' > /dev/null 2>&1 + pct set $CONTAINER_ID --memory 2048 --swap 0 --cores 2 + " + fi +} + +if [ "${MULTI_COMPONENT^^}" == "Y" ]; then + for COMPONENT in $(echo "$START_COMMAND" | jq -r 'keys[]'); do + START=$(echo "$START_COMMAND" | jq -r --arg k "$COMPONENT" '.[$k]') + RUNTIME=$(echo "$RUNTIME_LANGUAGE" | jq -r --arg k "$COMPONENT" '.[$k]') + BUILD=$(echo "$BUILD_COMMAND" | jq -r --arg k "$COMPONENT" '.[$k]') + INSTALL=$(echo "$INSTALL_COMMAND" | jq -r --arg k "$COMPONENT" '.[$k]') + if [ "$BUILD" == "null" ]; then + BUILD="" + fi + + if (( "$CONTAINER_ID" % 2 == 0 )); then + startComponentPVE2 "$RUNTIME" "$BUILD" "$START" "$COMPONENT" "$INSTALL" + else + startComponentPVE1 "$RUNTIME" "$BUILD" "$START" "$COMPONENT" "$INSTALL" + fi + done + if [ ! -z "$ROOT_START_COMMAND" ]; then + if (( $CONTAINER_ID % 2 == 0 )); then + ssh root@10.15.0.5 "pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT && $ROOT_START_COMMAND'" + else + pct exec $CONTAINER_ID -- bash -c "cd /root/$REPO_BASE_NAME/$PROJECT_ROOT && $ROOT_START_COMMAND" + fi + fi + # startComponent "$RUNTIME_LANGUAGE" "$BUILD_COMMAND" "$START_COMMAND" "." +else + if (( $CONTAINER_ID % 2 == 0 )); then + startComponentPVE2 "$RUNTIME_LANGUAGE" "$BUILD_COMMAND" "$START_COMMAND" "." "$INSTALL_COMMAND" + if [ ! -z "$ROOT_START_COMMAND" ]; then + ssh root@10.15.0.5 "pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT && $ROOT_START_COMMAND'" > /dev/null 2>&1 + fi + else + startComponentPVE1 "$RUNTIME_LANGUAGE" "$BUILD_COMMAND" "$START_COMMAND" "." "$INSTALL_COMMAND" + if [ ! -z "$ROOT_START_COMMAND" ]; then + ssh root@10.15.0.5 "pct exec $CONTAINER_ID -- bash -c 'cd /root/$REPO_BASE_NAME/$PROJECT_ROOT && $ROOT_START_COMMAND'" > /dev/null 2>&1 + fi + fi +fi + +# Update Log File + +if (( "$CONTAINER_ID" % 2 == 0 )); then + ssh root@10.15.0.5 "pct exec $CONTAINER_ID -- bash -c 'echo \"[$(date)]\" >> /root/container-updates.log'" +else + pct exec $CONTAINER_ID -- bash -c "echo \"[$(date)]\" >> /root/container-updates.log" +fi + +# Create new template if on default branch ===== + +UPDATE_CONTAINER="true" +BUILD_COMMAND_B64=$(echo -n "$BUILD_COMMAND" | base64) +RUNTIME_LANGUAGE_B64=$(echo -n "$RUNTIME_LANGUAGE" | base64) +START_COMMAND_B64=$(echo -n "$START_COMMAND" | base64) + +CMD=( +bash /var/lib/vz/snippets/start_services.sh +"$CONTAINER_ID" +"$CONTAINER_NAME" +"$REPO_BASE_NAME" +"$REPO_BASE_NAME_WITH_OWNER" +"$SSH_PORT" +"$CONTAINER_IP" +"$PROJECT_ROOT" +"$ROOT_START_COMMAND" +"$DEPLOY_ON_START" +"$MULTI_COMPONENT" +"$START_COMMAND_B64" +"$BUILD_COMMAND_B64" +"$RUNTIME_LANGUAGE_B64" +"$GH_ACTION" +"$PROJECT_BRANCH" +"$UPDATE_CONTAINER" +) + +# Safely quote each argument for the shell +QUOTED_CMD=$(printf ' %q' "${CMD[@]}") + +tmux new-session -d -s "$CONTAINER_NAME" "$QUOTED_CMD" +echo "โœ… Container $CONTAINER_ID has been updated with new contents from branch \"$PROJECT_BRANCH\" on repository \"$PROJECT_REPOSITORY\"." +echo "Wait a few minutes for all background processes to complete before accessing the container." +exit 0 diff --git a/container-creation/js/.gitignore b/container-creation/js/.gitignore deleted file mode 100644 index ca4d6ae5..00000000 --- a/container-creation/js/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -node_modules/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -coverage/ -*.log -.DS_Store -.env -.env.local -.env.development.local -.env.test.local -.env.production.local \ No newline at end of file diff --git a/container-creation/js/README.md b/container-creation/js/README.md deleted file mode 100644 index 2fc7beed..00000000 --- a/container-creation/js/README.md +++ /dev/null @@ -1,142 +0,0 @@ -# Container Creation JavaScript Module Tests - -This directory contains comprehensive tests for the JavaScript authentication modules used in the container creation process. - -## Overview - -The test suite validates the core functionality of three modules: -- `authenticateRepo.js` - Validates GitHub repository paths and directories -- `authenticateUser.js` - Authenticates users against the Proxmox VE API -- `runner.js` - Command-line interface for the authentication modules - -## Test Coverage - -All modules have **100% test coverage** including: -- โœ… **40 total tests** covering all functionality -- โœ… **100% statement coverage** -- โœ… **100% branch coverage** -- โœ… **100% function coverage** -- โœ… **100% line coverage** - -## Running Tests - -### Prerequisites -```bash -npm install -``` - -### Running Tests -```bash -# Run all tests -npm test - -# Run tests with coverage report -npm run test:coverage - -# Run tests in watch mode (for development) -npm run test:watch -``` - -## Test Structure - -### authenticateRepo.test.js -Tests for repository path validation: -- **Path validation** - Correctly rejects file paths (containing dots) -- **URL formatting** - Handles .git removal and leading slash normalization -- **HTTP response handling** - Tests success (200) and failure responses (404, 403, etc.) -- **Edge cases** - Empty paths, root paths, special characters -- **Real-world scenarios** - Known public repositories - -### authenticateUser.test.js -Tests for Proxmox user authentication: -- **Successful authentication** - Valid credentials and proper request formatting -- **Failed authentication** - Invalid credentials, network errors, timeouts -- **Edge cases** - Empty credentials, special characters, long credentials -- **HTTPS configuration** - Proper SSL verification bypass for internal network -- **Integration scenarios** - Typical Proxmox authentication flows - -### runner.test.js -Tests for the command-line interface: -- **Module structure** - File existence and imports -- **Function routing** - Correct routing to authentication functions -- **Promise handling** - Proper async result processing - -## Expected Results - -When tests are run, you should see output similar to: -``` -Test Suites: 3 passed, 3 total -Tests: 40 passed, 40 total -Snapshots: 0 total -Time: 0.668 s - ----------------------|---------|----------|---------|---------|------------------- -File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------|---------|----------|---------|---------|------------------- -All files | 100 | 100 | 100 | 100 | - authenticateRepo.js | 100 | 100 | 100 | 100 | - authenticateUser.js | 100 | 100 | 100 | 100 | ----------------------|---------|----------|---------|---------|------------------- -``` - -## Test Implementation Details - -### Testing Framework -- **Jest** - JavaScript testing framework with built-in mocking and coverage -- **axios-mock-adapter** - HTTP request mocking for isolated unit tests - -### Mocking Strategy -Tests use mocked HTTP calls instead of real network requests to: -- Ensure tests run quickly and reliably -- Avoid dependency on external services -- Test error conditions consistently -- Maintain test isolation - -### Test Categories -1. **Unit Tests** - Test individual functions in isolation -2. **Integration Tests** - Test module interactions and CLI behavior -3. **Edge Case Tests** - Test boundary conditions and error handling -4. **Real-world Scenario Tests** - Test with realistic inputs and use cases - -## Key Functionality Tested - -### Repository Authentication (`authenticateRepo.js`) -- Validates that repository paths exist on GitHub -- Rejects file paths (only accepts directory paths) -- Properly formats GitHub tree URLs -- Handles various HTTP response codes -- Manages network errors gracefully - -### User Authentication (`authenticateUser.js`) -- Authenticates against Proxmox VE API endpoint -- Appends @pve realm to usernames -- Uses proper HTTPS configuration for internal network -- Handles authentication success/failure appropriately -- Manages API errors and network issues - -### Command Line Interface (`runner.js`) -- Routes function calls to appropriate modules -- Handles command line arguments correctly -- Processes async results and outputs them -- Maintains proper module structure - -## Contributing - -When adding new functionality to the authentication modules: - -1. **Add corresponding tests** for any new code paths -2. **Maintain 100% coverage** by testing all branches and edge cases -3. **Use mocking** for external dependencies (HTTP calls) -4. **Follow naming conventions** used in existing tests -5. **Include both positive and negative test cases** -6. **Test edge cases** and error conditions -7. **Update this documentation** if test structure changes - -## Files - -- `package.json` - Node.js dependencies and test scripts -- `authenticateRepo.test.js` - Repository authentication tests (32 tests) -- `authenticateUser.test.js` - User authentication tests (5 tests) -- `runner.test.js` - CLI interface tests (3 tests) -- `.gitignore` - Excludes node_modules and coverage reports -- `README.md` - This documentation file \ No newline at end of file diff --git a/container-creation/js/run-tests.sh b/container-creation/js/run-tests.sh deleted file mode 100755 index 5ae1baae..00000000 --- a/container-creation/js/run-tests.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -# Test runner script for container-creation JavaScript modules -# This script provides an easy way to run different types of tests - -set -e - -echo "๐Ÿงช Container Creation JS Module Test Runner" -echo "==========================================" - -# Change to the JS directory -cd "$(dirname "$0")" - -# Check if node_modules exists -if [ ! -d "node_modules" ]; then - echo "๐Ÿ“ฆ Installing dependencies..." - npm install - echo "" -fi - -# Parse command line arguments -case "${1:-all}" in - "all"|"") - echo "๐Ÿš€ Running all tests..." - npm test - ;; - "coverage") - echo "๐Ÿ“Š Running tests with coverage report..." - npm run test:coverage - ;; - "watch") - echo "๐Ÿ‘€ Running tests in watch mode..." - npm run test:watch - ;; - "repo") - echo "๐Ÿ”— Running repository authentication tests..." - npx jest authenticateRepo.test.js - ;; - "user") - echo "๐Ÿ‘ค Running user authentication tests..." - npx jest authenticateUser.test.js - ;; - "runner") - echo "โš™๏ธ Running CLI runner tests..." - npx jest runner.test.js - ;; - "help"|"-h"|"--help") - echo "Usage: $0 [test-type]" - echo "" - echo "Test types:" - echo " all Run all tests (default)" - echo " coverage Run tests with coverage report" - echo " watch Run tests in watch mode" - echo " repo Run repository authentication tests only" - echo " user Run user authentication tests only" - echo " runner Run CLI runner tests only" - echo " help Show this help message" - exit 0 - ;; - *) - echo "โŒ Unknown test type: $1" - echo "Run '$0 help' for available options" - exit 1 - ;; -esac - -echo "" -echo "โœ… Test run completed!" \ No newline at end of file diff --git a/container-creation/js/runner.test.js b/container-creation/js/runner.test.js deleted file mode 100644 index 354fdb0f..00000000 --- a/container-creation/js/runner.test.js +++ /dev/null @@ -1,44 +0,0 @@ -const path = require('path'); - -describe('runner.js', () => { - const runnerPath = path.join(__dirname, 'runner.js'); - - describe('module structure', () => { - test('should exist and be executable', () => { - const fs = require('fs'); - expect(fs.existsSync(runnerPath)).toBe(true); - }); - - test('should import required modules correctly', () => { - // This tests that the runner can load without syntax errors - const runnerCode = require('fs').readFileSync(runnerPath, 'utf8'); - expect(runnerCode).toContain('authenticateuser = require("./authenticateUser.js")'); - expect(runnerCode).toContain('authenticaterepo = require("./authenticateRepo.js")'); - }); - - test('should handle command line argument parsing', () => { - const runnerCode = require('fs').readFileSync(runnerPath, 'utf8'); - expect(runnerCode).toContain('const [, , func, ...args] = process.argv'); - expect(runnerCode).toContain('if (func == "authenticateUser")'); - expect(runnerCode).toContain('else if (func == "authenticateRepo")'); - }); - }); - - describe('function routing', () => { - test('should route to authenticateUser function', () => { - const runnerCode = require('fs').readFileSync(runnerPath, 'utf8'); - expect(runnerCode).toContain('authenticateuser.authenticateUser(...args)'); - }); - - test('should route to authenticateRepo function', () => { - const runnerCode = require('fs').readFileSync(runnerPath, 'utf8'); - expect(runnerCode).toContain('authenticaterepo.authenticateRepo(...args)'); - }); - - test('should handle promise resolution', () => { - const runnerCode = require('fs').readFileSync(runnerPath, 'utf8'); - expect(runnerCode).toContain('.then((result) => {'); - expect(runnerCode).toContain('console.log(result);'); - }); - }); -}); \ No newline at end of file diff --git a/container-creation/node_runtime_install.sh b/container-creation/node_runtime_install.sh deleted file mode 100644 index 21095418..00000000 --- a/container-creation/node_runtime_install.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -# Script to install a specific Node.js runtime version -# Last Modified by Maxwell Klema on August 18th, 2025 -# ---------------------------------------------------------- - -pct enter "$CONTAINER_ID" -- < 10.15.0.6 (existing AI host) -# FORTWAYNE -> 10.250.0.2 (new WireGuard-connected host) -# N -> local execution (no SSH proxy) -case "${AI_CONTAINER^^}" in - PHOENIX) - TARGET_PVE_HOST="10.15.0.6" - ;; - FORTWAYNE) - TARGET_PVE_HOST="10.250.0.2" - ;; - N|"" ) - TARGET_PVE_HOST="" - ;; - *) - echo "Invalid AI_CONTAINER value: $AI_CONTAINER" - exit 1 - ;; -esac - -# Helper: returns true if we're using a remote PVE host (PHOENIX or FORTWAYNE) -is_remote_pve() { - [[ -n "$TARGET_PVE_HOST" ]] -} - -# === Wrapper for pct exec (and optionally pct commands for remote PVE) === -run_pct_exec() { - local ctid="$1" - shift - if is_remote_pve; then - ssh root@"$TARGET_PVE_HOST" "pct exec $ctid -- $*" - else - pct exec "$ctid" -- "$@" - fi -} - -run_pct() { - # $@ = full pct command, e.g., clone, set, start, etc. - if is_remote_pve; then - ssh root@"$TARGET_PVE_HOST" "pct $*" - else - pct "$@" - fi -} - -run_pveum() { - # Wrapper for pveum commands in remote case - if is_remote_pve; then - ssh root@"$TARGET_PVE_HOST" "pveum $*" - else - pveum "$@" - fi -} - -run_pvesh() { - if is_remote_pve; then - ssh root@"$TARGET_PVE_HOST" "pvesh $*" - else - pvesh "$@" - fi -} - -run_pct_push() { - local ctid="$1" - local src="$2" - local dest="$3" - if is_remote_pve; then - ssh root@"$TARGET_PVE_HOST" "pct push $ctid $src $dest" - else - pct push "$ctid" "$src" "$dest" - fi -} - -# === Template Selection & Clone === -if [[ "${AI_CONTAINER^^}" == "PHOENIX" ]]; then - echo "โณ Phoenix AI container requested. Using template CTID 163..." - CTID_TEMPLATE="163" - # Request cluster nextid from the target (remote if configured, else local via run_pvesh) - CONTAINER_ID=$(run_pvesh get /cluster/nextid) - - echo "DEBUG: Cloning on TARGET_PVE_HOST=${TARGET_PVE_HOST:-local} CTID_TEMPLATE=${CTID_TEMPLATE} -> CONTAINER_ID=${CONTAINER_ID}" - run_pct clone $CTID_TEMPLATE $CONTAINER_ID \ - --hostname $CONTAINER_NAME \ - --full true - - run_pct set $CONTAINER_ID \ - --tags "$PROXMOX_USERNAME" \ - --tags "$LINUX_DISTRO" \ - --tags "AI" \ - --onboot 1 - - run_pct start $CONTAINER_ID - run_pveum aclmod /vms/$CONTAINER_ID --user "$PROXMOX_USERNAME@pve" --role PVEVMUser - -elif [[ "${AI_CONTAINER^^}" == "FORTWAYNE" ]]; then - echo "โณ Fort Wayne AI container requested. Using template CTID 103 on 10.250.0.2..." - CTID_TEMPLATE="103" - # allocate nextid directly on Fort Wayne - CONTAINER_ID=$(ssh root@10.250.0.2 pvesh get /cluster/nextid) - - echo "DEBUG: Cloning on Fort Wayne (10.250.0.2) CTID_TEMPLATE=${CTID_TEMPLATE} -> CONTAINER_ID=${CONTAINER_ID}" - ssh root@10.250.0.2 pct clone $CTID_TEMPLATE $CONTAINER_ID \ - --hostname $CONTAINER_NAME \ - --full true - - ssh root@10.250.0.2 pct set $CONTAINER_ID \ - --tags "$PROXMOX_USERNAME" \ - --tags "$LINUX_DISTRO" \ - --tags "AI" \ - --onboot 1 - - ssh root@10.250.0.2 pct start $CONTAINER_ID - ssh root@10.250.0.2 pveum aclmod /vms/$CONTAINER_ID --user "$PROXMOX_USERNAME@pve" --role PVEVMUser - -else - REPO_BASE_NAME=$(basename -s .git "$PROJECT_REPOSITORY") - REPO_BASE_NAME_WITH_OWNER=$(echo "$PROJECT_REPOSITORY" | cut -d'/' -f4) - - TEMPLATE_NAME="template-$REPO_BASE_NAME-$REPO_BASE_NAME_WITH_OWNER" - # Search local and other known PVE (keeps original approach; will find local or remote templates depending on your environment) - CTID_TEMPLATE=$( { pct list; ssh root@10.15.0.5 'pct list'; } | awk -v name="$TEMPLATE_NAME" '$3 == name {print $1}') - - case "${LINUX_DISTRO^^}" in - DEBIAN) PACKAGE_MANAGER="apt-get" ;; - ROCKY) PACKAGE_MANAGER="dnf" ;; - esac - - if [ -z "$CTID_TEMPLATE" ]; then - case "${LINUX_DISTRO^^}" in - DEBIAN) CTID_TEMPLATE="160" ;; - ROCKY) CTID_TEMPLATE="138" ;; - esac - fi - - # For non-AI containers, allocate next ID locally and clone once here - CONTAINER_ID=$(pvesh get /cluster/nextid) - - echo "โณ Cloning Container (non-AI)... CTID_TEMPLATE=${CTID_TEMPLATE} -> CONTAINER_ID=${CONTAINER_ID}" - run_pct clone $CTID_TEMPLATE $CONTAINER_ID \ - --hostname $CONTAINER_NAME \ - --full true - - echo "โณ Setting Container Properties..." - run_pct set $CONTAINER_ID \ - --tags "$PROXMOX_USERNAME" \ - --tags "$LINUX_DISTRO" \ - --tags "LDAP" \ - --onboot 1 - - run_pct start $CONTAINER_ID - run_pveum aclmod /vms/$CONTAINER_ID --user "$PROXMOX_USERNAME@pve" --role PVEVMUser -fi - -# === Post-Provisioning (pct exec wrapped) === -if [ -f "/var/lib/vz/snippets/container-public-keys/$PUB_FILE" ]; then - echo "โณ Appending Public Key..." - run_pct_exec $CONTAINER_ID touch ~/.ssh/authorized_keys > /dev/null 2>&1 - # Use a here-doc to reliably feed the pubkey to the remote pct exec - if is_remote_pve; then - # copy key file to remote PVE host temporarily then pct push it in case pct exec over ssh doesn't accept stdin redirection - scp "/var/lib/vz/snippets/container-public-keys/$PUB_FILE" root@"$TARGET_PVE_HOST":/tmp/"$PUB_FILE" > /dev/null 2>&1 || true - ssh root@"$TARGET_PVE_HOST" "pct push $CONTAINER_ID /tmp/$PUB_FILE /root/.ssh/authorized_keys >/dev/null 2>&1 || (pct exec $CONTAINER_ID -- bash -lc 'cat > ~/.ssh/authorized_keys' < /tmp/$PUB_FILE)" - ssh root@"$TARGET_PVE_HOST" "rm -f /tmp/$PUB_FILE" >/dev/null 2>&1 || true - else - run_pct_exec $CONTAINER_ID bash -c "cat > ~/.ssh/authorized_keys" < /var/lib/vz/snippets/container-public-keys/$PUB_FILE > /dev/null 2>&1 - rm -rf /var/lib/vz/snippets/container-public-keys/$PUB_FILE > /dev/null 2>&1 - fi -fi - -ROOT_PSWD=$(tr -dc 'A-Za-z0-9' /dev/null 2>&1 - -CONTAINER_IP="" -attempts=0 -max_attempts=10 - -while [[ -z "$CONTAINER_IP" && $attempts -lt $max_attempts ]]; do - CONTAINER_IP=$(run_pct_exec "$CONTAINER_ID" hostname -I | awk '{print $1}') - [[ -z "$CONTAINER_IP" ]] && sleep 2 && ((attempts++)) -done - -if [[ -z "$CONTAINER_IP" ]]; then - echo "โŒ Timed out waiting for container to get an IP address." - exit 1 -fi - -echo "โณ Updatng container packages..." -if [[ "${LINUX_DISTRO^^}" == "ROCKY" ]]; then - run_pct_exec $CONTAINER_ID bash -c "dnf upgrade -y" -else - run_pct_exec $CONTAINER_ID bash -c "apt-get update && apt-get upgrade -y" -fi - -echo "โณ Configuring LDAP connection via SSSD..." -export AI_CONTAINER="$AI_CONTAINER" -source /var/lib/vz/snippets/helper-scripts/configureLDAP.sh - -echo "โณ Setting up Wazuh-Agent..." -source /var/lib/vz/snippets/Wazuh/register-agent.sh - -if [ "${DEPLOY_ON_START^^}" == "Y" ]; then - source /var/lib/vz/snippets/helper-scripts/deployOnStart.sh - for file in \ - "/var/lib/vz/snippets/container-env-vars/$ENV_BASE_FOLDER" \ - "/var/lib/vz/snippets/container-services/$SERVICES_BASE_FILE" - do - [ -f "$file" ] && rm -rf "$file" > /dev/null 2>&1 - done -fi - -run_pct_exec $CONTAINER_ID bash -c "cd /root && touch container-updates.log" - -echo "โณ Running Container Provision Script..." -if [ -f "/var/lib/vz/snippets/container-port-maps/$PROTOCOL_FILE" ]; then - /var/lib/vz/snippets/register-container.sh $CONTAINER_ID $HTTP_PORT /var/lib/vz/snippets/container-port-maps/$PROTOCOL_FILE "$USERNAME_ONLY" - rm -rf /var/lib/vz/snippets/container-port-maps/$PROTOCOL_FILE > /dev/null 2>&1 -else - /var/lib/vz/snippets/register-container.sh $CONTAINER_ID $HTTP_PORT "" "$PROXMOX_USERNAME" -fi - -SSH_PORT=$(iptables -t nat -S PREROUTING | grep "to-destination $CONTAINER_IP:22" | awk -F'--dport ' '{print $2}' | awk '{print $1}' | head -n 1 || true) - -echo "Adding container MOTD information..." -# port_map.json remains on central nginx host (10.15.20.69) โ€” leave as-is unless you want to change that behavior -scp 10.15.20.69:/etc/nginx/port_map.json /tmp/port_map.json -CONTAINER_INFO=$(jq -r --arg hn "$CONTAINER_NAME" '.[$hn]' /tmp/port_map.json) - -if [ "$CONTAINER_INFO" != "null" ]; then - HOSTNAME="$CONTAINER_NAME" - IP=$(echo "$CONTAINER_INFO" | jq -r '.ip') - OWNER=$(echo "$CONTAINER_INFO" | jq -r '.user') - OS_RELEASE=$(echo "$CONTAINER_INFO" | jq -r '.os_release') - PORTS=$(echo "$CONTAINER_INFO" | jq -r '.ports | to_entries[] | "\(.key): \(.value)"' | paste -sd ", " -) - PROTOCOLS=$(echo "$CONTAINER_INFO" | jq -r '.ports | keys | join(", ")') - - cat < /tmp/container_motd -Container Information: ----------------------- -Hostname : $HOSTNAME -IP Address : $IP -Ports : $PORTS -Protocols : $PROTOCOLS -Primary Owner : $OWNER -OS Release : $OS_RELEASE -EOF -else - echo "No container info found for $CONTAINER_NAME" > /tmp/container_motd -fi - -run_pct_push $CONTAINER_ID /tmp/container_motd /etc/motd - -echoContainerDetails - -BUILD_COMMAND_B64=$(echo -n "$BUILD_COMMAND" | base64) -RUNTIME_LANGUAGE_B64=$(echo -n "$RUNTIME_LANGUAGE" | base64) -START_COMMAND_B64=$(echo -n "$START_COMMAND" | base64) - -# Only run start_services when this is NOT an AI container (previously referenced undefined $AI) -if [[ "${AI_CONTAINER^^}" != "PHOENIX" && "${AI_CONTAINER^^}" != "FORTWAYNE" ]]; then - CMD=( - bash /var/lib/vz/snippets/start_services.sh - "$CONTAINER_ID" - "$CONTAINER_NAME" - "$REPO_BASE_NAME" - "$REPO_BASE_NAME_WITH_OWNER" - "$SSH_PORT" - "$CONTAINER_IP" - "$PROJECT_ROOT" - "$ROOT_START_COMMAND" - "$DEPLOY_ON_START" - "$MULTI_COMPONENTS" - "$START_COMMAND_B64" - "$BUILD_COMMAND_B64" - "$RUNTIME_LANGUAGE_B64" - "$GH_ACTION" - "$PROJECT_BRANCH" - ) -fi - -QUOTED_CMD=$(printf ' %q' "${CMD[@]}") - -# Create detached tmux session to run the (possibly long) service start process -if [[ -n "${CMD[*]}" ]]; then - tmux new-session -d -s "$CONTAINER_NAME" "$QUOTED_CMD" -fi - -exit 0 \ No newline at end of file diff --git a/nginx-reverse-proxy/checkHostname.js b/nginx-reverse-proxy/checkHostname.js new file mode 100644 index 00000000..f3b322b6 --- /dev/null +++ b/nginx-reverse-proxy/checkHostname.js @@ -0,0 +1,22 @@ +var fs = require('fs'); +var filePath = "/etc/nginx/port_map.json"; +var cachedMapping = null; + +var content = fs.readFileSync(filePath); +cachedMapping = JSON.parse(content); + + +function checkHostnameExists(hostname) { + if (cachedMapping === null) { + console.error("Failed to load port mapping file."); + return false; + } + + if (!cachedMapping.hasOwnProperty(hostname)) { + return false; + } else { + return true; + } +} + +module.exports = { checkHostnameExists }; \ No newline at end of file diff --git a/nginx-reverse-proxy/checkHostnameRunner.js b/nginx-reverse-proxy/checkHostnameRunner.js new file mode 100644 index 00000000..eaf0de29 --- /dev/null +++ b/nginx-reverse-proxy/checkHostnameRunner.js @@ -0,0 +1,9 @@ +manageHostnames = require('./checkHostname.js'); + +const [,, func, ...args] = process.argv; +if (func == "checkHostnameExists"){ + console.log(manageHostnames.checkHostnameExists(...args)); +} else { + console.error("Invalid function name. Use 'checkHostnameExists' or 'addHostname'."); + process.exit(1); +} \ No newline at end of file