diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index f240516823..6eab358f01 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -1,7 +1,12 @@ -name: Deploy BETA/BugBash Feature +name: Deploy to Beta Environment on: workflow_dispatch: + inputs: + deploy_to_npm: + description: "Deploy to NPM" + type: boolean + default: false concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} @@ -10,44 +15,127 @@ concurrency: permissions: id-token: write # allows the JWT to be requested from GitHub's OIDC provider contents: read # This is required for actions/checkout + pull-requests: read # This is required to get PR information env: NODE_OPTIONS: '--no-warnings' jobs: + validate-actor: + # Allow only to run from branches and not tags + if: ${{ startsWith(github.ref, 'refs/heads/') }} + uses: ./.github/workflows/validate-actor.yml + with: + team_names: 'js-sdk,integrations' + secrets: + PAT: ${{ secrets.PAT }} + get-deploy-inputs: name: Get Deploy Inputs - if: startsWith(github.ref, 'refs/heads/beta/') || startsWith(github.ref, 'refs/tags/bugbash/') + needs: validate-actor runs-on: [self-hosted, Linux, X64] outputs: - release_type: ${{ steps.deploy-inputs.outputs.release_type }} - feature_name: ${{ steps.deploy-inputs.outputs.feature_name }} - + version_suffix: ${{ steps.deploy-inputs.outputs.version_suffix }} + beta_identifier: ${{ steps.deploy-inputs.outputs.beta_identifier }} + beta_identifier_for_automation_tests: ${{ steps.deploy-inputs.outputs.beta_identifier_for_automation_tests }} steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Find PR for current branch + id: pr-info + uses: actions/github-script@v7 + with: + script: | + const branch = context.ref.replace('refs/heads/', ''); + console.log(`Finding PRs for branch: ${branch}`); + + const { data: pullRequests } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branch}`, + base: 'develop', + state: 'open' + }); + + if (pullRequests.length > 0) { + const pr = pullRequests[0]; + const prNumber = pr.number.toString(); + console.log(`Found PR #${prNumber} for branch ${branch}: https://github.com/${context.repo.owner}/${context.repo.repo}/pull/${prNumber}`); + + // Check if PR is in draft state + if (pr.draft) { + core.setFailed(`PR #${prNumber} is in draft state. Please mark it as ready for review before deploying.`); + return; + } + + // Get detailed PR information including mergeable state + const { data: prDetails } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber + }); + + // Check if PR is mergeable and all requirements are satisfied + if (prDetails.mergeable === false) { + core.setFailed(`PR #${prNumber} is not in a mergeable state. Please resolve conflicts before deploying.`); + return; + } + + // The mergeable_state can be one of: clean, dirty, blocked, unstable, or unknown + // Only 'clean' means all requirements are met (checks passed, approvals received, no conflicts) + if (prDetails.mergeable_state !== 'clean') { + // Get more details about why it's not clean + let reason = ''; + + if (prDetails.mergeable_state === 'blocked') { + reason = 'required checks or approvals are missing'; + } else if (prDetails.mergeable_state === 'dirty') { + reason = 'there are merge conflicts'; + } else if (prDetails.mergeable_state === 'unstable') { + reason = 'required checks are failing'; + } else { + reason = `the mergeable state is "${prDetails.mergeable_state}"`; + } + + core.setFailed(`PR #${prNumber} is not ready to merge: ${reason}. Please resolve all issues before deploying.`); + return; + } + + console.log(`PR #${prNumber} is in a clean mergeable state. All requirements satisfied. Proceeding with beta deployment.`); + + core.setOutput('pr_number', prNumber); + } else { + core.setFailed(`No open PR found for branch ${branch} targeting develop branch`); + core.setOutput('pr_number', ''); + } + - name: Extract deploy inputs id: deploy-inputs shell: bash run: | - source_branch_name=${GITHUB_REF##*/} - RELEASE_TYPE=beta - grep -q "bugbash/" <<< "${GITHUB_REF}" && RELEASE_TYPE=bugbash - FEATURE_NAME=${source_branch_name#bugbash/} - FEATURE_NAME=${FEATURE_NAME#beta/} - FEATURE_NAME=${FEATURE_NAME#refs/heads/} - FEATURE_NAME=${FEATURE_NAME#refs/tags/} - - echo "release_type=$RELEASE_TYPE" >> $GITHUB_OUTPUT - echo "feature_name=$FEATURE_NAME" >> $GITHUB_OUTPUT - - deploy: - name: Deploy BETA/BugBash Feature + # Suffix the short commit hash with the PR number + SHA_SHORT=$(echo ${{ github.sha }} | cut -c1-7) + # The version_suffix is structured as "beta.pr..". + # - "beta.pr." is a fixed prefix indicating a beta release for a pull request. + # - is the number of the pull request associated with the branch. + # - is the first 7 characters of the commit hash for traceability. + echo "version_suffix=beta.pr.${{ steps.pr-info.outputs.pr_number }}.$SHA_SHORT" >> $GITHUB_OUTPUT + echo "beta_identifier=PR-${{ steps.pr-info.outputs.pr_number }}/$SHA_SHORT" >> $GITHUB_OUTPUT + echo "beta_identifier_for_automation_tests=pr-${{ steps.pr-info.outputs.pr_number }}-$SHA_SHORT" >> $GITHUB_OUTPUT + + deploy-cdn: + name: Deploy to CDN uses: ./.github/workflows/deploy.yml needs: get-deploy-inputs with: - environment: ${{ needs.get-deploy-inputs.outputs.release_type }} - bugsnag_release_stage: ${{ needs.get-deploy-inputs.outputs.release_type }} - s3_dir_path: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.feature_name }} - s3_dir_path_legacy: ${{ needs.get-deploy-inputs.outputs.release_type }}/${{ needs.get-deploy-inputs.outputs.feature_name }}/v1.1 + environment: beta + bugsnag_release_stage: beta + s3_dir_path: beta/${{ needs.get-deploy-inputs.outputs.beta_identifier }}/v3 + s3_dir_path_legacy: beta/${{ needs.get-deploy-inputs.outputs.beta_identifier }}/v1.1 + version_suffix: ${{ needs.get-deploy-inputs.outputs.version_suffix }} action_type: '' secrets: AWS_ACCOUNT_ID: ${{ secrets.AWS_PROD_ACCOUNT_ID }} @@ -57,3 +145,51 @@ jobs: BUGSNAG_API_KEY: ${{ secrets.RS_PROD_BUGSNAG_API_KEY }} SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} SLACK_RELEASE_CHANNEL_ID: ${{ secrets.SLACK_RELEASE_CHANNEL_ID_NON_PROD }} + + deploy-npm: + name: Deploy to NPM + uses: ./.github/workflows/deploy-npm.yml + needs: get-deploy-inputs + if: ${{ inputs.deploy_to_npm }} + with: + is_called: true + environment: beta + bugsnag_release_stage: beta + version_suffix: ${{ needs.get-deploy-inputs.outputs.version_suffix }} + base_version: develop + head_version: ${{ github.ref_name }} + secrets: + RS_PROD_BUGSNAG_API_KEY: ${{ secrets.RS_PROD_BUGSNAG_API_KEY }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + SLACK_RELEASE_CHANNEL_ID: ${{ secrets.SLACK_RELEASE_CHANNEL_ID_NON_PROD }} + + deploy-sanity-suite: + name: Deploy sanity suite + needs: [get-deploy-inputs, deploy-cdn] + uses: ./.github/workflows/deploy-sanity-suite.yml + with: + environment: 'beta' + beta_identifier: ${{ needs.get-deploy-inputs.outputs.beta_identifier }} + secrets: + AWS_ACCOUNT_ID: ${{ secrets.AWS_PROD_ACCOUNT_ID }} + AWS_S3_BUCKET_NAME: ${{ secrets.AWS_PROD_S3_BUCKET_NAME }} + AWS_S3_SYNC_ROLE: ${{ secrets.AWS_PROD_S3_SYNC_ROLE }} + AWS_CF_DISTRIBUTION_ID: ${{ secrets.AWS_PROD_CF_DISTRIBUTION_ID }} + SANITY_SUITE_WRITE_KEY: ${{ secrets.SANITY_SUITE_PROD_WRITE_KEY }} + SANITY_SUITE_DATAPLANE_URL: ${{ secrets.SANITY_SUITE_PROD_DATAPLANE_URL }} + SANITY_SUITE_CONFIG_SERVER_HOST: ${{ secrets.SANITY_SUITE_PROD_CONFIG_SERVER_HOST }} + BUGSNAG_API_KEY: ${{ secrets.RS_PROD_BUGSNAG_API_KEY }} + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + SLACK_RELEASE_CHANNEL_ID: ${{ secrets.SLACK_RELEASE_CHANNEL_ID_NON_PROD }} + + trigger-test-suites: + uses: ./.github/workflows/trigger-test-suites.yml + name: Trigger test suites + needs: [get-deploy-inputs, deploy-sanity-suite] + with: + environment: beta + sanity_test_suite_url: https://cdn.rudderlabs.com/sanity-suite/beta/${{ needs.get-deploy-inputs.outputs.beta_identifier }} + build_source_id: ${{ needs.get-deploy-inputs.outputs.beta_identifier_for_automation_tests }} + secrets: + PAT: ${{ secrets.PAT }} diff --git a/.github/workflows/deploy-npm.yml b/.github/workflows/deploy-npm.yml index 21d06589d9..9baebac0e5 100644 --- a/.github/workflows/deploy-npm.yml +++ b/.github/workflows/deploy-npm.yml @@ -7,6 +7,23 @@ on: is_called: type: string required: true + base_version: + type: string + required: false + head_version: + type: string + required: false + version_suffix: + type: string + required: false + bugsnag_release_stage: + description: 'Bugsnag release stage' + type: string + required: false + environment: + type: string + required: false + default: 'production' secrets: RS_PROD_BUGSNAG_API_KEY: required: true @@ -38,6 +55,26 @@ jobs: fetch-depth: 0 ref: ${{ github.sha }} + - name: Modify package versions + if: ${{ inputs.version_suffix != '' }} + run: | + CURRENT_VERSION_JS=$(jq -r .version packages/analytics-js/package.json) + CURRENT_VERSION_V1=$(jq -r .version packages/analytics-v1.1/package.json) + + # Append the suffix to create new versions + NEW_VERSION_JS="${CURRENT_VERSION_JS}-${{ inputs.version_suffix }}" + NEW_VERSION_V1="${CURRENT_VERSION_V1}-${{ inputs.version_suffix }}" + + echo "Updating versions:" + echo "analytics-js: $CURRENT_VERSION_JS -> $NEW_VERSION_JS" + echo "analytics-v1.1: $CURRENT_VERSION_V1 -> $NEW_VERSION_V1" + + # Update all package.json files using jq + TMP_FILE_JS=$(mktemp) + jq ".version = \"$NEW_VERSION_JS\"" packages/analytics-js/package.json > "$TMP_FILE_JS" && mv "$TMP_FILE_JS" packages/analytics-js/package.json + TMP_FILE_V1=$(mktemp) + jq ".version = \"$NEW_VERSION_V1\"" packages/analytics-v1.1/package.json > "$TMP_FILE_V1" && mv "$TMP_FILE_V1" packages/analytics-v1.1/package.json + - name: Get new version number run: | current_version_v1=$(jq -r .version packages/analytics-v1.1/package.json) @@ -51,13 +88,14 @@ jobs: - name: Get versions in NPM run: | - current_npm_version=$(npm show @rudderstack/analytics-js version 2>/dev/null || echo "not found") + # Get latest version across all tags (most recently published) + current_npm_version=$(npm view @rudderstack/analytics-js time --json 2>/dev/null | jq -r 'to_entries | map(select(.key != "modified" and .key != "created")) | sort_by(.value) | last.key' || echo "not found") echo "CURRENT_NPM_VERSION=$current_npm_version" >> $GITHUB_ENV - current_npm_version_sw=$(npm show @rudderstack/analytics-js-service-worker version 2>/dev/null || echo "not found") + current_npm_version_sw=$(npm view @rudderstack/analytics-js-service-worker time --json 2>/dev/null | jq -r 'to_entries | map(select(.key != "modified" and .key != "created")) | sort_by(.value) | last.key' || echo "not found") echo "CURRENT_NPM_VERSION_SW=$current_npm_version_sw" >> $GITHUB_ENV - - current_npm_version_cookie_utils=$(npm show @rudderstack/analytics-js-cookies version 2>/dev/null || echo "not found") + + current_npm_version_cookie_utils=$(npm view @rudderstack/analytics-js-cookies time --json 2>/dev/null | jq -r 'to_entries | map(select(.key != "modified" and .key != "created")) | sort_by(.value) | last.key' || echo "not found") echo "CURRENT_NPM_VERSION_COOKIE_UTILS=$current_npm_version_cookie_utils" >> $GITHUB_ENV - name: Setup Node @@ -71,24 +109,31 @@ jobs: HUSKY: 0 REMOTE_MODULES_BASE_PATH: 'https://cdn.rudderlabs.com/v3/modern/plugins' BUGSNAG_API_KEY: ${{ secrets.RS_PROD_BUGSNAG_API_KEY }} - LOCK_DEPS_VERSION: 'true' - BUGSNAG_RELEASE_STAGE: 'production' + LOCK_DEPS_VERSION: ${{ inputs.environment == 'production' && 'true' || 'false' }} + BUGSNAG_RELEASE_STAGE: ${{ inputs.bugsnag_release_stage || 'production' }} run: | npm run setup:ci - name: Build release artifacts env: BUGSNAG_API_KEY: ${{ secrets.RS_PROD_BUGSNAG_API_KEY }} - BUGSNAG_RELEASE_STAGE: 'production' - LOCK_DEPS_VERSION: 'true' + BUGSNAG_RELEASE_STAGE: ${{ inputs.bugsnag_release_stage || 'production' }} + LOCK_DEPS_VERSION: ${{ inputs.environment == 'production' && 'true' || 'false' }} run: | npm run build:package npm run build:package:modern - - name: Get the two latest monorepo versions + - name: Get the monorepo versions for the base and head versions run: | - CURRENT_VERSION=$(git tag -l "v3*" --sort=-version:refname | head -n 1) - LAST_VERSION=$(git tag -l "v3*" --sort=-version:refname | head -n 2 | awk 'NR == 2 { print $1 }') + # If both base and head versions are provided, use them + if [ -n "${{ inputs.base_version }}" ] && [ -n "${{ inputs.head_version }}" ]; then + LAST_VERSION=${{ inputs.base_version }} + CURRENT_VERSION=${{ inputs.head_version }} + else + # Otherwise, get the two latest monorepo versions + CURRENT_VERSION=$(git tag -l "v3*" --sort=-version:refname | head -n 1) + LAST_VERSION=$(git tag -l "v3*" --sort=-version:refname | head -n 2 | awk 'NR == 2 { print $1 }') + fi echo "Current version: $CURRENT_VERSION" echo "Previous version: $LAST_VERSION" @@ -107,7 +152,7 @@ jobs: ./scripts/make-package-json-publish-ready.sh npm set //registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }} - npx nx release publish --base=${{ env.last_monorepo_version }} --head=${{ env.current_monorepo_version }} + npx nx release publish --base=${{ env.last_monorepo_version }} --head=${{ env.current_monorepo_version }} ${{ inputs.environment == 'beta' && '--tag=beta' || '' }} # Reset the changes made to package.json git reset --hard @@ -122,13 +167,15 @@ jobs: - name: Get versions in NPM after publish run: | npm cache clean --force - new_npm_version=$(npm show @rudderstack/analytics-js version 2>/dev/null || echo "not found") + + # Get latest version across all tags (most recently published) + new_npm_version=$(npm view @rudderstack/analytics-js time --json 2>/dev/null | jq -r 'to_entries | map(select(.key != "modified" and .key != "created")) | sort_by(.value) | last.key' || echo "not found") echo "NEW_NPM_VERSION=$new_npm_version" >> $GITHUB_ENV - new_npm_version_sw=$(npm show @rudderstack/analytics-js-service-worker version 2>/dev/null || echo "not found") + new_npm_version_sw=$(npm view @rudderstack/analytics-js-service-worker time --json 2>/dev/null | jq -r 'to_entries | map(select(.key != "modified" and .key != "created")) | sort_by(.value) | last.key' || echo "not found") echo "NEW_NPM_VERSION_SW=$new_npm_version_sw" >> $GITHUB_ENV - new_npm_version_cookie_utils=$(npm show @rudderstack/analytics-js-cookies version 2>/dev/null || echo "not found") + new_npm_version_cookie_utils=$(npm view @rudderstack/analytics-js-cookies time --json 2>/dev/null | jq -r 'to_entries | map(select(.key != "modified" and .key != "created")) | sort_by(.value) | last.key' || echo "not found") echo "NEW_NPM_VERSION_COOKIE_UTILS=$new_npm_version_cookie_utils" >> $GITHUB_ENV - name: Debug environment variables @@ -157,9 +204,9 @@ jobs: if: env.CURRENT_NPM_VERSION != env.NEW_NPM_VERSION && env.NEW_NPM_VERSION != 'not found' id: slack continue-on-error: true - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 env: - PROJECT_NAME: 'JS SDK NPM Package' + PROJECT_NAME: ${{ inputs.environment == 'beta' && 'JS SDK NPM Package - beta' || 'JS SDK NPM Package' }} NPM_PACKAGE_URL: 'https://www.npmjs.com/package/@rudderstack/analytics-js' RELEASES_URL: 'https://github.com/rudderlabs/rudder-sdk-js/releases/tag/@rudderstack/analytics-js@' with: @@ -193,16 +240,8 @@ jobs: "image_url": "https://img.icons8.com/color/452/npm.png", "alt_text": "NPM Icon" } - }, - { - "type": "context", - "elements": [ - { - "type": "mrkdwn", - "text": "For more details, check the full release notes <${{env.RELEASES_URL}}${{ env.CURRENT_VERSION_VALUE }}|here>." - } - ] } + ${{ inputs.environment == 'production' && format(',{{"type": "context", "elements": [{{"type": "mrkdwn", "text": "For more details, check the full release notes <{0}{1}|here>."}}]}}', env.RELEASES_URL, env.CURRENT_VERSION_VALUE) || '' }} ] } @@ -210,9 +249,9 @@ jobs: if: env.CURRENT_NPM_VERSION_SW != env.NEW_NPM_VERSION_SW && env.NEW_NPM_VERSION_SW != 'not found' id: slackSw continue-on-error: true - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 env: - PROJECT_NAME: 'JS SDK Service Worker NPM Package' + PROJECT_NAME: ${{ inputs.environment == 'beta' && 'JS SDK Service Worker NPM Package - beta' || 'JS SDK Service Worker NPM Package' }} NPM_PACKAGE_URL: 'https://www.npmjs.com/package/@rudderstack/analytics-js-service-worker' RELEASES_URL: 'https://github.com/rudderlabs/rudder-sdk-js/releases/tag/@rudderstack/analytics-js-service-worker@' with: @@ -246,16 +285,8 @@ jobs: "image_url": "https://img.icons8.com/color/452/npm.png", "alt_text": "NPM Icon" } - }, - { - "type": "context", - "elements": [ - { - "type": "mrkdwn", - "text": "For more details, check the full release notes <${{ env.RELEASES_URL }}${{ env.CURRENT_VERSION_SW_VALUE }}|here>." - } - ] } + ${{ inputs.environment == 'production' && format(',{{"type": "context", "elements": [{{"type": "mrkdwn", "text": "For more details, check the full release notes <{0}{1}|here>."}}]}}', env.RELEASES_URL, env.CURRENT_VERSION_SW_VALUE) || '' }} ] } @@ -263,9 +294,9 @@ jobs: if: env.CURRENT_NPM_VERSION_COOKIE_UTILS != env.NEW_NPM_VERSION_COOKIE_UTILS && env.NEW_NPM_VERSION_COOKIE_UTILS != 'not found' id: slack-cookie-utils continue-on-error: true - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 env: - PROJECT_NAME: 'JS SDK Cookies Utilities' + PROJECT_NAME: ${{ inputs.environment == 'beta' && 'JS SDK Cookies Utilities - beta' || 'JS SDK Cookies Utilities' }} NPM_PACKAGE_URL: 'https://www.npmjs.com/package/@rudderstack/analytics-js-cookies' RELEASES_URL: 'https://github.com/rudderlabs/rudder-sdk-js/releases/tag/@rudderstack/analytics-js-cookies@' with: @@ -299,15 +330,7 @@ jobs: "image_url": "https://img.icons8.com/color/452/npm.png", "alt_text": "NPM Icon" } - }, - { - "type": "context", - "elements": [ - { - "type": "mrkdwn", - "text": "For more details, check the full release notes <${{ env.RELEASES_URL }}${{ env.CURRENT_VERSION_COOKIE_UTILS_VALUE }}|here>." - } - ] } + ${{ inputs.environment == 'production' && format(',{{"type": "context", "elements": [{{"type": "mrkdwn", "text": "For more details, check the full release notes <{0}{1}|here>."}}]}}', env.RELEASES_URL, env.CURRENT_VERSION_COOKIE_UTILS_VALUE) || '' }} ] } diff --git a/.github/workflows/deploy-sanity-suite.yml b/.github/workflows/deploy-sanity-suite.yml index b8434e7b18..7340049cb9 100644 --- a/.github/workflows/deploy-sanity-suite.yml +++ b/.github/workflows/deploy-sanity-suite.yml @@ -9,6 +9,9 @@ on: use_pr_head_sha: type: string default: 'false' + beta_identifier: + type: string + required: false secrets: AWS_ACCOUNT_ID: required: true @@ -75,6 +78,9 @@ jobs: elif [ "${{ inputs.environment }}" == "production" ]; then echo "SDK_CDN_VERSION_PATH_PREFIX=" >> $GITHUB_ENV echo "SUITE_CDN_PATH=" >> $GITHUB_ENV + elif [ "${{ inputs.environment }}" == "beta" ]; then + echo "SDK_CDN_VERSION_PATH_PREFIX=beta/${{ inputs.beta_identifier }}/" >> $GITHUB_ENV + echo "SUITE_CDN_PATH=/beta/${{ inputs.beta_identifier }}" >> $GITHUB_ENV else echo "SDK_CDN_VERSION_PATH_PREFIX=dev/latest/" >> $GITHUB_ENV echo "SUITE_CDN_PATH=/dev" >> $GITHUB_ENV @@ -84,7 +90,7 @@ jobs: uses: unfor19/install-aws-cli-action@2ff7a6968c81b173eaaef188869215870f44902b # master - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 + uses: aws-actions/configure-aws-credentials@f24d7193d98baebaeacc7e2227925dd47cc267f5 # v4.2.0 with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_S3_SYNC_ROLE }} aws-region: us-east-1 @@ -125,12 +131,12 @@ jobs: - name: Send message to Slack channel id: slack - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 continue-on-error: true env: PROJECT_NAME: 'Sanity suite - ${{ inputs.environment }}' CDN_URL: 'https://cdn.rudderlabs.com/sanity-suite${{ env.SUITE_CDN_PATH }}/v3/cdn/index.html' - LINK_TEXT: ${{ ((inputs.environment == 'development' && format('v{0} - Development', env.CURRENT_VERSION_VALUE)) || (inputs.environment == 'staging' && format('v{0} - Staging', env.CURRENT_VERSION_VALUE)) || format('v{0}', env.CURRENT_VERSION_VALUE)) }} + LINK_TEXT: ${{ ((inputs.environment == 'development' && format('v{0} - Development', env.CURRENT_VERSION_VALUE)) || (inputs.environment == 'staging' && format('v{0} - Staging', env.CURRENT_VERSION_VALUE)) || (inputs.environment == 'beta' && format('v{0} - Beta', env.CURRENT_VERSION_VALUE)) || format('v{0}', env.CURRENT_VERSION_VALUE)) }} with: method: chat.postMessage token: ${{ secrets.SLACK_BOT_TOKEN }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 29cd966196..edb64c8d64 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -27,6 +27,9 @@ on: use_pr_head_sha: type: string default: 'false' + version_suffix: + type: string + default: '' secrets: AWS_ACCOUNT_ID: required: true @@ -69,7 +72,7 @@ jobs: uses: unfor19/install-aws-cli-action@2ff7a6968c81b173eaaef188869215870f44902b # master - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 + uses: aws-actions/configure-aws-credentials@f24d7193d98baebaeacc7e2227925dd47cc267f5 # v4.2.0 with: role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_S3_SYNC_ROLE }} aws-region: us-east-1 @@ -90,6 +93,24 @@ jobs: with: ref: ${{ steps.getSHA.outputs.SHA }} + - name: Modify package versions + if: ${{ inputs.version_suffix != '' }} + run: | + CURRENT_VERSION_JS=$(jq -r .version packages/analytics-js/package.json) + CURRENT_VERSION_V1=$(jq -r .version packages/analytics-v1.1/package.json) + + # Append the suffix to create new versions + NEW_VERSION_JS="${CURRENT_VERSION_JS}-${{ inputs.version_suffix }}" + NEW_VERSION_V1="${CURRENT_VERSION_V1}-${{ inputs.version_suffix }}" + + echo "Updating versions:" + echo "analytics-js: $CURRENT_VERSION_JS -> $NEW_VERSION_JS" + echo "analytics-v1.1: $CURRENT_VERSION_V1 -> $NEW_VERSION_V1" + + # Update all package.json files using jq + jq ".version = \"$NEW_VERSION_JS\"" packages/analytics-js/package.json > tmp && mv tmp packages/analytics-js/package.json + jq ".version = \"$NEW_VERSION_V1\"" packages/analytics-v1.1/package.json > tmp && mv tmp packages/analytics-v1.1/package.json + - name: Get new versions run: | current_version_v1=$(jq -r .version packages/analytics-v1.1/package.json) @@ -255,7 +276,7 @@ jobs: - name: Send message to Slack channel id: slack continue-on-error: true - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 env: PROJECT_NAME: ${{ format('JS SDK Browser Package {0} - {1}', inputs.action_type, inputs.environment) }} CDN_URL: ${{ format('https://cdn.rudderlabs.com/{0}/modern/rsa.min.js', inputs.s3_dir_path) }} diff --git a/.github/workflows/publish-new-release.yml b/.github/workflows/publish-new-release.yml index 60d9010fde..b543d11d30 100644 --- a/.github/workflows/publish-new-release.yml +++ b/.github/workflows/publish-new-release.yml @@ -136,7 +136,7 @@ jobs: id: slack if: always() continue-on-error: true - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 env: PROJECT_NAME: 'JS SDK Monorepo' TAG_COMPARE_URL: 'https://github.com/rudderlabs/rudder-sdk-js/compare/' diff --git a/.github/workflows/rollback.yml b/.github/workflows/rollback.yml index 9b7d52cc43..7bb793a63b 100644 --- a/.github/workflows/rollback.yml +++ b/.github/workflows/rollback.yml @@ -42,7 +42,7 @@ jobs: uses: unfor19/install-aws-cli-action@2ff7a6968c81b173eaaef188869215870f44902b # master - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 + uses: aws-actions/configure-aws-credentials@f24d7193d98baebaeacc7e2227925dd47cc267f5 # v4.2.0 with: role-to-assume: arn:aws:iam::${{ secrets.AWS_PROD_ACCOUNT_ID }}:role/${{ secrets.AWS_PROD_S3_SYNC_ROLE }} aws-region: us-east-1 @@ -173,7 +173,7 @@ jobs: - name: Send message to Slack channel id: slack continue-on-error: true - uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 + uses: slackapi/slack-github-action@b0fa283ad8fea605de13dc3f449259339835fc52 # v2.1.0 env: PROJECT_NAME: 'JS SDK Browser Package - Rollback - Production' CDN_URL: ${{ format('https://cdn.rudderlabs.com/{0}/modern/rsa.min.js', env.LATEST_VERSION_DIR_NAME) }} diff --git a/.github/workflows/security-code-quality-and-bundle-size-checks.yml b/.github/workflows/security-code-quality-and-bundle-size-checks.yml index 6798c25df2..fde4d2460f 100644 --- a/.github/workflows/security-code-quality-and-bundle-size-checks.yml +++ b/.github/workflows/security-code-quality-and-bundle-size-checks.yml @@ -31,7 +31,7 @@ jobs: cache: 'npm' - name: Execute bundle size checks - uses: rudderlabs/github-action-check-size-limit@v2.12.0 + uses: rudderlabs/github-action-check-size-limit@v2.13.0 env: HUSKY: 0 with: diff --git a/.github/workflows/trigger-test-suites.yml b/.github/workflows/trigger-test-suites.yml index 4ce7814cb4..0556baf871 100644 --- a/.github/workflows/trigger-test-suites.yml +++ b/.github/workflows/trigger-test-suites.yml @@ -9,6 +9,12 @@ on: use_pr_head_sha: type: string default: 'false' + build_source_id: + type: string + required: false + sanity_test_suite_url: + type: string + required: false secrets: PAT: description: Personal Access Token @@ -60,7 +66,10 @@ jobs: -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/rudderlabs/rudder-client-side-test/actions/workflows/sdk-team-js-sanity-suite.yaml/dispatches" \ -f "ref=main" \ - -f "inputs[environment]=${{ inputs.environment }}" -f "inputs[monorepo_version]=${{ needs.extract-monorepo-version.outputs.version }}" + -f "inputs[environment]=${{ inputs.environment }}" \ + -f "inputs[monorepo_version]=${{ needs.extract-monorepo-version.outputs.version }}" \ + -f "inputs[sanity_test_suite_url]=${{ inputs.sanity_test_suite_url }}" \ + -f "inputs[build_source_id]=${{ inputs.build_source_id }}" trigger-e2e-test-suite: runs-on: [self-hosted, Linux, X64] @@ -80,4 +89,7 @@ jobs: -H "X-GitHub-Api-Version: 2022-11-28" \ "/repos/rudderlabs/rudder-client-side-test/actions/workflows/sdk-team-js-regression.yaml/dispatches" \ -f "ref=main" \ - -f "inputs[environment]=${{ inputs.environment }}" -f "inputs[monorepo_version]=${{ needs.extract-monorepo-version.outputs.version }}" + -f "inputs[environment]=${{ inputs.environment }}" \ + -f "inputs[monorepo_version]=${{ needs.extract-monorepo-version.outputs.version }}" \ + -f "inputs[sanity_test_suite_url]=${{ inputs.sanity_test_suite_url }}" \ + -f "inputs[build_source_id]=${{ inputs.build_source_id }}" diff --git a/.github/workflows/unit-tests-and-lint.yml b/.github/workflows/unit-tests-and-lint.yml index 1fa23257c3..88c5a86d72 100644 --- a/.github/workflows/unit-tests-and-lint.yml +++ b/.github/workflows/unit-tests-and-lint.yml @@ -66,7 +66,7 @@ jobs: ./scripts/fix-reports-path-in-github-runner.sh - name: SonarQube Scan - uses: SonarSource/sonarqube-scan-action@aa494459d7c39c106cc77b166de8b4250a32bb97 # v5.1.0 + uses: SonarSource/sonarqube-scan-action@2500896589ef8f7247069a56136f8dc177c27ccf # v5.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.nvmrc b/.nvmrc index 2dbbe00e67..b8ffd70759 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.11.1 +22.15.0 diff --git a/jest.preset.js b/jest.preset.js index 3bf0c9132d..48efbd6a2b 100644 --- a/jest.preset.js +++ b/jest.preset.js @@ -34,7 +34,6 @@ module.exports = { 'ts-jest', { diagnostics: false, - isolatedModules: true, sourceMap: true, inlineSourceMap: true, tsconfig: '/tsconfig.spec.json', diff --git a/package-lock.json b/package-lock.json index 14519ed892..25f970909e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rudderstack/analytics-js-monorepo", - "version": "3.83.0", + "version": "3.84.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rudderstack/analytics-js-monorepo", - "version": "3.83.0", + "version": "3.84.0", "hasInstallScript": true, "license": "Elastic-2.0", "workspaces": [ @@ -21,7 +21,7 @@ "@segment/top-domain": "3.0.1", "@vespaiach/axios-fetch-adapter": "0.3.1", "assert": "2.1.0", - "axios": "1.8.4", + "axios": "1.9.0", "axios-retry": "4.5.0", "component-each": "0.2.6", "component-emitter": "2.0.0", @@ -49,26 +49,26 @@ "storejs": "2.1.0" }, "devDependencies": { - "@babel/core": "7.26.10", - "@babel/eslint-parser": "7.27.0", - "@babel/plugin-transform-arrow-functions": "7.25.9", - "@babel/plugin-transform-class-properties": "7.25.9", - "@babel/plugin-transform-object-assign": "7.25.9", - "@babel/plugin-transform-private-methods": "7.25.9", - "@babel/plugin-transform-private-property-in-object": "7.25.9", - "@babel/plugin-transform-runtime": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/preset-typescript": "7.27.0", - "@commitlint/config-conventional": "19.8.0", - "@commitlint/config-nx-scopes": "19.8.0", + "@babel/core": "7.27.1", + "@babel/eslint-parser": "7.27.1", + "@babel/plugin-transform-arrow-functions": "7.27.1", + "@babel/plugin-transform-class-properties": "7.27.1", + "@babel/plugin-transform-object-assign": "7.27.1", + "@babel/plugin-transform-private-methods": "7.27.1", + "@babel/plugin-transform-private-property-in-object": "7.27.1", + "@babel/plugin-transform-runtime": "7.27.1", + "@babel/preset-env": "7.27.2", + "@babel/preset-typescript": "7.27.1", + "@commitlint/config-conventional": "19.8.1", + "@commitlint/config-nx-scopes": "19.8.1", "@digitalroute/cz-conventional-changelog-for-jira": "8.0.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@jscutlery/semver": "5.6.0", - "@nx/eslint": "20.8.0", - "@nx/eslint-plugin": "20.8.0", - "@nx/jest": "20.8.0", - "@nx/js": "20.8.0", - "@nx/workspace": "20.8.0", + "@nx/eslint": "21.0.3", + "@nx/eslint-plugin": "21.0.3", + "@nx/jest": "21.0.3", + "@nx/js": "21.0.3", + "@nx/workspace": "21.0.3", "@originjs/vite-plugin-federation": "1.4.1", "@rollup/plugin-alias": "5.1.1", "@rollup/plugin-babel": "6.0.4", @@ -80,29 +80,28 @@ "@size-limit/file": "11.2.0", "@size-limit/webpack": "11.2.0", "@swc-node/register": "1.10.10", - "@swc/core": "1.11.22", + "@swc/core": "1.11.24", "@types/component-emitter": "1.2.14", "@types/jest": "29.5.14", - "@types/node": "22.14.1", + "@types/node": "22.15.17", "@types/ramda": "0.30.2", - "@typescript-eslint/eslint-plugin": "8.31.0", - "@typescript-eslint/parser": "8.31.0", + "@typescript-eslint/eslint-plugin": "8.32.0", + "@typescript-eslint/parser": "8.32.0", "babel-plugin-transform-object-hasown": "1.1.0", "commitizen": "4.3.1", - "commitlint": "19.8.0", - "core-js": "3.41.0", + "commitlint": "19.8.1", + "core-js": "3.42.0", "cross-env": "7.0.3", "dotenv": "16.5.0", "each": "2.7.2", - "eslint": "9.25.1", - "eslint-config-prettier": "10.1.2", + "eslint": "9.26.0", + "eslint-config-prettier": "10.1.5", "eslint-import-resolver-node": "0.3.9", "eslint-import-resolver-typescript": "4.3.4", "eslint-plugin-compat": "6.0.2", "eslint-plugin-import": "2.31.0", "eslint-plugin-sonarjs": "3.0.2", - "eslint-plugin-unicorn": "58.0.0", - "esm": "3.2.25", + "eslint-plugin-unicorn": "59.0.1", "http-server": "14.1.1", "husky": "9.1.7", "isomorphic-fetch": "3.0.0", @@ -114,14 +113,14 @@ "jest-watch-typeahead": "2.2.2", "join-component": "1.1.0", "jscpd": "4.0.5", - "lint-staged": "15.5.1", + "lint-staged": "15.5.2", "madge": "8.0.0", - "msw": "2.7.5", - "nx": "20.8.0", + "msw": "2.8.0", + "nx": "21.0.3", "patch-package": "8.0.0", "prettier": "3.5.3", "publint": "0.3.12", - "rollup": "4.40.0", + "rollup": "4.40.2", "rollup-plugin-copy": "3.5.0", "rollup-plugin-delete": "3.0.1", "rollup-plugin-dts": "6.2.1", @@ -143,11 +142,11 @@ "user-agent-data-types": "0.4.2" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.0", - "@nx/nx-darwin-x64": "20.8.0", - "@nx/nx-linux-x64-gnu": "20.8.0", - "@nx/nx-win32-x64-msvc": "20.8.0", - "@rollup/rollup-linux-x64-gnu": "4.40.0" + "@nx/nx-darwin-arm64": "21.0.2", + "@nx/nx-darwin-x64": "21.0.2", + "@nx/nx-linux-x64-gnu": "20.8.1", + "@nx/nx-win32-x64-msvc": "20.8.1", + "@rollup/rollup-linux-x64-gnu": "4.40.2" } }, "node_modules/@ampproject/remapping": { @@ -164,44 +163,44 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "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, "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -217,9 +216,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.0.tgz", - "integrity": "sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz", + "integrity": "sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -235,13 +234,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -251,25 +250,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -279,17 +278,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", - "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.27.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -300,12 +299,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", - "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, @@ -333,40 +332,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -376,35 +375,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -414,14 +413,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -431,79 +430,79 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -513,13 +512,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -529,12 +528,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -544,12 +543,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -559,14 +558,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -576,13 +575,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -592,14 +591,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -672,12 +671,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -687,12 +686,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -702,12 +701,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "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, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -741,12 +740,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -858,12 +857,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -889,12 +888,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -904,14 +903,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -921,14 +920,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -938,12 +937,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", - "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -953,12 +952,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", - "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -968,13 +967,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -984,13 +983,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1000,16 +999,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "engines": { @@ -1020,13 +1019,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1036,12 +1035,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1051,13 +1050,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1067,12 +1066,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1082,13 +1081,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1098,12 +1097,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1113,12 +1112,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1128,12 +1127,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1143,13 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", - "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1159,14 +1158,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1176,12 +1175,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1191,12 +1190,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1206,12 +1205,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1221,12 +1220,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1236,13 +1235,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1252,13 +1251,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1268,15 +1267,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1286,13 +1285,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1302,13 +1301,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1318,12 +1317,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1333,12 +1332,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.26.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", - "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1348,12 +1347,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1363,12 +1362,12 @@ } }, "node_modules/@babel/plugin-transform-object-assign": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.25.9.tgz", - "integrity": "sha512-I/Vl1aQnPsrrn837oLbo+VQtkNcjuuiATqwmuweg4fTauwHHQoxyjmjjOVKyO8OaTxgqYTKW3LuQsykXjDf5Ag==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.27.1.tgz", + "integrity": "sha512-LP6tsnirA6iy13uBKiYgjJsfQrodmlSrpZModtlo1Vk8sOO68gfo7dfA9TGJyEgxTiO7czK4EGZm8FJEZtk4kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1378,14 +1377,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", + "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1395,13 +1395,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1411,12 +1411,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1426,13 +1426,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1442,12 +1442,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1457,13 +1457,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1473,14 +1473,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1490,12 +1490,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1505,13 +1505,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", - "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1521,13 +1520,13 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1537,12 +1536,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1552,13 +1551,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", - "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", + "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1572,12 +1571,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1587,13 +1586,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1603,12 +1602,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1618,12 +1617,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", - "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1633,12 +1632,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", - "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1648,16 +1647,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", - "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.27.0", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1667,12 +1666,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1682,13 +1681,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1698,13 +1697,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1714,13 +1713,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1730,74 +1729,74 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.11.0", @@ -1827,16 +1826,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", - "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1846,42 +1845,39 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", - "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1890,13 +1886,13 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2005,17 +2001,18 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.0.tgz", - "integrity": "sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz", + "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/format": "^19.8.0", - "@commitlint/lint": "^19.8.0", - "@commitlint/load": "^19.8.0", - "@commitlint/read": "^19.8.0", - "@commitlint/types": "^19.8.0", - "tinyexec": "^0.3.0", + "@commitlint/format": "^19.8.1", + "@commitlint/lint": "^19.8.1", + "@commitlint/load": "^19.8.1", + "@commitlint/read": "^19.8.1", + "@commitlint/types": "^19.8.1", + "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, "bin": { @@ -2026,12 +2023,13 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.0.tgz", - "integrity": "sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.8.1.tgz", + "integrity": "sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0", + "@commitlint/types": "^19.8.1", "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { @@ -2039,12 +2037,13 @@ } }, "node_modules/@commitlint/config-nx-scopes": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-nx-scopes/-/config-nx-scopes-19.8.0.tgz", - "integrity": "sha512-cHyonFkbKN12EYFjnb5+CgNJZYMRTUBmkNLhnecRVZcB5qlQREs9kqqmrS6Vahme8PD2gmPA7I6b7kFfMHqRoQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-nx-scopes/-/config-nx-scopes-19.8.1.tgz", + "integrity": "sha512-BPkNs+grzc0bPmQCCP52Ml1FnGmS4JESOuD61Rz0oO/SaM0GM5+0XJBThb7xdgpu4YltH8tYBg5cVqVu93CMug==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0" + "@commitlint/types": "^19.8.1" }, "engines": { "node": ">=v18" @@ -2059,12 +2058,13 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.0.tgz", - "integrity": "sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", + "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0", + "@commitlint/types": "^19.8.1", "ajv": "^8.11.0" }, "engines": { @@ -2072,12 +2072,13 @@ } }, "node_modules/@commitlint/ensure": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.0.tgz", - "integrity": "sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", + "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0", + "@commitlint/types": "^19.8.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -2089,21 +2090,23 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.0.tgz", - "integrity": "sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", + "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/format": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.0.tgz", - "integrity": "sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", + "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0", + "@commitlint/types": "^19.8.1", "chalk": "^5.3.0" }, "engines": { @@ -2111,12 +2114,13 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.0.tgz", - "integrity": "sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", + "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0", + "@commitlint/types": "^19.8.1", "semver": "^7.6.0" }, "engines": { @@ -2128,6 +2132,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2136,30 +2141,32 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.0.tgz", - "integrity": "sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", + "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^19.8.0", - "@commitlint/parse": "^19.8.0", - "@commitlint/rules": "^19.8.0", - "@commitlint/types": "^19.8.0" + "@commitlint/is-ignored": "^19.8.1", + "@commitlint/parse": "^19.8.1", + "@commitlint/rules": "^19.8.1", + "@commitlint/types": "^19.8.1" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.0.tgz", - "integrity": "sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", + "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.8.0", - "@commitlint/execute-rule": "^19.8.0", - "@commitlint/resolve-extends": "^19.8.0", - "@commitlint/types": "^19.8.0", + "@commitlint/config-validator": "^19.8.1", + "@commitlint/execute-rule": "^19.8.1", + "@commitlint/resolve-extends": "^19.8.1", + "@commitlint/types": "^19.8.1", "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^6.1.0", @@ -2172,21 +2179,23 @@ } }, "node_modules/@commitlint/message": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.0.tgz", - "integrity": "sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", + "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/parse": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.0.tgz", - "integrity": "sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", + "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.0", + "@commitlint/types": "^19.8.1", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" }, @@ -2195,16 +2204,17 @@ } }, "node_modules/@commitlint/read": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.0.tgz", - "integrity": "sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", + "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/top-level": "^19.8.0", - "@commitlint/types": "^19.8.0", + "@commitlint/top-level": "^19.8.1", + "@commitlint/types": "^19.8.1", "git-raw-commits": "^4.0.0", "minimist": "^1.2.8", - "tinyexec": "^0.3.0" + "tinyexec": "^1.0.0" }, "engines": { "node": ">=v18" @@ -2215,18 +2225,20 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/@commitlint/resolve-extends": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.0.tgz", - "integrity": "sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", + "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.8.0", - "@commitlint/types": "^19.8.0", + "@commitlint/config-validator": "^19.8.1", + "@commitlint/types": "^19.8.1", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", @@ -2237,34 +2249,37 @@ } }, "node_modules/@commitlint/rules": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.0.tgz", - "integrity": "sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", + "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/ensure": "^19.8.0", - "@commitlint/message": "^19.8.0", - "@commitlint/to-lines": "^19.8.0", - "@commitlint/types": "^19.8.0" + "@commitlint/ensure": "^19.8.1", + "@commitlint/message": "^19.8.1", + "@commitlint/to-lines": "^19.8.1", + "@commitlint/types": "^19.8.1" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/to-lines": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.0.tgz", - "integrity": "sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", + "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/top-level": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.0.tgz", - "integrity": "sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", + "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^7.0.0" }, @@ -2277,6 +2292,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", @@ -2294,6 +2310,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -2309,6 +2326,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -2324,6 +2342,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -2339,6 +2358,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -2348,6 +2368,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -2356,10 +2377,11 @@ } }, "node_modules/@commitlint/types": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.0.tgz", - "integrity": "sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", + "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", "dev": true, + "license": "MIT", "dependencies": { "@types/conventional-commits-parser": "^5.0.0", "chalk": "^5.3.0" @@ -2483,37 +2505,37 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.1.tgz", - "integrity": "sha512-4JFstCTaToCFrPqrGzgkF8N2NHjtsaY4uRh6brZQ5L9e4wbMieX8oDT8N7qfVFTQecHFEtkj4ve49VIZ3mKVqw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.1", + "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.1.tgz", - "integrity": "sha512-LMshMVP0ZhACNjQNYXiU1iZJ6QCcv0lUdPDPugqGvCGXt5xtRVBPdtA0qU12pEXZzpWAhWlZYptfdAFq10DOVQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", "dev": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz", - "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -2586,9 +2608,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2599,7 +2621,6 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -2699,11 +2720,10 @@ } }, "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -2785,9 +2805,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "engines": { "node": ">=18.18" @@ -3817,6 +3837,27 @@ "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==", "dev": true }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz", + "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==", + "dev": true, + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@mswjs/interceptors": { "version": "0.37.6", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", @@ -4100,11 +4141,11 @@ } }, "node_modules/@nx/devkit": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.0.tgz", - "integrity": "sha512-0616zW0Krwb5frNZ7C0HUItonCDiAHY9UYSTyJm6hnal0Xc6XkJuEAFNjbx2sEOopO85CEAMNeYEHkRyWsSxCQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.1.tgz", + "integrity": "sha512-N3nwIg/7RIZeB76iuVo29q+l9WyTtvuBSgDFM2msiIK6Q928ilzoeNPZ/p7w/TE3Gqs5XVhq9ExMvDAOTxdmXA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "ejs": "^3.1.7", "enquirer": "~2.3.6", @@ -4124,6 +4165,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -4132,14 +4174,14 @@ } }, "node_modules/@nx/eslint": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.8.0.tgz", - "integrity": "sha512-FPpw/RHgg08gkhntf/d7xh8GtNKOjTzLrwh7/YUO5UTi26lCjglM0nsFJJEQS988STElgjBEeDh78wcMuXeQ7g==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.0.3.tgz", + "integrity": "sha512-0YNNO5iTPIq8j4vTluVTIXM1Be3GOvB1n930oupZYVvnQIR0Zv7SO9fnoz+boyZfeFhjBcy74xeiymz8eoAsDA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "21.0.3", + "@nx/js": "21.0.3", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.7.2" @@ -4155,14 +4197,14 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.8.0.tgz", - "integrity": "sha512-qcwvSI8MKdEinJ0XX01SIlVkTo2+Vi2ZvDbGccIdrej287hjaipphTvfesPnvnb7TSGZf0JG64P/yukmSFLxEw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-21.0.3.tgz", + "integrity": "sha512-ZEUUHNaorohmITaXU2imXnjzx8SaXTzI9P7MRMK7LbTXy+q36tkEcGxMy7yA7eEfuftTL9KyJYB0MxdQ0GsV3g==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "21.0.3", + "@nx/js": "21.0.3", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -4182,11 +4224,32 @@ } } }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/devkit": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.0.3.tgz", + "integrity": "sha512-PnEZWenJ3fOoAU+Es9v0xxANyrROtFj+rjDHCjfyqGs3jMihMyTsCDQLpsjdnrUF5jjp9VUawfms76ocSLmwpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.0.3" + } + }, "node_modules/@nx/eslint-plugin/node_modules/ansi-styles": { "version": "4.3.0", "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" }, @@ -4202,6 +4265,7 @@ "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" @@ -4218,6 +4282,7 @@ "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" }, @@ -4242,6 +4307,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4249,11 +4315,32 @@ "node": ">=10" } }, + "node_modules/@nx/eslint/node_modules/@nx/devkit": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.0.3.tgz", + "integrity": "sha512-PnEZWenJ3fOoAU+Es9v0xxANyrROtFj+rjDHCjfyqGs3jMihMyTsCDQLpsjdnrUF5jjp9VUawfms76ocSLmwpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.0.3" + } + }, "node_modules/@nx/eslint/node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4275,16 +4362,16 @@ } }, "node_modules/@nx/jest": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.8.0.tgz", - "integrity": "sha512-Nrch28OhUnofnIrT+V5+uHWdNVFDHc0G9yF83dPLMipne8NJ9731xxAglL9H7lw73AMTeHaxin2I4UE0Vf1/HA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.0.3.tgz", + "integrity": "sha512-a0BXZT4MScDXtxfaQuKpggMpMhItjsZIww4N0k4PpuDh0Yxuf643sZzIVCAkIBP6BoC2gFk00eF79U+6S2x+zg==", "dev": true, "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.8.0", - "@nx/js": "20.8.0", + "@nx/devkit": "21.0.3", + "@nx/js": "21.0.3", "@phenomnomnominal/tsquery": "~5.0.1", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", @@ -4298,11 +4385,32 @@ "yargs-parser": "21.1.1" } }, + "node_modules/@nx/jest/node_modules/@nx/devkit": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.0.3.tgz", + "integrity": "sha512-PnEZWenJ3fOoAU+Es9v0xxANyrROtFj+rjDHCjfyqGs3jMihMyTsCDQLpsjdnrUF5jjp9VUawfms76ocSLmwpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.0.3" + } + }, "node_modules/@nx/jest/node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4311,9 +4419,9 @@ } }, "node_modules/@nx/js": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.8.0.tgz", - "integrity": "sha512-JqQ94l0njkoCCIeqRzFsajMoSV5WodfGGG3giipBe9+cmqsMCZJxh7DiSTGCZ2vnUo3zoX8hodumlk8r+HtMZQ==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.0.3.tgz", + "integrity": "sha512-nrlMpSd567zGbZDyj4BTUcZAKzjTqzvx6B2+zmkq+q8RqApGOs3xvJ6QJpFrcaC7Oqa9xZljDUbaDE7bPueAMA==", "dev": true, "license": "MIT", "dependencies": { @@ -4324,8 +4432,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.8.0", - "@nx/workspace": "20.8.0", + "@nx/devkit": "21.0.3", + "@nx/workspace": "21.0.3", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -4356,11 +4464,32 @@ } } }, + "node_modules/@nx/js/node_modules/@nx/devkit": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.0.3.tgz", + "integrity": "sha512-PnEZWenJ3fOoAU+Es9v0xxANyrROtFj+rjDHCjfyqGs3jMihMyTsCDQLpsjdnrUF5jjp9VUawfms76ocSLmwpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.0.3" + } + }, "node_modules/@nx/js/node_modules/ansi-styles": { "version": "4.3.0", "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" }, @@ -4376,6 +4505,7 @@ "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" @@ -4392,6 +4522,7 @@ "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" }, @@ -4404,6 +4535,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4412,9 +4544,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.0.tgz", - "integrity": "sha512-A6Te2KlINtcOo/depXJzPyjbk9E0cmgbom/sm/49XdQ8G94aDfyIIY1RIdwmDCK5NVd74KFG3JIByTk5+VnAhA==", + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.0.2.tgz", + "integrity": "sha512-C2A94y4TJpAsxbyAZufCzcWNDFKvHNcGCxSwdMxyaDBHXOxDasSYH6KsUTj95sZtjMiHvMn9J4xforTwF/tE7w==", "cpu": [ "arm64" ], @@ -4422,15 +4554,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.0.tgz", - "integrity": "sha512-UpqayUjgalArXaDvOoshqSelTrEp42cGDsZGy0sqpxwBpm3oPQ8wE1d7oBAmRo208rAxOuFP0LZRFUqRrwGvLA==", + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.0.2.tgz", + "integrity": "sha512-eWHM0gmOZBuqFw0QrO6h/ku0+LxbjmTYaWFJerPjqfAyOHKI9CEY/nPWHuJRkq7algUQdlgX5Utf+oQ+6aJlTQ==", "cpu": [ "x64" ], @@ -4438,15 +4567,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.0.tgz", - "integrity": "sha512-dUR2fsLyKZYMHByvjy2zvmdMbsdXAiP+6uTlIAuu8eHMZ2FPQCAtt7lPYLwOFUxUXChbek2AJ+uCI0gRAgK/eg==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.0.3.tgz", + "integrity": "sha512-bJRFvhTOzewDM2HxeVDqbrR5357tAUpovcj9czzRGrEhhoelqCLP0/9Ric1V4j8yyPXmRpXa9REWq3weFaAcwg==", "cpu": [ "x64" ], @@ -4455,15 +4581,12 @@ "optional": true, "os": [ "freebsd" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.0.tgz", - "integrity": "sha512-GuZ7t0SzSX5ksLYva7koKZovQ5h/Kr1pFbOsQcBf3VLREBqFPSz6t7CVYpsIsMhiu/I3EKq6FZI3wDOJbee5uw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.0.3.tgz", + "integrity": "sha512-7Mt/G0e3x9j83VuM1wflbAGTITO+VZBRKZpvhWS6Z6mNzNhc6T2PX2OvNMDC7PsUlTJeq7O4kb3M1fmkmk1DVA==", "cpu": [ "arm" ], @@ -4472,15 +4595,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.0.tgz", - "integrity": "sha512-CiI955Q+XZmBBZ7cQqQg0MhGEFwZIgSpJnjPfWBt3iOYP8aE6nZpNOkmD7O8XcN/nEwwyeCOF8euXqEStwsk8w==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.0.3.tgz", + "integrity": "sha512-3sUnzts/dquniJ+IXrJJcxnwl4jqbteJJhSXtrYlp+Kd2nNqgQIqdKvHy2hwUBDD0NvzpDdz6bTwcY2s1ghsAg==", "cpu": [ "arm64" ], @@ -4489,15 +4609,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.0.tgz", - "integrity": "sha512-Iy9DpvVisxsfNh4gOinmMQ4cLWdBlgvt1wmry1UwvcXg479p1oJQ1Kp1wksUZoWYqrAG8VPZUmkE0f7gjyHTGg==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.0.3.tgz", + "integrity": "sha512-gBr2QXy5zmyut/UHbQLKV+wq6IKJ+5AACsczH4JdUvr58e0GunIVWTArgHMZwDJxbY4hAxtwgB8rFD4Bi6noxQ==", "cpu": [ "arm64" ], @@ -4506,19 +4623,15 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.0.tgz", - "integrity": "sha512-kZrrXXzVSbqwmdTmQ9xL4Jhi0/FSLrePSxYCL9oOM3Rsj0lmo/aC9kz4NBv1ZzuqT7fumpBOnhqiL1QyhOWOeQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.1.tgz", + "integrity": "sha512-Kzru44beVKAmSG84ShuMIIfyu2Uu5r8gsHdtiQPBIOGkZa0Z/e6YtUxcN3w1UZ7yvvzoQ4pQLvqU6UZRSWZtEg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" @@ -4528,9 +4641,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.0.tgz", - "integrity": "sha512-0l9jEMN8NhULKYCFiDF7QVpMMNG40duya+OF8dH0OzFj52N0zTsvsgLY72TIhslCB/cC74oAzsmWEIiFslscnA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.0.3.tgz", + "integrity": "sha512-Rg0xjGoikWbhnEANSP3KwRtYHJmq1P1pv31zvPjeZI9nFNLyCRsJYSpnlE5BfP8a8XlzdqlLO0Df0XmL5Fdyew==", "cpu": [ "x64" ], @@ -4539,15 +4652,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.0.tgz", - "integrity": "sha512-5miZJmRSwx1jybBsiB3NGocXL9TxGdT2D+dOqR2fsLklpGz0ItEWm8+i8lhDjgOdAr2nFcuQUfQMY57f9FOHrA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.0.3.tgz", + "integrity": "sha512-LyxCffeta+4ad70043ZQ1/lFdOzpFpx8zmwVLhASTmZ6jdrePKPyxn+uSv0AWOiEVpGiZHr3Yh47YfrlWBO+wA==", "cpu": [ "arm64" ], @@ -4556,19 +4666,15 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.0.tgz", - "integrity": "sha512-0P5r+bDuSNvoWys+6C1/KqGpYlqwSHpigCcyRzR62iZpT3OooZv+nWO06RlURkxMR8LNvYXTSSLvoLkjxqM8uQ==", + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.1.tgz", + "integrity": "sha512-6c2fVEPdPwJdnRbckBatRDF/g6JAp6p3Mfl90DpuaEF2DZC5pmCXKOsXE0aSIZ+gODom2JIchM++2KmDZPJUoA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" @@ -4578,22 +4684,42 @@ } }, "node_modules/@nx/workspace": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.8.0.tgz", - "integrity": "sha512-FdaHA5ISHSN+RyHswAAx+2A9HC77kWeFgeucdX2NSBs2QK2Lzg2Et639RzR1sYk2gYTP6tOkQXHHGKcg3jmiYQ==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.0.3.tgz", + "integrity": "sha512-yM1hCR7kbN0VuXum2P6m5SY+CXqSAez5fJYh8vHtXRfnzGRoerQJS2G2ZYQ828sxLeXB4Tft50IUUAgHEVh8tw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.0", + "@nx/devkit": "21.0.3", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.8.0", + "nx": "21.0.3", "picomatch": "4.0.2", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } }, + "node_modules/@nx/workspace/node_modules/@nx/devkit": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.0.3.tgz", + "integrity": "sha512-PnEZWenJ3fOoAU+Es9v0xxANyrROtFj+rjDHCjfyqGs3jMihMyTsCDQLpsjdnrUF5jjp9VUawfms76ocSLmwpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": "21.0.3" + } + }, "node_modules/@nx/workspace/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4637,6 +4763,19 @@ "node": ">=7.0.0" } }, + "node_modules/@nx/workspace/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@open-draft/deferred-promise": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", @@ -4664,7 +4803,6 @@ "resolved": "https://registry.npmjs.org/@originjs/vite-plugin-federation/-/vite-plugin-federation-1.4.1.tgz", "integrity": "sha512-Uo08jW5pj1t58OUKuZNkmzcfTN2pqeVuAWCCiKf/75/oll4Efq4cHOqSE1FXMlvwZNGDziNdDyBbQ5IANem3CQ==", "dev": true, - "license": "MulanPSL-2.0", "dependencies": { "estree-walker": "^3.0.2", "magic-string": "^0.27.0" @@ -4675,9 +4813,9 @@ } }, "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-5.2.0.tgz", - "integrity": "sha512-3v2eS1swAUZ/OPrBpTB5Imn4Xhbz4zKPa/mugnYCAC4pVt/miBQLBNciBRZG8oyHiGmLtjw/qanZC36uB6MITQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-5.3.0.tgz", + "integrity": "sha512-hXem5ZAguS7IlSiHg/LK0tEfLj4eUo+9U6DaFwwBEGd0L0VIF9LmuiHydRyOrdnnmi9iAAFMAn/wl2cUoiuruA==", "cpu": [ "arm64" ], @@ -4688,9 +4826,9 @@ ] }, "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-5.2.0.tgz", - "integrity": "sha512-6uhnlZU+CBULQAjcwQ4nerA76xDEvPFtHpTzXhEoitr4a3Ks5H92X4uuLT0C0FW3RfhIVL8Lpp9pLYHN3oAvug==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-5.3.0.tgz", + "integrity": "sha512-wgSwfsZkRbuYCIBLxeg1bYrtKnirAy+IJF0lwfz4z08clgdNBDbfGECJe/cd0csIZPpRcvPFe8317yf31sWhtA==", "cpu": [ "x64" ], @@ -4701,9 +4839,9 @@ ] }, "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-5.2.0.tgz", - "integrity": "sha512-6TCXw/rPnhBLlS/Rg7QHO9lBjwJSbUJMhd9POpVpQEK1S9viEAl8JPdxXuNCEDPJHSmpMrGt6+DTjQxQ5J1kpQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-5.3.0.tgz", + "integrity": "sha512-kzeE2WHgcRMmWjB071RdwEV5Pwke4o0WWslCKoh8if1puvxIxfzu3o7g6P2+v77BP5qop4cri+uvLABSO0WZjg==", "cpu": [ "x64" ], @@ -4714,9 +4852,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-5.2.0.tgz", - "integrity": "sha512-egjFYBKixAjekmiImCYkpwSo0bnZJOieJIc6cXePuCih2R5nFjkS1F8tSlJ18GdRZ1MmYveM6THmIHJCpnDqaQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-5.3.0.tgz", + "integrity": "sha512-I8np34yZP/XfIkZNDbw3rweqVgfjmHYpNX3xnJZWg+f4mgO9/UNWBwetSaqXeDZqvIch/aHak+q4HVrQhQKCqg==", "cpu": [ "arm" ], @@ -4727,9 +4865,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-5.2.0.tgz", - "integrity": "sha512-Cizb3uHnEc2MYZeRnp+BxmDyAKo7szJxbTW4BgPvs+XicYZI0kc/qcZlHRoJImalBqvve+ZObasRqCS1zqub9A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-5.3.0.tgz", + "integrity": "sha512-u2ndfeEUrW898eXM+qPxIN8TvTPjI90NDQBRgaxxkOfNw3xaotloeiZGz5+Yzlfxgvxr9DY9FdYkqhUhSnGhOw==", "cpu": [ "arm64" ], @@ -4740,9 +4878,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-5.2.0.tgz", - "integrity": "sha512-rDiRuIvQXa9MI8oiEbCVnU7dBVDuo74456dN3Bf30/Joz6FVBhYrhoOTxtxH+WgC38qCUWWuBjhFaLRLDLaMRw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-5.3.0.tgz", + "integrity": "sha512-TzbjmFkcnESGuVItQ2diKacX8vu5G0bH3BHmIlmY4OSRLyoAlrJFwGKAHmh6C9+Amfcjo2rx8vdm7swzmsGC6Q==", "cpu": [ "arm64" ], @@ -4753,9 +4891,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-5.2.0.tgz", - "integrity": "sha512-QRdE2DOO9e4oYzYyf/iRnLiomvs3bRedRTvFHbTAcL0JJfsicLLK4T7J5BP76sVum0QUAVJm+JqgEUmk8ETGXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-5.3.0.tgz", + "integrity": "sha512-NH3pjAqh8nuN29iRuRfTY42Vn03ctoR9VE8llfoUKUfhHUjFHYOXK5VSkhjj1usG8AeuesvqrQnLptCRQVTi/Q==", "cpu": [ "riscv64" ], @@ -4766,9 +4904,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-5.2.0.tgz", - "integrity": "sha512-bD8HDjnEziw1+Y7uowIRI9JaJd6vldLoVXOZaSeBRjofWk8rQOOyxfNTVymIrcmPE8rZZJfkDdGyCnTJP0h9vA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-5.3.0.tgz", + "integrity": "sha512-tuZtkK9sJYh2MC2uhol1M/8IMTB6ZQ5jmqP2+k5XNXnOb/im94Y5uV/u2lXwVyIuKHZZHtr+0d1HrOiNahoKpw==", "cpu": [ "s390x" ], @@ -4779,9 +4917,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-5.2.0.tgz", - "integrity": "sha512-eWEHGjkrk4Dsul7Wyt6X9UMxZ+e2zKgpRG2kbSZOQQTXf6ZnU9+lRAyAgf2X1qdLjmH0GT54wIak7fhSsuNWLA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-5.3.0.tgz", + "integrity": "sha512-VzhPYmZCtoES/ThcPdGSmMop7JlwgqtSvlgtKCW15ByV2JKyl8kHAHnPSBfpIooXb0ehFnRdxFtL9qtAEWy01g==", "cpu": [ "x64" ], @@ -4792,9 +4930,9 @@ ] }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-5.2.0.tgz", - "integrity": "sha512-iojrjytDOdg4aWm25ak7qpTQwWj+D7O+duHBL2rQhDxIY1K4eysJwobWck0yzJ6VlONaQF6RLt+YeDpGoKV+ww==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-5.3.0.tgz", + "integrity": "sha512-Hi39cWzul24rGljN4Vf1lxjXzQdCrdxO5oCT7KJP4ndSlqIUODJnfnMAP1YhcnIRvNvk+5E6sZtnEmFUd/4d8Q==", "cpu": [ "x64" ], @@ -4805,25 +4943,25 @@ ] }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-5.2.0.tgz", - "integrity": "sha512-Lgv3HjKUXRa/xMCgBAkwKQcPljAn5IRicjgoPBXGUhghzK/9yF2DTf7aXdVPvRxFKjvcyWtzpzPV2pzYCuBaBA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-5.3.0.tgz", + "integrity": "sha512-ddujvHhP3chmHnSXRlkPVUeYj4/B7eLZwL4yUid+df3WCbVh6DgoT9RmllZn21AhxgKtMdekDdyVJYKFd8tl4A==", "cpu": [ "wasm32" ], "dev": true, "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.8" + "@napi-rs/wasm-runtime": "^0.2.9" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz", - "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", + "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", "dev": true, "optional": true, "dependencies": { @@ -4833,9 +4971,9 @@ } }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-5.2.0.tgz", - "integrity": "sha512-VK5yEOdGbIrb89gUtVIw2IVP4r0rEhiwVLQOD37vZhvrt5iY0FHOTtMz9ZsWI0anZ0swt26U2wRcJYT0/AsBfw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-5.3.0.tgz", + "integrity": "sha512-j1YYPLvUkMVNKmIFQZZJ7q6Do4cI3htUnyxNLwDSBVhSohvPIK2VG+IdtOAlWZGa7v+phEZsHfNbXVwB0oPYFQ==", "cpu": [ "arm64" ], @@ -4846,9 +4984,9 @@ ] }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-5.2.0.tgz", - "integrity": "sha512-BhIcyjr/gTafUrdOhd1EC5H4LeUSKK9uQIG2RSyMMH0Cq1yBacTb1yvLowhP/6e4ncCGByXEkW7sWGowCfSY8A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-5.3.0.tgz", + "integrity": "sha512-LT9eOPPUqfZscQRd5mc08RBeDWOQf+dnOrKnanMallTGPe6g7+rcAlFTA8SWoJbcD45PV8yArFtCmSQSpzHZmg==", "cpu": [ "x64" ], @@ -5147,279 +5285,259 @@ "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", - "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", - "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", - "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", - "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", - "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", - "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", - "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", - "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", - "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", - "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", - "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", - "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", - "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", - "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", - "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", - "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", - "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", - "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", - "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", - "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -5601,6 +5719,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/@sigstore/sign/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@sigstore/tuf": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", @@ -5710,29 +5837,12 @@ "tslib": "^2.6.3" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@swc/core": ">= 1.4.13", - "typescript": ">= 4.3" - } - }, - "node_modules/@swc-node/register/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@swc/core": ">= 1.4.13", + "typescript": ">= 4.3" } }, "node_modules/@swc-node/sourcemap-support": { @@ -5756,12 +5866,11 @@ } }, "node_modules/@swc/core": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.22.tgz", - "integrity": "sha512-mjPYbqq8XjwqSE0hEPT9CzaJDyxql97LgK4iyvYlwVSQhdN1uK0DBG4eP9PxYzCS2MUGAXB34WFLegdUj5HGpg==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", + "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", "dev": true, "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.21" @@ -5774,16 +5883,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.22", - "@swc/core-darwin-x64": "1.11.22", - "@swc/core-linux-arm-gnueabihf": "1.11.22", - "@swc/core-linux-arm64-gnu": "1.11.22", - "@swc/core-linux-arm64-musl": "1.11.22", - "@swc/core-linux-x64-gnu": "1.11.22", - "@swc/core-linux-x64-musl": "1.11.22", - "@swc/core-win32-arm64-msvc": "1.11.22", - "@swc/core-win32-ia32-msvc": "1.11.22", - "@swc/core-win32-x64-msvc": "1.11.22" + "@swc/core-darwin-arm64": "1.11.24", + "@swc/core-darwin-x64": "1.11.24", + "@swc/core-linux-arm-gnueabihf": "1.11.24", + "@swc/core-linux-arm64-gnu": "1.11.24", + "@swc/core-linux-arm64-musl": "1.11.24", + "@swc/core-linux-x64-gnu": "1.11.24", + "@swc/core-linux-x64-musl": "1.11.24", + "@swc/core-win32-arm64-msvc": "1.11.24", + "@swc/core-win32-ia32-msvc": "1.11.24", + "@swc/core-win32-x64-msvc": "1.11.24" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -5795,14 +5904,13 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.22.tgz", - "integrity": "sha512-upSiFQfo1TE2QM3+KpBcp5SrOdKKjoc+oUoD1mmBDU2Wv4Bjjv16Z2I5ADvIqMV+b87AhYW+4Qu6iVrQD7j96Q==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", + "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -5812,14 +5920,13 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.22.tgz", - "integrity": "sha512-8PEuF/gxIMJVK21DjuCOtzdqstn2DqnxVhpAYfXEtm3WmMqLIOIZBypF/xafAozyaHws4aB/5xmz8/7rPsjavw==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", + "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -5829,14 +5936,13 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.22.tgz", - "integrity": "sha512-NIPTXvqtn9e7oQHgdaxM9Z/anHoXC3Fg4ZAgw5rSGa1OlnKKupt5sdfJamNggSi+eAtyoFcyfkgqHnfe2u63HA==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", + "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", "cpu": [ "arm" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -5846,14 +5952,13 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.22.tgz", - "integrity": "sha512-xZ+bgS60c5r8kAeYsLNjJJhhQNkXdidQ277pUabSlu5GjR0CkQUPQ+L9hFeHf8DITEqpPBPRiAiiJsWq5eqMBg==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", + "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -5863,14 +5968,13 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.22.tgz", - "integrity": "sha512-JhrP/q5VqQl2eJR0xKYIkKTPjgf8CRsAmRnjJA2PtZhfQ543YbYvUqxyXSRyBOxdyX8JwzuAxIPEAlKlT7PPuQ==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", + "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -5880,14 +5984,13 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.22.tgz", - "integrity": "sha512-htmAVL+U01gk9GyziVUP0UWYaUQBgrsiP7Ytf6uDffrySyn/FclUS3MDPocNydqYsOpj3OpNKPxkaHK+F+X5fg==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", + "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -5897,14 +6000,13 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.22.tgz", - "integrity": "sha512-PL0VHbduWPX+ANoyOzr58jBiL2VnD0xGSFwPy7NRZ1Pr6SNWm4jw3x2u6RjLArGhS5EcWp64BSk9ZxqmTV3FEg==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", + "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -5914,14 +6016,13 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.22.tgz", - "integrity": "sha512-moJvFhhTVGoMeEThtdF7hQog80Q00CS06v5uB+32VRuv+I31+4WPRyGlTWHO+oY4rReNcXut/mlDHPH7p0LdFg==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", + "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -5931,14 +6032,13 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.22.tgz", - "integrity": "sha512-/jnsPJJz89F1aKHIb5ScHkwyzBciz2AjEq2m9tDvQdIdVufdJ4SpEDEN9FqsRNRLcBHjtbLs6bnboA+B+pRFXw==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", + "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", "cpu": [ "ia32" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -5948,14 +6048,13 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.11.22", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.22.tgz", - "integrity": "sha512-lc93Y8Mku7LCFGqIxJ91coXZp2HeoDcFZSHCL90Wttg5xhk5xVM9uUCP+OdQsSsEixLF34h5DbT9ObzP8rAdRw==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", + "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -6315,9 +6414,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", "dev": true, "license": "MIT", "dependencies": { @@ -6391,21 +6490,20 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.0.tgz", - "integrity": "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.0.tgz", + "integrity": "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/type-utils": "8.31.0", - "@typescript-eslint/utils": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/type-utils": "8.32.0", + "@typescript-eslint/utils": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6421,16 +6519,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", - "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.0.tgz", + "integrity": "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/typescript-estree": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4" }, "engines": { @@ -6446,14 +6543,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", - "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.0.tgz", + "integrity": "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0" + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6464,16 +6560,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.0.tgz", - "integrity": "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.0.tgz", + "integrity": "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/utils": "8.31.0", + "@typescript-eslint/typescript-estree": "8.32.0", + "@typescript-eslint/utils": "8.32.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6488,11 +6583,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", - "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.0.tgz", + "integrity": "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6502,20 +6596,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", - "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.0.tgz", + "integrity": "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6556,16 +6649,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.0.tgz", - "integrity": "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.0.tgz", + "integrity": "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==", "dev": true, - "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/typescript-estree": "8.32.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6580,13 +6672,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", - "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.0.tgz", + "integrity": "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/types": "8.32.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -6602,7 +6693,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6611,182 +6701,182 @@ } }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.6.3.tgz", - "integrity": "sha512-+BbDAtwT4AVUyGIfC6SimaA6Mi/tEJCf5OYV5XQg7WIOW0vyD15aVgDLvsQscIZxgz42xB6DDqR7Kv6NBQJrEg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz", + "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.6.3.tgz", - "integrity": "sha512-q6qMXI8wT0u0GUns/L26kYHdX2du4yEhwxrXjPj/egvysI8XqcTyjnbWQm3NSJPw0Un2wvKPh0WuoTSJEZgbqw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz", + "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.6.3.tgz", - "integrity": "sha512-/7xs7QNNW17VZrFBf+2C95G72rA5c0YGtR18pvWrzM2tVPLrTsKnLl32hi3CG7F6cwwYRy7h61BIkMHh7qaZkw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz", + "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.6.3.tgz", - "integrity": "sha512-2xv5cUQCt+eYuq5tPF4AHStpzE8i8qdYnhitpvDv9vxzOZ5a0sdzgA8WHYgFe15dP469YOSivenMMdpuRcgE9Q==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz", + "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.6.3.tgz", - "integrity": "sha512-4KaZxKIeFt/jAOD/zuBOLb5yyZk/XG9FKf5IXpDP21NcYxeus/os6w+NCK7wjSJKbOpHZhwfkAYLkfujkAOFkw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz", + "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.6.3.tgz", - "integrity": "sha512-dJoZsZoWwvfS+khk0jkX6KnLL1T2vbRfsxinOR3PghpRKmMTnasEVAxmrXLQFNKqVKZV/mU7gHzWhiBMhbq3bw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz", + "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.6.3.tgz", - "integrity": "sha512-2Y6JcAY9e557rD6O53Zmeblrfu48vQfl5CrrKjt0/2J1Op/pKX3WI8TOh0gs5T4qX9uJDqdte11SNUssckdfUA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz", + "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.6.3.tgz", - "integrity": "sha512-kvcEe+j0De/DEfTNkte2xtmwSL4/GMesArcqmSgRqoOaGknUYY3whJ/3GygYKNMe82vvao4PaQkBlCrxhi88wQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz", + "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.6.3.tgz", - "integrity": "sha512-fruY8swKre2H0J96h8HE+kN3iUnDR3VDd2wxBn4BxDw+5g7GOHBz5x1533l9mqAqHI4b2dMBECI4RtQdMOiBeQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz", + "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz", + "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.6.3.tgz", - "integrity": "sha512-1w0eaSxm9e69TEj9eArZDPQ7mL2VL6Bb4AXeLOdQoe5SNQpZaL6RlwGm7ss9xErwC7c9Hvob/ZZF7i8xYT55zg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz", + "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.6.3.tgz", - "integrity": "sha512-ymUqs8AQyHTQQ50aN7EcMV47gKh5yKg8a0+SWSuDZEl6eGEOKn590D/iMDydS5KoWbMTy6/pBipS4vsPUEjYVw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", + "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.6.3.tgz", - "integrity": "sha512-LSfz1cguLZD+c00aTVbtrqX1x1sIR38M2lLYW3CZTGfippkg56Hf8kejHPA8H26OwB71c9/W78BCbgcdnEW+jQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", + "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.6.3.tgz", - "integrity": "sha512-gehKZDmNDS2QTxefwPBLi0RJgOQ0dIoD/osCcNboDb3+ZKcbSMBaF3+4R5vj+XdV0QBdZg3vXwdwZswfEkQOcA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz", + "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==", "cpu": [ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" @@ -6800,7 +6890,6 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.0", @@ -6809,42 +6898,39 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.6.3.tgz", - "integrity": "sha512-CzTmpDxwkoYl69stmlJzcVWITQEC6Vs8ASMZMEMbFO+q1Dw0GtpRjAA6X76zGcLOADDwzugx1vpT6YXarrhpTA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz", + "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.6.3.tgz", - "integrity": "sha512-j+n1gWkfu4Q/octUHXU1p1IOrh+B27vpA7ec81RB6nXCml5u7F0B7SrCZU+HqajxjVqgEQEYOcRCb1yzfwfsWw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz", + "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.6.3.tgz", - "integrity": "sha512-n33drkd84G5Mu2BkUGawZXmm+IFPuRv7GpODfwEBs/CzZq2+BIZyAZmb03H9IgNbd7xaohZbtZ4/9Gb0xo5ssw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", + "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -7156,27 +7242,18 @@ "dev": true }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -7696,9 +7773,9 @@ } }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -8030,6 +8107,12 @@ "node": ">= 0.8" } }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -8113,6 +8196,26 @@ "node": ">=8.12.0" } }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -8224,9 +8327,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -8243,10 +8346,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -8508,9 +8611,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", "dev": true, "funding": [ { @@ -9117,13 +9220,14 @@ } }, "node_modules/commitlint": { - "version": "19.8.0", - "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-19.8.0.tgz", - "integrity": "sha512-O5waRm0RsjH1g2sT4ifTV58sBYW3wPjfclsdicj1NWUyF91aF0fSqFgKC8EEOUi9RRLKBOhlJarS6V1jWIUx1Q==", + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-19.8.1.tgz", + "integrity": "sha512-j7jojdmHrVOZ16gnjK2nbQuzdwA9TpxS9iNb9Q9QS3ytgt3JZVIGmsNbCuhmnsJWGspotlQ34yH8n1HvIKImiQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/cli": "^19.8.0", - "@commitlint/types": "^19.8.0" + "@commitlint/cli": "^19.8.1", + "@commitlint/types": "^19.8.1" }, "bin": { "commitlint": "cli.js" @@ -9245,6 +9349,19 @@ "node": ">= 0.8.0" } }, + "node_modules/compression/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/compression/node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -9263,12 +9380,48 @@ "ms": "2.0.0" } }, + "node_modules/compression/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -9298,9 +9451,21 @@ } }, "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { "node": ">= 0.6" @@ -9548,10 +9713,19 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/core-js": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", - "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", + "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", "dev": true, "hasInstallScript": true, "funding": { @@ -9560,9 +9734,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "dev": true, "dependencies": { "browserslist": "^4.24.4" @@ -9572,6 +9746,19 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -9934,12 +10121,12 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -9950,12 +10137,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/decimal.js": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", @@ -10091,9 +10272,9 @@ } }, "node_modules/del/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "dev": true, "engines": { "node": ">= 4" @@ -10149,6 +10330,15 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dependency-tree": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.1.1.tgz", @@ -10486,6 +10676,12 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -10502,9 +10698,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.136", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", - "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", + "version": "1.5.150", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz", + "integrity": "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==", "dev": true }, "node_modules/emittery": { @@ -10525,6 +10721,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -10535,19 +10740,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -10720,9 +10912,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true }, "node_modules/es-object-atoms": { @@ -10788,6 +10980,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -10831,11 +11029,10 @@ } }, "node_modules/eslint": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -10843,11 +11040,12 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -10871,7 +11069,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -10892,13 +11091,17 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", - "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } @@ -10928,7 +11131,6 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.3.4.tgz", "integrity": "sha512-buzw5z5VtiQMysYLH9iW9BV04YyZebsw+gPi+c4FCjfS9i6COYOrEWw9t3m3wA9PFBfqcBCqWf32qrXLbwafDw==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.4.0", "get-tsconfig": "^4.10.0", @@ -10957,23 +11159,6 @@ } } }, - "node_modules/eslint-import-resolver-typescript/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", @@ -11204,9 +11389,9 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "58.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-58.0.0.tgz", - "integrity": "sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw==", + "version": "59.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz", + "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", @@ -11216,12 +11401,12 @@ "clean-regexp": "^1.0.0", "core-js-compat": "^3.41.0", "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", "globals": "^16.0.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", - "read-package-up": "^11.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", "semver": "^7.7.1", @@ -11238,9 +11423,9 @@ } }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", - "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", "dev": true, "engines": { "node": ">=18" @@ -11453,15 +11638,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -11573,6 +11749,15 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -11588,6 +11773,27 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", + "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", + "dev": true, + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -11654,6 +11860,63 @@ "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -11665,7 +11928,19 @@ "tmp": "^0.0.33" }, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/external-editor/node_modules/tmp": { @@ -11765,7 +12040,6 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, - "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -11910,6 +12184,23 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -12110,6 +12401,43 @@ "node": ">= 6" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/front-matter": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", @@ -12503,6 +12831,7 @@ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, + "license": "MIT", "dependencies": { "ini": "4.1.1" }, @@ -12644,9 +12973,9 @@ "dev": true }, "node_modules/graphql": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", - "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -12858,6 +13187,22 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -13003,12 +13348,12 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -13116,6 +13461,7 @@ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13142,18 +13488,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/index-to-position": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", - "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -13181,6 +13515,7 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -13318,6 +13653,15 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", @@ -14357,9 +14701,9 @@ } }, "node_modules/jest-circus/node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -15827,13 +16171,13 @@ "dev": true }, "node_modules/json-stable-stringify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz", - "integrity": "sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", "dev": true, "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" @@ -16076,11 +16420,10 @@ } }, "node_modules/lint-staged": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.1.tgz", - "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==", + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", + "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", @@ -16112,23 +16455,6 @@ "node": ">=18" } }, - "node_modules/lint-staged/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/lint-staged/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -16264,9 +16590,9 @@ } }, "node_modules/listr2": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.2.tgz", - "integrity": "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", + "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", @@ -16441,7 +16767,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -16481,7 +16808,8 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.map": { "version": "4.6.0", @@ -16505,7 +16833,8 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.pickby": { "version": "4.6.0", @@ -16516,13 +16845,15 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.startcase": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.tostring": { "version": "4.1.4", @@ -16539,7 +16870,8 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -17112,6 +17444,15 @@ "node": ">=8" } }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/make-fetch-happen/node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -17280,6 +17621,15 @@ "is-buffer": "~1.1.6" } }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/meow": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", @@ -17298,6 +17648,18 @@ "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", "dev": true }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -17351,19 +17713,21 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -17716,9 +18080,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msw": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.5.tgz", - "integrity": "sha512-00MyTlY3TJutBa5kiU+jWiz2z5pNJDYHn2TgPkGkh92kMmNH43RqvMXd8y/7HxNn8RjzUbvZWYZjcS36fdb6sw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.8.0.tgz", + "integrity": "sha512-tKf69ybtgL6t5jKegZ/EUCsWO05ndII75MjVVvQ/r6Al+Q2to9s4GMOqlvJk51j0gWwgXu4t7IJApvCXlqJmQA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -17761,9 +18125,9 @@ } }, "node_modules/msw/node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "engines": { "node": ">=16" @@ -17806,11 +18170,10 @@ } }, "node_modules/napi-postinstall": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.1.5.tgz", - "integrity": "sha512-HI5bHONOUYqV+FJvueOSgjRxHTLB25a3xIv59ugAxFe7xRNbW96hyYbMbsKzl+QvFV9mN/SrtHwiU+vYhMwA7Q==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.3.tgz", + "integrity": "sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==", "dev": true, - "license": "MIT", "bin": { "napi-postinstall": "lib/cli.js" }, @@ -17828,9 +18191,9 @@ "dev": true }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "engines": { "node": ">= 0.6" @@ -18282,6 +18645,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/npm-registry-fetch/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", @@ -18344,9 +18716,9 @@ "dev": true }, "node_modules/nx": { - "version": "20.8.0", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.0.tgz", - "integrity": "sha512-+BN5B5DFBB5WswD8flDDTnr4/bf1VTySXOv60aUAllHqR+KS6deT0p70TTMZF4/A2n/L2UCWDaDro37MGaYozA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.0.3.tgz", + "integrity": "sha512-MWKucgA00TRjMBsuGbAS6HrCnOVwktU7Zxxw06Rfl0ue9tfTqbZX5iiNnb6M7b2wPQm9zcQXEq3DVBkPP8wUNw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -18380,6 +18752,7 @@ "string-width": "^4.2.3", "tar-stream": "~2.2.0", "tmp": "~0.2.1", + "tree-kill": "^1.2.2", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", "yaml": "^2.6.0", @@ -18390,17 +18763,20 @@ "nx": "bin/nx.js", "nx-cloud": "bin/nx-cloud.js" }, + "engines": { + "node": "^20.19.0 || ^22.12.0" + }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.0", - "@nx/nx-darwin-x64": "20.8.0", - "@nx/nx-freebsd-x64": "20.8.0", - "@nx/nx-linux-arm-gnueabihf": "20.8.0", - "@nx/nx-linux-arm64-gnu": "20.8.0", - "@nx/nx-linux-arm64-musl": "20.8.0", - "@nx/nx-linux-x64-gnu": "20.8.0", - "@nx/nx-linux-x64-musl": "20.8.0", - "@nx/nx-win32-arm64-msvc": "20.8.0", - "@nx/nx-win32-x64-msvc": "20.8.0" + "@nx/nx-darwin-arm64": "21.0.3", + "@nx/nx-darwin-x64": "21.0.3", + "@nx/nx-freebsd-x64": "21.0.3", + "@nx/nx-linux-arm-gnueabihf": "21.0.3", + "@nx/nx-linux-arm64-gnu": "21.0.3", + "@nx/nx-linux-arm64-musl": "21.0.3", + "@nx/nx-linux-x64-gnu": "21.0.3", + "@nx/nx-linux-x64-musl": "21.0.3", + "@nx/nx-win32-arm64-msvc": "21.0.3", + "@nx/nx-win32-x64-msvc": "21.0.3" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -18415,6 +18791,62 @@ } } }, + "node_modules/nx/node_modules/@nx/nx-darwin-arm64": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.0.3.tgz", + "integrity": "sha512-UQxDwhLcA1ERv4u1GiNgb2yhTHflWE8iOfayApPfYD0eSjBUMj30/s2E1RVq5Tx9TxYtmFVwz+C8DxOVWKu3OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/nx/node_modules/@nx/nx-darwin-x64": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.0.3.tgz", + "integrity": "sha512-ZR9a2ysE4nrQ2VTQxZa2w76rr9rA9kw61Oy7sp2rlKeqr8yyKynZgZmuCTnOOn3LCOUl072wtGCIS85SFSeGug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/nx/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.0.3.tgz", + "integrity": "sha512-hwm/ER8LC1Dkh1CNIx9D3GqYFdX99StyDMV1A+W9fnIehJmFq8Om0HrbLrJAFIFMvQpVxwMjDO39q6Kf/UWyhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/nx/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.0.3.tgz", + "integrity": "sha512-1lyRNwjDax8Nvemt8wpbYiyRjIvrnBrzZTEkm7z5rDV2RX2Ik06EOZHWWtqHmdfx1EPV2omvVWRmmqLHI98YLA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/nx/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -18639,6 +19071,18 @@ "component-each": "*" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", @@ -18819,27 +19263,27 @@ } }, "node_modules/oxc-resolver": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-5.2.0.tgz", - "integrity": "sha512-ce0rdG5Y0s1jhcvh2Zc6sD+fTw/WA4pUKWrPmjbniZjC/m6pPob2I2Pkz8T0YzdWsbAC98E00Bc7KNB1B6Tolg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-5.3.0.tgz", + "integrity": "sha512-FHqtZx0idP5QRPSNcI5g2ItmADg7fhR3XIeWg5eRMGfp44xqRpfkdvo+EX4ZceqV9bxvl0Z8vaqMqY0gYaNYNA==", "dev": true, "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { - "@oxc-resolver/binding-darwin-arm64": "5.2.0", - "@oxc-resolver/binding-darwin-x64": "5.2.0", - "@oxc-resolver/binding-freebsd-x64": "5.2.0", - "@oxc-resolver/binding-linux-arm-gnueabihf": "5.2.0", - "@oxc-resolver/binding-linux-arm64-gnu": "5.2.0", - "@oxc-resolver/binding-linux-arm64-musl": "5.2.0", - "@oxc-resolver/binding-linux-riscv64-gnu": "5.2.0", - "@oxc-resolver/binding-linux-s390x-gnu": "5.2.0", - "@oxc-resolver/binding-linux-x64-gnu": "5.2.0", - "@oxc-resolver/binding-linux-x64-musl": "5.2.0", - "@oxc-resolver/binding-wasm32-wasi": "5.2.0", - "@oxc-resolver/binding-win32-arm64-msvc": "5.2.0", - "@oxc-resolver/binding-win32-x64-msvc": "5.2.0" + "@oxc-resolver/binding-darwin-arm64": "5.3.0", + "@oxc-resolver/binding-darwin-x64": "5.3.0", + "@oxc-resolver/binding-freebsd-x64": "5.3.0", + "@oxc-resolver/binding-linux-arm-gnueabihf": "5.3.0", + "@oxc-resolver/binding-linux-arm64-gnu": "5.3.0", + "@oxc-resolver/binding-linux-arm64-musl": "5.3.0", + "@oxc-resolver/binding-linux-riscv64-gnu": "5.3.0", + "@oxc-resolver/binding-linux-s390x-gnu": "5.3.0", + "@oxc-resolver/binding-linux-x64-gnu": "5.3.0", + "@oxc-resolver/binding-linux-x64-musl": "5.3.0", + "@oxc-resolver/binding-wasm32-wasi": "5.3.0", + "@oxc-resolver/binding-win32-arm64-msvc": "5.3.0", + "@oxc-resolver/binding-win32-x64-msvc": "5.3.0" } }, "node_modules/p-limit": { @@ -18912,9 +19356,9 @@ "dev": true }, "node_modules/package-manager-detector": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.1.0.tgz", - "integrity": "sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", "dev": true }, "node_modules/pacote": { @@ -19052,21 +19496,21 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", + "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", "dev": true, "engines": { "node": ">=0.12" @@ -19075,6 +19519,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/patch-package": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", @@ -19327,6 +19780,15 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -19349,9 +19811,9 @@ } }, "node_modules/portfinder": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.35.tgz", - "integrity": "sha512-73JaFg4NwYNAufDtS5FsFu/PdM49ahJrO1i44aCRsDWju1z5wuGDaqyFUQWR6aJoK2JPDWlaYYAGFNIGTSUHSw==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz", + "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", "dev": true, "dependencies": { "async": "^3.2.6", @@ -19361,23 +19823,6 @@ "node": ">= 10.12" } }, - "node_modules/portfinder/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -19587,7 +20032,20 @@ "sisteransi": "^1.0.5" }, "engines": { - "node": ">= 6" + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/proxy-from-env": { @@ -19612,7 +20070,6 @@ "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.12.tgz", "integrity": "sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w==", "dev": true, - "license": "MIT", "dependencies": { "@publint/pack": "^0.1.2", "package-manager-detector": "^1.1.0", @@ -19854,14 +20311,29 @@ } }, "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -20037,71 +20509,6 @@ "node": ">=10" } }, - "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", - "dev": true, - "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-package-up/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-package-up/node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-package-up/node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/read-pkg": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", @@ -20208,9 +20615,9 @@ } }, "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "engines": { "node": ">=16" @@ -20272,9 +20679,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "engines": { "node": ">=16" @@ -20373,21 +20780,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp-ast-analysis": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", @@ -20684,10 +21076,10 @@ "dev": true }, "node_modules/right-pad": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", - "integrity": "sha512-bYBjgxmkvTAfgIYy328fmkwhp39v8lwVgWhhrzxPV3yHtcSqyYKe9/XOhvW48UFjATg3VuJbpsp5822ACNvkmw==", - "deprecated": "Please use String.prototype.padEnd() over this package.", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.1.1.tgz", + "integrity": "sha512-eHfYN/4Pds8z4/LnF1LtZSQvWcU9HHU2A7iYtARpFO2fQqt2TP1vHCRTdkO9si7Zg3glo2qh1vgAmyDBO5FGRQ==", + "deprecated": "Use String.prototype.padEnd() instead", "dev": true, "engines": { "node": ">= 0.10" @@ -20707,11 +21099,10 @@ } }, "node_modules/rollup": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", - "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.7" }, @@ -20723,26 +21114,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.0", - "@rollup/rollup-android-arm64": "4.40.0", - "@rollup/rollup-darwin-arm64": "4.40.0", - "@rollup/rollup-darwin-x64": "4.40.0", - "@rollup/rollup-freebsd-arm64": "4.40.0", - "@rollup/rollup-freebsd-x64": "4.40.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", - "@rollup/rollup-linux-arm-musleabihf": "4.40.0", - "@rollup/rollup-linux-arm64-gnu": "4.40.0", - "@rollup/rollup-linux-arm64-musl": "4.40.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-gnu": "4.40.0", - "@rollup/rollup-linux-riscv64-musl": "4.40.0", - "@rollup/rollup-linux-s390x-gnu": "4.40.0", - "@rollup/rollup-linux-x64-gnu": "4.40.0", - "@rollup/rollup-linux-x64-musl": "4.40.0", - "@rollup/rollup-win32-arm64-msvc": "4.40.0", - "@rollup/rollup-win32-ia32-msvc": "4.40.0", - "@rollup/rollup-win32-x64-msvc": "4.40.0", + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" } }, @@ -21113,6 +21504,37 @@ "node": ">= 8" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/rudder-component-cookie": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/rudder-component-cookie/-/rudder-component-cookie-0.0.1.tgz", @@ -21211,10 +21633,24 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safe-push-apply": { "version": "1.0.0", @@ -21292,9 +21728,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -21339,6 +21775,28 @@ "semver": "bin/semver.js" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -21407,6 +21865,15 @@ "node": ">= 0.8" } }, + "node_modules/serve-handler/node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-handler/node_modules/mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", @@ -21446,6 +21913,30 @@ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "dev": true }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/serve/node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -21677,6 +22168,12 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21856,6 +22353,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sigstore/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -22176,26 +22682,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -22692,17 +23178,17 @@ "dev": true }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, - "license": "MIT", "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" @@ -22749,6 +23235,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/token-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", @@ -22791,6 +23286,15 @@ "node": ">=12" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -22833,7 +23337,6 @@ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz", "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", @@ -22891,9 +23394,9 @@ } }, "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "engines": { "node": ">=16" @@ -23071,6 +23574,15 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/tuf-js/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -23104,6 +23616,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -23282,6 +23808,7 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -23334,36 +23861,45 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unrs-resolver": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.6.3.tgz", - "integrity": "sha512-mYNIMmxlDcaepmUTNrBu2tEB/bRkLBUeAhke8XOnXYqSu/9dUk4cdFiJG1N4d5Q7Fii+9MpgavkxJpnXPqNhHw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", + "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { - "napi-postinstall": "^0.1.1" + "napi-postinstall": "^0.2.2" }, "funding": { "url": "https://github.com/sponsors/JounQin" }, "optionalDependencies": { - "@unrs/resolver-binding-darwin-arm64": "1.6.3", - "@unrs/resolver-binding-darwin-x64": "1.6.3", - "@unrs/resolver-binding-freebsd-x64": "1.6.3", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.6.3", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.6.3", - "@unrs/resolver-binding-linux-arm64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-arm64-musl": "1.6.3", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-s390x-gnu": "1.6.3", - "@unrs/resolver-binding-linux-x64-gnu": "1.6.3", - "@unrs/resolver-binding-linux-x64-musl": "1.6.3", - "@unrs/resolver-binding-wasm32-wasi": "1.6.3", - "@unrs/resolver-binding-win32-arm64-msvc": "1.6.3", - "@unrs/resolver-binding-win32-ia32-msvc": "1.6.3", - "@unrs/resolver-binding-win32-x64-msvc": "1.6.3" + "@unrs/resolver-binding-darwin-arm64": "1.7.2", + "@unrs/resolver-binding-darwin-x64": "1.7.2", + "@unrs/resolver-binding-freebsd-x64": "1.7.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-musl": "1.7.2", + "@unrs/resolver-binding-wasm32-wasi": "1.7.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" } }, "node_modules/update-browserslist-db": { @@ -23583,13 +24119,14 @@ } }, "node_modules/webpack": { - "version": "5.99.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz", - "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==", + "version": "5.99.8", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", + "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", @@ -23606,7 +24143,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", @@ -23637,28 +24174,37 @@ "node": ">=10.13.0" } }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "iconv-lite": "0.6.3" + "mime-db": "1.52.0" }, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "iconv-lite": "0.6.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, "node_modules/whatwg-fetch": { @@ -23948,9 +24494,9 @@ } }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -24076,9 +24622,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "peerDependencies": { + "zod": "^3.24.1" + } + }, "packages/analytics-js": { "name": "@rudderstack/analytics-js", - "version": "3.17.0", + "version": "3.18.0", "license": "Elastic-2.0", "dependencies": { "@preact/signals-core": "1.8.0", @@ -24094,7 +24658,7 @@ }, "packages/analytics-js-common": { "name": "@rudderstack/analytics-js-common", - "version": "3.18.0", + "version": "3.19.0", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", @@ -24112,7 +24676,7 @@ }, "packages/analytics-js-cookies": { "name": "@rudderstack/analytics-js-cookies", - "version": "0.4.24", + "version": "0.4.25", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js-common": "*" @@ -24121,7 +24685,7 @@ }, "packages/analytics-js-integrations": { "name": "@rudderstack/analytics-js-integrations", - "version": "3.13.2", + "version": "3.14.0", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", @@ -24141,7 +24705,7 @@ }, "packages/analytics-js-plugins": { "name": "@rudderstack/analytics-js-plugins", - "version": "3.8.1", + "version": "3.8.2", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js-common": "*", @@ -24152,14 +24716,14 @@ }, "packages/analytics-js-service-worker": { "name": "@rudderstack/analytics-js-service-worker", - "version": "3.2.24", + "version": "3.2.25", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", "@rudderstack/analytics-js-common": "*", "@vespaiach/axios-fetch-adapter": "0.3.1", "assert": "2.1.0", - "axios": "1.8.4", + "axios": "1.9.0", "axios-retry": "4.5.0", "component-type": "2.0.0", "join-component": "1.1.0", @@ -24168,13 +24732,13 @@ }, "devDependencies": { "@types/ms": "2.1.0", - "@types/node": "22.14.1", + "@types/node": "22.15.17", "jest-date-mock": "1.0.10" } }, "packages/analytics-v1.1": { "name": "rudder-sdk-js", - "version": "2.51.1", + "version": "2.51.2", "license": "Elastic-2.0", "dependencies": { "@lukeed/uuid": "2.0.1", @@ -24197,7 +24761,7 @@ }, "packages/sanity-suite": { "name": "@rudderstack/analytics-js-sanity-suite", - "version": "3.2.8", + "version": "3.2.9", "license": "Elastic-2.0", "dependencies": { "@rudderstack/analytics-js": "*", diff --git a/package.json b/package.json index 2be2c0fde8..bb74431c87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-monorepo", - "version": "3.83.0", + "version": "3.84.0", "private": true, "description": "Monorepo for RudderStack Analytics JS SDK", "workspaces": [ @@ -78,7 +78,7 @@ "@segment/top-domain": "3.0.1", "@vespaiach/axios-fetch-adapter": "0.3.1", "assert": "2.1.0", - "axios": "1.8.4", + "axios": "1.9.0", "axios-retry": "4.5.0", "component-each": "0.2.6", "component-emitter": "2.0.0", @@ -106,26 +106,26 @@ "storejs": "2.1.0" }, "devDependencies": { - "@babel/core": "7.26.10", - "@babel/eslint-parser": "7.27.0", - "@babel/plugin-transform-arrow-functions": "7.25.9", - "@babel/plugin-transform-class-properties": "7.25.9", - "@babel/plugin-transform-object-assign": "7.25.9", - "@babel/plugin-transform-private-methods": "7.25.9", - "@babel/plugin-transform-private-property-in-object": "7.25.9", - "@babel/plugin-transform-runtime": "7.26.10", - "@babel/preset-env": "7.26.9", - "@babel/preset-typescript": "7.27.0", - "@commitlint/config-conventional": "19.8.0", - "@commitlint/config-nx-scopes": "19.8.0", + "@babel/core": "7.27.1", + "@babel/eslint-parser": "7.27.1", + "@babel/plugin-transform-arrow-functions": "7.27.1", + "@babel/plugin-transform-class-properties": "7.27.1", + "@babel/plugin-transform-object-assign": "7.27.1", + "@babel/plugin-transform-private-methods": "7.27.1", + "@babel/plugin-transform-private-property-in-object": "7.27.1", + "@babel/plugin-transform-runtime": "7.27.1", + "@babel/preset-env": "7.27.2", + "@babel/preset-typescript": "7.27.1", + "@commitlint/config-conventional": "19.8.1", + "@commitlint/config-nx-scopes": "19.8.1", "@digitalroute/cz-conventional-changelog-for-jira": "8.0.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@jscutlery/semver": "5.6.0", - "@nx/eslint": "20.8.0", - "@nx/eslint-plugin": "20.8.0", - "@nx/jest": "20.8.0", - "@nx/js": "20.8.0", - "@nx/workspace": "20.8.0", + "@nx/eslint": "21.0.3", + "@nx/eslint-plugin": "21.0.3", + "@nx/jest": "21.0.3", + "@nx/js": "21.0.3", + "@nx/workspace": "21.0.3", "@originjs/vite-plugin-federation": "1.4.1", "@rollup/plugin-alias": "5.1.1", "@rollup/plugin-babel": "6.0.4", @@ -137,29 +137,28 @@ "@size-limit/file": "11.2.0", "@size-limit/webpack": "11.2.0", "@swc-node/register": "1.10.10", - "@swc/core": "1.11.22", + "@swc/core": "1.11.24", "@types/component-emitter": "1.2.14", "@types/jest": "29.5.14", - "@types/node": "22.14.1", + "@types/node": "22.15.17", "@types/ramda": "0.30.2", - "@typescript-eslint/eslint-plugin": "8.31.0", - "@typescript-eslint/parser": "8.31.0", + "@typescript-eslint/eslint-plugin": "8.32.0", + "@typescript-eslint/parser": "8.32.0", "babel-plugin-transform-object-hasown": "1.1.0", "commitizen": "4.3.1", - "commitlint": "19.8.0", - "core-js": "3.41.0", + "commitlint": "19.8.1", + "core-js": "3.42.0", "cross-env": "7.0.3", "dotenv": "16.5.0", "each": "2.7.2", - "eslint": "9.25.1", - "eslint-config-prettier": "10.1.2", + "eslint": "9.26.0", + "eslint-config-prettier": "10.1.5", "eslint-import-resolver-node": "0.3.9", "eslint-import-resolver-typescript": "4.3.4", "eslint-plugin-compat": "6.0.2", "eslint-plugin-import": "2.31.0", "eslint-plugin-sonarjs": "3.0.2", - "eslint-plugin-unicorn": "58.0.0", - "esm": "3.2.25", + "eslint-plugin-unicorn": "59.0.1", "http-server": "14.1.1", "husky": "9.1.7", "isomorphic-fetch": "3.0.0", @@ -171,14 +170,14 @@ "jest-watch-typeahead": "2.2.2", "join-component": "1.1.0", "jscpd": "4.0.5", - "lint-staged": "15.5.1", + "lint-staged": "15.5.2", "madge": "8.0.0", - "msw": "2.7.5", - "nx": "20.8.0", + "msw": "2.8.0", + "nx": "21.0.3", "patch-package": "8.0.0", "prettier": "3.5.3", "publint": "0.3.12", - "rollup": "4.40.0", + "rollup": "4.40.2", "rollup-plugin-copy": "3.5.0", "rollup-plugin-delete": "3.0.1", "rollup-plugin-dts": "6.2.1", @@ -200,11 +199,11 @@ "user-agent-data-types": "0.4.2" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.0", - "@nx/nx-darwin-x64": "20.8.0", - "@nx/nx-linux-x64-gnu": "20.8.0", - "@nx/nx-win32-x64-msvc": "20.8.0", - "@rollup/rollup-linux-x64-gnu": "4.40.0" + "@nx/nx-darwin-arm64": "21.0.2", + "@nx/nx-darwin-x64": "21.0.2", + "@nx/nx-linux-x64-gnu": "20.8.1", + "@nx/nx-win32-x64-msvc": "20.8.1", + "@rollup/rollup-linux-x64-gnu": "4.40.2" }, "overrides": { "rudder-component-cookie": { diff --git a/packages/analytics-js-common/CHANGELOG.md b/packages/analytics-js-common/CHANGELOG.md index 6646cb3ee5..82197031d7 100644 --- a/packages/analytics-js-common/CHANGELOG.md +++ b/packages/analytics-js-common/CHANGELOG.md @@ -2,6 +2,21 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.19.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.18.0...@rudderstack/analytics-js-common@3.19.0) (2025-05-09) + + +### Features + +* add new event mapping for tik tok ([#2210](https://github.com/rudderlabs/rudder-sdk-js/issues/2210)) ([1a4bf9d](https://github.com/rudderlabs/rudder-sdk-js/commit/1a4bf9d488d54dc22b322b271e4a22ccb510bd12)) +* group errors by message ([#2229](https://github.com/rudderlabs/rudder-sdk-js/issues/2229)) ([b448874](https://github.com/rudderlabs/rudder-sdk-js/commit/b448874fc39972576ebaf4d30f0bbd4883f69b7e)) +* onboarding userpilot integration ([#2103](https://github.com/rudderlabs/rudder-sdk-js/issues/2103)) ([9065069](https://github.com/rudderlabs/rudder-sdk-js/commit/90650693cd477ff3987174f8f6ec5972b034f2cb)) +* user session cut off ([#2209](https://github.com/rudderlabs/rudder-sdk-js/issues/2209)) ([8b7bcfd](https://github.com/rudderlabs/rudder-sdk-js/commit/8b7bcfd70155beb6f162a3b8ceec5735b67cce10)) + + +### Bug Fixes + +* load api options boolean inputs normalization ([#2236](https://github.com/rudderlabs/rudder-sdk-js/issues/2236)) ([4c3532c](https://github.com/rudderlabs/rudder-sdk-js/commit/4c3532c9b9e34903c2f975d95cfa516324bbee04)) + ## [3.18.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.17.2...@rudderstack/analytics-js-common@3.18.0) (2025-04-25) diff --git a/packages/analytics-js-common/CHANGELOG_LATEST.md b/packages/analytics-js-common/CHANGELOG_LATEST.md index 2d1b6d396c..7d675ddc07 100644 --- a/packages/analytics-js-common/CHANGELOG_LATEST.md +++ b/packages/analytics-js-common/CHANGELOG_LATEST.md @@ -1,13 +1,15 @@ -## [3.18.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.17.2...@rudderstack/analytics-js-common@3.18.0) (2025-04-25) +## [3.19.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-common@3.18.0...@rudderstack/analytics-js-common@3.19.0) (2025-05-09) ### Features -* remove page loaded event ([#2088](https://github.com/rudderlabs/rudder-sdk-js/issues/2088)) ([ec1d604](https://github.com/rudderlabs/rudder-sdk-js/commit/ec1d604f70d4e476a751f5207df09eef69220be2)) +* add new event mapping for tik tok ([#2210](https://github.com/rudderlabs/rudder-sdk-js/issues/2210)) ([1a4bf9d](https://github.com/rudderlabs/rudder-sdk-js/commit/1a4bf9d488d54dc22b322b271e4a22ccb510bd12)) +* group errors by message ([#2229](https://github.com/rudderlabs/rudder-sdk-js/issues/2229)) ([b448874](https://github.com/rudderlabs/rudder-sdk-js/commit/b448874fc39972576ebaf4d30f0bbd4883f69b7e)) +* onboarding userpilot integration ([#2103](https://github.com/rudderlabs/rudder-sdk-js/issues/2103)) ([9065069](https://github.com/rudderlabs/rudder-sdk-js/commit/90650693cd477ff3987174f8f6ec5972b034f2cb)) +* user session cut off ([#2209](https://github.com/rudderlabs/rudder-sdk-js/issues/2209)) ([8b7bcfd](https://github.com/rudderlabs/rudder-sdk-js/commit/8b7bcfd70155beb6f162a3b8ceec5735b67cce10)) ### Bug Fixes -* recursively migrate persisted entries ([#2187](https://github.com/rudderlabs/rudder-sdk-js/issues/2187)) ([3dd07ea](https://github.com/rudderlabs/rudder-sdk-js/commit/3dd07ea1bde4655124fc02850a022bcb550b8c07)) -* rename view id to visit id ([#2086](https://github.com/rudderlabs/rudder-sdk-js/issues/2086)) ([51c8dd9](https://github.com/rudderlabs/rudder-sdk-js/commit/51c8dd94b2e25f42a116cb72d209d41729c165c0)) +* load api options boolean inputs normalization ([#2236](https://github.com/rudderlabs/rudder-sdk-js/issues/2236)) ([4c3532c](https://github.com/rudderlabs/rudder-sdk-js/commit/4c3532c9b9e34903c2f975d95cfa516324bbee04)) diff --git a/packages/analytics-js-common/__tests__/utilities/object.test.ts b/packages/analytics-js-common/__tests__/utilities/object.test.ts index 197d67712f..d7899afdb4 100644 --- a/packages/analytics-js-common/__tests__/utilities/object.test.ts +++ b/packages/analytics-js-common/__tests__/utilities/object.test.ts @@ -464,14 +464,6 @@ describe('Common Utils - Object', () => { describe('getNormalizedBooleanValue', () => { const tcData = [ - { - input: [true, undefined], - output: true, - }, - { - input: [false, undefined], - output: false, - }, { input: [undefined, true], output: true, @@ -485,24 +477,24 @@ describe('Common Utils - Object', () => { output: true, }, { - input: [false, true], - output: false, + input: [true, true], + output: true, }, { - input: [undefined, undefined], + input: [false, false], output: false, }, { - input: [{}, false], + input: [false, true], output: false, }, { - input: [{}, true], + input: [{}, false], output: false, }, { - input: [{}, undefined], - output: false, + input: [{}, true], + output: true, }, { input: [[], false], @@ -510,11 +502,7 @@ describe('Common Utils - Object', () => { }, { input: [[], true], - output: false, - }, - { - input: [[], undefined], - output: false, + output: true, }, { input: ['string', false], @@ -522,11 +510,7 @@ describe('Common Utils - Object', () => { }, { input: ['string', true], - output: false, - }, - { - input: ['string', undefined], - output: false, + output: true, }, { input: [123456, false], @@ -534,11 +518,7 @@ describe('Common Utils - Object', () => { }, { input: [123456, true], - output: false, - }, - { - input: [123456, undefined], - output: false, + output: true, }, { input: [new Date(), false], @@ -546,11 +526,7 @@ describe('Common Utils - Object', () => { }, { input: [new Date(), true], - output: false, - }, - { - input: [new Date(), undefined], - output: false, + output: true, }, ]; diff --git a/packages/analytics-js-common/package.json b/packages/analytics-js-common/package.json index 6108a9033b..14132a548b 100644 --- a/packages/analytics-js-common/package.json +++ b/packages/analytics-js-common/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-common", - "version": "3.18.0", + "version": "3.19.0", "private": true, "description": "RudderStack JavaScript SDK common code", "module": "dist/npm/index.js", diff --git a/packages/analytics-js-common/project.json b/packages/analytics-js-common/project.json index 8a776dd854..92795008d6 100644 --- a/packages/analytics-js-common/project.json +++ b/packages/analytics-js-common/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-common@3.18.0", - "title": "@rudderstack/analytics-js-common@3.18.0", - "discussion-category": "@rudderstack/analytics-js-common@3.18.0", + "tag": "@rudderstack/analytics-js-common@3.19.0", + "title": "@rudderstack/analytics-js-common@3.19.0", + "discussion-category": "@rudderstack/analytics-js-common@3.19.0", "notesFile": "./packages/analytics-js-common/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-common/src/constants/integrations/Destinations.ts b/packages/analytics-js-common/src/constants/integrations/Destinations.ts index a764b822ce..ab75fdfaae 100644 --- a/packages/analytics-js-common/src/constants/integrations/Destinations.ts +++ b/packages/analytics-js-common/src/constants/integrations/Destinations.ts @@ -165,3 +165,5 @@ export const XPIXEL_NAME = 'XPIXEL'; export const XPIXEL_DISPLAY_NAME = 'XPixel'; export const YANDEX_METRICA_NAME = 'YANDEX_METRICA'; export const YANDEX_METRICA_DISPLAY_NAME = 'Yandex.Metrica'; +export const USERPILOT_NAME = 'USERPILOT'; +export const USERPILOT_DISPLAY_NAME = 'Userpilot'; diff --git a/packages/analytics-js-common/src/constants/integrations/TiktokAds/constants.ts b/packages/analytics-js-common/src/constants/integrations/TiktokAds/constants.ts index be11a6edcb..91746a24df 100644 --- a/packages/analytics-js-common/src/constants/integrations/TiktokAds/constants.ts +++ b/packages/analytics-js-common/src/constants/integrations/TiktokAds/constants.ts @@ -68,6 +68,11 @@ const trackMapping = [ sourceKeys: ['context.traits.phone', 'traits.phone', 'properties.phone'], }, ]; + +// We need to remove 'checkout step completed' and 'submitform' from the list of events as per tiktok docs +// tiktok changed the mapping for 'checkout step completed => purchase' and 'submitform => lead' +// once all customer migrate to new event we can remove old mapping +// https://ads.tiktok.com/help/article/standard-events-parameters?lang=en const eventNameMapping = { 'product added to wishlist': 'AddToWishlist', 'product added': 'AddToCart', @@ -83,6 +88,11 @@ const eventNameMapping = { submitform: 'SubmitForm', completeregistration: 'CompleteRegistration', subscribe: 'Subscribe', + purchase: 'Purchase', + lead: 'Lead', + customizeproduct: 'CustomizeProduct', + findlocation: 'FindLocation', + schedule: 'Schedule', }; export { diff --git a/packages/analytics-js-common/src/constants/integrations/Userpilot/constants.ts b/packages/analytics-js-common/src/constants/integrations/Userpilot/constants.ts new file mode 100644 index 0000000000..216927e5ad --- /dev/null +++ b/packages/analytics-js-common/src/constants/integrations/Userpilot/constants.ts @@ -0,0 +1,20 @@ +import { + USERPILOT_NAME as NAME, + USERPILOT_DISPLAY_NAME as DISPLAY_NAME, +} from '../Destinations'; + +const DIR_NAME = 'Userpilot'; + +const TRAIT_MAPPINGS = { + createdAt: 'created_at', + signedUpAt: 'created_at' +}; + +const DISPLAY_NAME_TO_DIR_NAME_MAP = { [DISPLAY_NAME]: DIR_NAME }; +const CNameMapping = { + [NAME]: NAME, + userpilot: NAME, + Userpilot: NAME, +}; + +export { NAME, DISPLAY_NAME, TRAIT_MAPPINGS, CNameMapping, DISPLAY_NAME_TO_DIR_NAME_MAP, DIR_NAME }; \ No newline at end of file diff --git a/packages/analytics-js-common/src/constants/integrations/client_server_name.js b/packages/analytics-js-common/src/constants/integrations/client_server_name.js index 117e11cba0..872b01bb36 100644 --- a/packages/analytics-js-common/src/constants/integrations/client_server_name.js +++ b/packages/analytics-js-common/src/constants/integrations/client_server_name.js @@ -80,6 +80,7 @@ const clientToServerNames = { NINETAILED: 'Ninetailed', XPIXEL: 'XPixel', GAINSIGHT_PX: 'Gainsight PX', + USERPILOT: 'Userpilot', }; export { clientToServerNames }; diff --git a/packages/analytics-js-common/src/constants/integrations/config_to_integration_names.js b/packages/analytics-js-common/src/constants/integrations/config_to_integration_names.js index 18dcb528c3..07482ae545 100644 --- a/packages/analytics-js-common/src/constants/integrations/config_to_integration_names.js +++ b/packages/analytics-js-common/src/constants/integrations/config_to_integration_names.js @@ -81,6 +81,7 @@ const configToIntNames = { NINETAILED: 'Ninetailed', XPIXEL: 'XPixel', GAINSIGHT_PX: 'Gainsight_PX', + USERPILOT: 'Userpilot', }; export { configToIntNames }; diff --git a/packages/analytics-js-common/src/constants/integrations/destDisplayNamesToFileNamesMap.ts b/packages/analytics-js-common/src/constants/integrations/destDisplayNamesToFileNamesMap.ts index 5f6649d58d..b641cc6fa9 100644 --- a/packages/analytics-js-common/src/constants/integrations/destDisplayNamesToFileNamesMap.ts +++ b/packages/analytics-js-common/src/constants/integrations/destDisplayNamesToFileNamesMap.ts @@ -160,6 +160,8 @@ import { Gainsight_PXDirectoryName, XPixelDisplayName, XPixelDirectoryName, + UserpilotDisplayName, + UserpilotDirectoryName, } from './destinationNames'; // The destination directory name is used as the destination SDK file name in CDN @@ -244,6 +246,7 @@ const destDisplayNamesToFileNamesMap: Record = { [NinetailedDisplayName]: NinetailedDirectoryName, [Gainsight_PXDisplayName]: Gainsight_PXDirectoryName, [XPixelDisplayName]: XPixelDirectoryName, + [UserpilotDisplayName]: UserpilotDirectoryName, }; export { destDisplayNamesToFileNamesMap }; diff --git a/packages/analytics-js-common/src/constants/integrations/destinationNames.ts b/packages/analytics-js-common/src/constants/integrations/destinationNames.ts index 7ce0b76db2..e71e5db7ae 100644 --- a/packages/analytics-js-common/src/constants/integrations/destinationNames.ts +++ b/packages/analytics-js-common/src/constants/integrations/destinationNames.ts @@ -294,3 +294,7 @@ export { DISPLAY_NAME as XPixelDisplayName, DIR_NAME as XPixelDirectoryName, } from './XPixel/constants'; +export { + DISPLAY_NAME as UserpilotDisplayName, + DIR_NAME as UserpilotDirectoryName, +} from './Userpilot/constants'; diff --git a/packages/analytics-js-common/src/constants/integrations/integration_cname.js b/packages/analytics-js-common/src/constants/integrations/integration_cname.js index fbadd73a89..2947aa2ace 100644 --- a/packages/analytics-js-common/src/constants/integrations/integration_cname.js +++ b/packages/analytics-js-common/src/constants/integrations/integration_cname.js @@ -79,6 +79,7 @@ import { CNameMapping as CommandBar } from './CommandBar/constants'; import { CNameMapping as Ninetailed } from './Ninetailed/constants'; import { CNameMapping as XPixel } from './XPixel/constants'; import { CNameMapping as Gainsight_PX } from './Gainsight_PX/constants'; +import { CNameMapping as Userpilot } from './Userpilot/constants'; // for sdk side native integration identification // add a mapping from common names to index.js exported key names as identified by Rudder const commonNames = { @@ -163,6 +164,7 @@ const commonNames = { ...SpotifyPixel, ...XPixel, ...Gainsight_PX, + ...Userpilot, }; export { commonNames }; diff --git a/packages/analytics-js-common/src/types/ApplicationState.ts b/packages/analytics-js-common/src/types/ApplicationState.ts index 8bdc2a98b1..a9c7db4b06 100644 --- a/packages/analytics-js-common/src/types/ApplicationState.ts +++ b/packages/analytics-js-common/src/types/ApplicationState.ts @@ -6,7 +6,7 @@ import type { ApiCallback, ReadyCallback, Traits } from './EventApi'; import type { BufferedEvent } from './Event'; import type { LifecycleStatus } from './ApplicationLifecycle'; import type { LogLevel } from './Logger'; -import type { ConsentOptions, LoadOptions, PreConsentOptions } from './LoadOptions'; +import type { LoadOptions, PreConsentOptions } from './LoadOptions'; import type { Destination } from './Destination'; import type { IntegrationOpts } from './Integration'; import type { SessionInfo } from './Session'; @@ -15,6 +15,7 @@ import type { ApiObject } from './ApiObject'; import type { ConsentManagementMetadata, ConsentManagementProvider, + ConsentOptions, ConsentResolutionStrategy, ConsentsInfo, } from './Consent'; diff --git a/packages/analytics-js-common/src/types/Consent.ts b/packages/analytics-js-common/src/types/Consent.ts index 7e9ae05c31..cf235c4d7b 100644 --- a/packages/analytics-js-common/src/types/Consent.ts +++ b/packages/analytics-js-common/src/types/Consent.ts @@ -1,3 +1,6 @@ +import type { IntegrationOpts } from './Integration'; +import type { StorageOpts } from './Storage'; + export type OneTrustCookieCategory = { oneTrustCookieCategory: string; }; @@ -49,3 +52,12 @@ export type KetchConsentPurpose = { export type IubendaConsentPurpose = { purpose: string; }; + +export type ConsentOptions = { + storage?: StorageOpts; + consentManagement?: ConsentManagementOptions; + integrations?: IntegrationOpts; + discardPreConsentEvents?: boolean; + sendPageEvent?: boolean; + trackConsent?: boolean; +}; diff --git a/packages/analytics-js-common/src/types/IRudderAnalytics.ts b/packages/analytics-js-common/src/types/IRudderAnalytics.ts index 3663b78c54..97aecf8151 100644 --- a/packages/analytics-js-common/src/types/IRudderAnalytics.ts +++ b/packages/analytics-js-common/src/types/IRudderAnalytics.ts @@ -1,9 +1,10 @@ import type { Nullable } from './Nullable'; import type { ApiCallback, ApiOptions } from './EventApi'; -import type { AnonymousIdOptions, ConsentOptions, LoadOptions } from './LoadOptions'; +import type { AnonymousIdOptions, LoadOptions } from './LoadOptions'; import type { ApiObject } from './ApiObject'; import type { ILogger } from './Logger'; import type { IdentifyTraits } from './traits'; +import type { ConsentOptions } from './Consent'; export type AnalyticsIdentifyMethod = { ( diff --git a/packages/analytics-js-common/src/types/LoadOptions.ts b/packages/analytics-js-common/src/types/LoadOptions.ts index 0ce571c781..5ce899241a 100644 --- a/packages/analytics-js-common/src/types/LoadOptions.ts +++ b/packages/analytics-js-common/src/types/LoadOptions.ts @@ -19,9 +19,15 @@ export type AnonymousIdOptions = { }; }; +export type SessionCutOffOptions = { + enabled: boolean; + duration?: number; +}; + export type SessionOpts = { autoTrack?: boolean; // Defaults to true timeout?: number; // Defaults to 30 minutes + cutOff?: SessionCutOffOptions; // Disabled by default }; export type EventMapping = { @@ -174,12 +180,3 @@ export type LoadOptions = { dataServiceEndpoint?: string; autoTrack?: AutoTrackOptions; }; - -export type ConsentOptions = { - storage?: StorageOpts; - consentManagement?: ConsentManagementOptions; - integrations?: IntegrationOpts; - discardPreConsentEvents?: boolean; - sendPageEvent?: boolean; - trackConsent?: boolean; -}; diff --git a/packages/analytics-js-common/src/types/Metrics.ts b/packages/analytics-js-common/src/types/Metrics.ts index 7dda140112..4691ad7fb4 100644 --- a/packages/analytics-js-common/src/types/Metrics.ts +++ b/packages/analytics-js-common/src/types/Metrics.ts @@ -24,7 +24,10 @@ export type ErrorEventPayload = { events: ErrorEvent[]; }; -export type ErrorEvent = Pick & { +export type ErrorEvent = Pick< + Event, + 'severity' | 'app' | 'device' | 'request' | 'context' | 'groupingHash' +> & { exceptions: Exception[]; unhandled: boolean; severityReason: { type: string }; diff --git a/packages/analytics-js-common/src/types/Session.ts b/packages/analytics-js-common/src/types/Session.ts index 7c6a2d15a5..3c0f53c387 100644 --- a/packages/analytics-js-common/src/types/Session.ts +++ b/packages/analytics-js-common/src/types/Session.ts @@ -5,4 +5,9 @@ export type SessionInfo = { expiresAt?: number; id?: number; sessionStart?: boolean; + cutOff?: { + enabled?: boolean; + duration?: number; + expiresAt?: number; + }; }; diff --git a/packages/analytics-js-common/src/utilities/object.ts b/packages/analytics-js-common/src/utilities/object.ts index 1b70ca4691..d47c3ad8b2 100644 --- a/packages/analytics-js-common/src/utilities/object.ts +++ b/packages/analytics-js-common/src/utilities/object.ts @@ -131,17 +131,12 @@ const getNormalizedObjectValue = (val: any): any => { * Normalizes a value to a boolean, with support for a default value * @param val Input value * @param defVal Default value - * @returns Returns the normalized boolean value + * @returns Returns the input value if it is a boolean, otherwise returns the default value * @example * getNormalizedBooleanValue(true, false) // returns true */ -const getNormalizedBooleanValue = (val: any, defVal: boolean | undefined): boolean | undefined => { - if (isDefined(defVal)) { - return isDefined(val) ? val === true : defVal; - } - - return val === true; -}; +const getNormalizedBooleanValue = (val: any, defVal: boolean): boolean => + typeof val === 'boolean' ? val : defVal; export { getValueByPath, diff --git a/packages/analytics-js-cookies/CHANGELOG.md b/packages/analytics-js-cookies/CHANGELOG.md index 096ca612d5..0ee745d056 100644 --- a/packages/analytics-js-cookies/CHANGELOG.md +++ b/packages/analytics-js-cookies/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [0.4.25](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.4.24...@rudderstack/analytics-js-cookies@0.4.25) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.19.0` ## [0.4.24](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.4.23...@rudderstack/analytics-js-cookies@0.4.24) (2025-04-25) ### Dependency Updates diff --git a/packages/analytics-js-cookies/CHANGELOG_LATEST.md b/packages/analytics-js-cookies/CHANGELOG_LATEST.md index 4bcdcd8237..18a557851e 100644 --- a/packages/analytics-js-cookies/CHANGELOG_LATEST.md +++ b/packages/analytics-js-cookies/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [0.4.24](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.4.23...@rudderstack/analytics-js-cookies@0.4.24) (2025-04-25) +## [0.4.25](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-cookies@0.4.24...@rudderstack/analytics-js-cookies@0.4.25) (2025-05-09) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.18.0` +* `@rudderstack/analytics-js-common` updated to version `3.19.0` diff --git a/packages/analytics-js-cookies/__tests__/cookieUtilities.test.ts b/packages/analytics-js-cookies/__tests__/cookieUtilities.test.ts index 538303972c..5d87ae2746 100644 --- a/packages/analytics-js-cookies/__tests__/cookieUtilities.test.ts +++ b/packages/analytics-js-cookies/__tests__/cookieUtilities.test.ts @@ -223,7 +223,9 @@ describe('Cookie Utilities', () => { expect(consoleErrorSpy).toHaveBeenNthCalledWith( 1, 'Error occurred during decryption: ', - new SyntaxError('Unexpected non-whitespace character after JSON at position 11'), + new SyntaxError( + 'Unexpected non-whitespace character after JSON at position 11 (line 1 column 12)', + ), ); consoleErrorSpy.mockRestore(); diff --git a/packages/analytics-js-cookies/package.json b/packages/analytics-js-cookies/package.json index 161f297e55..f247959fd2 100644 --- a/packages/analytics-js-cookies/package.json +++ b/packages/analytics-js-cookies/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-cookies", - "version": "0.4.24", + "version": "0.4.25", "description": "RudderStack JavaScript SDK Cookies Utilities", "main": "dist/npm/modern/cjs/index.cjs", "module": "dist/npm/modern/esm/index.mjs", diff --git a/packages/analytics-js-cookies/project.json b/packages/analytics-js-cookies/project.json index f8f6645882..f134e73727 100644 --- a/packages/analytics-js-cookies/project.json +++ b/packages/analytics-js-cookies/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-cookies@0.4.24", - "title": "@rudderstack/analytics-js-cookies@0.4.24", - "discussion-category": "@rudderstack/analytics-js-cookies@0.4.24", + "tag": "@rudderstack/analytics-js-cookies@0.4.25", + "title": "@rudderstack/analytics-js-cookies@0.4.25", + "discussion-category": "@rudderstack/analytics-js-cookies@0.4.25", "notesFile": "./packages/analytics-js-cookies/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-integrations/.size-limit.js b/packages/analytics-js-integrations/.size-limit.js index 0f12828de7..838b67986e 100644 --- a/packages/analytics-js-integrations/.size-limit.js +++ b/packages/analytics-js-integrations/.size-limit.js @@ -11,6 +11,6 @@ module.exports = [ { name: 'All Integrations - Modern - CDN', path: 'dist/cdn/modern/js-integrations/*.min.js', - limit: '91 KiB', + limit: '93.5 KiB', }, ]; diff --git a/packages/analytics-js-integrations/CHANGELOG.md b/packages/analytics-js-integrations/CHANGELOG.md index 93898f8eb6..6010b07dca 100644 --- a/packages/analytics-js-integrations/CHANGELOG.md +++ b/packages/analytics-js-integrations/CHANGELOG.md @@ -2,6 +2,16 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.14.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.13.2...@rudderstack/analytics-js-integrations@3.14.0) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.19.0` + +### Features + +* onboarding userpilot integration ([#2103](https://github.com/rudderlabs/rudder-sdk-js/issues/2103)) ([9065069](https://github.com/rudderlabs/rudder-sdk-js/commit/90650693cd477ff3987174f8f6ec5972b034f2cb)) + ## [3.13.2](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.13.1...@rudderstack/analytics-js-integrations@3.13.2) (2025-04-25) ### Dependency Updates diff --git a/packages/analytics-js-integrations/CHANGELOG_LATEST.md b/packages/analytics-js-integrations/CHANGELOG_LATEST.md index 678370a0ea..1f9365c0b7 100644 --- a/packages/analytics-js-integrations/CHANGELOG_LATEST.md +++ b/packages/analytics-js-integrations/CHANGELOG_LATEST.md @@ -1,12 +1,10 @@ -## [3.13.2](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.13.1...@rudderstack/analytics-js-integrations@3.13.2) (2025-04-25) +## [3.14.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-integrations@3.13.2...@rudderstack/analytics-js-integrations@3.14.0) (2025-05-09) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.18.0` +* `@rudderstack/analytics-js-common` updated to version `3.19.0` -### Bug Fixes +### Features -* add validation for non array products ([#2182](https://github.com/rudderlabs/rudder-sdk-js/issues/2182)) ([2294bdd](https://github.com/rudderlabs/rudder-sdk-js/commit/2294bdde8c967295e18533a2bd20e17231ae4768)) -* added mixpanel missing config properties ([#2125](https://github.com/rudderlabs/rudder-sdk-js/issues/2125)) ([fe1ba3e](https://github.com/rudderlabs/rudder-sdk-js/commit/fe1ba3e8b48d1c0bf8b04c1d1c6aa77d7f78bafd)) -* update clevertap loading js to https ([#2169](https://github.com/rudderlabs/rudder-sdk-js/issues/2169)) ([497ad22](https://github.com/rudderlabs/rudder-sdk-js/commit/497ad22d9e690f489b59527723699fd78ca56ce6)) +* onboarding userpilot integration ([#2103](https://github.com/rudderlabs/rudder-sdk-js/issues/2103)) ([9065069](https://github.com/rudderlabs/rudder-sdk-js/commit/90650693cd477ff3987174f8f6ec5972b034f2cb)) diff --git a/packages/analytics-js-integrations/__tests__/integrations/Userpilot/browser.test.js b/packages/analytics-js-integrations/__tests__/integrations/Userpilot/browser.test.js new file mode 100644 index 0000000000..c410668d0b --- /dev/null +++ b/packages/analytics-js-integrations/__tests__/integrations/Userpilot/browser.test.js @@ -0,0 +1,191 @@ +/* eslint-disable no-underscore-dangle */ +import Userpilot from '../../../src/integrations/Userpilot/browser'; + +const destinationInfo = { + areTransformationsConnected: false, + destinationId: 'sample-destination-id', +}; + +const mockUserpilotSDK = () => { + window.userpilot = { + identify: jest.fn(), + track: jest.fn(), + reload: jest.fn(), + group: jest.fn(), + }; +}; + +beforeEach(() => { + const scriptElement = document.createElement('script'); + scriptElement.type = 'text/javascript'; + scriptElement.id = 'dummyScript'; + const headElements = document.getElementsByTagName('head'); + headElements[0].insertBefore(scriptElement, headElements[0].firstChild); + delete window.userpilot; +}); + +describe('Userpilot init tests', () => { + test('Testing init call of Userpilot with token', () => { + const userpilot = new Userpilot({ token: 'test-token' }, { logLevel: 'debug' }, destinationInfo); + userpilot.init(); + expect(userpilot.name).toBe('USERPILOT'); + expect(userpilot.token).toBe('test-token'); + }); +}); + +describe('Userpilot tests', () => { + let userpilot; + + beforeEach(() => { + userpilot = new Userpilot({ token: 'test-token' }, { logLevel: 'debug' }, destinationInfo); + userpilot.init(); + mockUserpilotSDK(); + jest.spyOn(userpilot, 'isLoaded').mockImplementation(() => true); + }); + + test('Send identify with userId', () => { + const spy = jest.spyOn(window.userpilot, 'identify'); + userpilot.identify({ + message: { + userId: 'user-123', + context: { + traits: { + name: 'John Doe', + email: 'john@example.com', + first_name: 'John', + last_name: 'Doe', + createdAt: '2022-01-01T00:00:00Z', + }, + }, + }, + }); + + expect(spy).toHaveBeenCalledWith('user-123', { + name: 'John Doe', + email: 'john@example.com', + first_name: 'John', + last_name: 'Doe', + created_at: '2022-01-01T00:00:00Z', + }); + }); + + test('Send identify without userId should skip the call', () => { + const spy = jest.spyOn(window.userpilot, 'identify'); + userpilot.identify({ + message: { + anonymousId: 'anon-123', + context: { + traits: { + name: 'Anonymous User', + }, + }, + }, + }); + + expect(spy).not.toHaveBeenCalled(); + }); + + test('Send track event', () => { + const spy = jest.spyOn(window.userpilot, 'track'); + userpilot.track({ + message: { + event: 'Button Clicked', + properties: { + buttonName: 'Submit', + page: 'Checkout', + }, + }, + }); + + expect(spy).toHaveBeenCalledWith('Button Clicked', { + buttonName: 'Submit', + page: 'Checkout', + }); + }); + + test('Send track event without properties', () => { + const spy = jest.spyOn(window.userpilot, 'track'); + userpilot.track({ + message: { + event: 'Page Viewed', + }, + }); + + expect(spy).toHaveBeenCalledWith('Page Viewed', undefined); + }); + + test('Track call without event name should not call userpilot.track', () => { + const spy = jest.spyOn(window.userpilot, 'track'); + userpilot.track({ + message: { + properties: { + page: 'Home', + }, + }, + }); + + expect(spy).not.toHaveBeenCalled(); + }); + + test('Send page call', () => { + const spy = jest.spyOn(window.userpilot, 'reload'); + userpilot.page({ + message: { + name: 'Home Page', + properties: { + url: 'https://example.com/home', + path: '/home', + }, + }, + }); + + expect(spy).toHaveBeenCalledWith({ url: 'https://example.com/home' }); + }); + + test('Send page call without URL', () => { + const spy = jest.spyOn(window.userpilot, 'reload'); + userpilot.page({ + message: { + name: 'Profile Page', + properties: { + path: '/profile', + }, + }, + }); + + expect(spy).toHaveBeenCalledWith(); + }); + + test('Send group call', () => { + const spy = jest.spyOn(window.userpilot, 'group'); + userpilot.group({ + message: { + groupId: 'company-456', + traits: { + name: 'Acme Inc', + industry: 'Technology', + plan: 'enterprise', + }, + }, + }); + + expect(spy).toHaveBeenCalledWith('company-456', { + name: 'Acme Inc', + industry: 'Technology', + plan: 'enterprise', + }); + }); + + test('Group call without groupId should not call userpilot.group', () => { + const spy = jest.spyOn(window.userpilot, 'group'); + userpilot.group({ + message: { + traits: { + name: 'Acme Inc', + }, + }, + }); + + expect(spy).not.toHaveBeenCalled(); + }); +}); \ No newline at end of file diff --git a/packages/analytics-js-integrations/package.json b/packages/analytics-js-integrations/package.json index 77e31ddb3e..89d9faa837 100644 --- a/packages/analytics-js-integrations/package.json +++ b/packages/analytics-js-integrations/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-integrations", - "version": "3.13.2", + "version": "3.14.0", "private": true, "description": "RudderStack JavaScript SDK device mode integrations", "main": "dist/npm/modern/cjs/index.js", @@ -79,7 +79,7 @@ "build:integration:bundle-size": "VISUALIZER=true npm run build:integration", "build:integration:cli": "rollup -c --environment VERSION:$npm_package_version,PROD_DEBUG,ENV:prod,UGLIFY,INTG_NAME:$npm_config_intg", "build:integration:bundle-size:cli": "rollup -c --environment VERSION:$npm_package_version,VISUALIZER:true,PROD_DEBUG,ENV:prod,UGLIFY,INTG_NAME:$npm_config_intg", - "build:integration:all": "node -r esm ./scripts/integrationBuildScript.js", + "build:integration:all": "node ./scripts/integrationBuildScript.mjs", "build:integration:all:modern": "BROWSERSLIST_ENV=modern npm run build:integration:all", "build:integration:all:bundle-size": "VISUALIZER=true npm run build:integration:all", "build:integration:all:bundle-size:modern": "VISUALIZER=true npm run build:integration:all:modern" diff --git a/packages/analytics-js-integrations/project.json b/packages/analytics-js-integrations/project.json index 39036e07a8..a4d5278e6f 100644 --- a/packages/analytics-js-integrations/project.json +++ b/packages/analytics-js-integrations/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-integrations@3.13.2", - "title": "@rudderstack/analytics-js-integrations@3.13.2", - "discussion-category": "@rudderstack/analytics-js-integrations@3.13.2", + "tag": "@rudderstack/analytics-js-integrations@3.14.0", + "title": "@rudderstack/analytics-js-integrations@3.14.0", + "discussion-category": "@rudderstack/analytics-js-integrations@3.14.0", "notesFile": "./packages/analytics-js-integrations/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-integrations/scripts/integrationBuildScript.js b/packages/analytics-js-integrations/scripts/integrationBuildScript.mjs similarity index 97% rename from packages/analytics-js-integrations/scripts/integrationBuildScript.js rename to packages/analytics-js-integrations/scripts/integrationBuildScript.mjs index f298b96085..a82f38535b 100644 --- a/packages/analytics-js-integrations/scripts/integrationBuildScript.js +++ b/packages/analytics-js-integrations/scripts/integrationBuildScript.mjs @@ -2,7 +2,7 @@ /* eslint-disable import/no-relative-packages */ import { exec } from 'child_process'; import { cpus } from 'os'; -import { configToIntNames } from '../../analytics-js-common/src/constants/integrations/config_to_integration_names'; +import { configToIntNames } from '../../analytics-js-common/src/constants/integrations/config_to_integration_names.js'; const intgNamesArr = Object.values(configToIntNames); const totalIntgCount = intgNamesArr.length; diff --git a/packages/analytics-js-integrations/src/integrations/Userpilot/browser.js b/packages/analytics-js-integrations/src/integrations/Userpilot/browser.js new file mode 100644 index 0000000000..810490b6b5 --- /dev/null +++ b/packages/analytics-js-integrations/src/integrations/Userpilot/browser.js @@ -0,0 +1,155 @@ +import Logger from '../../utils/logger'; +import { loadNativeSdk } from './nativeSdkLoader.js'; +import { + NAME, + DISPLAY_NAME, + TRAIT_MAPPINGS, +} from '@rudderstack/analytics-js-common/constants/integrations/Userpilot/constants'; + +const logger = new Logger(DISPLAY_NAME); + +class Userpilot { + /** + * Creates an instance of Userpilot integration + * @param {Object} config - The integration configuration + * @param {string} config.token - App token + * @param {string} config.sdkEndpoint - SDK API endpoint + * @param {Object} analytics - The RudderStack analytics instance + * @param {Object} destinationInfo - Additional destination information + */ + constructor(config, analytics, destinationInfo) { + if (analytics.logLevel) { + logger.setLogLevel(analytics.logLevel); + } + this.analytics = analytics; + this.token = config.token; + this.sdkEndpoint = config.sdkEndpoint; + + this.name = NAME; + + ({ + shouldApplyDeviceModeTransformation: this.shouldApplyDeviceModeTransformation, + propagateEventsUntransformedOnError: this.propagateEventsUntransformedOnError, + destinationId: this.destinationId, + } = destinationInfo ?? {}); + } + + /** + * Initializes the Userpilot SDK + */ + init() { + return loadNativeSdk({ token: this.token, sdkEndpoint: this.sdkEndpoint }) + } + + /** + * Checks if the Userpilot SDK is loaded + * @returns {boolean} - Whether the SDK is loaded + */ + isLoaded() { + return !!window.userpilot; + } + + /** + * Checks if the integration is ready to send events + * @returns {boolean} - Whether the integration is ready + */ + isReady() { + return this.isLoaded(); + } + + /** + * Maps user traits to Userpilot format + * @param {Object} traits - User traits from RudderStack + * @returns {Object} - Mapped traits for Userpilot + */ + mapTraits(traits) { + if (!traits || typeof traits !== 'object') { + return {}; + } + + const mappedTraits = { ...traits }; + + Object.keys(TRAIT_MAPPINGS).forEach(traitKey => { + if (mappedTraits[traitKey] !== undefined) { + const userpilotKey = TRAIT_MAPPINGS[traitKey]; + mappedTraits[userpilotKey] = mappedTraits[traitKey]; + if (userpilotKey !== traitKey) { + delete mappedTraits[traitKey]; + } + } + }); + + return mappedTraits; + } + + /** + * Identify a user + * @param {Object} rudderElement - The RudderStack element + */ + identify(rudderElement) { + const userId = rudderElement.message.userId; + const traits = rudderElement.message.context.traits; + + if (!userId) { + logger.error('No userId provided. Skipping identify call.'); + return; + } + + const userProperties = this.mapTraits(traits); + + if (userProperties.company?.id) { + userProperties.company = this.mapTraits(userProperties.company); + } + + window.userpilot.identify(userId, userProperties); + } + + /** + * Associate the current user with a company/organization + * @param {Object} rudderElement - The RudderStack element + */ + group(rudderElement) { + const { groupId, traits } = rudderElement.message; + + if (!groupId) { + logger.error('Cannot associate user with undefined groupId'); + return; + } + + const companyProperties = this.mapTraits(traits); + + window.userpilot.group(groupId, companyProperties); + } + + /** + * Track an event + * @param {Object} rudderElement - The RudderStack element + */ + track(rudderElement) { + const { event, properties } = rudderElement.message; + + if (!event) { + logger.error('Cannot call track with undefined event'); + return; + } + + window.userpilot.track(event, properties); + } + + /** + * Page call - reloads Userpilot content + * @param {Object} rudderElement - The RudderStack element + */ + page(rudderElement) { + const { properties } = rudderElement.message; + const url = properties?.url; + + if (url) { + window.userpilot.reload({ url }); + } else { + window.userpilot.reload(); + } + } +} + +export default Userpilot; \ No newline at end of file diff --git a/packages/analytics-js-integrations/src/integrations/Userpilot/index.js b/packages/analytics-js-integrations/src/integrations/Userpilot/index.js new file mode 100644 index 0000000000..84f0b2988c --- /dev/null +++ b/packages/analytics-js-integrations/src/integrations/Userpilot/index.js @@ -0,0 +1 @@ +export { default as Userpilot } from './browser'; \ No newline at end of file diff --git a/packages/analytics-js-integrations/src/integrations/Userpilot/nativeSdkLoader.js b/packages/analytics-js-integrations/src/integrations/Userpilot/nativeSdkLoader.js new file mode 100644 index 0000000000..a1b2ccc6d3 --- /dev/null +++ b/packages/analytics-js-integrations/src/integrations/Userpilot/nativeSdkLoader.js @@ -0,0 +1,27 @@ +/** + * Loads the Userpilot SDK using the recommended loading pattern + * @param {Object} config - Configuration for Userpilot + * @param {string} config.token - The Userpilot token + * @param {string} [config.sdkEndpoint] - Optional custom endpoint + * @returns {Promise} A promise that resolves when the SDK is loaded + */ +function loadNativeSdk(config) { + window.userpilotSettings = { + token: config.token, + endpoint: config.sdkEndpoint ? config.sdkEndpoint : undefined + }; + + const script = document.createElement('script'); + script.type = 'text/javascript'; + script.async = true; + script.src = 'https://js.userpilot.io/sdk/latest.js'; + + document.head.appendChild(script); + + return new Promise((resolve, reject) => { + script.onload = () => resolve(); + script.onerror = (error) => reject(error); + }); +} + +export { loadNativeSdk }; \ No newline at end of file diff --git a/packages/analytics-js-integrations/src/integrations/index.js b/packages/analytics-js-integrations/src/integrations/index.js index 1e5bcba1ce..1058f9ef9f 100644 --- a/packages/analytics-js-integrations/src/integrations/index.js +++ b/packages/analytics-js-integrations/src/integrations/index.js @@ -77,6 +77,7 @@ import * as CommandBar from './CommandBar'; import * as Ninetailed from './Ninetailed'; import * as XPixel from './XPixel'; import * as Gainsight_PX from './Gainsight_PX'; +import * as Userpilot from './Userpilot'; // the key names should match the destination.name value to keep parity everywhere // (config-plan name, native destination.name , exported integration name(this one below)) @@ -160,6 +161,7 @@ const integrations = { NINETAILED: Ninetailed.default, XPIXEL: XPixel.default, GAINSIGHT_PX: Gainsight_PX.default, + USERPILOT: Userpilot.default, }; export { integrations }; diff --git a/packages/analytics-js-plugins/CHANGELOG.md b/packages/analytics-js-plugins/CHANGELOG.md index 6138694c0f..9e7a8ec9c9 100644 --- a/packages/analytics-js-plugins/CHANGELOG.md +++ b/packages/analytics-js-plugins/CHANGELOG.md @@ -2,6 +2,12 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.8.2](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.8.1...@rudderstack/analytics-js-plugins@3.8.2) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.19.0` +* `@rudderstack/analytics-js-cookies` updated to version `0.4.25` ## [3.8.1](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.8.0...@rudderstack/analytics-js-plugins@3.8.1) (2025-04-25) ### Dependency Updates diff --git a/packages/analytics-js-plugins/CHANGELOG_LATEST.md b/packages/analytics-js-plugins/CHANGELOG_LATEST.md index 238647929e..1d9be0aa2b 100644 --- a/packages/analytics-js-plugins/CHANGELOG_LATEST.md +++ b/packages/analytics-js-plugins/CHANGELOG_LATEST.md @@ -1,12 +1,6 @@ -## [3.8.1](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.8.0...@rudderstack/analytics-js-plugins@3.8.1) (2025-04-25) +## [3.8.2](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-plugins@3.8.1...@rudderstack/analytics-js-plugins@3.8.2) (2025-05-09) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.18.0` -* `@rudderstack/analytics-js-cookies` updated to version `0.4.24` - -### Bug Fixes - -* recursively migrate persisted entries ([#2187](https://github.com/rudderlabs/rudder-sdk-js/issues/2187)) ([3dd07ea](https://github.com/rudderlabs/rudder-sdk-js/commit/3dd07ea1bde4655124fc02850a022bcb550b8c07)) -* rename view id to visit id ([#2086](https://github.com/rudderlabs/rudder-sdk-js/issues/2086)) ([51c8dd9](https://github.com/rudderlabs/rudder-sdk-js/commit/51c8dd94b2e25f42a116cb72d209d41729c165c0)) - +* `@rudderstack/analytics-js-common` updated to version `3.19.0` +* `@rudderstack/analytics-js-cookies` updated to version `0.4.25` diff --git a/packages/analytics-js-plugins/package.json b/packages/analytics-js-plugins/package.json index b535f89bd3..a25a859326 100644 --- a/packages/analytics-js-plugins/package.json +++ b/packages/analytics-js-plugins/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-plugins", - "version": "3.8.1", + "version": "3.8.2", "private": true, "description": "RudderStack JavaScript SDK plugins", "main": "dist/npm/modern/cjs/index.cjs", diff --git a/packages/analytics-js-plugins/project.json b/packages/analytics-js-plugins/project.json index c79bea3294..3c46bb6f86 100644 --- a/packages/analytics-js-plugins/project.json +++ b/packages/analytics-js-plugins/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-plugins@3.8.1", - "title": "@rudderstack/analytics-js-plugins@3.8.1", - "discussion-category": "@rudderstack/analytics-js-plugins@3.8.1", + "tag": "@rudderstack/analytics-js-plugins@3.8.2", + "title": "@rudderstack/analytics-js-plugins@3.8.2", + "discussion-category": "@rudderstack/analytics-js-plugins@3.8.2", "notesFile": "./packages/analytics-js-plugins/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js-service-worker/CHANGELOG.md b/packages/analytics-js-service-worker/CHANGELOG.md index 8ba9ed0b18..71ca561a85 100644 --- a/packages/analytics-js-service-worker/CHANGELOG.md +++ b/packages/analytics-js-service-worker/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.2.25](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.2.24...@rudderstack/analytics-js-service-worker@3.2.25) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.19.0` ## [3.2.24](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.2.23...@rudderstack/analytics-js-service-worker@3.2.24) (2025-04-25) ### Dependency Updates diff --git a/packages/analytics-js-service-worker/CHANGELOG_LATEST.md b/packages/analytics-js-service-worker/CHANGELOG_LATEST.md index bc61151409..ff84543338 100644 --- a/packages/analytics-js-service-worker/CHANGELOG_LATEST.md +++ b/packages/analytics-js-service-worker/CHANGELOG_LATEST.md @@ -1,5 +1,5 @@ -## [3.2.24](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.2.23...@rudderstack/analytics-js-service-worker@3.2.24) (2025-04-25) +## [3.2.25](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-service-worker@3.2.24...@rudderstack/analytics-js-service-worker@3.2.25) (2025-05-09) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.18.0` +* `@rudderstack/analytics-js-common` updated to version `3.19.0` diff --git a/packages/analytics-js-service-worker/package.json b/packages/analytics-js-service-worker/package.json index 8d327de6cd..ff65bad4bf 100644 --- a/packages/analytics-js-service-worker/package.json +++ b/packages/analytics-js-service-worker/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-service-worker", - "version": "3.2.24", + "version": "3.2.25", "description": "RudderStack JavaScript Service Worker SDK", "main": "dist/npm/modern/cjs/index.cjs", "module": "dist/npm/modern/esm/index.mjs", @@ -93,7 +93,7 @@ "@rudderstack/analytics-js-common": "*", "@vespaiach/axios-fetch-adapter": "0.3.1", "assert": "2.1.0", - "axios": "1.8.4", + "axios": "1.9.0", "axios-retry": "4.5.0", "component-type": "2.0.0", "join-component": "1.1.0", @@ -102,7 +102,7 @@ }, "devDependencies": { "@types/ms": "2.1.0", - "@types/node": "22.14.1", + "@types/node": "22.15.17", "jest-date-mock": "1.0.10" }, "overrides": {}, diff --git a/packages/analytics-js-service-worker/project.json b/packages/analytics-js-service-worker/project.json index 82b49cb00b..45dc8b6d9d 100644 --- a/packages/analytics-js-service-worker/project.json +++ b/packages/analytics-js-service-worker/project.json @@ -51,9 +51,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js-service-worker@3.2.24", - "title": "rudderstack/analytics-js-service-worker@3.2.24", - "discussion-category": "rudderstack/analytics-js-service-worker@3.2.24", + "tag": "@rudderstack/analytics-js-service-worker@3.2.25", + "title": "rudderstack/analytics-js-service-worker@3.2.25", + "discussion-category": "rudderstack/analytics-js-service-worker@3.2.25", "notesFile": "./packages/analytics-js-service-worker/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js/.size-limit.mjs b/packages/analytics-js/.size-limit.mjs index c05792207f..eb7412f482 100644 --- a/packages/analytics-js/.size-limit.mjs +++ b/packages/analytics-js/.size-limit.mjs @@ -13,18 +13,18 @@ export default [ name: 'Core - Legacy - NPM (CJS)', path: 'dist/npm/legacy/cjs/index.cjs', import: '*', - limit: '48.2 KiB', + limit: '48.5 KiB', }, { name: 'Core - Legacy - NPM (UMD)', path: 'dist/npm/legacy/umd/index.js', import: '*', - limit: '48 KiB', + limit: '48.5 KiB', }, { name: 'Core - Legacy - CDN', path: 'dist/cdn/legacy/iife/rsa.min.js', - limit: '48 KiB', + limit: '48.2 KiB', }, { name: 'Core - Modern - NPM (ESM)', @@ -59,19 +59,19 @@ export default [ name: 'Core (Bundled) - Legacy - NPM (CJS)', path: 'dist/npm/legacy/bundled/cjs/index.cjs', import: '*', - limit: '48.2 KiB', + limit: '48.5 KiB', }, { name: 'Core (Bundled) - Legacy - NPM (UMD)', path: 'dist/npm/legacy/bundled/umd/index.js', import: '*', - limit: '48 KiB', + limit: '48.5 KiB', }, { name: 'Core (Bundled) - Modern - NPM (ESM)', path: 'dist/npm/modern/bundled/esm/index.mjs', import: '*', - limit: '39 KiB', + limit: '39.5 KiB', }, { name: 'Core (Bundled) - Modern - NPM (CJS)', @@ -83,7 +83,7 @@ export default [ name: 'Core (Bundled) - Modern - NPM (UMD)', path: 'dist/npm/modern/bundled/umd/index.js', import: '*', - limit: '39 KiB', + limit: '39.2 KiB', }, { name: 'Core (Content Script) - Legacy - NPM (ESM)', @@ -95,7 +95,7 @@ export default [ name: 'Core (Content Script) - Legacy - NPM (CJS)', path: 'dist/npm/legacy/content-script/cjs/index.cjs', import: '*', - limit: '48 KiB', + limit: '48.5 KiB', }, { name: 'Core (Content Script) - Legacy - NPM (UMD)', @@ -107,18 +107,18 @@ export default [ name: 'Core (Content Script) - Modern - NPM (ESM)', path: 'dist/npm/modern/content-script/esm/index.mjs', import: '*', - limit: '39 KiB', + limit: '39.5 KiB', }, { name: 'Core (Content Script) - Modern - NPM (CJS)', path: 'dist/npm/modern/content-script/cjs/index.cjs', import: '*', - limit: '39.2 KiB', + limit: '39.5 KiB', }, { name: 'Core (Content Script) - Modern - NPM (UMD)', path: 'dist/npm/modern/content-script/umd/index.js', import: '*', - limit: '39 KiB', + limit: '39.5 KiB', }, ]; diff --git a/packages/analytics-js/CHANGELOG.md b/packages/analytics-js/CHANGELOG.md index 7ecb6dc4cb..ec3012491b 100644 --- a/packages/analytics-js/CHANGELOG.md +++ b/packages/analytics-js/CHANGELOG.md @@ -2,6 +2,24 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.18.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.17.0...@rudderstack/analytics-js@3.18.0) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js-cookies` updated to version `0.4.25` +* `@rudderstack/analytics-js-common` updated to version `3.19.0` +* `@rudderstack/analytics-js-plugins` updated to version `3.8.2` + +### Features + +* group errors by message ([#2229](https://github.com/rudderlabs/rudder-sdk-js/issues/2229)) ([b448874](https://github.com/rudderlabs/rudder-sdk-js/commit/b448874fc39972576ebaf4d30f0bbd4883f69b7e)) +* user session cut off ([#2209](https://github.com/rudderlabs/rudder-sdk-js/issues/2209)) ([8b7bcfd](https://github.com/rudderlabs/rudder-sdk-js/commit/8b7bcfd70155beb6f162a3b8ceec5735b67cce10)) + + +### Bug Fixes + +* load api options boolean inputs normalization ([#2236](https://github.com/rudderlabs/rudder-sdk-js/issues/2236)) ([4c3532c](https://github.com/rudderlabs/rudder-sdk-js/commit/4c3532c9b9e34903c2f975d95cfa516324bbee04)) + ## [3.17.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.16.1...@rudderstack/analytics-js@3.17.0) (2025-04-25) ### Dependency Updates diff --git a/packages/analytics-js/CHANGELOG_LATEST.md b/packages/analytics-js/CHANGELOG_LATEST.md index d9935060f2..4493a75ed5 100644 --- a/packages/analytics-js/CHANGELOG_LATEST.md +++ b/packages/analytics-js/CHANGELOG_LATEST.md @@ -1,22 +1,18 @@ -## [3.17.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.16.1...@rudderstack/analytics-js@3.17.0) (2025-04-25) +## [3.18.0](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js@3.17.0...@rudderstack/analytics-js@3.18.0) (2025-05-09) ### Dependency Updates -* `@rudderstack/analytics-js-cookies` updated to version `0.4.24` -* `@rudderstack/analytics-js-common` updated to version `3.18.0` -* `@rudderstack/analytics-js-plugins` updated to version `3.8.1` +* `@rudderstack/analytics-js-cookies` updated to version `0.4.25` +* `@rudderstack/analytics-js-common` updated to version `3.19.0` +* `@rudderstack/analytics-js-plugins` updated to version `3.8.2` ### Features -* pre-consent event buffering works now for anonymousId pre-consent storage strategy ([#2100](https://github.com/rudderlabs/rudder-sdk-js/issues/2100)) ([6336925](https://github.com/rudderlabs/rudder-sdk-js/commit/6336925ccfdf66623ca98c4a44b7bf0a13ef54dc)) -* remove page loaded event ([#2088](https://github.com/rudderlabs/rudder-sdk-js/issues/2088)) ([ec1d604](https://github.com/rudderlabs/rudder-sdk-js/commit/ec1d604f70d4e476a751f5207df09eef69220be2)) +* group errors by message ([#2229](https://github.com/rudderlabs/rudder-sdk-js/issues/2229)) ([b448874](https://github.com/rudderlabs/rudder-sdk-js/commit/b448874fc39972576ebaf4d30f0bbd4883f69b7e)) +* user session cut off ([#2209](https://github.com/rudderlabs/rudder-sdk-js/issues/2209)) ([8b7bcfd](https://github.com/rudderlabs/rudder-sdk-js/commit/8b7bcfd70155beb6f162a3b8ceec5735b67cce10)) ### Bug Fixes -* consent api race condition to load integrations ([#2178](https://github.com/rudderlabs/rudder-sdk-js/issues/2178)) ([30149ad](https://github.com/rudderlabs/rudder-sdk-js/commit/30149adff3eddd628022f511374e9072d087db89)) -* consider local page urls as dev release stage in error reporting ([#2174](https://github.com/rudderlabs/rudder-sdk-js/issues/2174)) ([ae53449](https://github.com/rudderlabs/rudder-sdk-js/commit/ae53449af2289113182c602971340afdad39d13d)) -* recursively migrate persisted entries ([#2187](https://github.com/rudderlabs/rudder-sdk-js/issues/2187)) ([3dd07ea](https://github.com/rudderlabs/rudder-sdk-js/commit/3dd07ea1bde4655124fc02850a022bcb550b8c07)) -* rename view id to visit id ([#2086](https://github.com/rudderlabs/rudder-sdk-js/issues/2086)) ([51c8dd9](https://github.com/rudderlabs/rudder-sdk-js/commit/51c8dd94b2e25f42a116cb72d209d41729c165c0)) -* rename visit duration to time on page ([#2087](https://github.com/rudderlabs/rudder-sdk-js/issues/2087)) ([569846d](https://github.com/rudderlabs/rudder-sdk-js/commit/569846d992fd01105e880e67ca004d1e9f52688a)) +* load api options boolean inputs normalization ([#2236](https://github.com/rudderlabs/rudder-sdk-js/issues/2236)) ([4c3532c](https://github.com/rudderlabs/rudder-sdk-js/commit/4c3532c9b9e34903c2f975d95cfa516324bbee04)) diff --git a/packages/analytics-js/__fixtures__/fixtures.ts b/packages/analytics-js/__fixtures__/fixtures.ts index 2dd115eed7..d37f481b06 100644 --- a/packages/analytics-js/__fixtures__/fixtures.ts +++ b/packages/analytics-js/__fixtures__/fixtures.ts @@ -1,5 +1,6 @@ -import type { SourceConfigResponse } from '@rudderstack/analytics-js/components/configManager/types'; +import type { SourceConfigResponse } from '../src/components/configManager/types'; import { COOKIE_KEYS } from '@rudderstack/analytics-js-cookies/constants/cookies'; +import type { StorageEntries } from '@rudderstack/analytics-js-common/types/ApplicationState'; const identifyRequestPayload = { userId: '123456', @@ -42,15 +43,6 @@ const screenRequestPayload = { }, }; -const groupRequestPayload = { - userId: '12345', - groupId: '1', - traits: { - name: 'Company', - description: 'Google', - }, -}; - const aliasRequestPayload = { previousId: 'old_id', userId: 'new_id', @@ -93,9 +85,6 @@ const dummySourceConfigResponse: SourceConfigResponse = { enabled: true, workspaceId: 'dummyWorkspaceId', updatedAt: '2023-02-03T13:53:35.731Z', - dataplanes: { - US: '', - }, destinations: [ { config: { @@ -269,7 +258,7 @@ const entriesWithOnlyCookieStorage = { type: 'cookieStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithOnlyLocalStorage = { userId: { @@ -308,7 +297,7 @@ const entriesWithOnlyLocalStorage = { type: 'localStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithoutCookieStorage = { userId: { @@ -347,7 +336,7 @@ const entriesWithoutCookieStorage = { type: 'localStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithoutCookieAndLocalStorage = { userId: { @@ -386,7 +375,7 @@ const entriesWithoutCookieAndLocalStorage = { type: 'sessionStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithOnlyNoStorage = { userId: { @@ -425,7 +414,7 @@ const entriesWithOnlyNoStorage = { type: 'none', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithOnlySessionStorage = { userId: { @@ -464,7 +453,7 @@ const entriesWithOnlySessionStorage = { type: 'sessionStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithMixStorage = { userId: { @@ -503,7 +492,7 @@ const entriesWithMixStorage = { type: 'memoryStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithMixStorageButWithoutNone = { userId: { @@ -542,7 +531,7 @@ const entriesWithMixStorageButWithoutNone = { type: 'memoryStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const loadOptionWithEntry = { userId: { @@ -557,7 +546,7 @@ const loadOptionWithEntry = { sessionInfo: { type: 'none', }, -}; +} satisfies StorageEntries; const postConsentStorageEntryOptions = { userId: { @@ -572,7 +561,7 @@ const postConsentStorageEntryOptions = { sessionInfo: { type: 'none', }, -}; +} satisfies StorageEntries; const entriesWithInMemoryFallback = { userId: { @@ -611,7 +600,7 @@ const entriesWithInMemoryFallback = { type: 'memoryStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const loadOptionWithInvalidEntry = { userId: { @@ -623,7 +612,7 @@ const loadOptionWithInvalidEntry = { anonymousId: { type: 'cookieStorage', }, -}; +} satisfies StorageEntries; const entriesWithStorageOnlyForSession = { userId: { @@ -662,7 +651,7 @@ const entriesWithStorageOnlyForSession = { type: 'none', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const anonymousIdWithNoStorageEntries = { userId: { @@ -701,7 +690,7 @@ const anonymousIdWithNoStorageEntries = { type: 'cookieStorage', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; const entriesWithStorageOnlyForAnonymousId = { userId: { @@ -740,7 +729,7 @@ const entriesWithStorageOnlyForAnonymousId = { type: 'none', key: COOKIE_KEYS.authToken, }, -}; +} satisfies StorageEntries; export { identifyRequestPayload, diff --git a/packages/analytics-js/__tests__/components/configManager/ConfigManager.test.ts b/packages/analytics-js/__tests__/components/configManager/ConfigManager.test.ts index 1e41c84fd5..bcdf1a7754 100644 --- a/packages/analytics-js/__tests__/components/configManager/ConfigManager.test.ts +++ b/packages/analytics-js/__tests__/components/configManager/ConfigManager.test.ts @@ -209,7 +209,9 @@ describe('ConfigManager', () => { expect(defaultErrorHandler.onError).toHaveBeenCalledTimes(1); expect(defaultErrorHandler.onError).toHaveBeenCalledWith( - new SyntaxError("Expected ',' or '}' after property value in JSON at position 15"), + new SyntaxError( + "Expected ',' or '}' after property value in JSON at position 15 (line 1 column 16)", + ), 'ConfigManager', 'Unable to process/parse source configuration response', ); diff --git a/packages/analytics-js/__tests__/components/userSessionManager/UserSessionManager.test.ts b/packages/analytics-js/__tests__/components/userSessionManager/UserSessionManager.test.ts index fefb012ab6..f164d7be5f 100644 --- a/packages/analytics-js/__tests__/components/userSessionManager/UserSessionManager.test.ts +++ b/packages/analytics-js/__tests__/components/userSessionManager/UserSessionManager.test.ts @@ -67,7 +67,7 @@ describe('User session manager', () => { const setDataInCookieStorageEngine = (data: any) => { Object.entries(data).forEach(([key, value]) => { - clientDataStoreCookie.engine.setItem(key, value); + clientDataStoreCookie.engine.setItem(key, value as string); }); }; @@ -113,6 +113,10 @@ describe('User session manager', () => { state.loadOptions.value.sessions = { autoTrack: true, timeout: 10000, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, }; state.storage.entries.value = entriesWithStorageOnlyForAnonymousId; userSessionManager.init(); @@ -134,8 +138,7 @@ describe('User session manager', () => { autoTrack: true, expiresAt: expect.any(Number), id: expect.any(Number), - sessionStart: undefined, - timeout: 10000, // TODO: fix this after this entry is removed from state + timeout: 10000, }); // This also covers the data migration from previous storage to current expect(state.session.anonymousId.value).toBe(customData.rl_anonymous_id); @@ -152,11 +155,12 @@ describe('User session manager', () => { userSessionManager.syncStorageDataToState(); expect(spy).toHaveBeenCalledWith('anonId'); }); - it('should set anonymousId with existing logic if external name is not string', () => { + it('should set anonymousId with existing logic if external anonymous ID cookie name is not string', () => { const customData = { rl_anonymous_id: 'dummy-anonymousId', }; setDataInCookieStorage(customData); + // @ts-expect-error - need to test this case state.loadOptions.value.externalAnonymousIdCookieName = 12345; state.storage.entries.value = entriesWithOnlyCookieStorage; const spy = jest.spyOn(userSessionManager, 'getExternalAnonymousIdByCookieName'); @@ -171,6 +175,7 @@ describe('User session manager', () => { rl_anonymous_id: 'dummy-anonymousId', }; setDataInCookieStorage(customData); + // @ts-expect-error - need to test this case state.loadOptions.value.externalAnonymousIdCookieName = null; state.storage.entries.value = entriesWithOnlyCookieStorage; const spy = jest.spyOn(userSessionManager, 'getExternalAnonymousIdByCookieName'); @@ -216,7 +221,7 @@ describe('User session manager', () => { }, }; setDataInCookieStorage(customData); - state.loadOptions.value.sessions.autoTrack = false; + state.loadOptions.value.sessions!.autoTrack = false; state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.syncStorageDataToState(); expect(state.session.sessionInfo.value).toStrictEqual({}); @@ -232,16 +237,16 @@ describe('User session manager', () => { }, }; setDataInCookieStorage(customData); - state.loadOptions.value.sessions.autoTrack = false; + state.loadOptions.value.sessions!.autoTrack = false; state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.syncStorageDataToState(); expect(state.session.sessionInfo.value).toStrictEqual({ id: 1726655503445, expiresAt: expect.any(Number), - timeout: 60000, manualTrack: true, autoTrack: false, sessionStart: false, + timeout: undefined, }); }); it('should set sessionInfo if sessionInfo exists in storage with autoTrack enabled', () => { @@ -257,7 +262,7 @@ describe('User session manager', () => { setDataInCookieStorage(customData); state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.syncStorageDataToState(); - expect(state.session.sessionInfo.value).toStrictEqual({ + expect(state.session.sessionInfo.value).toEqual({ id: 1726655503445, expiresAt: expect.any(Number), timeout: 1800000, @@ -527,9 +532,9 @@ describe('User session manager', () => { expect(state.session.initialReferringDomain.value).toBe( customData.rl_page_init_referring_domain, ); - expect(state.session.sessionInfo.value).toStrictEqual({ + expect(state.session.sessionInfo.value).toEqual({ ...customData.rl_session, - timeout: expect.any(Number), // TODO: fix this after this entry is removed from state + timeout: expect.any(Number), }); expect(state.session.authToken.value).toBe(customData.rl_auth_token); }); @@ -549,7 +554,7 @@ describe('User session manager', () => { state.session.sessionInfo.value = { autoTrack: true, manualTrack: false, - id: 'new-session-id', + id: 1234567890, }; state.session.authToken.value = 'new-auth-token'; @@ -565,7 +570,7 @@ describe('User session manager', () => { expect(clientDataStoreCookie.get('rl_session')).toStrictEqual({ autoTrack: true, manualTrack: false, - id: 'new-session-id', + id: 1234567890, }); expect(clientDataStoreCookie.get('rl_auth_token')).toBe('new-auth-token'); }); @@ -583,12 +588,11 @@ describe('User session manager', () => { ); expect(state.session.initialReferrer.value).toBe('$direct'); // referrer is recomputed expect(state.session.initialReferringDomain.value).toBe(''); - expect(state.session.sessionInfo.value).toStrictEqual({ + expect(state.session.sessionInfo.value).toEqual({ autoTrack: true, expiresAt: expect.any(Number), id: expect.any(Number), - sessionStart: undefined, - timeout: expect.any(Number), // TODO: fix this after this entry is removed from state + timeout: expect.any(Number), }); expect(state.session.authToken.value).toBe(DEFAULT_USER_SESSION_VALUES.authToken); }); @@ -603,8 +607,49 @@ describe('User session manager', () => { expect(state.session.sessionInfo.value).toStrictEqual({}); }); + it('should reset the session info to default value if no session tracking is configured', () => { + state.storage.entries.value = entriesWithOnlyCookieStorage; + state.loadOptions.value.sessions = { + autoTrack: false, + }; + userSessionManager.init(); + + expect(state.session.sessionInfo.value).toStrictEqual({}); + }); + + it('should reset the cut off expiry timestamp (retrieved from storage) if cut off is disabled in the configuration', () => { + const customData = { + rl_session: { + autoTrack: true, + manualTrack: false, + id: 1234567890, + timeout: 10000, + expiresAt: Date.now() + 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: Date.now() + 10000, + }, + }, + }; + setDataInCookieStorage(customData); + + state.storage.entries.value = entriesWithOnlyCookieStorage; + state.loadOptions.value.sessions = { + autoTrack: true, + cutOff: { + enabled: false, + }, + }; + + userSessionManager.init(); + + expect(state.session.sessionInfo.value.cutOff).toBeUndefined(); + }); + it('should log a warning and use default timeout if provided timeout is not in number format', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; + // @ts-expect-error need to test this case state.loadOptions.value.sessions.timeout = '100000'; userSessionManager.init(); expect(defaultLogger.warn).toHaveBeenCalledWith( @@ -615,7 +660,7 @@ describe('User session manager', () => { it('should log a warning and disable auto tracking if provided timeout is 0', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; - state.loadOptions.value.sessions.timeout = 0; + state.loadOptions.value.sessions!.timeout = 0; userSessionManager.init(); expect(defaultLogger.warn).toHaveBeenCalledWith( 'UserSessionManager:: The session timeout value is 0, which disables the automatic session tracking feature. If you want to enable session tracking, please provide a positive integer value for the timeout.', @@ -625,12 +670,146 @@ describe('User session manager', () => { it('should log a warning if provided timeout is less than 10 seconds', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; - state.loadOptions.value.sessions.timeout = 5000; // provided timeout as 5 second + state.loadOptions.value.sessions!.timeout = 5000; // provided timeout as 5 second userSessionManager.init(); expect(defaultLogger.warn).toHaveBeenCalledWith( `UserSessionManager:: The session timeout value 5000 ms is less than the recommended minimum of 10000 ms. Please consider increasing the timeout value to ensure optimal performance and reliability.`, ); }); + + it('should log a warning and use default value if the provided cut off duration is not a positive integer', () => { + state.storage.entries.value = entriesWithOnlyCookieStorage; + state.loadOptions.value.sessions!.cutOff = { + enabled: true, + // @ts-expect-error - need to test this case + duration: '100000', + }; + + userSessionManager.init(); + + expect(defaultLogger.warn).toHaveBeenCalledWith( + 'UserSessionManager:: The session cut off duration value "100000" is not a number. The default cut off duration of 43200000 ms will be used instead.', + ); + + expect(state.session.sessionInfo.value.cutOff).toStrictEqual({ + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: expect.any(Number), + }); + }); + + it('should disable cut off and log a warning if the provided cut off duration is less than the session timeout', () => { + state.storage.entries.value = entriesWithOnlyCookieStorage; + state.loadOptions.value.sessions = { + autoTrack: true, + timeout: 60 * 60 * 1000, + cutOff: { + enabled: true, + duration: 10 * 60 * 1000, // less than the session timeout + }, + }; + + userSessionManager.init(); + + expect(defaultLogger.warn).toHaveBeenCalledWith( + 'UserSessionManager:: The session cut off duration value "600000" ms is less than the session timeout value "3600000" ms. The cut off functionality will be disabled.', + ); + + expect(state.session.sessionInfo.value.cutOff).toBeUndefined(); + }); + + it('should reset the session and cut off expiry timestamp if it is exceeded', () => { + const currentCutOffExpiryTimestamp = 99; // expired cut off + + const customData = { + rl_session: { + autoTrack: true, + manualTrack: false, + id: 98, + timeout: 10000, + expiresAt: 105, // still not expired + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: currentCutOffExpiryTimestamp, + }, + }, + }; + setDataInCookieStorage(customData); + + state.loadOptions.value.sessions = { + autoTrack: true, + timeout: 60 * 60 * 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + }, + }; + + state.storage.entries.value = entriesWithOnlyCookieStorage; + + jest.useFakeTimers(); + jest.setSystemTime(100); + + userSessionManager.init(); + + expect(state.session.sessionInfo.value).toStrictEqual({ + autoTrack: true, + id: Date.now(), + timeout: 3600000, + expiresAt: Date.now() + 3600000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: Date.now() + 12 * 60 * 60 * 1000, + }, + }); + + jest.useRealTimers(); + }); + + it('should not reset the cut off expiry timestamp if it is not exceeded', () => { + const currentCutOffExpiryTimestamp = 10000; // not expired cut off + + const customData = { + rl_session: { + autoTrack: true, + manualTrack: false, + id: 1234567890, + timeout: 10000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: currentCutOffExpiryTimestamp, + }, + }, + }; + setDataInCookieStorage(customData); + + state.loadOptions.value.sessions = { + autoTrack: true, + timeout: 60 * 60 * 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + }, + }; + + state.storage.entries.value = entriesWithOnlyCookieStorage; + + jest.useFakeTimers(); + jest.setSystemTime(100); + + userSessionManager.init(); + + expect(state.session.sessionInfo.value.cutOff).toStrictEqual({ + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: currentCutOffExpiryTimestamp, + }); + + jest.useRealTimers(); + }); }); describe('getAnonymousId', () => { @@ -1084,6 +1263,7 @@ describe('User session manager', () => { it('should reset the value to default value if the value is not an object', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.init(); + // @ts-expect-error - need to test this case userSessionManager.setUserTraits('dummy-user-traits'); expect(state.session.userTraits.value).toStrictEqual(DEFAULT_USER_SESSION_VALUES.userTraits); }); @@ -1159,6 +1339,7 @@ describe('User session manager', () => { it('should reset the value to default value if the value is not an object', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.init(); + // @ts-expect-error - need to test this case userSessionManager.setGroupTraits('dummy-group-traits'); expect(state.session.groupTraits.value).toStrictEqual( DEFAULT_USER_SESSION_VALUES.groupTraits, @@ -1256,6 +1437,7 @@ describe('User session manager', () => { it('should reset the value to default value if the value is not provided', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.init(); + // @ts-expect-error - need to test this case userSessionManager.setAuthToken(); expect(state.session.authToken.value).toBe(DEFAULT_USER_SESSION_VALUES.authToken); }); @@ -1315,6 +1497,10 @@ describe('User session manager', () => { expiresAt: pastTimestamp, id: 1683613729115, sessionStart: false, + cutOff: { + enabled: false, + duration: 12 * 60 * 1000, + }, }; userSessionManager.refreshSession(); expect(state.session.sessionInfo.value).toEqual({ @@ -1323,6 +1509,10 @@ describe('User session manager', () => { id: expect.any(Number), expiresAt: expect.any(Number), sessionStart: true, + cutOff: { + enabled: false, + duration: 12 * 60 * 1000, + }, }); }); @@ -1415,7 +1605,7 @@ describe('User session manager', () => { }; const sessionId = userSessionManager.getSessionId(); expect(typeof sessionId).toBe('number'); - expect(sessionId.toString().length).toBeGreaterThan(0); + expect(sessionId!.toString().length).toBeGreaterThan(0); }); it('should return null for expired session', () => { @@ -1484,6 +1674,10 @@ describe('User session manager', () => { expiresAt: Date.now() - 1000, id: 1683613729115, sessionStart: false, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, }; userSessionManager.startOrRenewAutoTracking(state.session.sessionInfo.value); expect(state.session.sessionInfo.value).toEqual({ @@ -1492,6 +1686,10 @@ describe('User session manager', () => { expiresAt: expect.any(Number), id: expect.any(Number), sessionStart: undefined, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, }); }); @@ -1547,22 +1745,31 @@ describe('User session manager', () => { describe('reset', () => { it('should reset user session to the initial value except anonymousId', () => { + jest.useFakeTimers(); + jest.setSystemTime(0); + state.storage.entries.value = entriesWithOnlyCookieStorage; userSessionManager.init(); userSessionManager.setAnonymousId(dummyAnonymousId); const sessionInfoBeforeReset = JSON.parse(JSON.stringify(state.session.sessionInfo.value)); + + jest.advanceTimersByTime(1000); userSessionManager.reset(); + expect(state.session.userId.value).toEqual(''); expect(state.session.userTraits.value).toEqual({}); expect(state.session.groupId.value).toEqual(''); expect(state.session.groupTraits.value).toEqual({}); expect(state.session.anonymousId.value).toEqual(dummyAnonymousId); + // new session will be generated expect(state.session.sessionInfo.value.autoTrack).toBe(sessionInfoBeforeReset.autoTrack); expect(state.session.sessionInfo.value.timeout).toBe(sessionInfoBeforeReset.timeout); expect(state.session.sessionInfo.value.expiresAt).not.toBe(sessionInfoBeforeReset.expiresAt); expect(state.session.sessionInfo.value.id).not.toBe(sessionInfoBeforeReset.id); expect(state.session.sessionInfo.value.sessionStart).toBe(undefined); + + jest.useRealTimers(); }); it('should clear the existing anonymousId and set a new anonymousId with first parameter set to true', () => { @@ -1583,11 +1790,43 @@ describe('User session manager', () => { it('should not start a new session with second parameter set to true', () => { state.storage.entries.value = entriesWithOnlyCookieStorage; + state.loadOptions.value.sessions = { + autoTrack: true, + timeout: 10 * 60 * 1000, + cutOff: { + enabled: false, + }, + }; + userSessionManager.init(); const sessionInfoBeforeReset = JSON.parse(JSON.stringify(state.session.sessionInfo.value)); userSessionManager.reset(true, true); expect(state.session.sessionInfo.value).toEqual(sessionInfoBeforeReset); }); + + it('should retain previous session timeout and cut off information when auto tracking is enabled', () => { + state.loadOptions.value.sessions = { + autoTrack: true, + timeout: 10 * 60 * 1000, + cutOff: { enabled: true, duration: 15 * 60 * 60 * 1000 }, + }; + + userSessionManager.init(); + + userSessionManager.reset(); + + expect(state.session.sessionInfo.value).toEqual({ + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: expect.any(Number), + id: expect.any(Number), + cutOff: { + enabled: true, + duration: 15 * 60 * 60 * 1000, + expiresAt: expect.any(Number), + }, + }); + }); }); describe('getExternalAnonymousIdByCookieName', () => { @@ -1717,7 +1956,11 @@ describe('User session manager', () => { }); describe('Network request to Data service is successful', () => { it('should validate cookies are set from the server side', done => { - state.source.value = { workspaceId: 'sample_workspaceId' }; + state.source.value = { + workspaceId: 'sample_workspaceId', + id: 'sample_source_id', + name: 'sample_source_name', + }; state.serverCookies.dataServiceUrl.value = 'https://dummy.dataplane.host.com/rsaRequest'; state.storage.cookie.value = { maxage: 10 * 60 * 1000, // 10 min @@ -1755,7 +1998,11 @@ describe('User session manager', () => { }, 1000); }); it('should set cookies from client side if not successfully set from the server side', done => { - state.source.value = { workspaceId: 'sample_workspaceId' }; + state.source.value = { + workspaceId: 'sample_workspaceId', + id: 'sample_source_id', + name: 'sample_source_name', + }; state.serverCookies.dataServiceUrl.value = 'https://dummy.dataplane.host.com/rsaRequest'; state.storage.cookie.value = { maxage: 10 * 60 * 1000, // 10 min @@ -1783,7 +2030,11 @@ describe('User session manager', () => { }); it('should set cookie from client side if data service is down', done => { - state.source.value = { workspaceId: 'sample_workspaceId' }; + state.source.value = { + workspaceId: 'sample_workspaceId', + id: 'sample_source_id', + name: 'sample_source_name', + }; state.serverCookies.dataServiceUrl.value = 'https://dummy.dataplane.host.com/serverDown/rsaRequest'; state.storage.cookie.value = { @@ -1803,7 +2054,11 @@ describe('User session manager', () => { }, 1000); }); it('should set cookie from client side if dataServerUrl is invalid', done => { - state.source.value = { workspaceId: 'sample_workspaceId' }; + state.source.value = { + workspaceId: 'sample_workspaceId', + id: 'sample_source_id', + name: 'sample_source_name', + }; state.serverCookies.dataServiceUrl.value = 'https://dummy.dataplane.host.com/invalidUrl/rsaRequest'; state.storage.cookie.value = { @@ -1823,7 +2078,11 @@ describe('User session manager', () => { }, 1000); }); it('should set cookie from client side if any unhandled error ocurred in serServerSideCookie function', () => { - state.source.value = { workspaceId: 'sample_workspaceId' }; + state.source.value = { + workspaceId: 'sample_workspaceId', + id: 'sample_source_id', + name: 'sample_source_name', + }; state.serverCookies.dataServiceUrl.value = 'https://dummy.dataplane.host.com/rsaRequest'; userSessionManager.getEncryptedCookieData = jest.fn(() => { throw new Error('test error'); @@ -1862,7 +2121,11 @@ describe('User session manager', () => { describe('makeRequestToSetCookie', () => { it('should make external request to exposed endpoint', done => { state.serverCookies.dataServiceUrl.value = 'https://dummy.dataplane.host.com/rsaRequest'; - state.source.value = { workspaceId: 'sample_workspaceId' }; + state.source.value = { + workspaceId: 'sample_workspaceId', + id: 'sample_source_id', + name: 'sample_source_name', + }; state.storage.cookie.value = { maxage: 10 * 60 * 1000, // 10 min path: '/', diff --git a/packages/analytics-js/__tests__/components/userSessionManager/utils.test.ts b/packages/analytics-js/__tests__/components/userSessionManager/utils.test.ts index 3fd3b96081..ddabf2e0d7 100644 --- a/packages/analytics-js/__tests__/components/userSessionManager/utils.test.ts +++ b/packages/analytics-js/__tests__/components/userSessionManager/utils.test.ts @@ -1,3 +1,4 @@ +import type { SessionInfo } from '@rudderstack/analytics-js-common/types/Session'; import { hasSessionExpired, generateSessionId, @@ -5,43 +6,224 @@ import { generateManualTrackingSession, MIN_SESSION_ID_LENGTH, isStorageTypeValidForStoringData, + isCutOffTimeExceeded, + generateAnonymousId, + getCutOffExpirationTimestamp, } from '../../../src/components/userSessionManager/utils'; import { defaultLogger } from '../../../src/services/Logger'; -describe('Utility: User session manager', () => { - describe('hasSessionExpired:', () => { - it('should return true for valid session', () => { - const outcome = hasSessionExpired(Date.now() + 1000); +describe('Utilities: User session manager', () => { + describe('hasSessionExpired', () => { + beforeEach(() => { + jest.useFakeTimers(); + jest.setSystemTime(0); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should return true if the current timestamp is less than the session expiry time', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 1000, + id: 1234567890, + sessionStart: undefined, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(false); + }); + + it('should return true if the current timestamp is greater than the session expiry time', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() - 1000, + id: 1234567890, + sessionStart: undefined, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(true); + }); + + it('should return true if the current timestamp is equal to the session expiry time', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now(), + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(true); + }); + + it('should return true if the session expiry timestamp is not set', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(true); + }); + + it('should return true if the session has not expired but the current timestamp is greater than the cut off time', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: Date.now() - 500, // 500ms ago + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(true); + }); + + it('should return false if the session has not expired and the current timestamp is less than the cut off time', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: Date.now() + 5000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(false); + }); + + it('should return false if the session has not expired and the current timestamp is equal to the cut off time', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: Date.now(), + }, + }; + + const outcome = hasSessionExpired(sessionInfo); expect(outcome).toEqual(false); }); - it('hasSessionExpired: should return false for valid session', () => { - const outcome = hasSessionExpired(Date.now() - 1000); + + it('should return false if the session has not expired and the cut off expiry timestamp is not set', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); + expect(outcome).toEqual(false); + }); + + it('should return true when both the session expiry and cut off expiry timestamps are less than the current timestamp', () => { + const sessionInfo: SessionInfo = { + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() - 1000, + cutOff: { + enabled: true, + duration: 12 * 60 * 60 * 1000, + expiresAt: Date.now() - 2000, + }, + }; + + const outcome = hasSessionExpired(sessionInfo); expect(outcome).toEqual(true); }); }); - describe('generateSessionId:', () => { + describe('generateSessionId', () => { it('should return newly generated session id', () => { const outcome = generateSessionId(); expect(typeof outcome).toBe('number'); expect(outcome.toString().length).toEqual(13); }); }); - describe('generateAutoTrackingSession:', () => { - it('should return newly generated auto tracking session', () => { - const timeout = 10 * 60 * 1000; - const outcome = generateAutoTrackingSession(timeout); + + describe('generateAutoTrackingSession', () => { + beforeEach(() => { + jest.useFakeTimers(); + jest.setSystemTime(0); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should return a freshly generated auto tracking session information object', () => { + const outcome = generateAutoTrackingSession({ + autoTrack: true, + timeout: 10 * 60 * 1000, + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, + }); + expect(outcome).toEqual({ autoTrack: true, - timeout, - expiresAt: expect.any(Number), - id: expect.any(Number), - sessionStart: undefined, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 10 * 60 * 1000, + id: Date.now(), + cutOff: { + enabled: false, + duration: 12 * 60 * 60 * 1000, + }, + }); + }); + + it('should return auto tracking session information with id and expires timestamp overridden if provided', () => { + const outcome = generateAutoTrackingSession({ + autoTrack: true, + timeout: 10 * 60 * 1000, + id: 1234567890, + expiresAt: Date.now() + 1000, + }); + + expect(outcome).toEqual({ + autoTrack: true, + timeout: 10 * 60 * 1000, + expiresAt: Date.now() + 10 * 60 * 1000, + id: Date.now(), }); }); }); - describe('generateManualTrackingSession:', () => { + describe('generateManualTrackingSession', () => { it('should return newly generated manual session', () => { const sessionId = 1234567890; const outcome = generateManualTrackingSession(sessionId, defaultLogger); @@ -85,7 +267,8 @@ describe('Utility: User session manager', () => { ); }); }); - describe('isStorageTypeValidForStoringData:', () => { + + describe('isStorageTypeValidForStoringData', () => { it('should return true only for storage type cookie/LS/memory', () => { const outcome1 = isStorageTypeValidForStoringData('cookieStorage'); const outcome2 = isStorageTypeValidForStoringData('localStorage'); @@ -102,4 +285,121 @@ describe('Utility: User session manager', () => { expect(outcome6).toEqual(false); }); }); + + describe('isCutOffTimeExceeded', () => { + beforeEach(() => { + jest.useFakeTimers(); + jest.setSystemTime(0); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should return false if the cut off time is greater than the current timestamp', () => { + const outcome = isCutOffTimeExceeded({ + id: 1234567890, + expiresAt: Date.now() + 1, + cutOff: { enabled: true, duration: 1000, expiresAt: Date.now() + 1000 }, + }); + + expect(outcome).toEqual(false); + }); + + it('should return true if the cut off time is less than the current timestamp', () => { + const outcome = isCutOffTimeExceeded({ + id: 1234567890, + expiresAt: Date.now() + 1, + cutOff: { enabled: true, duration: 1000, expiresAt: Date.now() - 1000 }, + }); + + expect(outcome).toEqual(true); + }); + + it('should return false if the cut off time is equal to the current timestamp', () => { + const outcome = isCutOffTimeExceeded({ + id: 1234567890, + expiresAt: Date.now() + 1, + cutOff: { enabled: true, duration: 1000, expiresAt: Date.now() }, + }); + + expect(outcome).toEqual(false); + }); + + it('should return false if the cut off time is not set', () => { + const outcome = isCutOffTimeExceeded({ + id: 1234567890, + expiresAt: Date.now() + 1, + cutOff: { enabled: true }, + }); + + expect(outcome).toEqual(false); + }); + + it('should return false if cut off is not enabled', () => { + const outcome = isCutOffTimeExceeded({ + id: 1234567890, + expiresAt: Date.now() + 1, + cutOff: { enabled: false }, + }); + + expect(outcome).toEqual(false); + }); + + it('should return false if cut off is not defined', () => { + const outcome = isCutOffTimeExceeded({ + id: 1234567890, + expiresAt: Date.now() + 1, + }); + + expect(outcome).toEqual(false); + }); + }); + + describe('getCutOffExpirationTimestamp', () => { + beforeEach(() => { + jest.useFakeTimers(); + jest.setSystemTime(0); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should return undefined if cut off is not defined', () => { + const outcome = getCutOffExpirationTimestamp(undefined); + expect(outcome).toEqual(undefined); + }); + + it('should return undefined if cut off is not enabled', () => { + const outcome = getCutOffExpirationTimestamp({ enabled: false }); + expect(outcome).toEqual(undefined); + }); + + it('should return the cut off expiry timestamp if it is set', () => { + const outcome = getCutOffExpirationTimestamp({ + enabled: true, + duration: 1000, + expiresAt: 1234567890, + }); + expect(outcome).toEqual(1234567890); + }); + + it('should calculate and return the cut off expiry timestamp based on the duration', () => { + const outcome = getCutOffExpirationTimestamp({ enabled: true, duration: 1000 }); + expect(outcome).toEqual(Date.now() + 1000); + }); + + it('should return undefined if the cut off duration is not a valid number', () => { + const outcome = getCutOffExpirationTimestamp({ enabled: true }); + expect(outcome).toEqual(undefined); + }); + }); + + describe('generateAnonymousId', () => { + it('should return a newly generated anonymous id', () => { + const outcome = generateAnonymousId(); + expect(outcome).toMatch(/^[\dA-Fa-f]{8}(?:-[\dA-Fa-f]{4}){3}-[\dA-Fa-f]{12}$/); + }); + }); }); diff --git a/packages/analytics-js/__tests__/components/utilities/loadOptions.test.ts b/packages/analytics-js/__tests__/components/utilities/loadOptions.test.ts index e975fb3c4c..e5939247ef 100644 --- a/packages/analytics-js/__tests__/components/utilities/loadOptions.test.ts +++ b/packages/analytics-js/__tests__/components/utilities/loadOptions.test.ts @@ -561,39 +561,39 @@ describe('load API options', () => { describe('useGlobalIntegrationsConfigInEvents', () => { const testCaseData: any[] = [ { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is a string', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is a string', input: { useGlobalIntegrationsConfigInEvents: 'Invalid' }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is a number', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is a number', input: { useGlobalIntegrationsConfigInEvents: 123 }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is an object', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is an object', input: { useGlobalIntegrationsConfigInEvents: { domain: 'rudderstack.com' } }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is an array', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is an array', input: { useGlobalIntegrationsConfigInEvents: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is a function', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is a function', input: { useGlobalIntegrationsConfigInEvents: () => {} }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is a symbol', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is a symbol', input: { useGlobalIntegrationsConfigInEvents: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useGlobalIntegrationsConfigInEvents if it is null', + name: 'should consider default value for useGlobalIntegrationsConfigInEvents if it is null', input: { useGlobalIntegrationsConfigInEvents: null }, - expected: { ...defaultLoadOptions, useGlobalIntegrationsConfigInEvents: false }, + expected: defaultLoadOptions, }, { name: 'should ignore useGlobalIntegrationsConfigInEvents if it is undefined', @@ -629,39 +629,39 @@ describe('load API options', () => { describe('bufferDataPlaneEventsUntilReady', () => { const testCaseData: any[] = [ { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is a string', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is a string', input: { bufferDataPlaneEventsUntilReady: 'Invalid' }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is a number', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is a number', input: { bufferDataPlaneEventsUntilReady: 123 }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is an object', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is an object', input: { bufferDataPlaneEventsUntilReady: { domain: 'rudderstack.com' } }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is an array', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is an array', input: { bufferDataPlaneEventsUntilReady: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is a function', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is a function', input: { bufferDataPlaneEventsUntilReady: () => {} }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is a symbol', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is a symbol', input: { bufferDataPlaneEventsUntilReady: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false bufferDataPlaneEventsUntilReady if it is null', + name: 'should consider default value for bufferDataPlaneEventsUntilReady if it is null', input: { bufferDataPlaneEventsUntilReady: null }, - expected: { ...defaultLoadOptions, bufferDataPlaneEventsUntilReady: false }, + expected: defaultLoadOptions, }, { name: 'should ignore bufferDataPlaneEventsUntilReady if it is undefined', @@ -697,39 +697,39 @@ describe('load API options', () => { describe('sendAdblockPage', () => { const testCaseData: any[] = [ { - name: 'should consider false sendAdblockPage if it is a string', + name: 'should consider default value for sendAdblockPage if it is a string', input: { sendAdblockPage: 'Invalid' }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false sendAdblockPage if it is a number', + name: 'should consider default value for sendAdblockPage if it is a number', input: { sendAdblockPage: 123 }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false sendAdblockPage if it is an object', + name: 'should consider default value for sendAdblockPage if it is an object', input: { sendAdblockPage: { domain: 'rudderstack.com' } }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false sendAdblockPage if it is an array', + name: 'should consider default value for sendAdblockPage if it is an array', input: { sendAdblockPage: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false sendAdblockPage if it is a function', + name: 'should consider default value for sendAdblockPage if it is a function', input: { sendAdblockPage: () => {} }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false sendAdblockPage if it is a symbol', + name: 'should consider default value for sendAdblockPage if it is a symbol', input: { sendAdblockPage: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false sendAdblockPage if it is null', + name: 'should consider default value for sendAdblockPage if it is null', input: { sendAdblockPage: null }, - expected: { ...defaultLoadOptions, sendAdblockPage: false }, + expected: defaultLoadOptions, }, { name: 'should ignore sendAdblockPage if it is undefined', @@ -831,39 +831,39 @@ describe('load API options', () => { describe('useServerSideCookies', () => { const testCaseData: any[] = [ { - name: 'should consider false useServerSideCookies if it is a string', + name: 'should consider default value for useServerSideCookies if it is a string', input: { useServerSideCookies: 'Invalid' }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useServerSideCookies if it is a number', + name: 'should consider default value for useServerSideCookies if it is a number', input: { useServerSideCookies: 123 }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useServerSideCookies if it is an object', + name: 'should consider default value for useServerSideCookies if it is an object', input: { useServerSideCookies: { domain: 'rudderstack.com' } }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useServerSideCookies if it is an array', + name: 'should consider default value for useServerSideCookies if it is an array', input: { useServerSideCookies: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useServerSideCookies if it is a function', + name: 'should consider default value for useServerSideCookies if it is a function', input: { useServerSideCookies: () => {} }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useServerSideCookies if it is a symbol', + name: 'should consider default value for useServerSideCookies if it is a symbol', input: { useServerSideCookies: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false useServerSideCookies if it is null', + name: 'should consider default value for useServerSideCookies if it is null', input: { useServerSideCookies: null }, - expected: { ...defaultLoadOptions, useServerSideCookies: false }, + expected: defaultLoadOptions, }, { name: 'should ignore useServerSideCookies if it is undefined', @@ -959,39 +959,39 @@ describe('load API options', () => { describe('loadIntegration', () => { const testCaseData: any[] = [ { - name: 'should consider false loadIntegration if it is a string', + name: 'should consider default value for loadIntegration if it is a string', input: { loadIntegration: 'Invalid' }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false loadIntegration if it is a number', + name: 'should consider default value for loadIntegration if it is a number', input: { loadIntegration: 123 }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false loadIntegration if it is an object', + name: 'should consider default value for loadIntegration if it is an object', input: { loadIntegration: { domain: 'rudderstack.com' } }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false loadIntegration if it is an array', + name: 'should consider default value for loadIntegration if it is an array', input: { loadIntegration: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false loadIntegration if it is a function', + name: 'should consider default value for loadIntegration if it is a function', input: { loadIntegration: () => {} }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false loadIntegration if it is a symbol', + name: 'should consider default value for loadIntegration if it is a symbol', input: { loadIntegration: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false loadIntegration if it is null', + name: 'should consider default value for loadIntegration if it is null', input: { loadIntegration: null }, - expected: { ...defaultLoadOptions, loadIntegration: false }, + expected: defaultLoadOptions, }, { name: 'should ignore loadIntegration if it is undefined', @@ -1228,34 +1228,34 @@ describe('load API options', () => { describe('lockIntegrationsVersion', () => { const testCaseData: any[] = [ { - name: 'should consider false lockIntegrationsVersion if it is a number', + name: 'should consider default value for lockIntegrationsVersion if it is a number', input: { lockIntegrationsVersion: 123 }, - expected: { ...defaultLoadOptions, lockIntegrationsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockIntegrationsVersion if it is a string', + name: 'should consider default value for lockIntegrationsVersion if it is a string', input: { lockIntegrationsVersion: 'Invalid' }, - expected: { ...defaultLoadOptions, lockIntegrationsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockIntegrationsVersion if it is an array', + name: 'should consider default value for lockIntegrationsVersion if it is an array', input: { lockIntegrationsVersion: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, lockIntegrationsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockIntegrationsVersion if it is a function', + name: 'should consider default value for lockIntegrationsVersion if it is a function', input: { lockIntegrationsVersion: () => {} }, - expected: { ...defaultLoadOptions, lockIntegrationsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockIntegrationsVersion if it is a symbol', + name: 'should consider default value for lockIntegrationsVersion if it is a symbol', input: { lockIntegrationsVersion: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, lockIntegrationsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockIntegrationsVersion if it is null', + name: 'should consider default value for lockIntegrationsVersion if it is null', input: { lockIntegrationsVersion: null }, - expected: { ...defaultLoadOptions, lockIntegrationsVersion: false }, + expected: defaultLoadOptions, }, { name: 'should ignore lockIntegrationsVersion if it is undefined', @@ -1291,34 +1291,34 @@ describe('load API options', () => { describe('lockPluginsVersion', () => { const testCaseData: any[] = [ { - name: 'should consider false lockPluginsVersion if it is a number', + name: 'should consider default value for lockPluginsVersion if it is a number', input: { lockPluginsVersion: 123 }, - expected: { ...defaultLoadOptions, lockPluginsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockPluginsVersion if it is a string', + name: 'should consider default value for lockPluginsVersion if it is a string', input: { lockPluginsVersion: 'Invalid' }, - expected: { ...defaultLoadOptions, lockPluginsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockPluginsVersion if it is an array', + name: 'should consider default value for lockPluginsVersion if it is an array', input: { lockPluginsVersion: ['rudderstack.com'] }, - expected: { ...defaultLoadOptions, lockPluginsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockPluginsVersion if it is a function', + name: 'should consider default value for lockPluginsVersion if it is a function', input: { lockPluginsVersion: () => {} }, - expected: { ...defaultLoadOptions, lockPluginsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockPluginsVersion if it is a symbol', + name: 'should consider default value for lockPluginsVersion if it is a symbol', input: { lockPluginsVersion: Symbol('rudderstack.com') }, - expected: { ...defaultLoadOptions, lockPluginsVersion: false }, + expected: defaultLoadOptions, }, { - name: 'should consider false lockPluginsVersion if it is null', + name: 'should consider default value for lockPluginsVersion if it is null', input: { lockPluginsVersion: null }, - expected: { ...defaultLoadOptions, lockPluginsVersion: false }, + expected: defaultLoadOptions, }, { name: 'should ignore lockPluginsVersion if it is undefined', @@ -1524,44 +1524,23 @@ describe('load API options', () => { }, }, { - name: 'should consider false for storage.migrate if it is a string', + name: 'should consider default value for storage.migrate if it is a string', input: { storage: { migrate: 'Invalid' } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: false, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { - name: 'should consider false for storage.migrate if it is a number', + name: 'should consider default value for storage.migrate if it is a number', input: { storage: { migrate: 123 } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: false, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { - name: 'should consider false for storage.migrate if it is a boolean', + name: 'should consider the value for storage.migrate if it is a boolean', input: { storage: { migrate: true } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: true, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { - name: 'should consider false for storage.migrate if it is an object', - input: { storage: { migrate: { domain: 'rudderstack.com' } } }, + name: 'should consider the value for storage.migrate if it is a boolean (false)', + input: { storage: { migrate: false } }, expected: { ...defaultLoadOptions, storage: { @@ -1572,52 +1551,29 @@ describe('load API options', () => { }, }, { - name: 'should consider false for storage.migrate if it is an array', + name: 'should consider default value for storage.migrate if it is an object', + input: { storage: { migrate: { domain: 'rudderstack.com' } } }, + expected: defaultLoadOptions, + }, + { + name: 'should consider default value for storage.migrate if it is an array', input: { storage: { migrate: ['rudderstack.com'] } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: false, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { - name: 'should consider false for storage.migrate if it is a function', + name: 'should consider default value for storage.migrate if it is a function', input: { storage: { migrate: () => {} } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: false, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { - name: 'should consider false for storage.migrate if it is a symbol', + name: 'should consider default value for storage.migrate if it is a symbol', input: { storage: { migrate: Symbol('rudderstack.com') } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: false, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { - name: 'should consider false for storage.migrate if it is null', + name: 'should consider default value for storage.migrate if it is null', input: { storage: { migrate: null } }, - expected: { - ...defaultLoadOptions, - storage: { - cookie: defaultLoadOptions.storage?.cookie, - migrate: false, - encryption: defaultLoadOptions.storage?.encryption, - }, - }, + expected: defaultLoadOptions, }, { name: 'should ignore storage.migrate if it is undefined', diff --git a/packages/analytics-js/__tests__/services/ErrorHandler/ErrorHandler.test.ts b/packages/analytics-js/__tests__/services/ErrorHandler/ErrorHandler.test.ts index d100d0aa19..2a4ef63095 100644 --- a/packages/analytics-js/__tests__/services/ErrorHandler/ErrorHandler.test.ts +++ b/packages/analytics-js/__tests__/services/ErrorHandler/ErrorHandler.test.ts @@ -212,5 +212,55 @@ describe('ErrorHandler', () => { new Error('Failed to notify error'), ); }); + + it('should generate grouping hash for CDN installations', () => { + // @ts-expect-error for testing + state.context.app.value.installType = 'cdn'; + state.reporting.isErrorReportingEnabled.value = true; + + const getBugsnagErrorEventSpy = jest.spyOn( + require('../../../src/services/ErrorHandler/utils'), + 'getBugsnagErrorEvent', + ); + + const error = new Error('dummy error'); + error.stack = + 'Error: Test:: dummy error\n at Object. (https://cdn.rudderlabs.com/v3/modern/rsa.min.js:1:1)'; + + errorHandlerInstance.onError(error, 'Test', 'Sample custom message'); + + expect(getBugsnagErrorEventSpy).toHaveBeenCalledTimes(1); + expect(getBugsnagErrorEventSpy).toHaveBeenCalledWith( + expect.anything(), + expect.anything(), + expect.anything(), + 'Test:: Sample custom message - dummy error', + ); + }); + + it('should not generate grouping hash for non-CDN installations', () => { + // @ts-expect-error for testing + state.context.app.value.installType = 'npm'; + state.reporting.isErrorReportingEnabled.value = true; + + const getBugsnagErrorEventSpy = jest.spyOn( + require('../../../src/services/ErrorHandler/utils'), + 'getBugsnagErrorEvent', + ); + + const error = new Error('dummy error'); + error.stack = + 'Error: Test:: dummy error\n at Object. (https://cdn.rudderlabs.com/v3/modern/rsa.min.js:1:1)'; + + errorHandlerInstance.onError(error, 'Test', 'Sample custom message'); + + expect(getBugsnagErrorEventSpy).toHaveBeenCalledTimes(1); + expect(getBugsnagErrorEventSpy).toHaveBeenCalledWith( + expect.anything(), + expect.anything(), + expect.anything(), + undefined, + ); + }); }); }); diff --git a/packages/analytics-js/__tests__/services/ErrorHandler/utils.test.ts b/packages/analytics-js/__tests__/services/ErrorHandler/utils.test.ts index b0bfe4b116..2edc58a56f 100644 --- a/packages/analytics-js/__tests__/services/ErrorHandler/utils.test.ts +++ b/packages/analytics-js/__tests__/services/ErrorHandler/utils.test.ts @@ -335,7 +335,7 @@ describe('Error Reporting utilities', () => { ], }; - const bsErrorEvent = getBugsnagErrorEvent(exception, errorState, state); + const bsErrorEvent = getBugsnagErrorEvent(exception, errorState, state, 'dummy message'); const expectedOutcome = { payloadVersion: '5', @@ -396,6 +396,7 @@ describe('Error Reporting utilities', () => { }, ], context: 'dummy message', + groupingHash: 'dummy message', metaData: { app: { snippetVersion: 'sample_snippet_version', @@ -501,6 +502,9 @@ describe('Error Reporting utilities', () => { sessions: { autoTrack: true, timeout: 1800000, + cutOff: { + enabled: false, + }, }, storage: { cookie: {}, @@ -654,6 +658,7 @@ describe('Error Reporting utilities', () => { ['', true, 'should allow empty messages'], ]; + // eslint-disable-next-line @typescript-eslint/no-unused-vars test.each(testCases)('%s -> %s (%s)', (message, expected, testName) => { const result = isAllowedToBeNotified({ message } as unknown as Exception); expect(result).toBe(expected); diff --git a/packages/analytics-js/__tests__/services/HttpClient/HttpClient.test.ts b/packages/analytics-js/__tests__/services/HttpClient/HttpClient.test.ts index afcc4a000c..b36a251e27 100644 --- a/packages/analytics-js/__tests__/services/HttpClient/HttpClient.test.ts +++ b/packages/analytics-js/__tests__/services/HttpClient/HttpClient.test.ts @@ -169,7 +169,7 @@ describe('HttpClient', () => { expect(defaultErrorHandler.onError).toHaveBeenCalledTimes(1); expect(defaultErrorHandler.onError).toHaveBeenCalledWith( new SyntaxError( - "Failed to parse response data: Expected property name or '}' in JSON at position 1", + "Failed to parse response data: Expected property name or '}' in JSON at position 1 (line 1 column 2)", ), 'HttpClient', ); diff --git a/packages/analytics-js/package.json b/packages/analytics-js/package.json index 4724819f1d..e311ab8a0f 100644 --- a/packages/analytics-js/package.json +++ b/packages/analytics-js/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js", - "version": "3.17.0", + "version": "3.18.0", "description": "RudderStack JavaScript SDK", "main": "dist/npm/modern/cjs/index.cjs", "module": "dist/npm/modern/esm/index.mjs", diff --git a/packages/analytics-js/project.json b/packages/analytics-js/project.json index b53f6f69fb..a706144534 100644 --- a/packages/analytics-js/project.json +++ b/packages/analytics-js/project.json @@ -52,9 +52,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "@rudderstack/analytics-js@3.17.0", - "title": "@rudderstack/analytics-js@3.17.0", - "discussion-category": "@rudderstack/analytics-js@3.17.0", + "tag": "@rudderstack/analytics-js@3.18.0", + "title": "@rudderstack/analytics-js@3.18.0", + "discussion-category": "@rudderstack/analytics-js@3.18.0", "notesFile": "./packages/analytics-js/CHANGELOG_LATEST.md" } } diff --git a/packages/analytics-js/src/app/RudderAnalytics.ts b/packages/analytics-js/src/app/RudderAnalytics.ts index b3434e2d9d..7e69ba351a 100644 --- a/packages/analytics-js/src/app/RudderAnalytics.ts +++ b/packages/analytics-js/src/app/RudderAnalytics.ts @@ -12,7 +12,6 @@ import type { Nullable } from '@rudderstack/analytics-js-common/types/Nullable'; import { PageLifecycleEvents, type AnonymousIdOptions, - type ConsentOptions, type LoadOptions, } from '@rudderstack/analytics-js-common/types/LoadOptions'; import type { ApiCallback, ApiOptions } from '@rudderstack/analytics-js-common/types/EventApi'; @@ -42,6 +41,7 @@ import { defaultCookieStorage } from '../services/StoreManager/storages/CookieSt import { defaultLocalStorage } from '../services/StoreManager/storages/LocalStorage'; import { defaultSessionStorage } from '../services/StoreManager/storages/sessionStorage'; import { defaultInMemoryStorage } from '../services/StoreManager/storages/InMemoryStorage'; +import type { ConsentOptions } from '@rudderstack/analytics-js-common/types/Consent'; // TODO: add analytics restart/reset mechanism diff --git a/packages/analytics-js/src/components/core/Analytics.ts b/packages/analytics-js/src/components/core/Analytics.ts index 3615ffc1c3..0669313b1d 100644 --- a/packages/analytics-js/src/components/core/Analytics.ts +++ b/packages/analytics-js/src/components/core/Analytics.ts @@ -14,7 +14,6 @@ import type { Nullable } from '@rudderstack/analytics-js-common/types/Nullable'; import type { ApiObject } from '@rudderstack/analytics-js-common/types/ApiObject'; import type { AnonymousIdOptions, - ConsentOptions, LoadOptions, } from '@rudderstack/analytics-js-common/types/LoadOptions'; import type { ApiCallback } from '@rudderstack/analytics-js-common/types/EventApi'; @@ -69,6 +68,7 @@ import type { IAnalytics } from './IAnalytics'; import { getConsentManagementData, getValidPostConsentOptions } from '../utilities/consent'; import { dispatchSDKEvent, isDataPlaneUrlValid, isWriteKeyValid } from './utilities'; import { safelyInvokeCallback } from '../utilities/callbacks'; +import type { ConsentOptions } from '@rudderstack/analytics-js-common/types/Consent'; /* * Analytics class with lifecycle based on state ad user triggered events diff --git a/packages/analytics-js/src/components/core/IAnalytics.ts b/packages/analytics-js/src/components/core/IAnalytics.ts index daae79c0b8..743bde9ffd 100644 --- a/packages/analytics-js/src/components/core/IAnalytics.ts +++ b/packages/analytics-js/src/components/core/IAnalytics.ts @@ -4,7 +4,6 @@ import type { IErrorHandler } from '@rudderstack/analytics-js-common/types/Error import type { IExternalSrcLoader } from '@rudderstack/analytics-js-common/services/ExternalSrcLoader/types'; import type { AnonymousIdOptions, - ConsentOptions, LoadOptions, } from '@rudderstack/analytics-js-common/types/LoadOptions'; import type { ApiCallback } from '@rudderstack/analytics-js-common/types/EventApi'; @@ -26,6 +25,7 @@ import type { IConfigManager } from '../configManager/types'; import type { IEventManager } from '../eventManager/types'; import type { ICapabilitiesManager } from '../capabilitiesManager/types'; import type { PreloadedEventCall } from '../preloadBuffer/types'; +import type { ConsentOptions } from '@rudderstack/analytics-js-common/types/Consent'; export interface IAnalytics { preloadBuffer: BufferQueue; diff --git a/packages/analytics-js/src/components/userSessionManager/UserSessionManager.ts b/packages/analytics-js/src/components/userSessionManager/UserSessionManager.ts index 7792562b02..b9fcd2d695 100644 --- a/packages/analytics-js/src/components/userSessionManager/UserSessionManager.ts +++ b/packages/analytics-js/src/components/userSessionManager/UserSessionManager.ts @@ -41,11 +41,16 @@ import { USER_SESSION_KEYS, } from '../../constants/storage'; import { storageClientDataStoreNameMap } from '../../services/StoreManager/types'; -import { DEFAULT_SESSION_TIMEOUT_MS, MIN_SESSION_TIMEOUT_MS } from '../../constants/timeouts'; -import { defaultSessionConfiguration } from '../../state/slices/session'; +import { + DEFAULT_SESSION_CUT_OFF_DURATION_MS, + DEFAULT_SESSION_TIMEOUT_MS, + MIN_SESSION_TIMEOUT_MS, +} from '../../constants/timeouts'; import { state } from '../../state'; import { getStorageEngine } from '../../services/StoreManager/storages'; import { + CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING, + CUT_OFF_DURATION_NOT_NUMBER_WARNING, DATA_SERVER_REQUEST_FAIL_ERROR, FAILED_SETTING_COOKIE_FROM_SERVER_ERROR, FAILED_SETTING_COOKIE_FROM_SERVER_GLOBAL_ERROR, @@ -57,7 +62,9 @@ import { generateAnonymousId, generateAutoTrackingSession, generateManualTrackingSession, + getCutOffExpirationTimestamp, hasSessionExpired, + isCutOffTimeExceeded, isStorageTypeValidForStoringData, } from './utils'; import { getReferringDomain } from '../utilities/url'; @@ -130,20 +137,33 @@ class UserSessionManager implements IUserSessionManager { } configureSessionTracking() { - let sessionInfo = this.getSessionInfo(); + let sessionInfo; if (this.isPersistenceEnabledForStorageEntry('sessionInfo')) { const configuredSessionTrackingInfo = this.getConfiguredSessionTrackingInfo(); - const initialSessionInfo = sessionInfo ?? defaultSessionConfiguration; + const initialSessionInfo = this.getSessionInfo() ?? DEFAULT_USER_SESSION_VALUES.sessionInfo; + + // Merge the session info from the storage and the configuration sessionInfo = { - ...initialSessionInfo, - ...configuredSessionTrackingInfo, - // If manualTrack is set to true in the storage, then autoTrack should be false + // If manualTrack is set to true in the storage, then do not enable auto tracking even if configured. + // Once manual tracking ends (endSession is called), auto tracking will be enabled in the next SDK run. autoTrack: configuredSessionTrackingInfo.autoTrack && initialSessionInfo.manualTrack !== true, - }; + timeout: configuredSessionTrackingInfo.timeout, + manualTrack: initialSessionInfo.manualTrack, + expiresAt: initialSessionInfo.expiresAt, + id: initialSessionInfo.id, + sessionStart: initialSessionInfo.sessionStart, + } as SessionInfo; + // If both autoTrack and manualTrack are disabled, reset the session info to default values if (!sessionInfo.autoTrack && sessionInfo.manualTrack !== true) { sessionInfo = DEFAULT_USER_SESSION_VALUES.sessionInfo; + } else if (configuredSessionTrackingInfo.cutOff?.enabled === true) { + sessionInfo.cutOff = { + enabled: true, + duration: configuredSessionTrackingInfo.cutOff.duration, + expiresAt: initialSessionInfo.cutOff?.expiresAt, + }; } } else { sessionInfo = DEFAULT_USER_SESSION_VALUES.sessionInfo; @@ -247,7 +267,7 @@ class UserSessionManager implements IUserSessionManager { } getConfiguredSessionTrackingInfo(): SessionInfo { - let autoTrack = state.loadOptions.value.sessions?.autoTrack !== false; + let autoTrack = state.loadOptions.value.sessions!.autoTrack !== false; // Do not validate any further if autoTrack is disabled if (!autoTrack) { @@ -268,7 +288,7 @@ class UserSessionManager implements IUserSessionManager { ); timeout = DEFAULT_SESSION_TIMEOUT_MS; } else { - timeout = configuredSessionTimeout as number; + timeout = configuredSessionTimeout; } if (timeout === 0) { @@ -282,7 +302,42 @@ class UserSessionManager implements IUserSessionManager { TIMEOUT_NOT_RECOMMENDED_WARNING(USER_SESSION_MANAGER, timeout, MIN_SESSION_TIMEOUT_MS), ); } - return { timeout, autoTrack }; + + const cutOff = this.getCutOffInfo(timeout); + + return { timeout, autoTrack, cutOff }; + } + + private getCutOffInfo(sessionTimeout: number): SessionInfo['cutOff'] { + const cutOff = state.loadOptions.value.sessions!.cutOff!; + let cutOffDuration; + let cutOffEnabled = false; + if (cutOff.enabled === true) { + cutOffDuration = cutOff.duration; + cutOffEnabled = true; + if (!isPositiveInteger(cutOffDuration)) { + this.logger.warn( + CUT_OFF_DURATION_NOT_NUMBER_WARNING( + USER_SESSION_MANAGER, + cutOffDuration, + DEFAULT_SESSION_CUT_OFF_DURATION_MS, + ), + ); + + // Use the default value for cut off duration + cutOffDuration = DEFAULT_SESSION_CUT_OFF_DURATION_MS; + } else if (cutOffDuration < sessionTimeout) { + this.logger.warn( + CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING( + USER_SESSION_MANAGER, + cutOffDuration, + sessionTimeout, + ), + ); + cutOffEnabled = false; + } + } + return { enabled: cutOffEnabled, duration: cutOffDuration }; } /** @@ -614,10 +669,7 @@ class UserSessionManager implements IUserSessionManager { */ getSessionId(): Nullable { const sessionInfo = this.getSessionInfo() ?? DEFAULT_USER_SESSION_VALUES.sessionInfo; - if ( - (sessionInfo.autoTrack && !hasSessionExpired(sessionInfo.expiresAt)) || - sessionInfo.manualTrack - ) { + if ((sessionInfo.autoTrack && !hasSessionExpired(sessionInfo)) || sessionInfo.manualTrack) { return sessionInfo.id ?? null; } return null; @@ -673,7 +725,7 @@ class UserSessionManager implements IUserSessionManager { */ reset(resetAnonymousId?: boolean, noNewSessionStart?: boolean) { const { session } = state; - const { manualTrack, autoTrack } = session.sessionInfo.value; + const { manualTrack, autoTrack, timeout, cutOff } = session.sessionInfo.value; batch(() => { session.userId.value = DEFAULT_USER_SESSION_VALUES.userId; @@ -692,7 +744,20 @@ class UserSessionManager implements IUserSessionManager { } if (autoTrack) { - session.sessionInfo.value = DEFAULT_USER_SESSION_VALUES.sessionInfo; + const sessionInfo = { + ...DEFAULT_USER_SESSION_VALUES.sessionInfo, + timeout, + }; + + if (cutOff) { + sessionInfo.cutOff = { + enabled: cutOff.enabled, + duration: cutOff.duration, + }; + } + + session.sessionInfo.value = sessionInfo; + this.startOrRenewAutoTracking(session.sessionInfo.value); } else if (manualTrack) { this.startManualTrackingInternal(); @@ -776,15 +841,30 @@ class UserSessionManager implements IUserSessionManager { * A function to check for existing session details and depending on that create a new session */ startOrRenewAutoTracking(sessionInfo: SessionInfo) { - if (hasSessionExpired(sessionInfo.expiresAt)) { - state.session.sessionInfo.value = generateAutoTrackingSession(sessionInfo.timeout); + let finalSessionInfo = sessionInfo; + if (hasSessionExpired(sessionInfo)) { + finalSessionInfo = generateAutoTrackingSession(sessionInfo); } else { const timestamp = Date.now(); const timeout = sessionInfo.timeout as number; - state.session.sessionInfo.value = mergeDeepRight(sessionInfo, { - expiresAt: timestamp + timeout, // set the expiry time of the session - }); + + // Set the expiry time of the session + finalSessionInfo.expiresAt = timestamp + timeout; + } + + // Reset cut off expiry timestamp if it is exceeded + if (isCutOffTimeExceeded(finalSessionInfo)) { + finalSessionInfo.cutOff!.expiresAt = undefined; } + + // If cut off is active, set or retain the expiry time + if (finalSessionInfo.cutOff) { + const cutOffExpiresAt = getCutOffExpirationTimestamp(finalSessionInfo.cutOff); + finalSessionInfo.cutOff.expiresAt = cutOffExpiresAt; + } + + // Update the session info in the state + state.session.sessionInfo.value = finalSessionInfo; } /** diff --git a/packages/analytics-js/src/components/userSessionManager/utils.ts b/packages/analytics-js/src/components/userSessionManager/utils.ts index 1188a1ffa1..08f64c941f 100644 --- a/packages/analytics-js/src/components/userSessionManager/utils.ts +++ b/packages/analytics-js/src/components/userSessionManager/utils.ts @@ -9,19 +9,28 @@ import { SESSION_STORAGE, } from '@rudderstack/analytics-js-common/constants/storages'; import { generateUUID } from '@rudderstack/analytics-js-common/utilities/uuId'; -import { DEFAULT_SESSION_TIMEOUT_MS } from '../../constants/timeouts'; import { INVALID_SESSION_ID_WARNING } from '../../constants/logMessages'; import { hasMinLength, isPositiveInteger } from '../utilities/number'; const MIN_SESSION_ID_LENGTH = 10; +const isCutOffTimeExceeded = (sessionInfo: SessionInfo): boolean => { + const { cutOff } = sessionInfo; + const timestamp = Date.now(); + return Boolean(cutOff?.enabled && cutOff.expiresAt && timestamp > cutOff.expiresAt); +}; + /** - * A function to validate current session and return true/false depending on that + * A function to validate whether the current auto tracking session has expired or not. + * It checks for the current session expiry and the cut off time expiry. + * @param sessionInfo session info * @returns boolean */ -const hasSessionExpired = (expiresAt?: number): boolean => { - const timestamp = Date.now(); - return Boolean(!expiresAt || timestamp > expiresAt); +const hasSessionExpired = (sessionInfo: SessionInfo): boolean => { + const isCurrentSessionExpired = Boolean( + !sessionInfo.expiresAt || Date.now() > sessionInfo.expiresAt, + ); + return isCurrentSessionExpired || isCutOffTimeExceeded(sessionInfo); }; /** @@ -48,20 +57,32 @@ const isManualSessionIdValid = (sessionId: number | undefined, logger: ILogger): return true; }; +const getCutOffExpirationTimestamp = (cutOff: SessionInfo['cutOff']): number | undefined => { + if (!cutOff?.enabled) { + return undefined; + } + + return ( + cutOff.expiresAt ?? + (isPositiveInteger(cutOff.duration) ? Date.now() + cutOff.duration : undefined) + ); +}; + /** * A function to generate new auto tracking session - * @param sessionTimeout current timestamp + * @param sessionInfo session info * @returns SessionInfo */ -const generateAutoTrackingSession = (sessionTimeout?: number): SessionInfo => { +const generateAutoTrackingSession = (sessionInfo: SessionInfo): SessionInfo => { + const { timeout, cutOff } = sessionInfo; const timestamp = Date.now(); - const timeout: number = sessionTimeout || DEFAULT_SESSION_TIMEOUT_MS; + return { id: timestamp, // set the current timestamp - expiresAt: timestamp + timeout, // set the expiry time of the session + expiresAt: timestamp + (timeout as number), // set the expiry time of the session timeout, - sessionStart: undefined, autoTrack: true, + ...(cutOff && { cutOff }), }; }; @@ -104,4 +125,6 @@ export { MIN_SESSION_ID_LENGTH, isStorageTypeValidForStoringData, generateAnonymousId, + isCutOffTimeExceeded, + getCutOffExpirationTimestamp, }; diff --git a/packages/analytics-js/src/components/utilities/consent.ts b/packages/analytics-js/src/components/utilities/consent.ts index a175681944..17e94f631f 100644 --- a/packages/analytics-js/src/components/utilities/consent.ts +++ b/packages/analytics-js/src/components/utilities/consent.ts @@ -2,10 +2,10 @@ import { CONFIG_MANAGER } from '@rudderstack/analytics-js-common/constants/logge import type { ConsentManagementOptions, ConsentManagementProvider, + ConsentOptions, Consents, CookieConsentOptions, } from '@rudderstack/analytics-js-common/types/Consent'; -import type { ConsentOptions } from '@rudderstack/analytics-js-common/types/LoadOptions'; import type { ILogger } from '@rudderstack/analytics-js-common/types/Logger'; import type { PluginName } from '@rudderstack/analytics-js-common/types/PluginsManager'; import { diff --git a/packages/analytics-js/src/components/utilities/loadOptions.ts b/packages/analytics-js/src/components/utilities/loadOptions.ts index 17c7413fc8..4b1ab75053 100644 --- a/packages/analytics-js/src/components/utilities/loadOptions.ts +++ b/packages/analytics-js/src/components/utilities/loadOptions.ts @@ -34,12 +34,12 @@ const normalizeLoadOptions = ( normalizedLoadOpts.secureCookie = getNormalizedBooleanValue( normalizedLoadOpts.secureCookie, - loadOptionsFromState.secureCookie, + loadOptionsFromState.secureCookie!, ); normalizedLoadOpts.sameDomainCookiesOnly = getNormalizedBooleanValue( normalizedLoadOpts.sameDomainCookiesOnly, - loadOptionsFromState.sameDomainCookiesOnly, + loadOptionsFromState.sameDomainCookiesOnly!, ); const uaChTrackLevels = ['none', 'default', 'full']; @@ -55,22 +55,22 @@ const normalizeLoadOptions = ( normalizedLoadOpts.useGlobalIntegrationsConfigInEvents = getNormalizedBooleanValue( normalizedLoadOpts.useGlobalIntegrationsConfigInEvents, - loadOptionsFromState.useGlobalIntegrationsConfigInEvents, + loadOptionsFromState.useGlobalIntegrationsConfigInEvents!, ); normalizedLoadOpts.bufferDataPlaneEventsUntilReady = getNormalizedBooleanValue( normalizedLoadOpts.bufferDataPlaneEventsUntilReady, - loadOptionsFromState.bufferDataPlaneEventsUntilReady, + loadOptionsFromState.bufferDataPlaneEventsUntilReady!, ); normalizedLoadOpts.sendAdblockPage = getNormalizedBooleanValue( normalizedLoadOpts.sendAdblockPage, - loadOptionsFromState.sendAdblockPage, + loadOptionsFromState.sendAdblockPage!, ); normalizedLoadOpts.useServerSideCookies = getNormalizedBooleanValue( normalizedLoadOpts.useServerSideCookies, - loadOptionsFromState.useServerSideCookies, + loadOptionsFromState.useServerSideCookies!, ); if (!isString(normalizedLoadOpts.dataServiceEndpoint)) { @@ -83,7 +83,7 @@ const normalizeLoadOptions = ( normalizedLoadOpts.loadIntegration = getNormalizedBooleanValue( normalizedLoadOpts.loadIntegration, - loadOptionsFromState.loadIntegration, + loadOptionsFromState.loadIntegration!, ); if (!isNonEmptyObject(normalizedLoadOpts.storage)) { @@ -91,7 +91,7 @@ const normalizeLoadOptions = ( } else { normalizedLoadOpts.storage.migrate = getNormalizedBooleanValue( normalizedLoadOpts.storage.migrate, - loadOptionsFromState.storage?.migrate, + loadOptionsFromState.storage?.migrate!, ); normalizedLoadOpts.storage.cookie = getNormalizedObjectValue(normalizedLoadOpts.storage.cookie); @@ -109,12 +109,12 @@ const normalizeLoadOptions = ( normalizedLoadOpts.lockIntegrationsVersion = getNormalizedBooleanValue( normalizedLoadOpts.lockIntegrationsVersion, - loadOptionsFromState.lockIntegrationsVersion, + loadOptionsFromState.lockIntegrationsVersion!, ); normalizedLoadOpts.lockPluginsVersion = getNormalizedBooleanValue( normalizedLoadOpts.lockPluginsVersion, - loadOptionsFromState.lockPluginsVersion, + loadOptionsFromState.lockPluginsVersion!, ); if (!isNumber(normalizedLoadOpts.dataPlaneEventsBufferTimeout)) { diff --git a/packages/analytics-js/src/components/utilities/number.ts b/packages/analytics-js/src/components/utilities/number.ts index 6aab8f277a..22976afca6 100644 --- a/packages/analytics-js/src/components/utilities/number.ts +++ b/packages/analytics-js/src/components/utilities/number.ts @@ -18,6 +18,7 @@ const hasMinLength = (minimumLength: number, num: number) => num.toString().leng * @param num input value * @returns boolean */ -const isPositiveInteger = (num: any) => isNumber(num) && num >= 0 && Number.isInteger(num); +const isPositiveInteger = (num: any): num is number => + isNumber(num) && num >= 0 && Number.isInteger(num); export { isNumber, hasMinLength, isPositiveInteger }; diff --git a/packages/analytics-js/src/constants/logMessages.ts b/packages/analytics-js/src/constants/logMessages.ts index dfb370b842..9661b4b046 100644 --- a/packages/analytics-js/src/constants/logMessages.ts +++ b/packages/analytics-js/src/constants/logMessages.ts @@ -172,6 +172,20 @@ const TIMEOUT_NOT_NUMBER_WARNING = ( ): string => `${context}${LOG_CONTEXT_SEPARATOR}The session timeout value "${timeout}" is not a number. The default timeout of ${defaultValue} ms will be used instead.`; +const CUT_OFF_DURATION_NOT_NUMBER_WARNING = ( + context: string, + cutOffDuration: number | undefined, + defaultValue: number, +): string => + `${context}${LOG_CONTEXT_SEPARATOR}The session cut off duration value "${cutOffDuration}" is not a number. The default cut off duration of ${defaultValue} ms will be used instead.`; + +const CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING = ( + context: string, + cutOffDuration: number, + timeout: number, +): string => + `${context}${LOG_CONTEXT_SEPARATOR}The session cut off duration value "${cutOffDuration}" ms is less than the session timeout value "${timeout}" ms. The cut off functionality will be disabled.`; + const TIMEOUT_ZERO_WARNING = (context: string): string => `${context}${LOG_CONTEXT_SEPARATOR}The session timeout value is 0, which disables the automatic session tracking feature. If you want to enable session tracking, please provide a positive integer value for the timeout.`; @@ -311,4 +325,6 @@ export { CALLBACK_INVOKE_ERROR, UNKNOWN_PLUGINS_WARNING, INVALID_CALLBACK_FN_ERROR, + CUT_OFF_DURATION_NOT_NUMBER_WARNING, + CUT_OFF_DURATION_LESS_THAN_TIMEOUT_WARNING, }; diff --git a/packages/analytics-js/src/constants/timeouts.ts b/packages/analytics-js/src/constants/timeouts.ts index f543cebc3f..a3bc42e25f 100644 --- a/packages/analytics-js/src/constants/timeouts.ts +++ b/packages/analytics-js/src/constants/timeouts.ts @@ -1,5 +1,6 @@ const DEFAULT_XHR_TIMEOUT_MS = 10 * 1000; // 10 seconds const DEFAULT_COOKIE_MAX_AGE_MS = 31536000 * 1000; // 1 year +const DEFAULT_SESSION_CUT_OFF_DURATION_MS = 12 * 60 * 60 * 1000; // 12 hours const DEFAULT_SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes const MIN_SESSION_TIMEOUT_MS = 10 * 1000; // 10 seconds const DEFAULT_DATA_PLANE_EVENTS_BUFFER_TIMEOUT_MS = 10 * 1000; // 10 seconds @@ -12,4 +13,5 @@ export { MIN_SESSION_TIMEOUT_MS, DEFAULT_DATA_PLANE_EVENTS_BUFFER_TIMEOUT_MS, DEBOUNCED_TIMEOUT_MS, + DEFAULT_SESSION_CUT_OFF_DURATION_MS, }; diff --git a/packages/analytics-js/src/index.ts b/packages/analytics-js/src/index.ts index d86ae6d1e5..e9c6e63a94 100644 --- a/packages/analytics-js/src/index.ts +++ b/packages/analytics-js/src/index.ts @@ -9,7 +9,6 @@ export { type BeaconQueueOpts, type DestinationsQueueOpts, type UaChTrackLevel, - type ConsentOptions, } from '@rudderstack/analytics-js-common/types/LoadOptions'; export { type CookieSameSite } from '@rudderstack/analytics-js-common/types/Storage'; export { type ApiCallback, type ApiOptions } from '@rudderstack/analytics-js-common/types/EventApi'; @@ -23,7 +22,7 @@ export { type PreloadedEventCall, } from './components/preloadBuffer/types'; export { RudderAnalytics } from './app/RudderAnalytics'; - +export { type ConsentOptions } from '@rudderstack/analytics-js-common/types/Consent'; declare global { interface Window { rudderanalytics: RudderAnalytics | RudderAnalyticsPreloader | undefined; diff --git a/packages/analytics-js/src/services/ErrorHandler/ErrorHandler.ts b/packages/analytics-js/src/services/ErrorHandler/ErrorHandler.ts index 03be20379e..ffaa8a2e8e 100644 --- a/packages/analytics-js/src/services/ErrorHandler/ErrorHandler.ts +++ b/packages/analytics-js/src/services/ErrorHandler/ErrorHandler.ts @@ -115,8 +115,17 @@ class ErrorHandler implements IErrorHandler { severityReason: { type: errorType }, }; - // enrich error payload - const bugsnagPayload = getBugsnagErrorEvent(bsException, errorState, state); + // Set grouping hash only for CDN installations (as an experiment) + // This will allow us to group errors by the message instead of the surrounding code. + // In case of NPM installations, the default grouping by surrounding code does not make sense as each user application is different. + // References: + // https://docs.bugsnag.com/platforms/javascript/customizing-error-reports/#groupinghash + // https://docs.bugsnag.com/product/error-grouping/#user_defined + const groupingHash = + state.context.app.value.installType === 'cdn' ? bsException.message : undefined; + + // Get the final payload to be sent to the metrics service + const bugsnagPayload = getBugsnagErrorEvent(bsException, errorState, state, groupingHash); // send it to metrics service this.httpClient.getAsyncData({ diff --git a/packages/analytics-js/src/services/ErrorHandler/utils.ts b/packages/analytics-js/src/services/ErrorHandler/utils.ts index 2511a1f8d9..0a172ac500 100644 --- a/packages/analytics-js/src/services/ErrorHandler/utils.ts +++ b/packages/analytics-js/src/services/ErrorHandler/utils.ts @@ -98,6 +98,7 @@ const getBugsnagErrorEvent = ( exception: Exception, errorState: ErrorState, state: ApplicationState, + groupingHash?: string, ): ErrorEventPayload => { const { context, lifecycle, session, source, reporting, autoTrack } = state; const { app, locale, userAgent, timezone, screen, library } = context; @@ -127,6 +128,7 @@ const getBugsnagErrorEvent = ( }, breadcrumbs: clone(reporting.breadcrumbs.value), context: exception.message, + groupingHash, metaData: { app: { snippetVersion: library.value.snippetVersion, diff --git a/packages/analytics-js/src/state/slices/loadOptions.ts b/packages/analytics-js/src/state/slices/loadOptions.ts index e636b80604..548901ddb8 100644 --- a/packages/analytics-js/src/state/slices/loadOptions.ts +++ b/packages/analytics-js/src/state/slices/loadOptions.ts @@ -16,6 +16,9 @@ const defaultLoadOptions: LoadOptions = { sessions: { autoTrack: true, timeout: DEFAULT_SESSION_TIMEOUT_MS, + cutOff: { + enabled: false, + }, }, sameSiteCookie: 'Lax', polyfillIfRequired: true, diff --git a/packages/analytics-js/src/state/slices/session.ts b/packages/analytics-js/src/state/slices/session.ts index 29988e7a90..edaf0fb6a2 100644 --- a/packages/analytics-js/src/state/slices/session.ts +++ b/packages/analytics-js/src/state/slices/session.ts @@ -1,13 +1,6 @@ import { signal } from '@preact/signals-core'; import type { SessionState } from '@rudderstack/analytics-js-common/types/ApplicationState'; -import type { SessionInfo } from '@rudderstack/analytics-js-common/types/Session'; import { DEFAULT_USER_SESSION_VALUES } from '../../components/userSessionManager/constants'; -import { DEFAULT_SESSION_TIMEOUT_MS } from '../../constants/timeouts'; - -const defaultSessionConfiguration: SessionInfo = { - autoTrack: true, - timeout: DEFAULT_SESSION_TIMEOUT_MS, -}; const sessionState: SessionState = { userId: signal(DEFAULT_USER_SESSION_VALUES.userId), @@ -21,4 +14,4 @@ const sessionState: SessionState = { authToken: signal(DEFAULT_USER_SESSION_VALUES.authToken), }; -export { sessionState, defaultSessionConfiguration }; +export { sessionState }; diff --git a/packages/analytics-v1.1/CHANGELOG.md b/packages/analytics-v1.1/CHANGELOG.md index 559faafb52..03a4787908 100644 --- a/packages/analytics-v1.1/CHANGELOG.md +++ b/packages/analytics-v1.1/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [2.51.2](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.51.1...rudder-sdk-js@2.51.2) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js-common` updated to version `3.19.0` ## [2.51.1](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.51.0...rudder-sdk-js@2.51.1) (2025-04-25) ### Dependency Updates diff --git a/packages/analytics-v1.1/CHANGELOG_LATEST.md b/packages/analytics-v1.1/CHANGELOG_LATEST.md index cddc39975e..953b6cb2d0 100644 --- a/packages/analytics-v1.1/CHANGELOG_LATEST.md +++ b/packages/analytics-v1.1/CHANGELOG_LATEST.md @@ -1,10 +1,5 @@ -## [2.51.1](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.51.0...rudder-sdk-js@2.51.1) (2025-04-25) +## [2.51.2](https://github.com/rudderlabs/rudder-sdk-js/compare/rudder-sdk-js@2.51.1...rudder-sdk-js@2.51.2) (2025-05-09) ### Dependency Updates -* `@rudderstack/analytics-js-common` updated to version `3.18.0` - -### Bug Fixes - -* recursively migrate persisted entries ([#2187](https://github.com/rudderlabs/rudder-sdk-js/issues/2187)) ([3dd07ea](https://github.com/rudderlabs/rudder-sdk-js/commit/3dd07ea1bde4655124fc02850a022bcb550b8c07)) - +* `@rudderstack/analytics-js-common` updated to version `3.19.0` diff --git a/packages/analytics-v1.1/package.json b/packages/analytics-v1.1/package.json index f19ef68672..c9f1c211eb 100644 --- a/packages/analytics-v1.1/package.json +++ b/packages/analytics-v1.1/package.json @@ -1,6 +1,6 @@ { "name": "rudder-sdk-js", - "version": "2.51.1", + "version": "2.51.2", "description": "RudderStack JavaScript SDK", "main": "dist/npm/index.js", "module": "dist/npm/index.es.js", diff --git a/packages/analytics-v1.1/project.json b/packages/analytics-v1.1/project.json index 724b763d7c..9fd70e25a5 100644 --- a/packages/analytics-v1.1/project.json +++ b/packages/analytics-v1.1/project.json @@ -59,9 +59,9 @@ "github": { "executor": "@jscutlery/semver:github", "options": { - "tag": "rudder-sdk-js@2.51.1", - "title": "rudder-sdk-js@2.51.1", - "discussion-category": "rudder-sdk-js@2.51.1", + "tag": "rudder-sdk-js@2.51.2", + "title": "rudder-sdk-js@2.51.2", + "discussion-category": "rudder-sdk-js@2.51.2", "notesFile": "./packages/analytics-v1.1/CHANGELOG_LATEST.md" } } diff --git a/packages/sanity-suite/CHANGELOG.md b/packages/sanity-suite/CHANGELOG.md index a5def7a2a1..755fb7dc20 100644 --- a/packages/sanity-suite/CHANGELOG.md +++ b/packages/sanity-suite/CHANGELOG.md @@ -2,6 +2,11 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [3.2.9](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-sanity-suite@3.2.8...@rudderstack/analytics-js-sanity-suite@3.2.9) (2025-05-09) + +### Dependency Updates + +* `@rudderstack/analytics-js` updated to version `3.18.0` ## [3.2.8](https://github.com/rudderlabs/rudder-sdk-js/compare/@rudderstack/analytics-js-sanity-suite@3.2.7...@rudderstack/analytics-js-sanity-suite@3.2.8) (2025-04-25) ### Dependency Updates diff --git a/packages/sanity-suite/package.json b/packages/sanity-suite/package.json index 4360977cc3..fc51ccd981 100644 --- a/packages/sanity-suite/package.json +++ b/packages/sanity-suite/package.json @@ -1,6 +1,6 @@ { "name": "@rudderstack/analytics-js-sanity-suite", - "version": "3.2.8", + "version": "3.2.9", "private": true, "description": "Sanity suite for testing JS SDK package", "main": "./dist/v3/cdn/testBook.js", diff --git a/patches/nx+20.8.0.patch b/patches/nx+21.0.0.patch similarity index 96% rename from patches/nx+20.8.0.patch rename to patches/nx+21.0.0.patch index 6afb8744c8..626b86ef0d 100644 --- a/patches/nx+20.8.0.patch +++ b/patches/nx+21.0.0.patch @@ -1,8 +1,8 @@ diff --git a/node_modules/nx/src/command-line/yargs-utils/shared-options.js b/node_modules/nx/src/command-line/yargs-utils/shared-options.js -index b2c577f..22a6a4a 100644 +index 6b2418e..126b642 100644 --- a/node_modules/nx/src/command-line/yargs-utils/shared-options.js +++ b/node_modules/nx/src/command-line/yargs-utils/shared-options.js -@@ -105,6 +105,10 @@ function withRunOptions(yargs) { +@@ -127,6 +127,10 @@ function withRunOptions(yargs) { type: 'boolean', hidden: true, alias: 'agents', @@ -14,7 +14,7 @@ index b2c577f..22a6a4a 100644 } function withTargetAndConfigurationOption(yargs, demandOption = true) { diff --git a/node_modules/nx/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js b/node_modules/nx/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js -index f58f821..407202f 100644 +index f58f821..5660e84 100644 --- a/node_modules/nx/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js +++ b/node_modules/nx/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js @@ -23,6 +23,10 @@ class StaticRunManyTerminalOutputLifeCycle { @@ -35,7 +35,7 @@ index f58f821..407202f 100644 + if (this.args.silent) { + return; + } -+ ++ output_1.output.addNewline(); if (this.tasks.length === 0) { output_1.output.logSingleLine(`No tasks were run`); diff --git a/sonar-project.properties b/sonar-project.properties index 7f90ac4b65..eab55d2d22 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,7 +6,7 @@ sonar.qualitygate.wait=false sonar.projectKey=rudderlabs_rudder-sdk-js sonar.organization=rudderlabs sonar.projectName=rudder-sdk-js -sonar.projectVersion=3.83.0 +sonar.projectVersion=3.84.0 # Meta-data for the project sonar.links.scm=https://github.com/rudderlabs/rudder-sdk-js